UNPKG

@kaiachain/kss-bridges-celer

Version:
126 lines 7.75 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.burnCanonicalToken = void 0; const jsdom_1 = require("jsdom"); const { window } = new jsdom_1.JSDOM(); global.XMLHttpRequest = window.XMLHttpRequest; const dotenv_1 = require("dotenv"); (0, dotenv_1.config)(); const core_1 = require("../core"); const core_2 = require("../core"); const ethers_1 = require("ethers"); const PeggedTokenBridge_json_1 = __importDefault(require("../core/contract/abi/pegged/PeggedTokenBridge.sol/PeggedTokenBridge.json")); const PeggedTokenBridgeV2_json_1 = __importDefault(require("../core/contract/abi/pegged/PeggedTokenBridgeV2.sol/PeggedTokenBridgeV2.json")); const core_3 = require("../core"); async function burnCanonicalToken(CBRIDGE_GATEWAY_URL, SRC_CHAIN_RPC, WALLET_ADDRESS, PRIVATE_KEY, SRC_CHAIN_ID, DST_CHAIN_ID, TOKEN_SYMBOL, AMOUNT, CONFIRMATIONS) { console.log("0. get transfer config for transaction"); const transferConfigs = await (0, core_2.getTransferConfigs)(CBRIDGE_GATEWAY_URL); const peggedTokenBridgeAddress = transferConfigs.pegged_pair_configs.find(config => config.pegged_chain_id === SRC_CHAIN_ID && config.bridge_version < 2)?.pegged_burn_contract_addr; const peggedTokenBridge = (0, core_1.getContract)(peggedTokenBridgeAddress || '', PeggedTokenBridge_json_1.default.abi, SRC_CHAIN_RPC, PRIVATE_KEY); const peggedTokenBridgeV2Address = transferConfigs.pegged_pair_configs.find(config => config.pegged_chain_id === SRC_CHAIN_ID && config.bridge_version === 2)?.pegged_burn_contract_addr; const peggedTokenBridgeV2 = (0, core_1.getContract)(peggedTokenBridgeV2Address || '', PeggedTokenBridgeV2_json_1.default.abi, SRC_CHAIN_RPC, PRIVATE_KEY); if (!peggedTokenBridgeAddress && !peggedTokenBridgeV2Address) throw new Error('SRC_CHAIN_ID not yet supported by cBridge'); // check if its a valid pair transfer const isPairPresent = !!(transferConfigs.pegged_pair_configs.filter(chainToken => (chainToken.org_chain_id == DST_CHAIN_ID && chainToken.pegged_chain_id == SRC_CHAIN_ID && chainToken.pegged_token?.token?.symbol.toUpperCase() == TOKEN_SYMBOL)).length > 0); if (!isPairPresent) { throw new Error("Please choose valid TOKEN_SYMBOL that is supported by given pair of chains"); } const { transferToken, value, nonce } = (0, core_1.getTransferObject)(transferConfigs, SRC_CHAIN_ID, DST_CHAIN_ID, TOKEN_SYMBOL, AMOUNT); const pegConfig = (0, core_1.getPegConfig)(transferConfigs, SRC_CHAIN_ID, DST_CHAIN_ID, TOKEN_SYMBOL); const bridgeVersion = pegConfig?.bridge_version; const spenderAddress = bridgeVersion === 2 ? peggedTokenBridgeV2Address : peggedTokenBridgeAddress; /**Check user's on-chain token allowance for peggedtoken contract. * If the allowance is not enough for user token transfer, trigger the corresponding on-chain approve flow */ console.log("1. Checking Allowance of tokens to PeggedToken contract"); const allowance = await (0, core_1.getAllowance)(WALLET_ADDRESS, spenderAddress || "", transferToken?.token?.address || "", SRC_CHAIN_ID, transferToken?.token?.symbol, SRC_CHAIN_RPC, transferConfigs.pegged_pair_configs); let needToApprove = false; const isNative = transferConfigs.chains.filter(chain => (chain.id == SRC_CHAIN_ID && chain.gas_token_symbol.toUpperCase() == TOKEN_SYMBOL.toUpperCase())).length > 0; needToApprove = (0, core_1.checkApprove)(allowance, AMOUNT, transferToken?.token, isNative); if (needToApprove) { console.log("Approving the tokens"); const approveTx = await (0, core_1.approve)(spenderAddress || "", SRC_CHAIN_RPC, PRIVATE_KEY, transferToken?.token, AMOUNT); if (!approveTx) { throw new Error(`Cannot approve the token`); } else { needToApprove = false; } console.log("approveTx hash: " + approveTx.hash); console.log("Waiting for the confirmations of approveTx"); const confirmationReceipt = await approveTx.wait(CONFIRMATIONS); // instead of waiting for fixed time, wait for some confirmations if (confirmationReceipt.status != 1) { throw new Error(`approveTx reverted`); } console.log(`approveTx confirmed upto ${confirmationReceipt.confirmations} confirmations`); } try { if (bridgeVersion === 2) { const burnId = ethers_1.utils.solidityKeccak256([ "address", "address", "uint256", "uint64", "address", "uint64", "uint64", "address", ], [ WALLET_ADDRESS, transferToken?.token?.address, value?.toString(), DST_CHAIN_ID.toString(), WALLET_ADDRESS, nonce?.toString(), pegConfig?.pegged_chain_id.toString(), peggedTokenBridgeV2.address, ]); console.log("burnId:", burnId); console.log("3. submit an on-chain send transaction"); const burnTx = await (0, core_1.transactor)(peggedTokenBridgeV2.burn(transferToken?.token?.address, value, DST_CHAIN_ID, WALLET_ADDRESS, nonce, { gasLimit: 200000 }), SRC_CHAIN_RPC, PRIVATE_KEY); console.log("burnTx hash: " + burnTx.hash); console.log("Waiting for the confirmations of burnTx"); const confirmationReceipt = await burnTx.wait(CONFIRMATIONS); // instead of waiting for fixed time, wait for some confirmations if (confirmationReceipt.status != 1) { throw new Error(`burnTx reverted`); } console.log(`burnTx confirmed upto ${confirmationReceipt.confirmations} confirmations`); console.log("4. getTransferStatus for this transaction until the transfer is complete or needs a refund"); (0, core_3.statusTracker)(CBRIDGE_GATEWAY_URL, burnId); return burnId; } else { const burnId = ethers_1.utils.solidityKeccak256(["address", "address", "uint256", "address", "uint64", "uint64"], [ WALLET_ADDRESS, transferToken?.token?.address, value?.toString(), WALLET_ADDRESS, nonce?.toString(), pegConfig?.pegged_chain_id.toString(), ]); console.log("burnId:", burnId); console.log("3. submit an on-chain send transaction"); const burnTx = await (0, core_1.transactor)(peggedTokenBridge.burn(transferToken?.token?.address, value, WALLET_ADDRESS, nonce, { gasLimit: 200000 }), SRC_CHAIN_RPC, PRIVATE_KEY); console.log("burnTx hash: " + burnTx.hash); console.log("Waiting for the confirmations of burnTx"); const confirmationReceipt = await burnTx.wait(CONFIRMATIONS); // instead of waiting for fixed time, wait for some confirmations if (confirmationReceipt.status != 1) { throw new Error(`approveTx reverted`); } console.log(`burnTx confirmed upto ${confirmationReceipt.confirmations} confirmations`); console.log("4. getTransferStatus for this transaction until the transfer is complete or needs a refund"); (0, core_3.statusTracker)(CBRIDGE_GATEWAY_URL, burnId); return burnId; } } catch (error) { throw new Error(`-Error: ${error}`); } } exports.burnCanonicalToken = burnCanonicalToken; //# sourceMappingURL=burnCanonicalToken.js.map