nerve-sdk-js
Version:
nerve nerve-js nerve-sdk nerve-js-sdk
738 lines (676 loc) • 21.8 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); }); }; }
var http = require('./https.js');
var sdk = require('../../api/sdk');
var cryptos = require("crypto");
var numberUtil = require("../../utils/numberUtil");
module.exports = {
/**
* 判断是否为主网
* @param chainId
**/
isMainNet(chainId) {
if (chainId === 2) {
return true;
}
return false;
},
/**
* 计算手续费
* @param tx
* @param signatrueCount 签名数量,默认为1
**/
countFee(tx, signatrueCount) {
var txSize = tx.txSerialize().length;
txSize += signatrueCount * 110;
return 100000 * Math.ceil(txSize / 1024);
},
/**
* 计算跨链交易手续费
* @param tx
* @param signatrueCount 签名数量,默认为1
**/
countCtxFee(tx, signatrueCount) {
var txSize = tx.txSerialize().length;
txSize += signatrueCount * 110;
return 1000000 * Math.ceil(txSize / 1024);
},
/**
* 获取inputs 、 outputs
* @param transferInfo
* @param balanceInfo
* @param type
* @returns {*}
*/
mutiInputsOrOutputs(transferInfo, balanceInfo, type) {
var newAmount = numberUtil.Plus(transferInfo.from.amount, transferInfo.fee);
var newLocked = 0;
var newNonce = balanceInfo.nonce;
if (numberUtil.isLessThan(balanceInfo.balance, newAmount)) {
return {
success: false,
data: "Your balance is not enough."
};
}
var inputs = [{
address: transferInfo.from.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: newAmount,
locked: newLocked,
nonce: newNonce
}];
var outputs = [];
for (var i = 0; i < transferInfo.to.length; i++) {
var to = transferInfo.to[i];
outputs.push({
address: to.toAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: to.amount,
lockTime: to.lockTime ? to.lockTime : 0
});
}
return {
success: true,
data: {
inputs: inputs,
outputs: outputs
}
};
},
/**
* 获取inputs 、 outputs
* @param transferInfo
* @param balanceInfo
* @param type 2:转账 4:创建节点 5:加入staking 6:退出staking 9:注销节点 28:追加保证金 29:退出保证金
* @returns {*}
*/
inputsOrOutputs(transferInfo, balanceInfo, type) {
transferInfo.amount = numberUtil.instance(transferInfo.amount).toFixed();
transferInfo.fee = numberUtil.instance(transferInfo.fee).toFixed();
var newAmount = numberUtil.Plus(transferInfo.amount, transferInfo.fee);
var newLocked = 0;
var newNonce = balanceInfo.nonce;
var newoutputAmount = numberUtil.instance(transferInfo.amount);
var newLockTime = 0;
var inputs = [];
var outputs = [];
if (type === 4) {
newLockTime = -1;
} else if (type === 5) {
if (transferInfo.defaultAssetsInfo) {
// 加入的资产不是nvt input组装两个
var newArr = {
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: transferInfo.amount,
locked: 0,
nonce: balanceInfo.nonce
};
inputs.push(newArr);
var feeArr = {
address: transferInfo.fromAddress,
assetsChainId: transferInfo.defaultAssetsInfo.chainId,
assetsId: transferInfo.defaultAssetsInfo.assetsId,
amount: transferInfo.fee,
locked: 0,
nonce: transferInfo.feeBalanceInfo.nonce
};
inputs.push(feeArr);
} else {
// 加入的资产是nvt 合并amount+fee
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: newAmount.toFixed(),
locked: 0,
nonce: balanceInfo.nonce
});
}
outputs.push({
address: transferInfo.toAddress ? transferInfo.toAddress : transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: transferInfo.amount,
lockTime: transferInfo.locked
});
return {
success: true,
data: {
inputs: inputs,
outputs: outputs
}
};
} else if (type === 6) {
if (transferInfo.defaultAssetsInfo) {
// 加入的资产不是nvt input组装两个
var _newArr = {
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: transferInfo.amount,
locked: -1,
nonce: balanceInfo.nonce
};
inputs.push(_newArr);
var _feeArr = {
address: transferInfo.fromAddress,
assetsChainId: transferInfo.defaultAssetsInfo.chainId,
assetsId: transferInfo.defaultAssetsInfo.assetsId,
amount: transferInfo.fee,
locked: -1,
nonce: transferInfo.feeBalanceInfo.nonce
};
inputs.push(_feeArr);
outputs.push({
address: transferInfo.toAddress ? transferInfo.toAddress : transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: transferInfo.amount,
lockTime: 0
});
} else {
// 加入的资产是nvt 合并amount+fee
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: transferInfo.amount,
locked: -1,
nonce: balanceInfo.nonce
});
outputs.push({
address: transferInfo.toAddress ? transferInfo.toAddress : transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: numberUtil.Minus(transferInfo.amount, transferInfo.fee).toFixed(),
lockTime: 0
});
}
return {
success: true,
data: {
inputs: inputs,
outputs: outputs
}
};
} else if (type === 9) {
//注销节点
newoutputAmount = numberUtil.Minus(transferInfo.amount, transferInfo.fee);
var times = new Date().valueOf() + 3600000 * 72; //锁定三天
newLockTime = Number(times.toString().substr(0, times.toString().length - 3));
for (var item of transferInfo.nonceList) {
var _newArr2 = {
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: item.deposit,
locked: -1,
nonce: item.nonce
};
inputs.push(_newArr2);
}
outputs.push({
address: transferInfo.toAddress ? transferInfo.toAddress : transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: newoutputAmount.toFixed(),
lockTime: newLockTime
});
return {
success: true,
data: {
inputs: inputs,
outputs: outputs
}
};
} else if (type === 28) {
//追加保证金
newLockTime = -1;
} else if (type === 29) {
//退出保证金
newoutputAmount = numberUtil.Minus(transferInfo.amount, transferInfo.fee); //锁定三天
var _times = new Date().valueOf() + 3600000 * 72;
newLockTime = Number(_times.toString().substr(0, _times.toString().length - 3));
for (var _item of transferInfo.nonceList) {
var _newArr3 = {
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: _item.deposit,
locked: -1,
nonce: _item.nonce
};
inputs.push(_newArr3);
}
outputs.push({
address: transferInfo.toAddress ? transferInfo.toAddress : transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: newoutputAmount.toFixed(),
lockTime: newLockTime
});
var allAmount = 0;
for (var _item2 of transferInfo.nonceList) {
// allAmount = allAmount + Number(item.deposit);
allAmount = numberUtil.Plus(allAmount, _item2.deposit);
}
outputs.push({
address: transferInfo.toAddress ? transferInfo.toAddress : transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: numberUtil.Minus(allAmount, transferInfo.amount).toFixed(),
lockTime: -1
});
return {
success: true,
data: {
inputs: inputs,
outputs: outputs
}
};
}
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: newAmount.toFixed(),
locked: newLocked,
nonce: newNonce
});
outputs.push({
address: transferInfo.toAddress ? transferInfo.toAddress : transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: newoutputAmount.toFixed(),
lockTime: newLockTime
});
/*console.log(inputs);
console.log(outputs);*/
return {
success: true,
data: {
inputs: inputs,
outputs: outputs
}
};
},
/**
* 获取跨链交易inputs 、 outputs
* @param transferInfo
* @param balanceInfo
* @param chainId
* @returns {*}
*/
ctxInputsOrOutputs(transferInfo, balanceInfo, chainId) {
var _this = this;
return _asyncToGenerator(function* () {
var inputs = [];
var outputs = [{
address: transferInfo.toAddress ? transferInfo.toAddress : transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: transferInfo.amount,
lockTime: 0
}];
var mainNetBalanceInfo = yield _this.getBalance(chainId, 2, 1, transferInfo.fromAddress);
var localBalanceInfo; //如果不是主网需要收取NULS手续费
if (!isMainNet(chainId)) {
if (mainNetBalanceInfo.balance < transferInfo.fee) {
console.log("余额不足");
return;
}
} //如果转出资产为本链主资产,则直接将手续费加到转出金额上
if (chainId === transferInfo.assetsChainId && transferInfo.assetsId === 1) {
var newAmount = transferInfo.amount + transferInfo.fee;
if (balanceInfo.balance < transferInfo.amount + transferInfo.fee) {
console.log("余额不足");
return;
} //转出的本链资产 = 转出资产amount + 本链手续费
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: newAmount,
locked: 0,
nonce: balanceInfo.nonce
}); //如果不是主网需收取主网NULS手续费
if (!isMainNet(chainId)) {
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: 2,
assetsId: 1,
amount: transferInfo.fee,
locked: 0,
nonce: mainNetBalanceInfo.nonce
});
}
} else {
localBalanceInfo = yield _this.getBalance(chainId, chainId, 1, transferInfo.fromAddress);
if (localBalanceInfo.balance < transferInfo.fee) {
console.log("该账户本链主资产不足够支付手续费!");
return;
} //如果转出的是NULS,则需要把NULS手续费添加到转出金额上
if (transferInfo.assetsChainId === 2 && transferInfo.assetsId === 1) {
var _newAmount = transferInfo.amount + transferInfo.fee;
if (mainNetBalanceInfo.balance < _newAmount) {
console.log("余额不足");
return;
}
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: _newAmount,
locked: 0,
nonce: mainNetBalanceInfo.nonce
});
} else {
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: transferInfo.assetsChainId,
assetsId: transferInfo.assetsId,
amount: transferInfo.amount,
locked: 0,
nonce: balanceInfo.nonce
});
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: 2,
assetsId: 1,
amount: transferInfo.fee,
locked: 0,
nonce: mainNetBalanceInfo.nonce
});
} //本链主资产手续费
if (!isMainNet(chainId)) {
inputs.push({
address: transferInfo.fromAddress,
assetsChainId: chainId,
assetsId: 1,
amount: transferInfo.fee,
locked: 0,
nonce: localBalanceInfo.nonce
});
}
}
return {
success: true,
data: {
inputs: inputs,
outputs: outputs
}
};
})();
},
/**
* 获取账户的余额及nonce
* @param address
* @param chainId
* @param assetChainId
* @param assetId
* @returns {Promise<AxiosResponse<any>>}
*/
getBalance(chainId) {
var _arguments = arguments;
return _asyncToGenerator(function* () {
var assetChainId = _arguments.length > 1 && _arguments[1] !== undefined ? _arguments[1] : 5;
var assetId = _arguments.length > 2 && _arguments[2] !== undefined ? _arguments[2] : 1;
var address = _arguments.length > 3 ? _arguments[3] : undefined;
return yield http.postComplete('/', 'getAccountBalance', [chainId, assetChainId, assetId, address]).then(response => {
//console.log(response);
return {
'balance': response.result.balance,
'nonce': response.result.nonce
};
}).catch(error => {
return {
success: false,
data: error
};
});
})();
},
/**
* 获取账户的余额及nonce
* @param address
* @returns {Promise<AxiosResponse<any>>}
*/
getNulsBalance(address) {
var _arguments2 = arguments;
return _asyncToGenerator(function* () {
var chainId = _arguments2.length > 1 && _arguments2[1] !== undefined ? _arguments2[1] : 5;
var assetId = _arguments2.length > 2 && _arguments2[2] !== undefined ? _arguments2[2] : 1;
return yield http.post('/', 'getAccountBalance', [chainId, assetId, address]).then(response => {
//console.log(response);
if (response.hasOwnProperty("result")) {
return {
success: true,
data: {
balance: response.result.balance,
nonce: response.result.nonce
}
};
} else {
throw "Get balance error"; // return {success: false, data: response}
}
}).catch(error => {
// console.log(error)
throw "Network error"; // return {success: false, data: error};
});
})();
},
/**
* 验证交易
* @param txHex
* @returns {Promise<AxiosResponse<any>>}
*/
validateTx(txHex) {
return _asyncToGenerator(function* () {
return yield http.post('/', 'validateTx', [txHex]).then(response => {
//console.log(response);
if (response.hasOwnProperty("result")) {
return {
success: true,
data: response.result
};
} else {
return {
success: false,
error: response.error
};
}
}).catch(error => {
return {
success: false,
error: error
};
});
})();
},
/**
* 获取所有地址前缀映射关系
* @returns {Promise<AxiosResponse<any>>}
*/
getAllAddressPrefix() {
return _asyncToGenerator(function* () {
return yield http.post('/', 'getAllAddressPrefix', []).then(response => {
console.log(response);
if (response.hasOwnProperty("result")) {
var data = {};
for (var i = 0; i < response.result.length; i++) {
data[response.result[i].chainId] = response.result[i].addressPrefix;
}
return {
success: true,
data: data
};
} else {
return {
success: false,
data: response.error
};
}
}).catch(error => {
return {
success: false,
data: error
};
});
})();
},
/**
* 获取所有可用于swap交易的稳定币交易池
* @returns {Promise<AxiosResponse<any>>}
*/
getStablePairListForSwapTrade() {
return _asyncToGenerator(function* () {
return yield http.post('/', 'getStablePairListForSwapTrade', []).then(response => {
console.log(response);
if (response.hasOwnProperty("result")) {
return {
success: true,
data: response.result
};
} else {
return {
success: false,
data: response.error
};
}
}).catch(error => {
return {
success: false,
data: error
};
});
})();
},
/**
* 广播交易
* @param txHex
* @returns {Promise<AxiosResponse<any>>}
*/
broadcastTx(txHex) {
return _asyncToGenerator(function* () {
return yield http.post('/', 'broadcastTx', [txHex]).then(response => {
if (response.hasOwnProperty("result")) {
return response.result;
} else {
return response.error;
}
}).catch(error => {
return {
success: false,
data: error
};
});
})();
},
/**
* 跨链交易广播
* @param txHex
* @returns {Promise<AxiosResponse<any>>}
*/
sendCrossTx(txHex) {
return _asyncToGenerator(function* () {
return yield http.post('/', 'sendCrossTx', [8, txHex]).then(response => {
console.log(response);
return response.result;
}).catch(error => {
return {
success: false,
data: error
};
});
})();
},
/**
* 获取节点详细信息
* @param agentHash
* @returns {Promise<AxiosResponse<any>>}
*/
getConsensusNode(agentHash) {
return _asyncToGenerator(function* () {
return yield http.post('/', 'getConsensusNode', [agentHash]).then(response => {
if (response.hasOwnProperty('result')) {
return {
success: true,
data: response.result
};
} else {
return {
success: false,
data: response
};
}
}).catch(error => {
return {
success: false,
data: error
};
});
})();
},
/**
* 查询资产的USD价格
* @returns {Promise<AxiosResponse<any>>}
*/
getSymbolPriceOfUsdt(chainId, assetId) {
var _arguments3 = arguments;
return _asyncToGenerator(function* () {
var assetType = _arguments3.length > 2 && _arguments3[2] !== undefined ? _arguments3[2] : '';
return yield http.postComplete('/', 'getQuotationUsdtPrice', [chainId, assetId, assetType]) // return await http.postComplete('/', 'getBestSymbolPrice', [chainId, assetId, assetType])
.then(response => {
if (response.hasOwnProperty("result")) {
return response.result;
} else {
return response.error;
}
}).catch(error => {
return {
success: false,
data: error
};
});
})();
},
/**
* 返回异构链主资产在NERVE网络的资产信息
*/
getHeterogeneousMainAsset(htgChainId) {
return _asyncToGenerator(function* () {
return yield http.postComplete('/', 'getHeterogeneousMainAsset', [htgChainId]).then(response => {
if (response.hasOwnProperty("result")) {
return response.result;
} else {
return response.error;
}
}).catch(error => {
return {
success: false,
data: error
};
});
})();
},
getMinimumFeeOfWithdrawal(htgChainId, nerveTxHash) {
return _asyncToGenerator(function* () {
return yield http.postComplete('/', 'getMinimumFeeOfWithdrawal', [htgChainId, nerveTxHash]).then(response => {
if (response.hasOwnProperty("result")) {
return response.result;
} else {
return response.error;
}
}).catch(error => {
return {
success: false,
data: error
};
});
})();
}
};