import axios from "axios";
const main = async () => {
// fetch event proof from Hashi Prover
console.log("Fetching event proof from Hashi prover...");
const result = await axios.post(
`http://jsonrpc.hashi-explorer.xyz:3000/v1`,
{
jsonrpc: "2.0",
method: "hashi_getReceiptProof",
params: {
logIndex: 397,
blockNumber: 7016999,
chainId: 11155111,
transactionHash: "0x25a6a5c138f3b5a434a3a2b5d6bf7bdf97cb700bd7515f801ecfb71f1d965e7b",
},
id: 1,
},
{
headers: {
"Content-Type": "application/json",
},
}
);
console.log("Event proof result", result.data.result.proof);
};
main();
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { HashiProver } from "./HashiProver.sol";
contract MockERC20Prover {
event TransferEventVerified(uint256 indexed chainID, bytes rlpEncodedEvent);
HashiProver public hashiProver;
address public erc20Contract;
uint256 public chainID;
constructor(address shoyuBashi_, address erc20Contract_, uint256 chainID_) {
hashiProver = HashiProver(shoyuBashi_);
erc20Contract = erc20Contract_;
chainID = chainID_;
}
function verifyTransferEvent(HashiProver.ReceiptProof calldata proof, bytes memory expectedRlpEncodedEvent) external {
require(proof.chainId == chainID, "Invalid chain id");
bytes memory rlpEncodedEvent = hashiProver.verifyForeignEvent(proof);
require(keccak256(rlpEncodedEvent) == keccak256(expectedRlpEncodedEvent), "invalid event");
emit TransferEventVerified(proof.chainId , rlpEncodedEvent);
// TODO: Define custom logic here
}
}// Example of submitting the proof in Solidity (or via web3 call)
HashiProver.ReceiptProof memory proof = { /* fetched proof from curl command */ };
MockERC20Prover.verifyTransferEvent(proof, expectedRlpEncodedEvent);