UNPKG

@arcana/ca-sdk

Version:

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

80 lines (79 loc) 2.91 kB
import { FUEL_NETWORK_URL } from "../constants"; import { getLogger } from "../logger"; import { switchChain } from "../utils"; import { isERC20TokenTransfer, isNativeTokenTransfer } from "./evm/common"; import ERC20Transfer from "./evm/erc20"; import NativeTransfer from "./evm/native"; import { fixTx, isFuelNativeTransfer } from "./fuel/common"; import FuelNativeTransfer from "./fuel/native"; import FuelTokenTransfer from "./fuel/token"; const logger = getLogger(); var TxType; (function (TxType) { TxType[TxType["EVMERC20Transfer"] = 0] = "EVMERC20Transfer"; TxType[TxType["EVMNativeTransfer"] = 1] = "EVMNativeTransfer"; TxType[TxType["FuelTokenTransfer"] = 2] = "FuelTokenTransfer"; TxType[TxType["FuelNativeTransfer"] = 3] = "FuelNativeTransfer"; })(TxType || (TxType = {})); const handlers = { [TxType.EVMERC20Transfer]: ERC20Transfer, [TxType.EVMNativeTransfer]: NativeTransfer, [TxType.FuelNativeTransfer]: FuelNativeTransfer, [TxType.FuelTokenTransfer]: FuelTokenTransfer, }; const createHandler = (input) => { let handler = null; let processTx = async () => { }; if (input.evm.tx) { const tx = input.evm.tx; if (isERC20TokenTransfer(input)) { handler = handlers[TxType.EVMERC20Transfer]; } else if (isNativeTokenTransfer(input)) { handler = handlers[TxType.EVMNativeTransfer]; } processTx = async () => { if (!input.options.bridge && !input.options.skipTx) { logger.debug("in processTx", { tx: input.evm.tx, }); await switchChain(input.evm.client, input.chain); return input.evm.client.request({ method: "eth_sendTransaction", params: [tx], }); } }; } else if (input.fuel?.tx) { if (isFuelNativeTransfer(input.fuel.tx)) { handler = handlers[TxType.FuelNativeTransfer]; } else { handler = handlers[TxType.FuelTokenTransfer]; } processTx = async () => { if (!input.options.bridge && !input.options.skipTx) { logger.debug("in processTx", { address: input.fuel.address, provider: input.fuel.provider, tx: input.fuel?.tx, }); const tx = await fixTx(input.fuel.address, input.fuel.tx, input.fuel.provider); return input.fuel.connector.sendTransaction(input.fuel.address, tx, { provider: { url: FUEL_NETWORK_URL, }, }); } }; } else { throw Error("Unknown handler"); } return { handler: handler ? new handler(input) : null, processTx, }; }; export { createHandler };