You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.2 KiB
152 lines
4.2 KiB
4 years ago
|
const ethers = require('ethers');
|
||
|
const { types, task } = require('hardhat/config');
|
||
|
const utils = require('./utils.js');
|
||
|
|
||
|
task('prove', 'Prove a message inclusion to a replica')
|
||
|
.addParam(
|
||
|
'address',
|
||
|
'The address of the replica contract.',
|
||
|
undefined,
|
||
|
types.string,
|
||
|
)
|
||
|
.addParam('message', 'The message to prove.', undefined, types.string)
|
||
|
.addParam(
|
||
|
'proof',
|
||
|
'The 32 * 32 byte proof as a single hex string',
|
||
|
undefined,
|
||
|
types.string,
|
||
|
)
|
||
|
.addParam(
|
||
|
'index',
|
||
|
'The index of the message in the merkle tree',
|
||
|
undefined,
|
||
|
types.int,
|
||
|
)
|
||
|
.setAction(async (args) => {
|
||
|
let address = ethers.utils.getAddress(args.address);
|
||
|
let { rawProof, message, index } = args;
|
||
|
let proof = utils.parseProof(rawProof);
|
||
|
|
||
|
if (!ethers.utils.isHexString(message)) {
|
||
|
throw new Error('newRoot must be a 0x prefixed hex string');
|
||
|
}
|
||
|
|
||
|
let signer = await ethers.getSigner();
|
||
|
let replica = new optics.Replica(address, signer);
|
||
|
|
||
|
// preflight
|
||
|
if (
|
||
|
await replica.callStatic.prove(
|
||
|
ethers.utils.keccak256(message),
|
||
|
proof,
|
||
|
index,
|
||
|
)
|
||
|
) {
|
||
|
let tx = await replica.prove(
|
||
|
ethers.utils.keccak256(message),
|
||
|
proof,
|
||
|
index,
|
||
|
);
|
||
|
await utils.reportTxOutcome(tx);
|
||
|
} else {
|
||
|
console.log('Error: Replica will reject proof');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
task('process', 'Process a message that has been proven to a replica')
|
||
|
.addParam(
|
||
|
'address',
|
||
|
'The address of the replica contract.',
|
||
|
undefined,
|
||
|
types.string,
|
||
|
)
|
||
|
.addParam('message', 'The message to prove.', undefined, types.string)
|
||
|
.setAction(async (args) => {
|
||
|
let address = ethers.utils.getAddress(args.address);
|
||
|
let { message } = args;
|
||
|
if (!ethers.utils.isHexString(message)) {
|
||
|
throw new Error('newRoot must be a 0x prefixed hex string');
|
||
|
}
|
||
|
|
||
|
let signer = await ethers.getSigner();
|
||
|
let replica = new optics.Replica(address, signer);
|
||
|
|
||
|
try {
|
||
|
await replica.callStatic.process(message);
|
||
|
let tx = await replica.process(message);
|
||
|
await utils.reportTxOutcome(tx);
|
||
|
} catch (e) {
|
||
|
console.error(
|
||
|
`Error: Replica will reject process with message\n\t${e.message}`,
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
task('prove-and-process', 'Prove and process a message')
|
||
|
.addParam(
|
||
|
'address',
|
||
|
'The address of the replica contract.',
|
||
|
undefined,
|
||
|
types.string,
|
||
|
)
|
||
|
.addParam('message', 'The message to prove.', undefined, types.string)
|
||
|
.addParam(
|
||
|
'proof',
|
||
|
'The 32 * 32 byte proof as a single hex string',
|
||
|
undefined,
|
||
|
types.string,
|
||
|
)
|
||
|
.addParam(
|
||
|
'index',
|
||
|
'The index of the message in the merkle tree',
|
||
|
undefined,
|
||
|
types.int,
|
||
|
)
|
||
|
.setAction(async (args) => {
|
||
|
let address = ethers.utils.getAddress(args.address);
|
||
|
let { rawProof, message, index } = args;
|
||
|
let proof = utils.parseProof(rawProof);
|
||
|
|
||
|
if (!ethers.utils.isHexString(message)) {
|
||
|
throw new Error('message must be a 0x prefixed hex string');
|
||
|
}
|
||
|
|
||
|
let signer = await ethers.getSigner();
|
||
|
let replica = new optics.Replica(address, signer);
|
||
|
|
||
|
try {
|
||
|
// preflight and make sure it works. This throws on revert
|
||
|
await replica.callStatic.proveAndProcess(message, proof, index);
|
||
|
await replica.proveAndProcess(message, proof, index);
|
||
|
} catch (e) {
|
||
|
console.error(
|
||
|
`Error: Replica will reject proveAndProcess with message\n\t${e.message}`,
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
task('enqueue', 'Enqueue a message on the Home chain')
|
||
|
.addParam(
|
||
|
'address',
|
||
|
'The address of the replica contract.',
|
||
|
undefined,
|
||
|
types.string,
|
||
|
)
|
||
|
.addParam('destination', 'The destination chain.', undefined, types.int)
|
||
|
.addParam('recipient', 'The message recipient.', undefined, types.string)
|
||
|
.addParam('body', 'The message body.', undefined, types.string)
|
||
|
.setAction(async (args) => {
|
||
|
let address = ethers.utils.getAddress(args.address);
|
||
|
let { destination, recipient, body } = args;
|
||
|
|
||
|
ethers.utils.isHexString(recipient, 32);
|
||
|
if (!ethers.utils.isHexString(message)) {
|
||
|
throw new Error('body must be a 0x prefixed hex string');
|
||
|
}
|
||
|
|
||
|
let home = new optics.Home(address, signer);
|
||
|
|
||
|
let tx = await home.enqueue(destination, recipient, body);
|
||
|
await utils.reportTxOutcome(tx);
|
||
|
});
|