UNPKG

moac-api

Version:
1,002 lines (931 loc) 34.7 kB
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;