qos-qweb
Version:
qos js sdk
200 lines • 17.6 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const bech32_1 = __importDefault(require("bech32"));
const int64_buffer_1 = require("int64-buffer");
const js_amino_1 = require("js-amino");
const tweetnacl_1 = __importDefault(require("tweetnacl"));
const _1 = require(".");
const common_1 = require("../types/common");
const tx_1 = require("../types/tx");
function getOriginAddress(address) {
const addrDecode = bech32_1.default.decode(address);
const fromwords = bech32_1.default.fromWords(addrDecode.words);
return fromwords;
}
exports.getOriginAddress = getOriginAddress;
function signTxMsg(oMsg) {
const msg = makeTxSignMsg(oMsg);
const signatureData = tweetnacl_1.default.sign.detached(Buffer.from(msg.signedMsg), oMsg.account.keypair.secretKey);
const codec = registerCodec();
const pubKey = new tx_1.PubKeyEd25519([...oMsg.account.keypair.publicKey]);
const sig = new tx_1.Signature(pubKey, [...signatureData], oMsg.nonce.toString());
const sendMultiMsg = new tx_1.MsgMultiSend(msg.senders, msg.receivers);
const stdtx = new tx_1.StdTx(sendMultiMsg, [sig], oMsg.chainid, oMsg.maxGas.toString());
// const jsonTx = codec.marshalJson(stdtx)
// logger.debug('stdtx: ')
// logger.info(jsonTx)
// logger.debug('marshalBinary: ')
const binary = codec.marshalBinary(stdtx);
// logger.debug(binary.toString())
// const decodedDataTx = new StdTx();
// codec.unMarshalBinary(binary, decodedDataTx)
// logger.debug('unMb StdTx: ')
// logger.info(decodedDataTx.JsObject())
return binary;
}
exports.signTxMsg = signTxMsg;
function makeTxSignMsg({ account, tx, chainid, maxGas, nonce }) {
let arrMsg = [];
// push buffer of orginaddress
const fromAddress = getOriginAddress(account.address);
arrMsg = arrMsg.concat(fromAddress);
const allData = composeData(tx);
// concat buffer of qosAmount
arrMsg = arrMsg.concat([..._1.stringToBuffer(allData.qosAmount.toString())]);
// concat buffer of qscAmount
const qscArray = [];
const qscArr = [];
for (const qsc of allData.qscAmountArr) {
qscArray.push(`${qsc.amount}${qsc.coinName}`);
qscArr.push(new tx_1.QSC(qsc.coinName, qsc.amount.toString()));
}
// compose qsc string , e.g. 2qsca,3qscb
const qscString = qscArray.join(',');
arrMsg = arrMsg.concat([..._1.stringToBuffer(qscString)]);
arrMsg = arrMsg.concat([...allData.arrReceiver]);
const chaidBufferArray = [..._1.stringToBuffer(chainid)];
arrMsg = arrMsg.concat(chaidBufferArray);
arrMsg = arrMsg.concat([..._1.Int64ToBuffer(maxGas)]);
arrMsg = arrMsg.concat([..._1.Int64ToBuffer(nonce)]);
arrMsg = arrMsg.concat(chaidBufferArray);
const senders = [
new tx_1.Sender(fromAddress, allData.qosAmount.toString(), qscArr)
];
const receivers = allData.receivers;
return { signedMsg: arrMsg, senders, receivers };
}
function registerCodec() {
const codec = new js_amino_1.Codec();
codec.registerConcrete(new tx_1.StdTx(), 'qbase/txs/stdtx', {});
codec.registerConcrete(new tx_1.MsgMultiSend(), 'transfer/txs/TxTransfer', {});
codec.registerConcrete(new tx_1.PubKeyEd25519(), 'tendermint/PubKeyEd25519', {});
return codec;
}
function composeData(tx) {
const coinNameArr = getQscCoinNames(tx);
if (Array.isArray(tx)) {
return txIsArrayForComposeData(tx, coinNameArr);
}
return txForComposeData(tx, coinNameArr);
}
function txIsArrayForComposeData(tx, coinNameArr) {
let qosAmount = 0;
const qscAmountArr = [];
// 添加 receiver 代签名 byte[]
let arrReceiver = [];
const receivers = [];
for (const item of tx) {
item.qos = _1.accMul(item.qos, common_1.qosDecimal);
qosAmount += item.qos;
const toAddress = getOriginAddress(item.to);
arrReceiver = arrReceiver.concat(toAddress);
arrReceiver = arrReceiver.concat([..._1.stringToBuffer(item.qos.toString())]);
const qscArr = [];
const cqscAmountArr = [];
if (item.qscs && item.qscs.length > 0) {
for (const coinName of coinNameArr) {
const cqsc = item.qscs
.filter(x => x.coin_name.toLowerCase() === coinName)
.reduce((pre, current) => {
return {
coin_name: pre.coin_name,
amount: pre.amount + current.amount
};
});
cqsc.amount = _1.accMul(cqsc.amount, common_1.qosDecimal);
cqscAmountArr.push(`${cqsc.amount}${coinName}`);
qscArr.push(new tx_1.QSC(coinName, cqsc.amount.toString()));
const index = qscAmountArr.findIndex(x => x.coinName === coinName);
if (index > -1) {
qscAmountArr[index].amount += cqsc.amount;
}
else {
qscAmountArr.push({
coinName,
amount: cqsc.amount
});
}
}
arrReceiver = arrReceiver.concat([
..._1.stringToBuffer(cqscAmountArr.join(','))
]);
}
receivers.push(new tx_1.Receiver(toAddress, item.qos.toString(), qscArr));
}
return {
qosAmount: new int64_buffer_1.Int64BE(qosAmount),
qscAmountArr,
arrReceiver,
receivers
};
}
function txForComposeData(tx, coinNameArr) {
let qosAmount = 0;
const qscAmountArr = [];
// 添加 receiver 代签名 byte[]
let arrReceiver = [];
const qscArr = [];
qosAmount = _1.accMul(tx.qos, common_1.qosDecimal);
const toAddress = getOriginAddress(tx.to);
arrReceiver = arrReceiver.concat(toAddress);
arrReceiver = arrReceiver.concat([..._1.stringToBuffer(tx.qos.toString())]);
const cqscAmountArr = [];
if (tx.qscs && tx.qscs.length > 0) {
for (const coinName of coinNameArr) {
const cqsc = tx.qscs
.filter(x => x.coin_name.toLowerCase() === coinName)
.reduce((pre, current) => {
return {
coin_name: pre.coin_name,
amount: pre.amount + current.amount
};
});
cqsc.amount = _1.accMul(cqsc.amount, common_1.qosDecimal);
cqscAmountArr.push(`${cqsc.amount}${coinName}`);
qscAmountArr.push({
coinName,
amount: cqsc.amount
});
qscArr.push(new tx_1.QSC(coinName, cqsc.amount.toString()));
}
arrReceiver = arrReceiver.concat([
..._1.stringToBuffer(cqscAmountArr.join(','))
]);
}
const receivers = [new tx_1.Receiver(toAddress, tx.qos.toString(), qscAmountArr)];
return {
qosAmount: new int64_buffer_1.Int64BE(qosAmount),
qscAmountArr,
arrReceiver,
receivers
};
}
/**
* 去重并获取所有QSC的CoinName数组,如['QSC']
* @param tx 交易体
*/
function getQscCoinNames(tx) {
const qscSet = new Set();
if (Array.isArray(tx)) {
for (const item of tx) {
if (item.qscs && item.qscs.length > 0) {
for (const qsc of item.qscs) {
qscSet.add(qsc.coin_name.toLowerCase());
}
}
}
}
else {
if (tx.qscs && tx.qscs.length > 0) {
for (const qsc of tx.qscs) {
qscSet.add(qsc.coin_name.toLowerCase());
}
}
}
return [...qscSet];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHhTaWduRGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL1R4U2lnbkRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsK0NBQXVDO0FBQ3ZDLHVDQUFpQztBQUNqQywwREFBNkI7QUFDN0Isd0JBQTBEO0FBRTFELDRDQUFzRDtBQUN0RCxvQ0FRcUI7QUFFckIsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBZTtJQUM5QyxNQUFNLFVBQVUsR0FBRyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUpELDRDQUlDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBTXpCO0lBQ0MsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sYUFBYSxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDL0IsQ0FBQztJQUVGLE1BQU0sS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksa0JBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN0RSxNQUFNLEdBQUcsR0FBRyxJQUFJLGNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUU3RSxNQUFNLFlBQVksR0FB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