@kaiachain/kss-bridges-celer
Version:
TypeScript client and use-cases for cBridge
126 lines • 7.75 kB
JavaScript
;
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