eth-to-bnc-bridge/src/oracle/tss-sign/tx.js

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