@tatumio/erc20-connector
Version:
ERC20 Connector for Tatum API
253 lines (252 loc) • 13.1 kB
JavaScript
"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;