UNPKG

@tatumio/nft-connector

Version:

NFT Connector for Tatum API

767 lines (766 loc) 37.8 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.NftService = void 0; const axios_1 = __importDefault(require("axios")); const bignumber_js_1 = __importDefault(require("bignumber.js")); const fcl = __importStar(require("@onflow/fcl")); const sdk = __importStar(require("@onflow/sdk")); const tatum_solana_1 = require("@tatumio/tatum-solana"); const tatum_kcs_1 = require("@tatumio/tatum-kcs"); const js_1 = require("@metaplex/js"); const NftError_1 = require("./NftError"); const crypto_1 = require("@harmony-js/crypto"); const erc721Provenance_abi_1 = __importDefault(require("@tatumio/tatum/dist/src/contracts/erc721Provenance/erc721Provenance_abi")); const erc721_abi_1 = __importDefault(require("@tatumio/tatum/dist/src/contracts/erc721/erc721_abi")); const web3_1 = __importDefault(require("web3")); const flow_1 = require("@tatumio/tatum/dist/src/transaction/flow"); const one_1 = require("@tatumio/tatum/dist/src/transaction/one"); const tatum_1 = require("@tatumio/tatum"); class NftService { constructor(logger) { this.logger = logger; } async getMetadataErc721(chain, token, contractAddress, account, nonce) { if (chain === tatum_1.Currency.FLOW) { if (!account) { throw new NftError_1.NftError(`Account address must be present.`, 'nft.erc721.failed'); } try { return { data: await tatum_1.getFlowNftMetadata(await this.isTestnet(), account, token, contractAddress) }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } else if (chain === tatum_1.Currency.TRON) { const client = await this.getClient(chain, await this.isTestnet()); client.setAddress(contractAddress); const c = await client.contract().at(contractAddress); try { return { data: await c.tokenURI(token).call() }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } else if (chain === tatum_1.Currency.EGLD) { return await this.getElrondNftDataForAddress(chain, token, contractAddress, nonce, await this.isTestnet()); } else if (chain === tatum_1.Currency.SOL.toString()) { const connection = new js_1.Connection((await this.getNodesUrl(tatum_1.Currency.SOL, await this.isTestnet()))[0]); const metadata = await js_1.programs.metadata.Metadata.findMany(connection, { mint: contractAddress }); if ((metadata === null || metadata === void 0 ? void 0 : metadata.length) > 0) { return { onchainData: metadata[0].data }; } throw new NftError_1.NftError(`Unable to obtain information for token.`, 'nft.erc721.failed'); } const c = new (await this.getClient(chain, await this.isTestnet())).eth.Contract(erc721_abi_1.default, chain === tatum_1.Currency.ONE ? new crypto_1.HarmonyAddress(contractAddress).basicHex : contractAddress); try { return { data: await c.methods.tokenURI(token).call() }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } async getRoyaltyErc721(chain, token, contractAddress, nonce) { if (chain === tatum_1.Currency.FLOW) { throw new NftError_1.NftError(`Unsupported chain ${chain}.`, 'unsupported.chain'); } else if (chain === tatum_1.Currency.TRON) { const client = await this.getClient(chain, await this.isTestnet()); client.setAddress(contractAddress); const c = await client.contract().at(contractAddress); try { const [addresses, values] = await Promise.all([c.tokenCashbackRecipients(token).call(), c.tokenCashbackValues(token).call()]); return { addresses: addresses.map(a => tatum_1.convertAddressFromHex(a)), values: values.map(c => new bignumber_js_1.default(c._hex).dividedBy(1e6).toString(10)) }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } else if (chain === tatum_1.Currency.EGLD) { const data = await this.getElrondNftDataForAddress(chain, token, contractAddress, nonce, await this.isTestnet()); return { addresses: [token], values: [data === null || data === void 0 ? void 0 : data.royalties] }; } else if (chain === tatum_1.Currency.SOL.toString()) { const connection = new js_1.Connection((await this.getNodesUrl(tatum_1.Currency.SOL, await this.isTestnet()))[0]); const metadata = await js_1.programs.metadata.Metadata.findMany(connection, { mint: contractAddress }); if ((metadata === null || metadata === void 0 ? void 0 : metadata.length) > 0) { const creators = metadata[0].data.data.creators || []; return { addresses: creators.map(c => c.address), values: creators.map(c => c.share.toString()) }; } throw new NftError_1.NftError(`Unable to obtain information for token.`, 'nft.erc721.failed'); } const c = new (await this.getClient(chain, await this.isTestnet())).eth.Contract(erc721_abi_1.default, chain === tatum_1.Currency.ONE ? new crypto_1.HarmonyAddress(contractAddress).basicHex : contractAddress); try { const [addresses, values] = await Promise.all([c.methods.tokenCashbackRecipients(token).call(), c.methods.tokenCashbackValues(token, `0x${new bignumber_js_1.default(1).multipliedBy(1e18).toString(16)}`).call()]); return { addresses, values: values.map(c => new bignumber_js_1.default(c).dividedBy(1e18).toString(10)) }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } async getProvenanceData(chain, contractAddress, tokenId) { try { const testnet = await this.isTestnet(); const provider = (await this.getNodesUrl(chain, testnet))[0]; const body = new tatum_1.SmartContractReadMethodInvocation(); const result = []; let txData; body.contractAddress = contractAddress; body.params = [tokenId]; body.methodName = 'getTokenData'; body.methodABI = erc721Provenance_abi_1.default.find((a) => a.name === 'getTokenData'); switch (chain) { case tatum_1.Currency.ETH: txData = await tatum_1.sendSmartContractReadMethodInvocationTransaction(body); break; case tatum_1.Currency.CELO: txData = await tatum_1.sendCeloSmartContractReadMethodInvocationTransaction(testnet, body, provider); break; case tatum_1.Currency.BSC: txData = await tatum_1.sendBscSmartContractReadMethodInvocationTransaction(body); break; case tatum_1.Currency.ONE: txData = await tatum_1.sendOneSmartContractReadMethodInvocationTransaction(testnet, body, provider); break; case tatum_1.Currency.MATIC: txData = await tatum_1.sendPolygonSmartContractReadMethodInvocationTransaction(testnet, body, provider); break; default: throw new NftError_1.NftError(`Unsupported chain ${chain}.`, 'unsupported.chain'); } for (let i = 0; i < txData.data.length; i++) { const t = txData.data[i].split("'''###'''", 2); result.push({ provenanceData: t[0], tokenPrice: t[1] }); } return result; } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } async getTokensOfOwner(chain, address, contractAddress, nonce) { var _a; if (chain === tatum_1.Currency.FLOW) { try { return (await tatum_1.getFlowNftTokenByAddress(await this.isTestnet(), address, contractAddress)).map(e => `${e}`); } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } else if (chain === tatum_1.Currency.TRON) { const client = await this.getClient(chain, await this.isTestnet()); client.setAddress(contractAddress); const c = await client.contract().at(contractAddress); try { return { data: (await c.tokensOfOwner(address).call()).map(c => new bignumber_js_1.default(c._hex).toString(10)) }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } else if (chain === tatum_1.Currency.EGLD) { return { data: [(_a = (await this.getElrondNftDataForAddress(chain, address, contractAddress, nonce, await this.isTestnet()))) === null || _a === void 0 ? void 0 : _a.creator] }; } const c = new (await this.getClient(chain, await this.isTestnet())).eth.Contract(erc721_abi_1.default, chain === tatum_1.Currency.ONE ? new crypto_1.HarmonyAddress(contractAddress).basicHex : contractAddress); try { return { data: await c.methods.tokensOfOwner(address).call() }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError(`Unable to obtain information for token. ${e}`, 'nft.erc721.failed'); } } async getContractAddress(chain, txId) { if (chain === tatum_1.Currency.FLOW) { try { await this.getClient(chain, await this.isTestnet()); const tx = await sdk.send(sdk.build([sdk.getTransaction(txId)])); const { args } = await sdk.decode(tx); if (args && args.length) { return { contractAddress: args[0].value }; } } catch (e) { this.logger.error(e); } throw new NftError_1.NftError('Transaction not found. Possible not exists or is still pending.', 'tx.not.found'); } else if (chain === tatum_1.Currency.TRON) { try { const tx = await (await this.getClient(chain, await this.isTestnet())).trx.getTransactionInfo(txId); return { contractAddress: tatum_1.convertAddressFromHex(tx.contract_address) }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError('Transaction not found. Possible not exists or is still pending.', 'tx.not.found'); } } else if (chain === tatum_1.Currency.EGLD) { throw new NftError_1.NftError(`Unsupported chain ${chain}.`, 'unsupported.chain'); } try { const web3 = await this.getClient(chain, await this.isTestnet()); const { contractAddress } = await web3.eth.getTransactionReceipt(txId); return { contractAddress }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError('Transaction not found. Possible not exists or is still pending.', 'tx.not.found'); } } async getTransaction(chain, txId) { if (chain === tatum_1.Currency.FLOW) { try { await this.getClient(chain, await this.isTestnet()); const tx = await sdk.send(sdk.build([sdk.getTransaction(txId)])); const decoded = await sdk.decode(tx); try { const txStatus = await sdk.send(sdk.build([sdk.getTransactionStatus(txId)])); return { ...decoded, ...await sdk.decode(txStatus) }; } catch (e) { this.logger.warn(e); } return decoded; } catch (e) { this.logger.error(e); } throw new NftError_1.NftError('Transaction not found. Possible not exists or is still pending.', 'tx.not.found'); } else if (chain === tatum_1.Currency.TRON) { try { return await (await this.getClient(chain, await this.isTestnet())).trx.getTransactionInfo(txId); } catch (e) { this.logger.error(e); throw new NftError_1.NftError('Transaction not found. Possible not exists or is still pending.', 'tx.not.found'); } } else if (chain === tatum_1.Currency.EGLD) { try { return await tatum_1.egldGetTransaction(txId); } catch (e) { this.logger.error(e); throw new NftError_1.NftError('Transaction not found. Possible not exists or is still pending.', 'tx.not.found'); } } try { const web3 = await this.getClient(chain, await this.isTestnet()); const { r, s, v, hash, ...transaction } = (await web3.eth.getTransaction(txId)); let receipt = undefined; try { receipt = await web3.eth.getTransactionReceipt(hash); } catch (_) { transaction.transactionHash = hash; } return { ...transaction, ...receipt }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError('Transaction not found. Possible not exists or is still pending.', 'tx.not.found'); } } async transferErc721(body) { const testnet = await this.isTestnet(); let txData; const { chain } = body; const provider = (await this.getNodesUrl(chain, testnet))[0]; switch (chain) { case tatum_1.Currency.ETH: txData = await tatum_1.prepareEthTransferErc721SignedTransaction(body, provider); break; case tatum_1.Currency.ONE: txData = await one_1.prepareOneTransfer721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.MATIC: txData = await tatum_1.preparePolygonTransferErc721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.KCS: txData = await tatum_kcs_1.prepareTransferErc721SignedTransaction(body, provider); break; case tatum_1.Currency.SOL.toString(): txData = await tatum_solana_1.transferNft(body, provider); if (body.signatureId) { txData = JSON.stringify(txData); } break; case tatum_1.Currency.TRON: await this.getClient(chain, await this.isTestnet()); txData = await tatum_1.prepareTronTransferTrc721SignedTransaction(testnet, body); break; case tatum_1.Currency.BSC: txData = await tatum_1.prepareBscTransferBep721SignedTransaction(body, provider); break; case tatum_1.Currency.CELO: txData = await tatum_1.prepareCeloTransferErc721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldTransferNftSignedTransaction(body, provider); break; case tatum_1.Currency.FLOW: if (body.signatureId) { txData = JSON.stringify({ type: flow_1.FlowTxType.TRANSFER_NFT, body }); } else { return this.wrapFlowCall(async (proposer, payer) => await tatum_1.sendFlowNftTransferToken(testnet, body, proposer, payer)); } break; case tatum_1.Currency.ALGO: txData = await tatum_1.prepareAlgoTransferNFTSignedTransaction(testnet, body, provider); break; default: throw new NftError_1.NftError(`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 mintErc721(body) { const testnet = await this.isTestnet(); let txData; const { chain } = body; const provider = (await this.getNodesUrl(chain, testnet))[0]; switch (chain) { case tatum_1.Currency.ETH: { const builtInBody = await this.getMintBuiltInData(body); if (body.provenance) { txData = await tatum_1.prepareEthMintErc721ProvenanceSignedTransaction((builtInBody || body), provider); } else { if (!body.authorAddresses) { txData = await tatum_1.prepareEthMintErc721SignedTransaction((builtInBody || body), provider); } else { txData = await tatum_1.prepareEthMintCashbackErc721SignedTransaction((builtInBody || body), provider); } } break; } case tatum_1.Currency.MATIC: { const builtInBody = await this.getMintBuiltInData(body); if (body.provenance) { txData = await tatum_1.preparePolygonMintErc721ProvenanceSignedTransaction(testnet, (builtInBody || body), provider); } else { if (!body.authorAddresses) { txData = await tatum_1.preparePolygonMintErc721SignedTransaction(testnet, (builtInBody || body), provider); } else { txData = await tatum_1.preparePolygonMintCashbackErc721SignedTransaction(testnet, (builtInBody || body), provider); } } break; } case tatum_1.Currency.KCS: { const builtInBody = await this.getMintBuiltInData(body); if (body.provenance) { } else { if (!body.authorAddresses) { txData = await tatum_kcs_1.prepareMintErc721SignedTransaction((builtInBody || body), provider); } else { } } break; } case tatum_1.Currency.ONE: { const builtInBody = await this.getMintBuiltInData(body); if (body.provenance) { txData = await tatum_1.prepareOneMint721ProvenanceSignedTransaction(testnet, (builtInBody || body), provider); } else { if (!body.authorAddresses) { txData = await one_1.prepareOneMint721SignedTransaction(testnet, (builtInBody || body), provider); } else { txData = await one_1.prepareOneMintCashback721SignedTransaction(testnet, (builtInBody || body), provider); } } break; } case tatum_1.Currency.BSC: { const builtInBody = await this.getMintBuiltInData(body); if (body.provenance) { txData = await tatum_1.prepareBscMintBep721ProvenanceSignedTransaction((builtInBody || body), provider); } else { if (!body.authorAddresses) { txData = await tatum_1.prepareBscMintBep721SignedTransaction((builtInBody || body), provider); } else { txData = await tatum_1.prepareBscMintBepCashback721SignedTransaction((builtInBody || body), provider); } } break; } case tatum_1.Currency.TRON: await this.getClient(tatum_1.Currency.TRON, await this.isTestnet()); if (!body.authorAddresses) { txData = await tatum_1.prepareTronMintTrc721SignedTransaction(testnet, body); } else { txData = await tatum_1.prepareTronMintCashbackTrc721SignedTransaction(testnet, body); } break; case tatum_1.Currency.CELO: { const builtInBody = await this.getMintBuiltInData(body); if (body.provenance) { txData = await tatum_1.prepareCeloMintErc721ProvenanceSignedTransaction(testnet, (builtInBody || body), provider); } else { if (!body.authorAddresses) { txData = await tatum_1.prepareCeloMintErc721SignedTransaction(testnet, (builtInBody || body), provider); } else { txData = await tatum_1.prepareCeloMintCashbackErc721SignedTransaction(testnet, (builtInBody || body), provider); } } break; } case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldCreateNftOrSftSignedTransaction(body, provider); break; case tatum_1.Currency.SOL: txData = await tatum_solana_1.mintNft(body, provider); if (body.signatureId) { txData = JSON.stringify(txData); } break; case tatum_1.Currency.FLOW: if (body.signatureId) { txData = JSON.stringify({ type: flow_1.FlowTxType.MINT_NFT, body }); } else { return this.wrapFlowCall(async (proposer, payer) => await tatum_1.sendFlowNftMintToken(testnet, body, proposer, payer)); } break; default: throw new NftError_1.NftError(`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 addMinter(body) { const testnet = await this.isTestnet(); const { chain } = body; const provider = (await this.getNodesUrl(chain, testnet))[0]; const txData = await tatum_1.prepareAddNFTMinter(testnet, body, provider); if (body.signatureId) { return { signatureId: await this.storeKMSTransaction(txData, chain, [body.signatureId], body.index) }; } else { return this.broadcast(chain, txData); } } async mintMultipleErc721(body) { const testnet = await this.isTestnet(); let txData; const { chain } = body; const provider = (await this.getNodesUrl(chain, testnet))[0]; switch (chain) { case tatum_1.Currency.ETH: if (body.provenance) { txData = await tatum_1.prepareEthMintMultipleErc721ProvenanceSignedTransaction(body, provider); } else { if (!body.authorAddresses) { txData = await tatum_1.prepareEthMintMultipleErc721SignedTransaction(body, provider); } else { txData = await tatum_1.prepareEthMintMultipleCashbackErc721SignedTransaction(body, provider); } } break; case tatum_1.Currency.MATIC: if (body.provenance) { txData = await tatum_1.preparePolygonMintMultipleErc721ProvenanceSignedTransaction(testnet, body, provider); } else { if (!body.authorAddresses) { txData = await tatum_1.preparePolygonMintMultipleErc721SignedTransaction(testnet, body, provider); } else { txData = await tatum_1.preparePolygonMintMultipleCashbackErc721SignedTransaction(testnet, body, provider); } } break; case tatum_1.Currency.ONE: if (body.provenance) { txData = await tatum_1.prepareOneMintMultiple721ProvenanceSignedTransaction(testnet, body, provider); } else { if (!body.authorAddresses) { txData = await one_1.prepareOneMintMultiple721SignedTransaction(testnet, body, provider); } else { txData = await one_1.prepareOneMintMultipleCashback721SignedTransaction(testnet, body, provider); } } break; case tatum_1.Currency.TRON: await this.getClient(chain, await this.isTestnet()); if (!body.authorAddresses) { txData = await tatum_1.prepareTronMintMultipleTrc721SignedTransaction(testnet, body); } else { throw new NftError_1.NftError(`Unsupported chain ${chain}.`, 'unsupported.chain'); } break; case tatum_1.Currency.BSC: if (body.provenance) { txData = await tatum_1.prepareBscMintMultipleBep721ProvenanceSignedTransaction(body, provider); } else { if (!body.authorAddresses) { txData = await tatum_1.prepareBscMintMultipleBep721SignedTransaction(body, provider); } else { txData = await tatum_1.prepareBscMintMultipleCashbackBep721SignedTransaction(body, provider); } } break; case tatum_1.Currency.CELO: if (body.provenance) { txData = await tatum_1.prepareCeloMintMultipleErc721ProvenanceSignedTransaction(testnet, body, provider); } else { if (!body.authorAddresses) { txData = await tatum_1.prepareCeloMintMultipleErc721SignedTransaction(testnet, body, provider); } else { txData = await tatum_1.prepareCeloMintMultipleCashbackErc721SignedTransaction(testnet, body, provider); } } break; case tatum_1.Currency.EGLD: throw new NftError_1.NftError(`Unsupported chain ${chain}.`, 'unsupported.chain'); case tatum_1.Currency.FLOW: if (body.signatureId) { txData = JSON.stringify({ type: flow_1.FlowTxType.MINT_MULTIPLE_NFT, body }); } else { return this.wrapFlowCall(async (proposer, payer) => await tatum_1.sendFlowNftMintMultipleToken(testnet, body, proposer, payer)); } break; default: throw new NftError_1.NftError(`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 updateCashbackForAuthor(body) { const testnet = await this.isTestnet(); let txData; const { chain } = body; switch (chain) { case tatum_1.Currency.ETH: txData = await tatum_1.prepareEthUpdateCashbackForAuthorErc721SignedTransaction(body, (await this.getNodesUrl(chain, testnet))[0]); break; case tatum_1.Currency.MATIC: txData = await tatum_1.preparePolygonUpdateCashbackForAuthorErc721SignedTransaction(testnet, body, (await this.getNodesUrl(chain, testnet))[0]); break; case tatum_1.Currency.KCS: txData = await tatum_kcs_1.prepareUpdateCashbackForAuthorErc721SignedTransaction(body, (await this.getNodesUrl(chain, testnet))[0]); break; case tatum_1.Currency.ONE: txData = await one_1.prepareOneUpdateCashbackForAuthor721SignedTransaction(testnet, body, (await this.getNodesUrl(chain, testnet))[0]); break; case tatum_1.Currency.TRON: await this.getClient(chain, await this.isTestnet()); txData = await tatum_1.prepareTronUpdateCashbackForAuthorTrc721SignedTransaction(testnet, body); break; case tatum_1.Currency.BSC: txData = await tatum_1.prepareBscUpdateCashbackForAuthorErc721SignedTransaction(body, (await this.getNodesUrl(chain, testnet))[0]); break; case tatum_1.Currency.CELO: txData = await tatum_1.prepareCeloUpdateCashbackForAuthorErc721SignedTransaction(testnet, body, (await this.getNodesUrl(chain, testnet))[0]); break; case tatum_1.Currency.EGLD: throw new NftError_1.NftError(`Unsupported chain ${chain}.`, 'unsupported.chain'); default: throw new NftError_1.NftError(`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 burnErc721(body) { const testnet = await this.isTestnet(); let txData; const { chain } = body; const provider = (await this.getNodesUrl(chain, testnet))[0]; switch (chain) { case tatum_1.Currency.ETH: txData = await tatum_1.prepareEthBurnErc721SignedTransaction(body, provider); break; case tatum_1.Currency.MATIC: txData = await tatum_1.preparePolygonBurnErc721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.KCS: txData = await tatum_kcs_1.prepareBurnErc721SignedTransaction(body, provider); break; case tatum_1.Currency.ONE: txData = await one_1.prepareOneBurn721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.TRON: await this.getClient(chain, await this.isTestnet()); txData = await tatum_1.prepareTronBurnTrc721SignedTransaction(testnet, body); break; case tatum_1.Currency.BSC: txData = await tatum_1.prepareBscBurnBep721SignedTransaction(body, provider); break; case tatum_1.Currency.CELO: txData = await tatum_1.prepareCeloBurnErc721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldAddOrBurnNftQuantitySignedTransaction(body, provider); break; case tatum_1.Currency.FLOW: if (body.signatureId) { txData = JSON.stringify({ type: flow_1.FlowTxType.BURN_NFT, body }); } else { return this.wrapFlowCall(async (proposer, payer) => await tatum_1.sendFlowNftBurnToken(testnet, body, proposer, payer)); } break; case tatum_1.Currency.ALGO: txData = await tatum_1.prepareAlgoBurnNFTSignedTransaction(testnet, body, provider); break; default: throw new NftError_1.NftError(`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 deployErc721(body) { const testnet = await this.isTestnet(); let txData; const { chain } = body; const provider = (await this.getNodesUrl(chain, testnet))[0]; switch (chain) { case tatum_1.Currency.ETH: txData = await tatum_1.prepareEthDeployErc721SignedTransaction(body, provider); break; case tatum_1.Currency.MATIC: txData = await tatum_1.preparePolygonDeployErc721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.KCS: txData = await tatum_kcs_1.prepareDeployErc721SignedTransaction(body, provider); break; case tatum_1.Currency.ONE: txData = await one_1.prepareOneDeploy721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.BSC: txData = await tatum_1.prepareBscDeployBep721SignedTransaction(body, provider); break; case tatum_1.Currency.TRON: await this.getClient(chain, await this.isTestnet()); txData = await tatum_1.prepareTronDeployTrc721SignedTransaction(testnet, body); break; case tatum_1.Currency.CELO: txData = await tatum_1.prepareCeloDeployErc721SignedTransaction(testnet, body, provider); break; case tatum_1.Currency.EGLD: txData = await tatum_1.prepareEgldDeployNftOrSftSignedTransaction(body, provider); break; case tatum_1.Currency.FLOW: return await this.deployFlowNft(testnet, body); break; case tatum_1.Currency.ALGO: txData = await tatum_1.prepareAlgoCreateNFTSignedTransaction(testnet, body, provider); break; default: throw new NftError_1.NftError(`Unsupported chain ${chain}.`, 'unsupported.chain'); } if (body.signatureId) { return { signatureId: await this.storeKMSTransaction(txData, chain, [body.signatureId], body.index) }; } else { return await this.broadcast(chain, txData); } } async getElrondNftDataForAddress(chain, address, contractAddress, nonce, testnet) { const provider = (await this.getNodesUrl(chain, testnet))[0]; try { const { tokenData } = (await axios_1.default.get(`${provider}/address/${address}/nft/${contractAddress}/nonce/${nonce}`, { headers: { 'Content-Type': 'application/json' } })).data.data; return { data: tokenData }; } catch (e) { this.logger.error(e); throw new NftError_1.NftError('Get NFT data for an address not found.', 'nft.not.found'); } } async getClient(chain, testnet) { const url = (await this.getNodesUrl(chain, testnet))[0]; if (chain === tatum_1.Currency.FLOW) { fcl.config().put('accessNode.api', url); return; } else if (chain === tatum_1.Currency.TRON) { return this.getTronClient(testnet); } else if (chain === tatum_1.Currency.ALGO) { return await tatum_1.getAlgoClient(await this.isTestnet(), (await this.getNodesUrl(chain, testnet))[0]); } return new web3_1.default(url); } } exports.NftService = NftService;