UNPKG

@tatumio/erc20-connector

Version:

ERC20 Connector for Tatum API

253 lines (252 loc) 13.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Erc20Service = void 0; const web3_1 = __importDefault(require("web3")); const Erc20Error_1 = require("./Erc20Error"); const crypto_1 = require("@harmony-js/crypto"); const tatum_1 = require("@tatumio/tatum"); const token_abi_1 = __importDefault(require("@tatumio/tatum/dist/src/contracts/erc20/token_abi")); const tatum_kcs_1 = require("@tatumio/tatum-kcs"); class Erc20Service { constructor(logger) { this.logger = logger; } async getFirstNodeUrl(chain, testnet) { const nodes = await this.getNodesUrl(chain, testnet); if (nodes.length === 0) { new Erc20Error_1.Erc20Error('Nodes url array must have at least one element.', 'erc20.nodes.url'); } return nodes[0]; } async getClient(chain, testnet) { if ([tatum_1.Currency.ETH, tatum_1.Currency.BSC, tatum_1.Currency.CELO, tatum_1.Currency.XDC, tatum_1.Currency.ONE, tatum_1.Currency.MATIC, tatum_1.Currency.KCS].includes(chain)) { return new web3_1.default((await this.getFirstNodeUrl(chain, testnet))); } else if (chain === tatum_1.Currency.ALGO) { return await tatum_1.getAlgoClient(await this.isTestnet(), await this.getFirstNodeUrl(chain, testnet)); } throw new Erc20Error_1.Erc20Error(`Unsupported chain ${chain}.`, 'unsupported.chain'); } async getErc20Balance(chain, address, contractAddress) { let contractOrAddress; switch (chain) { case tatum_1.Currency.ETH: case tatum_1.Currency.BSC: case tatum_1.Currency.CELO: case tatum_1.Currency.MATIC: case tatum_1.Currency.KCS: contractOrAddress = contractAddress; break; case tatum_1.Currency.ONE: contractOrAddress = new crypto_1.HarmonyAddress(contractAddress).basicHex; break; case tatum_1.Currency.EGLD: return { balance: `${await tatum_1.egldGetAccountErc20Balance(address, contractAddress)}` }; case tatum_1.Currency.XDC: contractOrAddress = tatum_1.fromXdcAddress(contractAddress); break; default: throw new Erc20Error_1.Erc20Error(`Unsupported chain ${chain}.`, 'unsupported.chain'); } const _address = chain === tatum_1.Currency.XDC ? tatum_1.fromXdcAddress(address) : address; const client = await this.getClient(chain, await this.isTestnet()); const contract = new client.eth.Contract(token_abi_1.default, contractOrAddress); return { balance: await contract.methods.balanceOf(_address).call() }; } async transferErc20(body) { const testnet = await this.isTestnet(); const { chain, ..._body } = body; let txData; switch (chain) { case tatum_1.Currency.ETH: if (_body.currency) { txData = await tatum_1.prepareEthOrErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); } else { txData = await tatum_1.prepareCustomErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); } break; case tatum_1.Currency.ONE: txData = await tatum_1.prepareOneTransfer20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.MATIC: txData = await tatum_1.preparePolygonTransferErc20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.KCS: txData = await tatum_kcs_1.prepareTransferErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.BSC: txData = await tatum_1.prepareCustomBep20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.CELO: txData = await tatum_1.prepareCeloTransferErc20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldTransferEsdtSignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.XDC: txData = await tatum_1.prepareXdcCustomErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.ALGO: txData = await tatum_1.prepareAlgoTransferFTSignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; default: throw new Erc20Error_1.Erc20Error(`Unsupported chain ${chain}.`, 'unsupported.chain'); } if (body.signatureId) { return { signatureId: await this.storeKMSTransaction(txData, chain, [body.signatureId], body.index) }; } else { return this.broadcast(chain, txData); } } async burnErc20(body) { const testnet = await this.isTestnet(); const { chain, ..._body } = body; let txData; switch (chain) { case tatum_1.Currency.ETH: txData = await tatum_1.prepareEthBurnErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.ONE: txData = await tatum_1.prepareOneBurn20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.MATIC: txData = await tatum_1.preparePolygonBurnErc20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.KCS: txData = await tatum_kcs_1.prepareBurnErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.BSC: txData = await tatum_1.prepareBurnBep20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.CELO: txData = await tatum_1.prepareCeloBurnErc20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldBurnEsdtSignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.XDC: txData = await tatum_1.prepareXdcBurnErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.ALGO: txData = await tatum_1.prepareAlgoBurnFTSignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; default: throw new Erc20Error_1.Erc20Error(`Unsupported chain ${chain}.`, 'unsupported.chain'); } if (body.signatureId) { return { signatureId: await this.storeKMSTransaction(txData, chain, [body.signatureId], body.index) }; } else { return this.broadcast(chain, txData); } } async mintErc20(body) { const testnet = await this.isTestnet(); const { chain, ..._body } = body; let txData; switch (chain) { case tatum_1.Currency.ETH: txData = await tatum_1.prepareEthMintErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.ONE: txData = await tatum_1.prepareOneMint20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.MATIC: txData = await tatum_1.preparePolygonMintErc20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.KCS: txData = await tatum_kcs_1.prepareMintErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.BSC: txData = await tatum_1.prepareMintBep20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.CELO: txData = await tatum_1.prepareCeloMintErc20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldMintEsdtSignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.XDC: txData = await tatum_1.prepareXdcMintErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; default: throw new Erc20Error_1.Erc20Error(`Unsupported chain ${chain}.`, 'unsupported.chain'); } if (body.signatureId) { return { signatureId: await this.storeKMSTransaction(txData, chain, [body.signatureId], body.index) }; } else { return this.broadcast(chain, txData); } } async deployErc20(body) { const testnet = await this.isTestnet(); const { chain, ..._body } = body; let txData; switch (chain) { case tatum_1.Currency.ETH: txData = await tatum_1.prepareDeployErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.ONE: txData = await tatum_1.prepareOneDeploy20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.MATIC: txData = await tatum_1.preparePolygonDeployErc20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.KCS: txData = await tatum_kcs_1.prepareDeployErc20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.BSC: txData = await tatum_1.prepareDeployBep20SignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.CELO: txData = await tatum_1.prepareCeloDeployErc20SignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldDeployEsdtSignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.XDC: const tx = { ..._body, address: tatum_1.fromXdcAddress(_body.address), }; txData = await tatum_1.prepareXdcDeployErc20SignedTransaction(tx, (await this.getFirstNodeUrl(chain, testnet))); break; case tatum_1.Currency.ALGO: txData = await tatum_1.prepareAlgoCreateFTSignedTransaction(testnet, _body, (await this.getFirstNodeUrl(chain, testnet))); break; default: throw new Erc20Error_1.Erc20Error(`Unsupported chain ${chain}.`, 'unsupported.chain'); } if (body.signatureId) { return { signatureId: await this.storeKMSTransaction(txData, chain, [body.signatureId], body.index) }; } else { return this.broadcast(chain, txData); } } async approveErc20(body) { const testnet = await this.isTestnet(); const { chain, ..._body } = body; let txData; switch (chain) { case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldFreezeOrWipeOrOwvershipEsdtSignedTransaction(_body, (await this.getFirstNodeUrl(chain, testnet))); break; default: txData = await tatum_1.prepareAuctionApproveErc20Transfer(testnet, body, await this.getFirstNodeUrl(body.chain, testnet)); } if (body.signatureId) { return { signatureId: await this.storeKMSTransaction(txData, body.chain, [body.signatureId], body.index) }; } else { return this.broadcast(body.chain, txData); } } } exports.Erc20Service = Erc20Service;