wormhole/test/testlib.js

89 lines
2.8 KiB
JavaScript
Raw Normal View History

2021-11-17 06:13:08 -08:00
/**
*
* Pricecaster Testing Library.
* (c) 2021-22 Randlabs, Inc.
*
*/
const web3EthAbi = require('web3-eth-abi')
const web3Utils = require('web3-utils')
const elliptic = require('elliptic')
class TestLib {
/**
* Create a packed and signed VAA for testing.
* See https://github.com/certusone/wormhole/blob/dev.v2/design/0001_generic_message_passing.md
*
* @param {} guardianSetIndex The guardian set index
* @param {*} signers The list of private keys for signing the VAA
* @param {*} timestamp The timestamp of VAA
* @param {*} nonce The nonce.
* @param {*} emitterChainId The emitter chain identifier
* @param {*} emitterAddress The emitter chain address, prefixed with 0x
* @param {*} sequence The sequence.
* @param {*} consistencyLevel The reported consistency level
* @param {*} payload This VAA Payload hex string, prefixed with 0x
*/
createSignedVAA (guardianSetIndex,
signers,
timestamp,
nonce,
emitterChainId,
emitterAddress,
sequence,
consistencyLevel,
payload) {
const body = [
web3EthAbi.encodeParameter('uint32', timestamp).substring(2 + (64 - 8)),
web3EthAbi.encodeParameter('uint32', nonce).substring(2 + (64 - 8)),
web3EthAbi.encodeParameter('uint16', emitterChainId).substring(2 + (64 - 4)),
web3EthAbi.encodeParameter('bytes32', emitterAddress).substring(2),
web3EthAbi.encodeParameter('uint64', sequence).substring(2 + (64 - 16)),
web3EthAbi.encodeParameter('uint8', consistencyLevel).substring(2 + (64 - 2)),
payload.substr(2)
]
const hash = web3Utils.soliditySha3(web3Utils.soliditySha3('0x' + body.join('')))
let signatures = ''
for (const i in signers) {
// eslint-disable-next-line new-cap
const ec = new elliptic.ec('secp256k1')
const key = ec.keyFromPrivate(signers[i])
const signature = key.sign(hash.substr(2), { canonical: true })
const packSig = [
web3EthAbi.encodeParameter('uint8', i).substring(2 + (64 - 2)),
this.zeroPadBytes(signature.r.toString(16), 32),
this.zeroPadBytes(signature.s.toString(16), 32),
web3EthAbi.encodeParameter('uint8', signature.recoveryParam).substr(2 + (64 - 2))
]
signatures += packSig.join('')
}
const vm = [
web3EthAbi.encodeParameter('uint8', 1).substring(2 + (64 - 2)),
web3EthAbi.encodeParameter('uint32', guardianSetIndex).substring(2 + (64 - 8)),
web3EthAbi.encodeParameter('uint8', signers.length).substring(2 + (64 - 2)),
signatures,
body.join('')
].join('')
return vm
}
zeroPadBytes (value, length) {
while (value.length < 2 * length) {
value = '0' + value
}
return value
}
}
module.exports = {
TestLib
}