@kaiachain/kss-bridges-celer
Version:
TypeScript client and use-cases for cBridge
68 lines • 4.92 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.poolTransfer = 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 Bridge_json_1 = __importDefault(require("../core/contract/abi/Bridge.sol/Bridge.json"));
const core_3 = require("../core");
async function poolTransfer(CBRIDGE_GATEWAY_URL, WALLET_ADDRESS, PRIVATE_KEY, SRC_CHAIN_ID, DST_CHAIN_ID, SRC_CHAIN_RPC, TOKEN_SYMBOL, AMOUNT, SLIPPAGE_TOLERANCE, CONFIRMATIONS) {
console.log("0. get transfer config for transaction");
const transferConfigs = await (0, core_1.getTransferConfigs)(CBRIDGE_GATEWAY_URL);
const bridgeAddress = (0, core_2.getBridgeContractAddress)(transferConfigs, SRC_CHAIN_ID);
if (!bridgeAddress)
throw new Error('SRC_CHAIN_ID not yet supported by cBridge');
const bridgeContract = (0, core_2.getContract)(bridgeAddress || '', Bridge_json_1.default.abi, SRC_CHAIN_RPC, PRIVATE_KEY);
// check if TOKEN_SYMBOL is present in both chain tokens list
const isPresentInSrc = !!(transferConfigs.chain_token[SRC_CHAIN_ID]?.token?.filter(chainToken => chainToken?.token?.symbol.toUpperCase() == TOKEN_SYMBOL.toUpperCase()).length > 0);
const isPresentInDst = !!(transferConfigs.chain_token[DST_CHAIN_ID]?.token?.filter(chainToken => chainToken?.token?.symbol.toUpperCase() == TOKEN_SYMBOL.toUpperCase()).length > 0);
if (!(isPresentInSrc && isPresentInDst)) {
throw new Error("Please choose valid TOKEN_SYMBOL that is supported by given pair of chains");
}
const { transferToken, value, toChain, nonce, fromChain } = (0, core_2.getTransferObject)(transferConfigs, SRC_CHAIN_ID, DST_CHAIN_ID, TOKEN_SYMBOL, AMOUNT);
/**Check user's on-chain token allowance for cBridge 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 cBridge contract");
const allowance = await (0, core_2.getAllowance)(WALLET_ADDRESS, bridgeAddress || '', transferToken?.token?.address || '', fromChain?.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_2.checkApprove)(allowance, AMOUNT, transferToken?.token, isNative);
if (needToApprove) {
console.log("Approving the tokens");
const approveTx = await (0, core_2.approve)(bridgeAddress || '', 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
console.log(`approveTx confirmed upto ${confirmationReceipt.confirmations} confirmations`);
}
const transferId = (0, core_2.getTransferId)(WALLET_ADDRESS, transferToken?.token?.address, value, toChain?.id, nonce, fromChain?.id);
console.log("TransferId:", transferId);
console.log("2. make an estimation for this transfer");
const estimateRequest = (0, core_1.estimateAmt)(SRC_CHAIN_ID, DST_CHAIN_ID, TOKEN_SYMBOL, WALLET_ADDRESS, SLIPPAGE_TOLERANCE, AMOUNT);
console.log("3. submit an on-chain send transaction");
const poolTransferTx = await (0, core_1.poolBasedTransfer)(bridgeContract, CBRIDGE_GATEWAY_URL, WALLET_ADDRESS, estimateRequest, { transferToken, fromChain, toChain, value, nonce }, SRC_CHAIN_RPC, PRIVATE_KEY, isNative);
if (!poolTransferTx)
throw new Error("Cannot submit transaction");
console.log("poolTransferTx hash: " + poolTransferTx.hash);
console.log("Waiting for the confirmations of poolTransferTx");
const confirmationReceipt = await poolTransferTx.wait(CONFIRMATIONS); // instead of waiting for fixed time, wait for some confirmations
console.log(`poolTransferTx 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, transferId);
return transferId;
}
exports.poolTransfer = poolTransfer;
//# sourceMappingURL=poolTransfer.js.map