nerve-sdk-js
Version:
nerve nerve-js nerve-sdk nerve-js-sdk
121 lines (110 loc) • 6.13 kB
JavaScript
require('dotenv').config();
const nerve = require('../../index');
const {BitcoinRechargeData} = require('../../model/BitcoinRechargeData');
const tbcLib = nerve.tbcLib;
// const network = "testnet";
const network = "mainnet"
//计算多签地址
// devnet: FBeMrqQWFkhBJt6rA2yKxVWg9Jeiww76Pr
// testnet: FJ5buUdNQ8FBpwh3ZT2W1peVUidHRvje2m
// mainnet: jvBaMk4qKjXaQFYgBmS7HkwwktsYDdBxfa
const multiSigAddress = 'jvBaMk4qKjXaQFYgBmS7HkwwktsYDdBxfa';
const privateKey = tbcLib.tbc.PrivateKey.fromString(process.env._8KFu);// 1DaqS9YD6VVtDkAzXDnaDQg61DcuXC8KFu
const tbc_from = tbcLib.tbc.Address.fromPrivateKey(privateKey).toString();
//普通地址向多签地址转tbc
async function transferToMulti(network = 'testnet', privateKey, tbc_from, tbc_multiSigAddress, nerve_to, amount, remark) {
const utxos = await tbcLib.API.getUTXOs(tbc_from, amount + 0.0003, network);
const txData = new BitcoinRechargeData();
txData.to = nerve_to;
txData.value = Math.floor(amount * Math.pow(10, 6));
if (remark) {
txData.extend0 = remark;
}
let remarkData = Buffer.concat([Buffer.from('88888888', 'hex'), txData.serialize()]);
const txraw = tbcLib.MultiSig.p2pkhToMultiSig_sendTBC(tbc_from, tbc_multiSigAddress, amount, utxos, privateKey, remarkData);
await tbcLib.API.broadcastTXraw(txraw, network);
}
//普通地址向多签地址转ft
async function transferToMultiWithFT(network = 'testnet', privateKey, tbc_from, tbc_multiSigAddress, nerve_to, ft_amount, ft_contract, remark, tbc_amount = 0) {
const utxo = await tbcLib.API.fetchUTXO(privateKey, 0.01 + tbc_amount, network);
const Token = new tbcLib.FT(ft_contract);
const TokenInfo = await tbcLib.API.fetchFtInfo(Token.contractTxid, network);
Token.initialize(TokenInfo);
const transferTokenAmount = ft_amount;//转移数量
const transferTokenAmountBN = BigInt(Math.floor(transferTokenAmount * Math.pow(10, Token.decimal)));
const ftutxo_codeScript = tbcLib.FT.buildFTtransferCode(Token.codeScript, tbc_from).toBuffer().toString('hex');
const ftutxos = await tbcLib.API.fetchFtUTXOs(Token.contractTxid, tbc_from, ftutxo_codeScript, network, transferTokenAmountBN);//准备ft utxo
let preTXs = [];
let prepreTxDatas = [];
for (let i = 0; i < ftutxos.length; i++) {
preTXs.push(await tbcLib.API.fetchTXraw(ftutxos[i].txId, network));//获取每个ft输入的父交易
prepreTxDatas.push(await tbcLib.API.fetchFtPrePreTxData(preTXs[i], ftutxos[i].outputIndex, network));//获取每个ft输入的爷交易
}
const 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();
let remarkData = Buffer.concat([Buffer.from('88888888', 'hex'), txData.serialize()]);
const transferTX = tbcLib.MultiSig.p2pkhToMultiSig_transferFT(tbc_from, tbc_multiSigAddress, Token, transferTokenAmount, utxo, ftutxos, preTXs, prepreTxDatas, privateKey, tbc_amount, remarkData);//组装交易
await tbcLib.API.broadcastTXraw(transferTX, network);
}
// doge: 29a753233bf4f3b546b5eacd0a8ec7a7a236bf7b987f51390a7cac90bb1d8bcf
// usdt: b7d03431efe6a85271a47b557c8bacad9b7fe7c3c8c15ce10a075b59d9a39326
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) {
const 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, tbcAmount = 0) {
const txData = new BitcoinRechargeData();
txData.to = nerveTo;
txData.value = tbcAmount;
txData.extend0 = extend;
txData.extend1 = tokenContract + '' + tokenAmount;
return '88888888' + txData.serialize().toString('hex');
}
function parseData() {
const hex = '0500017ab79bd5c00354e7d4f346749ad7d2c1f8bae031000000553239613735333233336266346633623534366235656163643061386563376137613233366266376239383766353133393061376361633930626231643862636631303030303030303030303030303030303030303000000000';
const txData = new BitcoinRechargeData();
txData.parse(Buffer.from(hex, 'hex'));
console.log(JSON.stringify(txData));
}
// parseData();