UNPKG

@arcana/ca-sdk

Version:

Arcana Network's chain abstraction SDK for unified balance in Web3 apps

76 lines (75 loc) 2.79 kB
import Decimal from "decimal.js"; import { SOPHON_CHAIN_ID } from "../../constants"; import { getLogger } from "../../logger"; import { divDecimals } from "../../utils"; const logger = getLogger(); const tokenRequestParseSimulation = ({ assets, bridge, chain, iGas, simulation, }) => { const tokenContract = simulation.token.contractAddress; const amount = simulation.amount ?? new Decimal(0); const nativeToken = chain.nativeCurrency; logger.debug("ERC20RequestBase:ParseSimulation:1", { assets, tokenContract, }); const { asset, chainsWithBalance, destinationAssetBalance, destinationGasBalance, } = assets.getAssetDetails(chain, tokenContract); const gasMultiple = simulation.gasFee .mul(chain.id === SOPHON_CHAIN_ID ? 3 : 2) .add(divDecimals(iGas, nativeToken.decimals)); logger.debug("ERC20RequestBase:ParseSimulation:0", { destinationGasBalance, expectedGas: gasMultiple.toFixed(), simGas: simulation.gasFee.toFixed(), }); const isGasRequiredToBeBorrowed = bridge ? gasMultiple.greaterThan(0) : gasMultiple.greaterThan(destinationGasBalance); let isIntentRequired = false; if (bridge) { isIntentRequired = true; } let gas = new Decimal(0); logger.debug("ERC20RequestBase:parseSimulation:1", { abstracted: asset?.abstracted, chainsWithBalance, destinationAssetBalance, isGasRequiredToBeBorrowed, }); if (chainsWithBalance && asset?.abstracted) { if (amount.greaterThan(destinationAssetBalance)) { isIntentRequired = true; } if (isGasRequiredToBeBorrowed) { isIntentRequired = true; gas = bridge ? gasMultiple : gasMultiple.minus(destinationGasBalance); } } return { amount, gas, isIntentRequired, }; }; const nativeRequestParseSimulation = ({ assets, bridge, chain, simulation, }) => { const { asset, chainsWithBalance, destinationGasBalance } = assets.getAssetDetails(chain, simulation.token.contractAddress); const gasMultiple = simulation.gasFee.mul(2); let isIntentRequired = false; if (bridge) { isIntentRequired = true; } if (chainsWithBalance && asset?.abstracted) { if (simulation.amount.add(gasMultiple).greaterThan(destinationGasBalance)) { isIntentRequired = true; } } logger.debug("parseSimulation", { amount: simulation.amount.toFixed(), destinationGasBalance: destinationGasBalance, gas: gasMultiple.toFixed(), }); return { amount: simulation.amount, gas: gasMultiple, isIntentRequired, }; }; export { nativeRequestParseSimulation, tokenRequestParseSimulation };