fully working evm to evm project
This commit is contained in:
parent
a350744738
commit
5514a2e301
|
@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
|
||||||
import "./Wormhole/IWormhole.sol";
|
import "./Wormhole/IWormhole.sol";
|
||||||
|
|
||||||
contract Messenger {
|
contract Messenger {
|
||||||
string private solana_msg;
|
string private current_msg;
|
||||||
address private wormhole_core_bridge_address = address(0xC89Ce4735882C9F0f0FE26686c53074E09B0D550);
|
address private wormhole_core_bridge_address = address(0xC89Ce4735882C9F0f0FE26686c53074E09B0D550);
|
||||||
IWormhole core_bridge = IWormhole(wormhole_core_bridge_address);
|
IWormhole core_bridge = IWormhole(wormhole_core_bridge_address);
|
||||||
uint32 nonce = 0;
|
uint32 nonce = 0;
|
||||||
|
@ -21,7 +21,7 @@ contract Messenger {
|
||||||
nonce = nonce+1;
|
nonce = nonce+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
function recieveEncodedMsg(bytes memory encodedMsg) public {
|
function receiveEncodedMsg(bytes memory encodedMsg) public {
|
||||||
(IWormhole.VM memory vm, bool valid, string memory reason) = core_bridge.parseAndVerifyVM(encodedMsg);
|
(IWormhole.VM memory vm, bool valid, string memory reason) = core_bridge.parseAndVerifyVM(encodedMsg);
|
||||||
|
|
||||||
//1. Check Wormhole Guardian Signatures
|
//1. Check Wormhole Guardian Signatures
|
||||||
|
@ -37,11 +37,11 @@ contract Messenger {
|
||||||
_completedMessages[vm.hash] = true;
|
_completedMessages[vm.hash] = true;
|
||||||
|
|
||||||
//Do the thing
|
//Do the thing
|
||||||
solana_msg = string(vm.payload);
|
current_msg = string(vm.payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSolanaMsg() public view returns (string memory){
|
function getCurrentMsg() public view returns (string memory){
|
||||||
return solana_msg;
|
return current_msg;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
Registers it's sibling applications on other chains as the only ones that can send this instance messages
|
Registers it's sibling applications on other chains as the only ones that can send this instance messages
|
||||||
|
|
|
@ -2,9 +2,10 @@ import { exec } from "child_process";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import { ethers } from 'ethers';
|
import { ethers } from 'ethers';
|
||||||
import {
|
import {
|
||||||
CHAIN_ID_ETH,
|
getEmitterAddressEth,
|
||||||
getEmitterAddressEth
|
parseSequenceFromLogEth
|
||||||
} from "@certusone/wormhole-sdk";
|
} from "@certusone/wormhole-sdk";
|
||||||
|
import fetch from 'node-fetch';
|
||||||
|
|
||||||
async function main(){
|
async function main(){
|
||||||
let config = JSON.parse(fs.readFileSync('./xdapp.config.json').toString());
|
let config = JSON.parse(fs.readFileSync('./xdapp.config.json').toString());
|
||||||
|
@ -26,7 +27,8 @@ async function main(){
|
||||||
|
|
||||||
if(out) {
|
if(out) {
|
||||||
console.log(out);
|
console.log(out);
|
||||||
network.deployed_address = out.split("Deployed to: ")[1].split('\n')[0].trim();
|
network.deployedAddress = out.split("Deployed to: ")[1].split('\n')[0].trim();
|
||||||
|
network.emittedVAAs = []; //Resets the emittedVAAs
|
||||||
config.networks[process.argv[2]] = network;
|
config.networks[process.argv[2]] = network;
|
||||||
fs.writeFileSync('./xdapp.config.json', JSON.stringify(config, null, 4));
|
fs.writeFileSync('./xdapp.config.json', JSON.stringify(config, null, 4));
|
||||||
}
|
}
|
||||||
|
@ -34,7 +36,7 @@ async function main(){
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if (process.argv[3] == "register_chain") {
|
} else if (process.argv[3] == "register_chain") {
|
||||||
if(!network.deployed_address){
|
if(!network.deployedAddress){
|
||||||
throw new Error("Deploy to this network first!");
|
throw new Error("Deploy to this network first!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,26 +45,90 @@ async function main(){
|
||||||
.connect(new ethers.providers.JsonRpcProvider(network.rpc));
|
.connect(new ethers.providers.JsonRpcProvider(network.rpc));
|
||||||
|
|
||||||
const targetNetwork = config.networks[process.argv[4]];
|
const targetNetwork = config.networks[process.argv[4]];
|
||||||
if(!targetNetwork.deployed_address){
|
if(!targetNetwork.deployedAddress){
|
||||||
throw new Error("Target Network not deployed yet!");
|
throw new Error("Target Network not deployed yet!");
|
||||||
}
|
}
|
||||||
if(targetNetwork.type == "evm"){
|
if(targetNetwork.type == "evm"){
|
||||||
const emitter_address = Buffer.from(getEmitterAddressEth(targetNetwork.deployed_address), "hex");
|
const emitter_address = Buffer.from(getEmitterAddressEth(targetNetwork.deployedAddress), "hex");
|
||||||
const messenger = new ethers.Contract(
|
const messenger = new ethers.Contract(
|
||||||
network.deployed_address,
|
network.deployedAddress,
|
||||||
JSON.parse(fs.readFileSync('./chains/evm/out/Messenger.sol/Messenger.json').toString()).abi,
|
JSON.parse(fs.readFileSync('./chains/evm/out/Messenger.sol/Messenger.json').toString()).abi,
|
||||||
signer
|
signer
|
||||||
);
|
);
|
||||||
const tx = await messenger.registerApplicationContracts(CHAIN_ID_ETH, emitter_address);
|
const tx = await messenger.registerApplicationContracts(targetNetwork.wormholeChainId, emitter_address);
|
||||||
console.log("Registered EVM style Emitter: ", tx.hash);
|
console.log(`Network(${process.argv[2]}) Registered EVM style Emitter: `, tx.hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (process.argv[2] == "send_msg") {
|
} else if (process.argv[3] == "send_msg") {
|
||||||
|
if(!network.deployedAddress){
|
||||||
|
throw new Error("Deploy to this network first!");
|
||||||
|
}
|
||||||
|
|
||||||
} else if (process.argv[2] == "submit_vaa") {
|
if(network.type == "evm"){
|
||||||
|
const signer = new ethers.Wallet(network.privateKey)
|
||||||
|
.connect(new ethers.providers.JsonRpcProvider(network.rpc));
|
||||||
|
const messenger = new ethers.Contract(
|
||||||
|
network.deployedAddress,
|
||||||
|
JSON.parse(fs.readFileSync('./chains/evm/out/Messenger.sol/Messenger.json').toString()).abi,
|
||||||
|
signer
|
||||||
|
);
|
||||||
|
const tx = await (await messenger.sendMsg(Buffer.from(process.argv[4]))).wait();
|
||||||
|
await new Promise((r) => setTimeout(r, 5000));
|
||||||
|
const emitterAddr = getEmitterAddressEth(messenger.address);
|
||||||
|
const seq = parseSequenceFromLogEth(
|
||||||
|
tx,
|
||||||
|
network.bridgeAddress
|
||||||
|
);
|
||||||
|
const vaaBytes = await (
|
||||||
|
await fetch(
|
||||||
|
`${config.wormhole.restAddress}/v1/signed_vaa/${network.wormholeChainId}/${emitterAddr}/${seq}`
|
||||||
|
)
|
||||||
|
).json();
|
||||||
|
if(!network.emittedVAAs){
|
||||||
|
network.emittedVAAs = [vaaBytes.vaaBytes];
|
||||||
|
} else {
|
||||||
|
network.emittedVAAs.push(vaaBytes.vaaBytes);
|
||||||
|
}
|
||||||
|
config.networks[process.argv[2]] = network;
|
||||||
|
fs.writeFileSync('./xdapp.config.json', JSON.stringify(config, null, 2));
|
||||||
|
console.log(`Network(${process.argv[2]}) Emitted VAA: `, vaaBytes.vaaBytes);
|
||||||
|
}
|
||||||
|
} else if (process.argv[3] == "submit_vaa") {
|
||||||
|
if(!network.deployedAddress){
|
||||||
|
throw new Error("Deploy to this network first!");
|
||||||
|
}
|
||||||
|
|
||||||
} else if (process.argv[2] == "get_current_msg") {
|
if(network.type == "evm"){
|
||||||
|
const targetNetwork = config.networks[process.argv[4]];
|
||||||
|
const vaaBytes = isNaN(parseInt(process.argv[5])) ?
|
||||||
|
targetNetwork.emittedVAAs.pop() :
|
||||||
|
targetNetwork.emittedVAAs[parseInt(process.argv[5])];
|
||||||
|
|
||||||
|
const signer = new ethers.Wallet(network.privateKey)
|
||||||
|
.connect(new ethers.providers.JsonRpcProvider(network.rpc));
|
||||||
|
const messenger = new ethers.Contract(
|
||||||
|
network.deployedAddress,
|
||||||
|
JSON.parse(fs.readFileSync('./chains/evm/out/Messenger.sol/Messenger.json').toString()).abi,
|
||||||
|
signer
|
||||||
|
);
|
||||||
|
|
||||||
|
const tx = await messenger.receiveEncodedMsg(Buffer.from(vaaBytes, "base64"));
|
||||||
|
console.log(`Submitted VAA: ${vaaBytes}\nTX: ${tx.hash}`);
|
||||||
|
}
|
||||||
|
} else if (process.argv[3] == "get_current_msg") {
|
||||||
|
if(!network.deployedAddress){
|
||||||
|
throw new Error("Deploy to this network first!");
|
||||||
|
}
|
||||||
|
if(network.type == "evm"){
|
||||||
|
const signer = new ethers.Wallet(network.privateKey)
|
||||||
|
.connect(new ethers.providers.JsonRpcProvider(network.rpc));
|
||||||
|
const messenger = new ethers.Contract(
|
||||||
|
network.deployedAddress,
|
||||||
|
JSON.parse(fs.readFileSync('./chains/evm/out/Messenger.sol/Messenger.json').toString()).abi,
|
||||||
|
signer
|
||||||
|
);
|
||||||
|
console.log(`${process.argv[2]} Current Msg: `, await messenger.getCurrentMsg());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Unkown command!")
|
throw new Error("Unkown command!")
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certusone/wormhole-sdk": "^0.3.3",
|
"@certusone/wormhole-sdk": "^0.3.3",
|
||||||
"ethers": "^5.6.6"
|
"ethers": "^5.6.6",
|
||||||
|
"node-fetch": "^2.6.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/runtime": {
|
"node_modules/@babel/runtime": {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"deploy evm": "node xdapp.js deploy evm"
|
"test": "sh test.sh"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
|
@ -15,6 +15,7 @@
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certusone/wormhole-sdk": "^0.3.3",
|
"@certusone/wormhole-sdk": "^0.3.3",
|
||||||
"ethers": "^5.6.6"
|
"ethers": "^5.6.6",
|
||||||
|
"node-fetch": "^2.6.7"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
node messenger.js eth0 deploy
|
||||||
|
node messenger.js eth1 deploy
|
||||||
|
node messenger.js eth0 register_chain eth1
|
||||||
|
node messenger.js eth1 register_chain eth0
|
||||||
|
node messenger.js eth0 send_msg "From: eth0\nMsg: Hello World!"
|
||||||
|
node messenger.js eth1 submit_vaa eth0 latest
|
||||||
|
node messenger.js eth1 send_msg "From: eth1\nMsg: Hello World!"
|
||||||
|
node messenger.js eth0 submit_vaa eth1 latest
|
||||||
|
sleep 10
|
||||||
|
node messenger.js eth0 get_current_msg
|
||||||
|
node messenger.js eth1 get_current_msg
|
|
@ -1,16 +1,29 @@
|
||||||
{
|
{
|
||||||
"networks": {
|
"networks": {
|
||||||
"eth0": {
|
"eth0": {
|
||||||
"type": "evm",
|
"type": "evm",
|
||||||
"rpc": "http://147.182.160.210:8545",
|
"wormholeChainId": 2,
|
||||||
"privateKey": "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d",
|
"rpc": "http://147.182.160.210:8545",
|
||||||
"deployed_address": "0xc0b3b62dd0400e4baa721ddec9b8a384147b23ff"
|
"privateKey": "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d",
|
||||||
},
|
"bridgeAddress": "0xC89Ce4735882C9F0f0FE26686c53074E09B0D550",
|
||||||
"eth1": {
|
"deployedAddress": "0xdd37b2eb92f97dd09ced1f1d20a73aa340b2311a",
|
||||||
"type": "evm",
|
"emittedVAAs": [
|
||||||
"rpc": "http://147.182.160.210:8546",
|
"AQAAAAABAIdmeszZttqU5FVcyea0U43u7+aP7W5VJYXm5SfeWV3yCCdFZft2CKMf+N9ZcVe8xAkvUOS5r1bLwifJH5OaXyEAAAAwAgAAAAAAAgAAAAAAAAAAAAAAAN03suuS+X3QnO0fHSCnOqNAsjEaAAAAAAAAAAABRnJvbTogZXRoMFxuTXNnOiBIZWxsbyBXb3JsZCE="
|
||||||
"privateKey": "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d",
|
]
|
||||||
"deployed_address": "0x4339316e04cffb5961d1c41fef8e44bfa2a7fbd1"
|
},
|
||||||
}
|
"eth1": {
|
||||||
|
"type": "evm",
|
||||||
|
"wormholeChainId": 4,
|
||||||
|
"rpc": "http://147.182.160.210:8546",
|
||||||
|
"privateKey": "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d",
|
||||||
|
"bridgeAddress": "0xC89Ce4735882C9F0f0FE26686c53074E09B0D550",
|
||||||
|
"deployedAddress": "0xed447acb0ceb49d77f317dd6d37cb64da7a7e7f8",
|
||||||
|
"emittedVAAs": [
|
||||||
|
"AQAAAAABAIg4d8PvMFF37BarCvW0jSUxvxEtvnDeWU9xp+dps8EUB6OGwOggQU+lVowzPI39biro5W7lc5iKZ1I7z6n4uu8BAAEJ/QAAAAAABAAAAAAAAAAAAAAAAO1EessM60nXfzF91tN8tk2np+f4AAAAAAAAAAABRnJvbTogZXRoMVxuTXNnOiBIZWxsbyBXb3JsZCE="
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"wormhole": {
|
||||||
|
"restAddress": "http://147.182.160.210:7071"
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue