@arcana/ca-sdk
Version:
Arcana Network's chain abstraction SDK for unified balance in Web3 apps
79 lines (78 loc) • 2.88 kB
JavaScript
import { FUEL_NETWORK_URL } from "../constants";
import { getLogger } from "../logger";
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 input.evm.client.switchChain({ id: input.chain.id });
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 };