nerve-sdk-js
Version:
nerve nerve-js nerve-sdk nerve-js-sdk
166 lines (136 loc) • 8.18 kB
JavaScript
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
require('dotenv').config();
var nerve = require('../../index');
var {
BitcoinRechargeData
} = require('../../model/BitcoinRechargeData');
var tbcLib = nerve.tbcLib; // const network = "testnet";
var network = "mainnet"; //计算多签地址
// devnet: FBeMrqQWFkhBJt6rA2yKxVWg9Jeiww76Pr
// testnet: FJ5buUdNQ8FBpwh3ZT2W1peVUidHRvje2m
// mainnet: jvBaMk4qKjXaQFYgBmS7HkwwktsYDdBxfa
var multiSigAddress = 'jvBaMk4qKjXaQFYgBmS7HkwwktsYDdBxfa';
var privateKey = tbcLib.tbc.PrivateKey.fromString(process.env._8KFu); // 1DaqS9YD6VVtDkAzXDnaDQg61DcuXC8KFu
var tbc_from = tbcLib.tbc.Address.fromPrivateKey(privateKey).toString(); //普通地址向多签地址转tbc
function transferToMulti() {
return _transferToMulti.apply(this, arguments);
} //普通地址向多签地址转ft
function _transferToMulti() {
_transferToMulti = _asyncToGenerator(function* () {
var network = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'testnet';
var privateKey = arguments.length > 1 ? arguments[1] : undefined;
var tbc_from = arguments.length > 2 ? arguments[2] : undefined;
var tbc_multiSigAddress = arguments.length > 3 ? arguments[3] : undefined;
var nerve_to = arguments.length > 4 ? arguments[4] : undefined;
var amount = arguments.length > 5 ? arguments[5] : undefined;
var remark = arguments.length > 6 ? arguments[6] : undefined;
var utxos = yield tbcLib.API.getUTXOs(tbc_from, amount + 0.0003, network);
var txData = new BitcoinRechargeData();
txData.to = nerve_to;
txData.value = Math.floor(amount * Math.pow(10, 6));
if (remark) {
txData.extend0 = remark;
}
var remarkData = Buffer.concat([Buffer.from('88888888', 'hex'), txData.serialize()]);
var txraw = tbcLib.MultiSig.p2pkhToMultiSig_sendTBC(tbc_from, tbc_multiSigAddress, amount, utxos, privateKey, remarkData);
yield tbcLib.API.broadcastTXraw(txraw, network);
});
return _transferToMulti.apply(this, arguments);
}
function transferToMultiWithFT() {
return _transferToMultiWithFT.apply(this, arguments);
} // doge: 29a753233bf4f3b546b5eacd0a8ec7a7a236bf7b987f51390a7cac90bb1d8bcf
// usdt: b7d03431efe6a85271a47b557c8bacad9b7fe7c3c8c15ce10a075b59d9a39326
function _transferToMultiWithFT() {
_transferToMultiWithFT = _asyncToGenerator(function* () {
var network = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'testnet';
var privateKey = arguments.length > 1 ? arguments[1] : undefined;
var tbc_from = arguments.length > 2 ? arguments[2] : undefined;
var tbc_multiSigAddress = arguments.length > 3 ? arguments[3] : undefined;
var nerve_to = arguments.length > 4 ? arguments[4] : undefined;
var ft_amount = arguments.length > 5 ? arguments[5] : undefined;
var ft_contract = arguments.length > 6 ? arguments[6] : undefined;
var remark = arguments.length > 7 ? arguments[7] : undefined;
var tbc_amount = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 0;
var utxo = yield tbcLib.API.fetchUTXO(privateKey, 0.01 + tbc_amount, network);
var Token = new tbcLib.FT(ft_contract);
var TokenInfo = yield tbcLib.API.fetchFtInfo(Token.contractTxid, network);
Token.initialize(TokenInfo);
var transferTokenAmount = ft_amount; //转移数量
var transferTokenAmountBN = BigInt(Math.floor(transferTokenAmount * Math.pow(10, Token.decimal)));
var ftutxo_codeScript = tbcLib.FT.buildFTtransferCode(Token.codeScript, tbc_from).toBuffer().toString('hex');
var ftutxos = yield tbcLib.API.fetchFtUTXOs(Token.contractTxid, tbc_from, ftutxo_codeScript, network, transferTokenAmountBN); //准备ft utxo
var preTXs = [];
var prepreTxDatas = [];
for (var i = 0; i < ftutxos.length; i++) {
preTXs.push(yield tbcLib.API.fetchTXraw(ftutxos[i].txId, network)); //获取每个ft输入的父交易
prepreTxDatas.push(yield tbcLib.API.fetchFtPrePreTxData(preTXs[i], ftutxos[i].outputIndex, network)); //获取每个ft输入的爷交易
}
var txData = new BitcoinRechargeData();
txData.to = nerve_to;
txData.value = tbc_amount <= 0 ? 0 : Math.floor(tbc_amount * Math.pow(10, 6));
if (remark) {
txData.extend0 = remark;
}
txData.extend1 = ft_contract + transferTokenAmountBN.toString();
var remarkData = Buffer.concat([Buffer.from('88888888', 'hex'), txData.serialize()]);
var transferTX = tbcLib.MultiSig.p2pkhToMultiSig_transferFT(tbc_from, tbc_multiSigAddress, Token, transferTokenAmount, utxo, ftutxos, preTXs, prepreTxDatas, privateKey, tbc_amount, remarkData); //组装交易
yield tbcLib.API.broadcastTXraw(transferTX, network);
});
return _transferToMultiWithFT.apply(this, arguments);
}
transferToMulti(network, privateKey, tbc_from, multiSigAddress, 'NERVEepb6CwyEWh9mhnmPTJcuWpRzmYvoS7tLm', 0.5, 'tbc nerve fee transfer'); // transferToMultiWithFT(network, privateKey, tbc_from, multiSigAddress, 'TNVTdTSPNruAy8kuDvg6AxuWp8xUuWqvqCNti', 1.01, '29a753233bf4f3b546b5eacd0a8ec7a7a236bf7b987f51390a7cac90bb1d8bcf', 'test233333333');
/**
* DAPP接口调用参考
* sendTransaction
* const amount = 1000; // TBC转账金额-右移精度
* const nerveTo = ""; // Nerve网络接收地址
* const extend = "test23333333";
* const tbcTo = ""; // TBC网络接收地址
* params = [{flag:"P2PKH", satoshis: amount, address: tbcTo, ramark: transferTBCData(nerveTo, amount, extend)}];
*
* @param {Nerve接收地址} nerveTo
* @param {跨入的TBC金额-右移精度} tbcAmount
* @param {扩展备注-选填,可填任意值} extend
* @returns
*/
function transferTBCData(nerveTo, tbcAmount, extend) {
var txData = new BitcoinRechargeData();
txData.to = nerveTo;
txData.value = tbcAmount;
txData.extend0 = extend;
return '88888888' + txData.serialize().toString('hex');
}
/**
* DAPP接口调用参考
* sendTransaction
* const nerveTo = ""; // Nerve网络接收地址
* const tokenValue = 30000; // Token转账金额-右移精度
* const tokenContract = ""; // Token合约地址
* const tbcTo = ""; // TBC网络接收地址
* const extend = "test23333333";
* const tbcValue = 0; // 大于0则同时跨链tbc资产-右移精度
* params = [{flag:"FT_TRANSFER", ft_contract_address: tokenContract, ft_amount: tokenValue, address: tbcTo, tbc_amount: tbcValue, ramark: transferTokenData(nerveTo, tokenValue, tokenContract, extend, tbcValue)}];
* @param {Nerve接收地址} nerveTo
* @param {跨入的TOKEN金额-右移精度} tokenAmount
* @param {token合约地址} tokenContract
* @param {扩展备注-选填,可填任意值,swapbox用于填写订单号} extend
* @param {跨入的TBC金额-右移精度-选填} tbcAmount
* @returns
*/
function transferTokenData(nerveTo, tokenAmount, tokenContract, extend) {
var tbcAmount = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
var txData = new BitcoinRechargeData();
txData.to = nerveTo;
txData.value = tbcAmount;
txData.extend0 = extend;
txData.extend1 = tokenContract + '' + tokenAmount;
return '88888888' + txData.serialize().toString('hex');
}
function parseData() {
var hex = '0500017ab79bd5c00354e7d4f346749ad7d2c1f8bae031000000553239613735333233336266346633623534366235656163643061386563376137613233366266376239383766353133393061376361633930626231643862636631303030303030303030303030303030303030303000000000';
var txData = new BitcoinRechargeData();
txData.parse(Buffer.from(hex, 'hex'));
console.log(JSON.stringify(txData));
} // parseData();