UNPKG

@tatumio/tatum-v1

Version:

Tatum API client allows browsers and Node.js clients to interact with Tatum API.

617 lines 62.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.sendXdcDeployErc721Transaction = exports.sendXdcErc721Transaction = exports.sendXdcUpdateCashbackForAuthorErc721Transaction = exports.sendXdcBurnErc721Transaction = exports.sendXdcMintMultipleErc721Transaction = exports.sendXdcMintMultipleCashbackErc721Transaction = exports.sendXdcMintErcCashback721Transaction = exports.sendXdcMintErc721Transaction = exports.sendXdcSmartContractMethodInvocationTransaction = exports.sendXdcDeployErc20Transaction = exports.sendXdcCustomErc20Transaction = exports.sendXdcOrErc20Transaction = exports.sendXdcStoreDataTransaction = exports.sendXdcSmartContractReadMethodInvocationTransaction = exports.prepareXdcDeployErc721SignedTransaction = exports.prepareXdcUpdateCashbackForAuthorErc721SignedTransaction = exports.prepareXdcTransferErc721SignedTransaction = exports.prepareXdcBurnErc721SignedTransaction = exports.prepareXdcMintMultipleErc721SignedTransaction = exports.prepareXdcMintMultipleCashbackErc721SignedTransaction = exports.prepareXdcMintErcCashback721SignedTransaction = exports.prepareXdcMintErc721SignedTransaction = exports.prepareXdcSmartContractWriteMethodInvocation = exports.prepareXdcDeployErc20SignedTransaction = exports.prepareXdcCustomErc20SignedTransaction = exports.prepareXdcOrErc20SignedTransaction = exports.prepareXdcBurnErc20SignedTransaction = exports.prepareXdcMintErc20SignedTransaction = exports.prepareXdcStoreDataTransaction = exports.signXdcKMSTransaction = exports.getXdcClient = exports.xdcGetGasPriceInWei = exports.fromXdcAddress = void 0; const bignumber_js_1 = require("bignumber.js"); const web3_1 = __importDefault(require("web3")); const web3_utils_1 = require("web3-utils"); const blockchain_1 = require("../blockchain"); const tatum_1 = require("../connector/tatum"); const constants_1 = require("../constants"); const token_abi_1 = __importDefault(require("../contracts/erc20/token_abi")); const token_bytecode_1 = __importDefault(require("../contracts/erc20/token_bytecode")); const erc721_abi_1 = __importDefault(require("../contracts/erc721Cashback/erc721_abi")); const erc721_bytecode_1 = __importDefault(require("../contracts/erc721Cashback/erc721_bytecode")); const model_1 = require("../model"); const erc721_abi_2 = __importDefault(require("../contracts/erc721General/erc721_abi")); const erc721_bytecode_2 = __importDefault(require("../contracts/erc721General/erc721_bytecode")); const erc721Provenance_abi_1 = __importDefault(require("../contracts/erc721Provenance/erc721Provenance_abi")); const erc721Provenance_bytecode_1 = __importDefault(require("../contracts/erc721Provenance/erc721Provenance_bytecode")); /** * Convert XDC address format. */ const fromXdcAddress = (xdcAddress) => { return xdcAddress.trim().replace('xdc', '0x'); }; exports.fromXdcAddress = fromXdcAddress; /** * Estimate Gas price for the transaction. */ const xdcGetGasPriceInWei = async () => { const gasStationUrl = 'https://rpc.xinfin.network/'; try { const { data } = await tatum_1.axios.post(`${gasStationUrl}gasPrice`, { 'jsonrpc': '2.0', 'method': 'eth_gasPrice', 'params': [], 'id': 1, }); return data ? web3_1.default.utils.toWei(data, 'wei') : web3_1.default.utils.toWei('5', 'kwei'); } catch (e) { return web3_1.default.utils.toWei('5', 'kwei'); } return web3_1.default.utils.toWei('5', 'kwei'); }; exports.xdcGetGasPriceInWei = xdcGetGasPriceInWei; /** * Returns XDC server to connect to. * * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @param fromPrivateKey optional private key of sender account */ const getXdcClient = (provider, fromPrivateKey) => { const client = new web3_1.default(provider || `${process.env.TATUM_API_URL || constants_1.TATUM_API_URL}/v3/xdc/web3/${process.env.TATUM_API_KEY}`); if (fromPrivateKey) { client.eth.accounts.wallet.clear(); client.eth.accounts.wallet.add(fromPrivateKey); client.eth.defaultAccount = client.eth.accounts.wallet[0].address; } return client; }; exports.getXdcClient = getXdcClient; /** * Sign XDC pending transaction from Tatum KMS * @param tx pending transaction from KMS * @param fromPrivateKey private key to sign transaction with. * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const signXdcKMSTransaction = async (tx, fromPrivateKey, provider) => { if (tx.chain !== model_1.Currency.XDC) { throw Error('Unsupported chain.'); } const client = exports.getXdcClient(provider, fromPrivateKey); const transactionConfig = JSON.parse(tx.serializedTransaction); transactionConfig.gas = await client.eth.estimateGas(transactionConfig); if (!transactionConfig.nonce) { transactionConfig.nonce = await blockchain_1.xdcGetTransactionsCount(client.eth.defaultAccount); } return (await client.eth.accounts.signTransaction(transactionConfig, fromPrivateKey)).rawTransaction; }; exports.signXdcKMSTransaction = signXdcKMSTransaction; /** * Sign XDC Store data transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcStoreDataTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.CreateRecord); const { fromPrivateKey, to, ethFee, data, nonce, signatureId, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); const address = to || client.eth.defaultAccount; if (!address) { throw new Error('Recipient must be provided.'); } const hexData = client.utils.isHex(data) ? client.utils.stringToHex(data) : client.utils.toHex(data); const addressNonce = nonce ? nonce : await blockchain_1.xdcGetTransactionsCount(address); const customFee = ethFee ? Object.assign(Object.assign({}, ethFee), { gasPrice: client.utils.toWei(ethFee.gasPrice, 'gwei') }) : { gasLimit: `${hexData.length * 68 + 21000}`, gasPrice: await exports.xdcGetGasPriceInWei(), }; const tx = { from: 0, to: exports.fromXdcAddress(address), value: '0', gasPrice: customFee.gasPrice, gas: customFee.gasLimit, data: hexData, nonce: addressNonce, }; if (signatureId) { return JSON.stringify(tx); } return (await client.eth.accounts.signTransaction(tx, fromPrivateKey)).rawTransaction; }; exports.prepareXdcStoreDataTransaction = prepareXdcStoreDataTransaction; /** * Sign ERC20 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param client Web3 client of the XDC Server to connect to. If not set, default public server will be used. * @param transaction content of the transaction to broadcast * @param signatureId signature ID * @param fromPrivateKey private key * @param fee Fee object * @returns transaction data to be broadcast to blockchain. */ const prepareErc20SignedTransactionAbstraction = async (client, transaction, signatureId, fromPrivateKey, fee) => { var _a; const gasPrice = fee ? client.utils.toWei(fee.gasPrice, 'gwei') : await exports.xdcGetGasPriceInWei(); const tx = Object.assign(Object.assign({}, transaction), { gasPrice }); if (signatureId) { return JSON.stringify(tx); } const estimatedGas = await client.eth.estimateGas(tx); tx.gas = (_a = fee === null || fee === void 0 ? void 0 : fee.gasLimit) !== null && _a !== void 0 ? _a : estimatedGas; return (await client.eth.accounts.signTransaction(tx, fromPrivateKey)).rawTransaction; }; /** * Sign ERC20 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcMintErc20SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.MintErc20); const { fromPrivateKey, amount, to, contractAddress, nonce, signatureId, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new client.eth.Contract(token_abi_1.default, exports.fromXdcAddress(contractAddress)); const digits = new bignumber_js_1.BigNumber(10).pow(await contract.methods.decimals().call()); const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.mint(exports.fromXdcAddress(to), `0x${new bignumber_js_1.BigNumber(amount).multipliedBy(digits).toString(16)}`).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey); }; exports.prepareXdcMintErc20SignedTransaction = prepareXdcMintErc20SignedTransaction; /** * Sign ERC20 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcBurnErc20SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.BurnErc20); const { fromPrivateKey, amount, contractAddress, nonce, signatureId, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new client.eth.Contract(token_abi_1.default, exports.fromXdcAddress(contractAddress)); const digits = new bignumber_js_1.BigNumber(10).pow(await contract.methods.decimals().call()); const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.burn(`0x${new bignumber_js_1.BigNumber(amount).multipliedBy(digits).toString(16)}`).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey); }; exports.prepareXdcBurnErc20SignedTransaction = prepareXdcBurnErc20SignedTransaction; /** * Sign XDC or supported ERC20 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcOrErc20SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.TransferErc20); const { fromPrivateKey, to, amount, fee, data, nonce, signatureId, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); const tx = { from: 0, to: exports.fromXdcAddress(to), value: client.utils.toWei(`${amount}`, 'ether'), data: client.utils.isHex(data) ? client.utils.stringToHex(data) : client.utils.toHex(data), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcOrErc20SignedTransaction = prepareXdcOrErc20SignedTransaction; /** * Sign XDC custom ERC20 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcCustomErc20SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.TransferErc20); const { fromPrivateKey, to, amount, contractAddress, digits, fee, nonce, signatureId, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new client.eth.Contract([constants_1.TRANSFER_METHOD_ABI], exports.fromXdcAddress(contractAddress)); const decimals = new bignumber_js_1.BigNumber(10).pow(digits); const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.transfer(exports.fromXdcAddress(to), `0x${new bignumber_js_1.BigNumber(amount).multipliedBy(decimals).toString(16)}`).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcCustomErc20SignedTransaction = prepareXdcCustomErc20SignedTransaction; /** * Sign XDC deploy ERC20 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcDeployErc20SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.DeployErc20); const { name, address, symbol, supply, digits, fromPrivateKey, nonce, fee, signatureId, totalCap, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new client.eth.Contract(token_abi_1.default); const _digits = new bignumber_js_1.BigNumber(10).pow(digits); const deploy = contract.deploy({ data: token_bytecode_1.default, arguments: [ name, symbol, address, digits, `0x${new bignumber_js_1.BigNumber(totalCap || supply).multipliedBy(_digits).toString(16)}`, `0x${new bignumber_js_1.BigNumber(supply).multipliedBy(_digits).toString(16)}`, ], }); const tx = { from: 0, data: deploy.encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcDeployErc20SignedTransaction = prepareXdcDeployErc20SignedTransaction; /** * Sign XDC invoke smart contract transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcSmartContractWriteMethodInvocation = async (body, provider) => { await tatum_1.validateBody(body, model_1.SmartContractMethodInvocation); const { fromPrivateKey, fee, params, methodName, methodABI, contractAddress, amount, nonce, signatureId, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); const contract = new client.eth.Contract([methodABI]); const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), value: web3_utils_1.toWei(amount || '0', 'ether'), data: contract.methods[methodName](...params).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcSmartContractWriteMethodInvocation = prepareXdcSmartContractWriteMethodInvocation; /** * Sign XDC mint ERC 721 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcMintErc721SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.EthMintErc721); const { fromPrivateKey, to, tokenId, contractAddress, nonce, fee, url, signatureId, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new (client).eth.Contract(erc721_abi_1.default, exports.fromXdcAddress(contractAddress)); if (contractAddress) { const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.mintWithTokenURI(exports.fromXdcAddress(to), tokenId, url).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); } throw new Error('Contract address should not be empty!'); }; exports.prepareXdcMintErc721SignedTransaction = prepareXdcMintErc721SignedTransaction; /** * Sign XDC mint ERC 721 transaction with cashback via private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcMintErcCashback721SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.EthMintErc721); const { fromPrivateKey, to, tokenId, contractAddress, nonce, fee, url, signatureId, authorAddresses, cashbackValues, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new (client).eth.Contract(erc721_abi_1.default, exports.fromXdcAddress(contractAddress)); const cb = []; const cashbacks = cashbackValues; for (const c of cashbacks) { cb.push(`0x${new bignumber_js_1.BigNumber(client.utils.toWei(c, 'ether')).toString(16)}`); } if (contractAddress) { const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.mintWithCashback(exports.fromXdcAddress(to), tokenId, url, authorAddresses, cb).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); } throw new Error('Contract address should not be empty!'); }; exports.prepareXdcMintErcCashback721SignedTransaction = prepareXdcMintErcCashback721SignedTransaction; /** * Sign XDC mint multiple ERC 721 Cashback transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcMintMultipleCashbackErc721SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.EthMintMultipleErc721); const { fromPrivateKey, to, tokenId, contractAddress, url, nonce, signatureId, authorAddresses, cashbackValues, fee, } = body; const client = await exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new (client).eth.Contract(erc721_abi_1.default, exports.fromXdcAddress(contractAddress)); const cashbacks = cashbackValues; const cb = []; for (const c of cashbacks) { const cb2 = []; for (const c2 of c) { cb2.push(`0x${new bignumber_js_1.BigNumber(client.utils.toWei(c2, 'ether')).toString(16)}`); } cb.push(cb2); } const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.mintMultipleCashback(to.map(t => exports.fromXdcAddress(t)), tokenId, url, authorAddresses, cb).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcMintMultipleCashbackErc721SignedTransaction = prepareXdcMintMultipleCashbackErc721SignedTransaction; /** * Sign XDC mint multiple ERC 721 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcMintMultipleErc721SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.EthMintMultipleErc721); const { fromPrivateKey, to, tokenId, contractAddress, url, nonce, signatureId, fee, } = body; const client = await exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new (client).eth.Contract(erc721_abi_1.default, exports.fromXdcAddress(contractAddress)); const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.mintMultiple(to.map(t => exports.fromXdcAddress(t)), tokenId, url).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcMintMultipleErc721SignedTransaction = prepareXdcMintMultipleErc721SignedTransaction; /** * Sign XDC burn ERC 721 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcBurnErc721SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.EthBurnErc721); const { fromPrivateKey, tokenId, fee, contractAddress, nonce, signatureId, } = body; const client = exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new (client).eth.Contract(erc721_abi_1.default, exports.fromXdcAddress(contractAddress)); const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.burn(tokenId).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcBurnErc721SignedTransaction = prepareXdcBurnErc721SignedTransaction; /** * Sign XDC transfer ERC 721 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcTransferErc721SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.EthTransferErc721); const { fromPrivateKey, to, tokenId, fee, contractAddress, nonce, signatureId, value, } = body; const client = await exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new (client).eth.Contract(erc721_abi_1.default, exports.fromXdcAddress(contractAddress)); const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.safeTransfer(exports.fromXdcAddress(to), tokenId).encodeABI(), nonce, value: value ? `0x${new bignumber_js_1.BigNumber(value).multipliedBy(1e18).toString(16)}` : undefined, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcTransferErc721SignedTransaction = prepareXdcTransferErc721SignedTransaction; /** * Sign XDC update cashback ERC 721 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcUpdateCashbackForAuthorErc721SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.UpdateCashbackErc721); const { fromPrivateKey, cashbackValue, tokenId, fee, contractAddress, nonce, signatureId, } = body; const client = await exports.getXdcClient(provider, fromPrivateKey); // @ts-ignore const contract = new (client).eth.Contract(erc721_abi_1.default, exports.fromXdcAddress(contractAddress)); const tx = { from: 0, to: exports.fromXdcAddress(contractAddress), data: contract.methods.updateCashbackForAuthor(tokenId, `0x${new bignumber_js_1.BigNumber(web3_utils_1.toWei(cashbackValue, 'ether')).toString(16)}`).encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcUpdateCashbackForAuthorErc721SignedTransaction = prepareXdcUpdateCashbackForAuthorErc721SignedTransaction; /** * Sign XDC deploy ERC 721 transaction with private keys locally. Nothing is broadcast to the blockchain. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction data to be broadcast to blockchain. */ const prepareXdcDeployErc721SignedTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.EthDeployErc721); const { fromPrivateKey, fee, name, symbol, provenance, cashback, nonce, signatureId, publicMint, } = body; const client = await exports.getXdcClient(provider, fromPrivateKey); if (provenance && cashback) { throw new Error('Only one of provenance or cashback must be present and true.'); } let abi = erc721_abi_2.default; let data = erc721_bytecode_2.default; if (provenance) { abi = erc721Provenance_abi_1.default; data = erc721Provenance_bytecode_1.default; } else if (cashback) { abi = erc721_abi_1.default; data = erc721_bytecode_1.default; } // @ts-ignore const contract = new client.eth.Contract(abi, null, { data, }); // @ts-ignore const deploy = contract.deploy({ arguments: [name, symbol, publicMint ? publicMint : false], }); const tx = { from: 0, data: deploy.encodeABI(), nonce, }; return await prepareErc20SignedTransactionAbstraction(client, tx, signatureId, fromPrivateKey, fee); }; exports.prepareXdcDeployErc721SignedTransaction = prepareXdcDeployErc721SignedTransaction; /** * Send XDC invoke smart contract transaction to the blockchain. * Invoked method only reads from blockchain the data and returns them back. * * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. */ const sendXdcSmartContractReadMethodInvocationTransaction = async (body, provider) => { await tatum_1.validateBody(body, model_1.SmartContractReadMethodInvocation); const { params, methodName, methodABI, contractAddress, } = body; const client = exports.getXdcClient(provider); const contract = new client.eth.Contract([methodABI], exports.fromXdcAddress(contractAddress)); return { data: await contract.methods[methodName](...params).call() }; }; exports.sendXdcSmartContractReadMethodInvocationTransaction = sendXdcSmartContractReadMethodInvocationTransaction; /** * Send XDC store data transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcStoreDataTransaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcStoreDataTransaction(body, provider), body.signatureId); exports.sendXdcStoreDataTransaction = sendXdcStoreDataTransaction; /** * Send XDC or supported ERC20 transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcOrErc20Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcOrErc20SignedTransaction(body, provider), body.signatureId); exports.sendXdcOrErc20Transaction = sendXdcOrErc20Transaction; /** * Send XDC custom ERC20 transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcCustomErc20Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcCustomErc20SignedTransaction(body, provider), body.signatureId); exports.sendXdcCustomErc20Transaction = sendXdcCustomErc20Transaction; /** * Send XDC deploy ERC20 transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcDeployErc20Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcDeployErc20SignedTransaction(body, provider), body.signatureId); exports.sendXdcDeployErc20Transaction = sendXdcDeployErc20Transaction; /** * Send XDC invoke smart contract transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcSmartContractMethodInvocationTransaction = async (body, provider) => { if (body.methodABI.stateMutability === 'view') { return exports.sendXdcSmartContractReadMethodInvocationTransaction(body, provider); } return blockchain_1.xdcBroadcast(await exports.prepareXdcSmartContractWriteMethodInvocation(body, provider), body.signatureId); }; exports.sendXdcSmartContractMethodInvocationTransaction = sendXdcSmartContractMethodInvocationTransaction; /** * Send XDC ERC721 mint transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcMintErc721Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcMintErc721SignedTransaction(body, provider), body.signatureId); exports.sendXdcMintErc721Transaction = sendXdcMintErc721Transaction; /** * Send XDC ERC721 mint transaction to the blockchain with cashback details. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcMintErcCashback721Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcMintErcCashback721SignedTransaction(body, provider), body.signatureId); exports.sendXdcMintErcCashback721Transaction = sendXdcMintErcCashback721Transaction; /** * Send XDC ERC721 mint multiple transaction with cashback to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcMintMultipleCashbackErc721Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcMintMultipleCashbackErc721SignedTransaction(body, provider), body.signatureId); exports.sendXdcMintMultipleCashbackErc721Transaction = sendXdcMintMultipleCashbackErc721Transaction; /** * Send XDC ERC721 mint multiple transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcMintMultipleErc721Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcMintMultipleErc721SignedTransaction(body, provider), body.signatureId); exports.sendXdcMintMultipleErc721Transaction = sendXdcMintMultipleErc721Transaction; /** * Send XDC ERC721 burn transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcBurnErc721Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcBurnErc721SignedTransaction(body, provider), body.signatureId); exports.sendXdcBurnErc721Transaction = sendXdcBurnErc721Transaction; const sendXdcUpdateCashbackForAuthorErc721Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcUpdateCashbackForAuthorErc721SignedTransaction(body, provider), body.signatureId); exports.sendXdcUpdateCashbackForAuthorErc721Transaction = sendXdcUpdateCashbackForAuthorErc721Transaction; /** * Send XDC ERC721 transaction to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcErc721Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcTransferErc721SignedTransaction(body, provider), body.signatureId); exports.sendXdcErc721Transaction = sendXdcErc721Transaction; /** * Send XDC ERC721 deploy to the blockchain. This method broadcasts signed transaction to the blockchain. * This operation is irreversible. * @param body content of the transaction to broadcast * @param provider url of the XDC Server to connect to. If not set, default public server will be used. * @returns transaction id of the transaction in the blockchain */ const sendXdcDeployErc721Transaction = async (body, provider) => blockchain_1.xdcBroadcast(await exports.prepareXdcDeployErc721SignedTransaction(body, provider), body.signatureId); exports.sendXdcDeployErc721Transaction = sendXdcDeployErc721Transaction; // TODO: add ERC-1155 support //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGRjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL3hkYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwrQ0FBeUM7QUFDekMsZ0RBQXdCO0FBRXhCLDJDQUFtQztBQUNuQyw4Q0FBc0U7QUFDdEUsOENBQXlEO0FBQ3pELDRDQUFrRTtBQUNsRSw2RUFBeUQ7QUFDekQsdUZBQW1FO0FBQ25FLHdGQUE0RTtBQUM1RSxrR0FBc0Y7QUFDdEYsb0NBaUJrQjtBQUNsQix1RkFBeUU7QUFDekUsaUdBQW1GO0FBQ25GLDhHQUFxRjtBQUNyRix3SEFBK0Y7QUFFL0Y7O0dBRUc7QUFDSSxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQWtCLEVBQVUsRUFBRTtJQUMzRCxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQy9DLENBQUMsQ0FBQTtBQUZZLFFBQUEsY0FBYyxrQkFFMUI7QUFFRDs7R0FFRztBQUNJLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDNUMsTUFBTSxhQUFhLEdBQUcsNkJBQTZCLENBQUE7SUFDbkQsSUFBSTtRQUNGLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLGFBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLFVBQVUsRUFBRTtZQUM1RCxTQUFTLEVBQUUsS0FBSztZQUNoQixRQUFRLEVBQUUsY0FBYztZQUN4QixRQUFRLEVBQUUsRUFBRTtZQUNaLElBQUksRUFBRSxDQUFDO1NBQ1IsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFBO0tBQzVFO0lB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