@tatumio/tatum-v1
Version:
Tatum API client allows browsers and Node.js clients to interact with Tatum API.
431 lines • 49.8 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.sendAlgoBurnFTSignedTransaction = exports.prepareAlgoBurnFTSignedTransaction = exports.sendAlgoTransferFTSignedTransaction = exports.prepareAlgoTransferFTSignedTransaction = exports.sendAlgoCreateFTSignedTransaction = exports.prepareAlgoCreateFTSignedTransaction = exports.sendAlgoBurnFractionalNFTSignedTransaction = exports.prepareAlgoBurnFractionalNFTSignedTransaction = exports.sendAlgoTransferFractionalNFTSignedTransaction = exports.prepareAlgoTransferFractionalNFTSignedTransaction = exports.sendAlgoCreateFractionalNFTSignedTransaction = exports.prepareAlgoCreateFractionalNFTSignedTransaction = exports.sendAlgoBurnNFTSignedTransaction = exports.prepareAlgoBurnNFTSignedTransaction = exports.sendAlgoReceiveNFTSignedTransaction = exports.sendAlgoTransferNFTSignedTransaction = exports.prepareAlgoReceiveNFTSignedTransaction = exports.prepareAlgoTransferNFTSignedTransaction = exports.sendAlgoCreateNFTSignedTransaction = exports.prepareAlgoCreateNFTSignedTransaction = exports.signAlgoKMSTransaction = exports.sendAlgoSignedTransaction = exports.prepareAlgoSignedTransaction = exports.getAlgoIndexerClient = exports.getAlgoClient = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const util_1 = require("util");
const blockchain_1 = require("../blockchain");
const model_1 = require("../model");
const wallet_1 = require("../wallet");
const algosdk = require('algosdk');
const base32 = require('base32.js');
const Url = require('url-parse');
/**
* Algod V2 Client
* @param testnet if the algorand node is testnet or not
* @param provider url of the algorand server endpoint
* @returns algorand Client
*/
const getAlgoClient = (testnet, provider) => {
if (provider) {
return new algosdk.Algodv2(`${(testnet ? process.env.TATUM_ALGORAND_TESTNET_TOKEN : process.env.TATUM_ALGORAND_MAINNET_TOKEN) || 'DUMMYTOKEN'}`, provider, Url(provider).port);
}
else {
return new algosdk.Algodv2({ 'X-API-Key': testnet ? `${process.env.TATUM_ALGORAND_TESTNET_THIRD_API_KEY}` : `${process.env.TATUM_ALGORAND_MAINNET_THIRD_API_KEY}` }, testnet ? `${process.env.TATUM_ALGORAND_TESTNET_THIRD_API_ALGOD_URL}` : `${process.env.TATUM_ALGORAND_MAINNET_THIRD_API_ALGOD_URL}`, '');
}
};
exports.getAlgoClient = getAlgoClient;
/**
* Algo Indexer Client
* @param testnet if the algorand node is testnet or not
* @param provider url of the algorand server endpoint
* @returns algorand Indexer Client
*/
const getAlgoIndexerClient = (testnet, provider) => {
if (provider) {
return new algosdk.Indexer(`${(testnet ? process.env.TATUM_ALGORAND_TESTNET_TOKEN : process.env.TATUM_ALGORAND_MAINNET_TOKEN) || 'DUMMYTOKEN'}`, provider, Url(provider).port);
}
else {
return new algosdk.Indexer({ 'X-API-Key': testnet ? `${process.env.TATUM_ALGORAND_TESTNET_THIRD_API_KEY}` : `${process.env.TATUM_ALGORAND_MAINNET_THIRD_API_KEY}` }, testnet ? `${process.env.TATUM_ALGORAND_TESTNET_THIRD_API_INDEXER_URL}` : `${process.env.TATUM_ALGORAND_MAINNET_THIRD_API_INDEXER_URL}`, '');
}
};
exports.getAlgoIndexerClient = getAlgoIndexerClient;
/**
* Algorand transaction signing
* @param testnet if the algorand node is testnet or not
* @param tx content of the transaction to broadcast
* @param provider url of the algorand server endpoint for purestake.io restapi
* @returns transaction data to be broadcast to blockchain
*/
const prepareAlgoSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const enc = new util_1.TextEncoder();
const note = enc.encode(tx.note ? tx.note : '');
const txn = algosdk.makePaymentTxnWithSuggestedParams(tx.from, tx.to, new bignumber_js_1.default(tx.amount).multipliedBy(1000000).toNumber(), undefined, note, Object.assign(Object.assign({}, params), { fee: new bignumber_js_1.default(tx.fee).multipliedBy(1000000).toNumber(), flatFee: true }));
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoSignedTransaction = prepareAlgoSignedTransaction;
/**
* Send Algorand transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* This operation is irreversible.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain
*/
const sendAlgoSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoSignedTransaction = sendAlgoSignedTransaction;
/**
* Sign Algorand pending transaction from Tatum KMS
* @param tx pendding transaction from Tatum KMS
* @param fromPrivateKey private key to sign transaction with
* @param testnet mainnet or testnet version
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const signAlgoKMSTransaction = async (tx, fromPrivateKey, testnet, provider) => {
if (tx.chain !== model_1.Currency.ALGO) {
throw Error('Unsupported chain.');
}
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = JSON.parse(tx.serializedTransaction);
txn.from = algosdk.encodeAddress(new Uint8Array(Object.values(txn.from.publicKey)));
txn.to = algosdk.encodeAddress(new Uint8Array(Object.values(txn.to.publicKey)));
txn.note = new Uint8Array(Object.values(txn.note || ''));
txn.lease = undefined;
if (txn.tag) {
if (txn.tag.data) {
txn.tag = Buffer.from(txn.tag.data);
}
}
txn.genesisHash = Buffer.from(txn.genesisHash.data);
if (txn.assetManager) {
txn.assetManager = algosdk.encodeAddress(new Uint8Array(Object.values(txn.assetManager.publicKey)));
}
if (txn.assetReserve) {
txn.assetReserve = undefined;
}
if (txn.assetFreeze) {
txn.assetFreeze = undefined;
}
if (txn.assetClawback) {
txn.assetClawback = undefined;
}
if (txn.assetRevocationTarget) {
txn.assetRevocationTarget = undefined;
}
if (txn.reKeyTo) {
txn.reKeyTo = undefined;
}
if (txn.assetMetadataHash) {
txn.assetMetadataHash = new Uint8Array(Object.values(txn.assetMetadataHash));
}
const _txn = new (algosdk.Transaction)(txn);
const secretKey = new Uint8Array(decoder.write(fromPrivateKey).buf);
return Buffer.from(_txn.signTxn(secretKey)).toString('hex');
};
exports.signAlgoKMSTransaction = signAlgoKMSTransaction;
/**
* Sign Algorand create NFT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain
*/
const prepareAlgoCreateNFTSignedTransaction = async (testnet, tx, provider, decimals = 0, total = 1) => {
var _a, _b, _c, _d, _e;
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = algosdk.makeAssetCreateTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, undefined, total, decimals, false, (_a = tx.attr) === null || _a === void 0 ? void 0 : _a.manager, (_b = tx.attr) === null || _b === void 0 ? void 0 : _b.reserve, (_c = tx.attr) === null || _c === void 0 ? void 0 : _c.freeze, (_d = tx.attr) === null || _d === void 0 ? void 0 : _d.clawback, (_e = tx.attr) === null || _e === void 0 ? void 0 : _e.assetUnit, tx.name, tx.url, undefined, params);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoCreateNFTSignedTransaction = prepareAlgoCreateNFTSignedTransaction;
/**
* Send Algorand create NFT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain
*/
const sendAlgoCreateNFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoCreateNFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoCreateNFTSignedTransaction = sendAlgoCreateNFTSignedTransaction;
/**
* Sign Algorand transfer NFT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoTransferNFTSignedTransaction = async (testnet, tx, provider, amount = 1) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = algosdk.makeAssetTransferTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, tx.to, undefined, undefined, amount, undefined, new bignumber_js_1.default(tx.contractAddress).toNumber(), params);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoTransferNFTSignedTransaction = prepareAlgoTransferNFTSignedTransaction;
/**
* Sign Algorand receive NFT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoReceiveNFTSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const from = tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from;
const txn = algosdk.makeAssetTransferTxnWithSuggestedParams(from, from, undefined, undefined, 0, undefined, tx.assetId, params);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoReceiveNFTSignedTransaction = prepareAlgoReceiveNFTSignedTransaction;
/**
* Send Algorand Transfer NFT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoTransferNFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoTransferNFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoTransferNFTSignedTransaction = sendAlgoTransferNFTSignedTransaction;
/**
* Send Algorand Receive NFT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoReceiveNFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoReceiveNFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoReceiveNFTSignedTransaction = sendAlgoReceiveNFTSignedTransaction;
/**
* Sign Algorand burn NFT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoBurnNFTSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = algosdk.makeAssetDestroyTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, undefined, new bignumber_js_1.default(tx.contractAddress).toNumber(), params, undefined);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoBurnNFTSignedTransaction = prepareAlgoBurnNFTSignedTransaction;
/**
* Send Algorand burn NFT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoBurnNFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoBurnNFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoBurnNFTSignedTransaction = sendAlgoBurnNFTSignedTransaction;
/**
* Sign Algorand create Fractional NFT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoCreateFractionalNFTSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const v = Math.floor(Math.log10(new bignumber_js_1.default(tx.amount).toNumber()));
const txn = algosdk.makeAssetCreateTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, undefined, new bignumber_js_1.default(10).pow(v).toNumber(), v, false, tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, undefined, undefined, undefined, tx.tokenId, tx.contractAddress, tx.url, undefined, params);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoCreateFractionalNFTSignedTransaction = prepareAlgoCreateFractionalNFTSignedTransaction;
/**
* Send Algorand create Fractinoal NFT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoCreateFractionalNFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoCreateFractionalNFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoCreateFractionalNFTSignedTransaction = sendAlgoCreateFractionalNFTSignedTransaction;
/**
* Sign Algorand transfer Fractional NFT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoTransferFractionalNFTSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = algosdk.makeAssetTransferTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, tx.to, undefined, undefined, new bignumber_js_1.default(tx.amount).toNumber(), undefined, new bignumber_js_1.default(tx.contractAddress).toNumber(), params, undefined);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoTransferFractionalNFTSignedTransaction = prepareAlgoTransferFractionalNFTSignedTransaction;
/**
* Send Algorand transfer Fractinoal NFT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoTransferFractionalNFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoTransferFractionalNFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoTransferFractionalNFTSignedTransaction = sendAlgoTransferFractionalNFTSignedTransaction;
/**
* Sign Algorand burn Fracational NFT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connecto to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoBurnFractionalNFTSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = algosdk.makeAssetDestroyTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, undefined, new bignumber_js_1.default(tx.contractAddress).toNumber(), params, undefined);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoBurnFractionalNFTSignedTransaction = prepareAlgoBurnFractionalNFTSignedTransaction;
/**
* Send Algorand burn Fractional NFT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoBurnFractionalNFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoBurnFractionalNFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoBurnFractionalNFTSignedTransaction = sendAlgoBurnFractionalNFTSignedTransaction;
/**
* Sign Algorand create FT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connnect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoCreateFTSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = algosdk.makeAssetCreateTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, undefined, new bignumber_js_1.default(tx.supply).shiftedBy(new bignumber_js_1.default(tx.digits).toNumber()).toNumber(), new bignumber_js_1.default(tx.digits).toNumber(), false, tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, undefined, undefined, undefined, tx.symbol, tx.name, tx.url, undefined, params);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoCreateFTSignedTransaction = prepareAlgoCreateFTSignedTransaction;
/**
* Send Algorand create FT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoCreateFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoCreateFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoCreateFTSignedTransaction = sendAlgoCreateFTSignedTransaction;
/**
* Sign Algorand transfer FT transaction with private kwy locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoTransferFTSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = algosdk.makeAssetTransferTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, tx.to, undefined, undefined, new bignumber_js_1.default(tx.amount).shiftedBy(tx.digits || 1).toNumber(), undefined, new bignumber_js_1.default(tx.contractAddress).toNumber(), params, undefined);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoTransferFTSignedTransaction = prepareAlgoTransferFTSignedTransaction;
/**
* Send Algorand transfer FT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoTransferFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoTransferFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoTransferFTSignedTransaction = sendAlgoTransferFTSignedTransaction;
/**
* Sign ALgorand burn FT transaction with private key locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction data to be broadcast to blockchain.
*/
const prepareAlgoBurnFTSignedTransaction = async (testnet, tx, provider) => {
const algodClient = exports.getAlgoClient(testnet, provider);
const params = await algodClient.getTransactionParams().do();
const decoder = new base32.Decoder({ type: 'rfc4648' });
const txn = algosdk.makeAssetDestroyTxnWithSuggestedParams(tx.fromPrivateKey ? wallet_1.generateAlgodAddressFromPrivatetKey(tx.fromPrivateKey) : tx.from, undefined, new bignumber_js_1.default(tx.contractAddress).toNumber(), params, undefined);
if (tx.signatureId) {
return JSON.stringify(txn);
}
const secretKey = new Uint8Array(decoder.write(tx.fromPrivateKey).buf);
return Buffer.from(txn.signTxn(secretKey)).toString('hex');
};
exports.prepareAlgoBurnFTSignedTransaction = prepareAlgoBurnFTSignedTransaction;
/**
* Sned Algorand burn FT transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* @param testnet mainnet or testnet version
* @param tx content of the transaction to broadcast
* @param provider url of the Algorand Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain.
*/
const sendAlgoBurnFTSignedTransaction = async (testnet, tx, provider) => {
return (await blockchain_1.algorandBroadcast(await exports.prepareAlgoBurnFTSignedTransaction(testnet, tx, provider)));
};
exports.sendAlgoBurnFTSignedTransaction = sendAlgoBurnFTSignedTransaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9hbGdvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLGdFQUFxQztBQUNyQywrQkFBbUM7QUFDbkMsOENBQWtEO0FBQ2xELG9DQWNrQjtBQUNsQixzQ0FBK0Q7QUFFL0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVwQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDakM7Ozs7O0dBS0c7QUFDSSxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWdCLEVBQUUsUUFBaUIsRUFBZSxFQUFFO0lBQ2hGLElBQUksUUFBUSxFQUFFO1FBQ1osT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDaEw7U0FBTTtRQUNMLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLEVBQ2pLLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyww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