moac-api
Version:
moac api for dapp
1,002 lines (931 loc) • 34.7 kB
JavaScript
var common = require('./common');
var Chain3 = require('chain3');
var VnodeChain = require('./vnodeChain');
var config = require('./config');
/***
* 子链类的定义
* vnodeAddress: 主链vnode的ip地址 如http://192.168.10.234:8545
* monitorAddress: 子链monitor ip地址 如http://47.68.76.89:8546
* microChainAddress: 子链地址 如0x2be88a22ecaf05d0a1eacedb949ae8828d92e878
* dappBaseAddress: 子链dapp控制合约地址 如0xce357507d385969fa40e738208703de8d274489c
* via: 对应部署子链时vnodeconfig.json中的VnodeBeneficialAddress 如0xc968337c1a4167b5c6d1e273a0044016ea044988
*/
class MicroChain {
constructor(vnodeAddress, monitorAddress, microChainAddress, dappBaseAddress, via, version) {
this.vnodeAddress = vnodeAddress;
this.monitorAddress = monitorAddress;
this.microChainAddress = microChainAddress;
this.dappBaseAddress = dappBaseAddress;
this.vnodeChain = new VnodeChain(vnodeAddress);
this.via = via;
this.chain3 = new Chain3(new Chain3.providers.HttpProvider(vnodeAddress));
this.monitorIp = common.resolveAddress(this.monitorAddress).ip;
this.monitorPort = common.resolveAddress(this.monitorAddress).port;
this.mc = this.chain3.mc;
this.version = version;
return this;
}
/***
* 获取当前用户nonce-异步
* addr: 当前用户的地址
*
*/
getNonce(addr) {
var param = {"SubChainAddr": this.microChainAddress, "Sender": addr}
return new Promise ((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetNonce", param).then((nonce) => {
resolve(nonce);
}).catch((err) => {
reject(err);
})
});
}
/***
* 获取子链余额-异步
* addr: 当前用户的地址
* @returns 最小单位 erc20: decimals最小单位 10 * 1000000 原生:18个0
*/
getBalance(addr) {
var param = {"SubChainAddr": this.microChainAddress, "Sender": addr}
return new Promise ((resolve, reject) => {
if (!common.checkChain3(this.chain3)) {
reject(new Error("chain3 cannot be connected!"));
return;
}
var decimals = this.getDecimalsFromMc(this.microChainAddress);
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetBalance", param).then((balance) => {
resolve(this.chain3.fromSha(balance, "mc") * Math.pow(10, decimals));
}).catch((err) => {
reject(err);
})
});
}
/***
* 获取子链区块高度-异步
*
*/
getBlockNumber() {
var param = {"SubChainAddr": this.microChainAddress}
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetBlockNumber", param).then((blockNumber) => {
resolve(blockNumber);
}).catch((err) => {
reject(err);
})
})
}
/***
* 获取子链下一次停止区块高度-异步
*
*/
getBlockkThreshold() {
var param = {"SubChainAddr": this.microChainAddress}
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetBlockkThreshold", param).then((blockNumber) => {
resolve(blockNumber);
}).catch((err) => {
reject(err);
})
})
}
/**
* 获取子链dapp状态-异步 (1-正常 0-异常)
*/
getDappState() {
var param = {"SubChainAddr": this.microChainAddress}
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetDappState", param).then((state) => {
resolve(state);
}).catch((err) => {
reject(err);
})
})
}
/**
* 获取某一区块信息-异步
* number:区块高度
*/
getBlock(number) {
var param = {"SubChainAddr": this.microChainAddress, "Number": number};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetBlock", param).then((blockInfo) => {
resolve(blockInfo);
}).catch((err) => {
reject(err);
})
})
}
/**
* 获取某一区间内的多个区块信息-异步
* start: 开始高度
* end: 结束高度
*/
getBlocks(start, end) {
var param = {"SubChainAddr": this.microChainAddress, "Start": start, "End": end};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetBlocks", param).then((blockListInfo) => {
resolve(blockListInfo);
}).catch((err) => {
reject(err);
})
})
}
/**
* 获取子链详细信息-异步
*/
getMicroChainInfo() {
var param = {"SubChainAddr": this.microChainAddress};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetSubChainInfo", param).then((microChainInfo) => {
resolve(microChainInfo);
}).catch((err) => {
reject(err);
})
})
}
/**
* 根据TxHash获取交易信息-异步
* transactionHash: 交易hash
*/
getTransactionByHash(transactionHash) {
var param = {"Hash": transactionHash, "SubChainAddr": this.microChainAddress};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetTransactionByHash", param).then((transactionInfo) => {
resolve(transactionInfo);
}).catch((err) => {
reject(err);
})
})
}
/***
* 通过tx hash获取receipt信息
*/
getTransactionReceiptByHash(transactionHash) {
var param = {"Hash": transactionHash, "SubChainAddr": this.microChainAddress};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetReceiptByHash", param).then((receiptInfo) => {
resolve(receiptInfo);
}).catch((err) => {
reject(err);
})
})
}
/**
* 获取dappList
*/
getDappAddrList() {
var param = {"SubChainAddr": this.microChainAddress};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.GetDappAddrList", param).then((dappListInfo) => {
resolve(dappListInfo);
}).catch((err) => {
reject(err);
})
})
}
/**
* 调用子链dapp合约public方法-异步
* contractAddress: dapp合约地址
* param: 例如合约中存在一个无参的方法getDechatInfo,则传入["getDechatInfo"];
* 存在一个有参的方法getTopicList(uint pageNum, uint pageSize), 则传入["getTopicList", "0", "20"] (无论合约数据类型是什么,传入全为字符串格式)
*/
callContract(contractAddress, param) {
var paramObj = {"SubChainAddr": this.microChainAddress, "Sender": "085baafb872a9eb63403a00ad89beceb796abc9a",
"DappAddr": contractAddress, "Params": param};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.AnyCall", paramObj).then((result) => {
resolve(result);
}).catch((err) => {
reject(err);
})
})
}
/**
* 根据块号调用子链dapp合约public方法-异步
* 和callContract类似,只是多了一个入参blkNum
*/
callContractByBlkNum(contractAddress, param, blkNum) {
var paramObj = {"SubChainAddr": this.microChainAddress, "Sender": "085baafb872a9eb63403a00ad89beceb796abc9a",
"DappAddr": contractAddress, "Params": param, "BlkNum":blkNum};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.AnyCall", paramObj).then((result) => {
resolve(result);
}).catch((err) => {
reject(err);
})
})
}
/**
* public call方法调用子链合约方法-异步
* 当查询方法入参中存在数组格式的时候,callContract不适用,要用此方法
* data: getData获取的值,去除前两位0x
* blkNum: 按块号查询则blkNum传入块号,不按块号或当前块查询传0
*/
publicCallContract(contractAddress, data, blkNum) {
var paramObj = {"SubChainAddr": this.microChainAddress, "Sender": "085baafb872a9eb63403a00ad89beceb796abc9a",
"DappAddr": contractAddress, "Data": data, "BlkNum":blkNum};
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.PublicCall", paramObj).then((result) => {
resolve(result);
}).catch((err) => {
reject(err);
})
})
}
/**
* 子链转账(成功则返回转账交易hash, 失败则抛出异常信息)
* from: 转账人地址
* to: 收款人地址
* amount: 转账金额(最小单位,例如转账200个coin,decimals是6,则传入200 * 1000000)
* privateKey: 转账人私钥
* contractAddress: 子链是erc20,传入主链erc20代币合约地址。子链是moac,传入""
*
*/
transferCoin(from, to, amount, privateKey, contractAddress,nonce) {
var chain3 = this.chain3;
var mc = this.mc;
var via = this.via;
var microChainAddress = this.microChainAddress;
var version = this.version;
return new Promise((resolve, reject) => {
// if (!common.checkChain3(chain3)) {
// reject(new Error("chain3 cannot be connected!"));
// return;
// }
try {
if (contractAddress == "") {
// 子链是moac
amount = chain3.toSha(amount, "mc");
} else {
// 子链是erc20
var decimals = this.vnodeChain.getContractInstance(contractAddress, config.erc20Abi).decimals();
if (decimals == null || decimals == undefined) {
reject(new Error("cannot get decimals from your contractAddress!"));
return;
}
amount = this.getValueFromErcVal(amount, decimals);
}
} catch (e) {
reject(e);
return;
}
if(nonce){
if(version){
var rawTx = {
nonce: chain3.intToHex(nonce),
from: from,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: to,
shardingFlag: '0x2',
chainId: chain3.intToHex(version),
via: via
}
var signedTx = chain3.signTransaction(rawTx, privateKey);
mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
resolve(hash);
} else {
reject(err);
}
});
}else{
chain3.version.getNetwork(function (error, version) {
if (error != null) {
reject(error);
return;
}
var rawTx = {
nonce: chain3.intToHex(nonce),
from: from,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: to,
shardingFlag: '0x2',
chainId: chain3.intToHex(version),
via: via
}
var signedTx = chain3.signTransaction(rawTx, privateKey)
mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
resolve(hash);
} else {
reject(err);
}
});
});
}
}else{
this.getNonce(from).then((nonce) => {
if(version){
var rawTx = {
nonce: chain3.intToHex(nonce),
from: from,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: to,
shardingFlag: '0x2',
chainId: chain3.intToHex(version),
via: via
}
var signedTx = chain3.signTransaction(rawTx, privateKey)
mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
resolve(hash);
} else {
reject(err);
}
});
}else{
chain3.version.getNetwork(function (error, version) {
if (error != null) {
reject(error);
return;
}
var rawTx = {
nonce: chain3.intToHex(nonce),
from: from,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: to,
shardingFlag: '0x2',
chainId: chain3.intToHex(version),
via: via
}
var signedTx = chain3.signTransaction(rawTx, privateKey)
mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
resolve(hash);
} else {
reject(err);
}
});
});
}
}).catch((err) => {
reject(err);
})
}
})
}
/**
* 子链交易
* @param from 发起人
* @param to 接收人
* @param amount
* @param privateKey
* @param nonce
* @returns
*/
sendRawTransactionPrivate(from, to, amount, privateKey, contractAddress, nonce){
var obj = this;
var chain3 = this.chain3;
var mc = this.mc;
var via = this.via;
var microChainAddress = this.microChainAddress;
var version = this.version;
return new Promise((resolve, reject) => {
try {
if (contractAddress == "") {
// 子链是moac
amount = chain3.toSha(amount, "mc");
} else {
// 子链是erc20
var decimals = this.vnodeChain.getContractInstance(contractAddress, config.erc20Abi).decimals();
if (decimals == null || decimals == undefined) {
reject(new Error("cannot get decimals from your contractAddress!"));
return;
}
amount = this.getValueFromErcVal(amount, decimals);
}
} catch (e) {
reject(e);
return;
}
if(nonce){
if(version){
var rawTx = {
nonce: chain3.intToHex(nonce),
from: from,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: to,
shardingFlag: '0x2',
chainId: chain3.intToHex(version),
via: via
}
var signedTx = chain3.signTransaction(rawTx, privateKey);
//发送加签交易
obj.sendSignTransaction(signedTx).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
})
}else{
chain3.version.getNetwork(function (error, version) {
if (error != null) {
reject(error);
return;
}
var rawTx = {
nonce: chain3.intToHex(nonce),
from: from,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: to,
shardingFlag: '0x2',
chainId: chain3.intToHex(version),
via: via
}
var signedTx = chain3.signTransaction(rawTx, privateKey)
//发送加签交易
obj.sendSignTransaction(signedTx).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
})
});
}
}else{
this.getNonce(from).then((nonce) => {
if(version){
var rawTx = {
nonce: chain3.intToHex(nonce),
from: from,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: to,
shardingFlag: '0x2',
chainId: chain3.intToHex(version),
via: via
}
var signedTx = chain3.signTransaction(rawTx, privateKey)
//发送加签交易
obj.sendSignTransaction(signedTx).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
})
}else{
chain3.version.getNetwork(function (error, version) {
if (error != null) {
reject(error);
return;
}
var rawTx = {
nonce: chain3.intToHex(nonce),
from: from,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: to,
shardingFlag: '0x2',
chainId: chain3.intToHex(version),
via: via
}
var signedTx = chain3.signTransaction(rawTx, privateKey)
//发送加签交易
obj.sendSignTransaction(signedTx).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
})
});
}
}).catch((err) => {
reject(err);
})
}
})
}
/***
* 获取子链dapp合约实例
* dappContractAddress: dapp合约地址
* dappAbi:dapp合约的Abi对象
*/
getDappInstance(dappContractAddress, dappAbi) {
var dappContract = this.mc.contract(dappAbi);
return dappContract.at(dappContractAddress);
}
/***
* 提币到moac(子链原生币按比例兑换moac)
* addr:提币人地址
* amount:提币金额(单位个,例如提币10个coin,则传入10)
* privateKey:提币人私钥
*/
redeemMoacMintToken(addr, amount, privateKey) {
var chain3 = this.chain3;
var thisObj = this;
var microChainAddress = this.microChainAddress;
var via = this.via;
var dappBaseAddr = this.dappBaseAddress;
var version = this.version;
return new Promise((resolve, reject) => {
if (!common.checkChain3(chain3)) {
reject(new Error("chain3 cannot be connected!"));
return;
}
amount = chain3.toSha(amount, "mc");
thisObj.getNonce(addr).then((nonce) =>{
if(version){
var rawTx = {
nonce: chain3.intToHex(nonce),
from: addr,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: dappBaseAddr + "89739c5b",
shardingFlag: '0x1',
chainId: chain3.intToHex(version),
via: via
}
console.log(rawTx);
var signedTx = chain3.signTransaction(rawTx, privateKey)
chain3.mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
console.log("success");
resolve(hash);
} else {
console.log("fail:", err.message);
reject(err);
}
});
}else{
chain3.version.getNetwork(function (error, version) {
if (error != null) {
reject(error);
return;
}
var rawTx = {
nonce: chain3.intToHex(nonce),
from: addr,
gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: dappBaseAddr + "89739c5b",
shardingFlag: '0x1',
chainId: chain3.intToHex(version),
via: via
}
console.log(rawTx);
var signedTx = chain3.signTransaction(rawTx, privateKey)
chain3.mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
console.log("success");
resolve(hash);
} else {
console.log("fail:", err.message);
reject(err);
}
});
});
}
}).catch((err) => {
reject(err);
})
});
}
/***
* 提币到erc20(子链原生币按比例兑换erc20)
* addr:提币人地址
* amount:提币金额(最小单位,例如提币10个coin,decimals是6,则传入10 * 1000000)
* privateKey:提币人私钥
*/
redeemErcMintToken(addr, amount, privateKey) {
var chain3 = this.chain3;
var thisObj = this;
var microChainAddress = this.microChainAddress;
var via = this.via;
var dappBaseAddr = this.dappBaseAddress;
var version = this.version;
var decimals = this.getDecimalsFromMc(this.microChainAddress);
return new Promise((resolve, reject) => {
if (!common.checkChain3(chain3)) {
reject(new Error("chain3 cannot be connected!"));
return;
}
amount = this.getValueFromErcVal(amount, decimals);
thisObj.getNonce(addr).then((nonce) =>{
if(version){
var rawTx = {
nonce: chain3.intToHex(nonce),
from: addr,
gas: '0x0',
gasLimit: '0x0',//chain3.intToHex(0),
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: dappBaseAddr + "89739c5b",
shardingFlag: '0x1',
chainId: chain3.intToHex(version),
via: via
}
console.log(rawTx);
var signedTx = chain3.signTransaction(rawTx, privateKey)
chain3.mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
console.log("success");
resolve(hash);
} else {
console.log("fail:", err.message);
reject(err);
}
});
}else{
chain3.version.getNetwork(function (error, version) {
if (error != null) {
reject(error);
return;
}
var rawTx = {
nonce: chain3.intToHex(nonce),
from: addr,
gas: '0x0',
gasLimit: '0x0',//chain3.intToHex(0),
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: dappBaseAddr + "89739c5b",
shardingFlag: '0x1',
chainId: chain3.intToHex(version),
via: via
}
console.log(rawTx);
var signedTx = chain3.signTransaction(rawTx, privateKey)
chain3.mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
console.log("success");
resolve(hash);
} else {
console.log("fail:", err.message);
reject(err);
}
});
});
}
}).catch((err) => {
reject(err);
})
});
}
/***
* 发送子链加签交易(只用于调用需要发送交易的子链合约方法)
* @param from:交易发起人
* @param microChainAddress:子链地址
* @param amount:涉及payable相关业务需要发送的金额
* @param dappAddress:子链合约地址
* dappAddress, method, paramTypes参照getData方法入参
* @param privateKey: 交易发起人私钥
* @returns
*/
sendRawTransaction(from, microChainAddress, amount, dappAddress, method, paramTypes, paramValues, privateKey)
{
var chain3 = this.chain3;
var mc = this.mc;
var thisObj = this;
var via = this.via;
var dataStr = this.getData(method, paramTypes, paramValues);
var version = this.version;
return new Promise(function(resolve, reject){
if (!common.checkChain3(chain3)) {
reject(new Error("chain3 cannot be connected!"));
return;
}
thisObj.getNonce(from).then((nonce) => {
if(version){
var signTx = {
nonce: chain3.intToHex(nonce),
from: from,
//gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: dappAddress + dataStr.substring(2),
shardingFlag: "0x1",
chainId: chain3.intToHex(version),
via: via
}
console.log(signTx);
var signedTx = chain3.signTransaction(signTx, privateKey);
mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
resolve(hash);
} else {
console.log("error:" + err.message);
reject(err);
}
});
}else{
chain3.version.getNetwork(function (error, version) {
if (error != null) {
reject(error);
return;
}
var signTx = {
nonce: chain3.intToHex(nonce),
from: from,
//gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: dappAddress + dataStr.substring(2),
shardingFlag: "0x1",
chainId: chain3.intToHex(version),
via: via
}
console.log(signTx);
var signedTx = chain3.signTransaction(signTx, privateKey);
mc.sendRawTransaction(signedTx, function (err, hash) {
if (!err) {
resolve(hash);
} else {
console.log("error:" + err.message);
reject(err);
}
});
});
}
}).catch((err) => {
reject(err);
})
});
}
/***
* 获取加签后的tx
* @param from:交易发起人
* @param microChainAddress:子链地址
* @param amount:涉及payable相关业务需要发送的金额
* @param dappAddress:子链合约地址
* dappAddress, method, paramTypes参照getData方法入参
* @param privateKey: 交易发起人私钥
* @returns
*/
getSignedTx(from, microChainAddress, amount, dappAddress, method, paramTypes, paramValues, privateKey)
{
var chain3 = this.chain3;
var mc = this.mc;
var thisObj = this;
var via = this.via;
var dataStr = this.getData(method, paramTypes, paramValues);
var version = this.version;
return new Promise(function(resolve, reject){
if (!common.checkChain3(chain3)) {
reject(new Error("chain3 cannot be connected!"));
return;
}
thisObj.getNonce(from).then((nonce) => {
if(version){
var signTx = {
nonce: chain3.intToHex(nonce),
from: from,
//gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: dappAddress + dataStr.substring(2),
shardingFlag: "0x1",
chainId: chain3.intToHex(version),
via: via
}
console.log(signTx);
var signedTx = chain3.signTransaction(signTx, privateKey);
resolve(signedTx);
}else{
chain3.version.getNetwork(function (error, version) {
if (error != null) {
reject(error);
return;
}
var signTx = {
nonce: chain3.intToHex(nonce),
from: from,
//gas: '0x0',
gasLimit: '0x0',
gasPrice: chain3.fromDecimal(common.random(1, 200000)),
to: microChainAddress,
value: chain3.toHex(amount),
data: dappAddress + dataStr.substring(2),
shardingFlag: "0x1",
chainId: chain3.intToHex(version),
via: via
}
console.log(signTx);
var signedTx = chain3.signTransaction(signTx, privateKey);
resolve(signedTx);
});
}
}).catch((err) => {
reject(err);
})
});
}
/**
* 发送加签后的交易数据
* @param signTx 加签后的交易数据
*/
sendSignTransaction(signTx){
var params = {};
var str = signTx.substring(0,2);
if(str=="0x"){
params.TxData = signTx.slice(2);
}else{
params.TxData = signTx;
}
return new Promise((resolve, reject) => {
common.monitorRpcRequest(this.monitorIp, this.monitorPort, "ScsRPCMethod.SendRawTransaction", params).then((result) => {
resolve(result);
}).catch((err) => {
reject(err);
})
})
}
/**
* 传入子链类型是erc20的原生币金额(decimals最小单位),返回子链原生币单位金额(decimals是18)
*/
getValueFromErcVal(amount, decimals) {
return this.chain3.toSha((amount / Math.pow(10, decimals)), "mc");
}
/**
* 通过子链地址,获取子链上erc20的decimals
*/
getDecimalsFromMc(microChainAddress) {
var erc20Address = this.vnodeChain.getSubChainBaseInstance(microChainAddress, config.subChainBaseErcV1_0_8).ERCAddr();
var decimals = 0;
if (erc20Address == undefined || erc20Address == null || erc20Address == "0x") {
// moac充值
//throw new Error("cannot get erc20Address from this microChainAddress!");
decimals = 18;
} else {
// erc20充值
decimals = this.vnodeChain.getContractInstance(erc20Address, config.erc20Abi).decimals();
if (decimals == undefined || decimals == null) {
throw new Error("cannot get decimals from the erc20 contract!");
}
}
return decimals
}
/***
* 获取加签交易的data数据
* @param method方法 issue(address,uint256)
* @param paramTypes 参数类型数组 ['address','uint256']
* @param paramValues 参数值数组 ['0x.....',10000]
*/
getData(method,paramTypes,paramValues){
if(method == undefined || method == ""){
return "";
}
var data = this.chain3.sha3(method).slice(0, 10) + this.chain3.encodeParams(paramTypes, paramValues);
return data;
}
/***
* 加签
* @param message 加签前数据
* @param srcAddr 加签的钱包私钥
* @return 价钱后数据
*/
signMcMessage(message, privateKey){
return this.chain3.signMcMessage(message, privateKey);
}
/***
* 验签
* @param message 加签前数据
* @param signedData 价钱后数据
* @param srcAddr 加签的钱包地址
* @return true/fasle
*/
verifyMcSignature (message, signedData, srcAddr){
return this.chain3.verifyMcSignature(message, signedData, srcAddr);
}
}
// getData("issue(address,uint256)", ['address','uint256'], ["0xfdf", 213123123123])
module.exports = MicroChain;