@tatumio/tatum-v1
Version:
Tatum API client allows browsers and Node.js clients to interact with Tatum API.
617 lines • 62.2 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.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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