83 lines
2.1 KiB
JavaScript
83 lines
2.1 KiB
JavaScript
const TransactionBnc = require('@binance-chain/javascript-sdk/lib/tx').default
|
|
const { crypto } = require('@binance-chain/javascript-sdk')
|
|
const BN = require('bignumber.js')
|
|
|
|
const { FOREIGN_CHAIN_ID } = process.env
|
|
|
|
class Transaction {
|
|
constructor (fromAddress, accountNumber, sequence, toAddress, amount, asset, memo = 'test') {
|
|
const accCode = crypto.decodeAddress(fromAddress)
|
|
const toAccCode = crypto.decodeAddress(toAddress)
|
|
|
|
amount = new BN(amount).multipliedBy(10 ** 8).toNumber()
|
|
|
|
const coin = {
|
|
denom: asset,
|
|
amount: amount,
|
|
}
|
|
|
|
const msg = {
|
|
inputs: [{
|
|
address: accCode,
|
|
coins: [coin]
|
|
}],
|
|
outputs: [{
|
|
address: toAccCode,
|
|
coins: [coin]
|
|
}],
|
|
msgType: 'MsgSend'
|
|
}
|
|
|
|
this.signMsg = {
|
|
inputs: [{
|
|
address: fromAddress,
|
|
coins: [coin]
|
|
}],
|
|
outputs: [{
|
|
address: toAddress,
|
|
coins: [coin]
|
|
}]
|
|
}
|
|
|
|
const options = {
|
|
account_number: accountNumber,
|
|
chain_id: FOREIGN_CHAIN_ID,
|
|
memo: memo,
|
|
msg,
|
|
sequence,
|
|
type: msg.msgType,
|
|
}
|
|
this.tx = new TransactionBnc(options)
|
|
}
|
|
|
|
getSignBytes () {
|
|
return this.tx.getSignBytes(this.signMsg)
|
|
}
|
|
|
|
addSignature (publicKey, signature) {
|
|
const yLast = parseInt(publicKey.y[publicKey.y.length - 1], 16)
|
|
const n = new BN('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141', 16)
|
|
const s = new BN(signature.s, 16)
|
|
if (s.gt(n.div(2))) {
|
|
console.log('Normalizing s')
|
|
signature.s = n.minus(s).toString(16)
|
|
}
|
|
const publicKeyEncoded = Buffer.from('eb5ae98721' + (yLast % 2 ? '03' : '02') + padZeros(publicKey.x, 64), 'hex')
|
|
this.tx.signatures = [{
|
|
pub_key: publicKeyEncoded,
|
|
signature: Buffer.from(padZeros(signature.r, 64) + padZeros(signature.s, 64), 'hex'),
|
|
account_number: this.tx.account_number,
|
|
sequence: this.tx.sequence,
|
|
}]
|
|
return this.tx.serialize()
|
|
}
|
|
}
|
|
|
|
function padZeros (s, len) {
|
|
while (s.length < len)
|
|
s = '0' + s
|
|
return s
|
|
}
|
|
|
|
module.exports = Transaction
|