@arcana/ca-sdk
Version:
Arcana Network's chain abstraction SDK for unified balance in Web3 apps
76 lines (75 loc) • 2.79 kB
JavaScript
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 };