Node/Javascript Function to Transfer BTS Assets on BitShares Blockchain
To make a transfer on the BitShares blockchain, you need to create and broadcast a transfer operation. This operation includes details such as the sender, receiver, amount, and asset to transfer.
Here is a basic example of how you can make a transfer with the bitsharesjs library in Node.js. This example assumes that you already have the private key of the sender’s account.
The following code has been tested – which can be used to transfer funds from one account to another on the BitShares Blockchain.
const { Apis, ChainConfig } = require("bitsharesjs-ws");
const { Aes, ChainStore, FetchChain, PrivateKey, TransactionBuilder, TransactionHelper } = require('bitsharesjs');
const https = require("https");
const agent = new https.Agent({
rejectUnauthorized: false
});
BTS_TEST_NODE = "wss://api-us-testnet.61bts.com/ws";
BTS_NODE = "wss://api.61bts.com";
async function transferBTS(fromAccountName, toAccountName, amount, asset, memo, privateKeyWif, privateMemoKey, apiNode) {
return new Promise(async (resolve, reject) => {
try {
await Apis.instance(apiNode, true, 4000, undefined, agent).init_promise;
ChainConfig.setPrefix('BTS');
await new Promise(resolve => setTimeout(resolve, 1000));
const fromAccount = await FetchChain("getAccount", fromAccountName);
const toAccount = await FetchChain("getAccount", toAccountName);
const sendAsset = await FetchChain("getAsset", asset);
if (!fromAccount) {
throw new Error(`Unable to find account: ${fromAccountName}`);
}
if (!toAccount) {
throw new Error(`Unable to find account: ${toAccountName}`);
}
if (!sendAsset) {
throw new Error(`Unable to find asset: ${asset}`);
}
let memoObj;
if (memo) {
const nonce = TransactionHelper.unique_nonce_uint64();
memoObj = {
from: fromAccount.get("options").get("memo_key"),
to: toAccount.get("options").get("memo_key"),
nonce: nonce,
message: Aes.encrypt_with_checksum(
PrivateKey.fromWif(privateMemoKey),
toAccount.get('options').get('memo_key'),
nonce,
new Buffer.from(memo, 'utf-8')
)
};
}
const tr = new TransactionBuilder();
const transferOp = tr.get_type_operation("transfer", {
fee: {
amount: 0,
asset_id: "1.3.0"
},
from: fromAccount.get("id"),
to: toAccount.get("id"),
amount: {
amount: amount * Math.pow(10, sendAsset.get("precision")),
asset_id: sendAsset.get("id")
},
memo: memoObj
});
await tr.add_operation(transferOp);
await tr.set_required_fees();
tr.add_signer(PrivateKey.fromWif(privateKeyWif));
const result = await tr.broadcast();
resolve(result);
} catch (error) {
reject(error);
}
});
}
A few points about the code:
- Instead of creating a nested async function inside the Promise executor, I’ve directly made the executor function async. This allows you to use await directly in the executor function.
- I’ve added error handling within the Promise. If any of the await statements fail, the error will be caught and passed to reject, causing the Promise to be rejected.
- For the Aes.encrypt_with_checksum function, the nonce value wasn’t defined before, so I’ve created a nonce constant and used it.
- new Buffer(memo, ‘utf-8’) is replaced with new Buffer.from(memo, ‘utf-8’) as new Buffer has been deprecated and it’s recommended to use Buffer.from() or Buffer.alloc() for newer versions of Node.js.
To view the balance of a BTS Account: NodeJs code to check the balance of a BTS account (BitShares Blockchain)
BitShares Blockchain API (bitsharesjs and bitsharesjs-ws) are based on Web Sockets, and thus, the usage is a bit different from SteemJs.
–EOF (The Ultimate Computing & Technology Blog) —
662 wordsLast Post: Teaching Kids Programming - Algorithms to Find Neither Minimum nor Maximum
Next Post: What is Grid Computing, and how is it different from Cloud Computing?