pyth-crosschain/target_chains/ethereum/scripts/createLocalnetGovernanceVaa.js

104 lines
2.5 KiB
JavaScript

const abi = require("web3-eth-abi");
const utils = require("web3-utils");
const elliptic = require("elliptic");
const testSigner1PK =
"cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0";
const testGovernanceChain = "1"; // ethereum
const testGovernanceEmitter =
"0x0000000000000000000000000000000000000000000000000000000000001234";
function zeroPadBytes(value, length) {
while (value.length < 2 * length) {
value = "0" + value;
}
return value;
}
const signAndEncodeVM = function (
timestamp,
nonce,
emitterChainId,
emitterAddress,
sequence,
data,
signers,
guardianSetIndex,
consistencyLevel
) {
const body = [
abi.encodeParameter("uint32", timestamp).substring(2 + (64 - 8)),
abi.encodeParameter("uint32", nonce).substring(2 + (64 - 8)),
abi.encodeParameter("uint16", emitterChainId).substring(2 + (64 - 4)),
abi.encodeParameter("bytes32", emitterAddress).substring(2),
abi.encodeParameter("uint64", sequence).substring(2 + (64 - 16)),
abi.encodeParameter("uint8", consistencyLevel).substring(2 + (64 - 2)),
data.substr(2),
];
const hash = utils.soliditySha3(utils.soliditySha3("0x" + body.join("")));
let signatures = "";
for (let i in signers) {
const ec = new elliptic.ec("secp256k1");
const key = ec.keyFromPrivate(signers[i]);
const signature = key.sign(hash.substr(2), { canonical: true });
const packSig = [
abi.encodeParameter("uint8", i).substring(2 + (64 - 2)),
zeroPadBytes(signature.r.toString(16), 32),
zeroPadBytes(signature.s.toString(16), 32),
abi
.encodeParameter("uint8", signature.recoveryParam)
.substr(2 + (64 - 2)),
];
signatures += packSig.join("");
}
const vm = [
abi.encodeParameter("uint8", 1).substring(2 + (64 - 2)),
abi.encodeParameter("uint32", guardianSetIndex).substring(2 + (64 - 8)),
abi.encodeParameter("uint8", signers.length).substring(2 + (64 - 2)),
signatures,
body.join(""),
].join("");
return vm;
};
function createVAAFromUint8Array(
dataBuffer,
emitterChainId,
emitterAddress,
sequence
) {
const dataHex = "0x" + dataBuffer.toString("hex");
return (
"0x" +
signAndEncodeVM(
0,
0,
emitterChainId,
emitterAddress,
sequence,
dataHex,
[testSigner1PK],
0,
0
)
);
}
module.exports = function createLocalnetGovernanceVAA(dataBuffer, sequence) {
return createVAAFromUint8Array(
dataBuffer,
testGovernanceChain,
testGovernanceEmitter,
sequence
);
};