From dab5ca286f349f3ac6b690dbfa2f6929331018bf Mon Sep 17 00:00:00 2001 From: spacemandev Date: Thu, 19 May 2022 03:01:44 -0500 Subject: [PATCH] deploy for one evm chain works --- .gitignore | 4 +- projects/messenger/chains/evm/.gitignore | 2 + projects/messenger/chains/evm/foundry.toml | 7 +++ .../messenger/chains/evm/src/Messenger.sol | 53 +++++++++++++++++++ .../chains/evm/src/Wormhole/IWormhole.sol | 42 +++++++++++++++ .../chains/evm/src/Wormhole/Structs.sol | 40 ++++++++++++++ projects/messenger/messenger.js | 44 +++++++++++++++ projects/messenger/package.json | 16 ++++++ projects/messenger/xdapp.config.json | 15 ++++++ src/SUMMARY.md | 9 +++- src/projects/messenger/introduction.md | 0 src/projects/messenger/prerequistes.md | 0 src/projects/summary.md | 0 13 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 projects/messenger/chains/evm/.gitignore create mode 100644 projects/messenger/chains/evm/foundry.toml create mode 100644 projects/messenger/chains/evm/src/Messenger.sol create mode 100644 projects/messenger/chains/evm/src/Wormhole/IWormhole.sol create mode 100644 projects/messenger/chains/evm/src/Wormhole/Structs.sol create mode 100644 projects/messenger/messenger.js create mode 100644 projects/messenger/package.json create mode 100644 projects/messenger/xdapp.config.json create mode 100644 src/projects/messenger/introduction.md create mode 100644 src/projects/messenger/prerequistes.md create mode 100644 src/projects/summary.md diff --git a/.gitignore b/.gitignore index 4d46a36..ec98fdf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .DS_STORE -book \ No newline at end of file +book +.github +CNAME \ No newline at end of file diff --git a/projects/messenger/chains/evm/.gitignore b/projects/messenger/chains/evm/.gitignore new file mode 100644 index 0000000..1f85ede --- /dev/null +++ b/projects/messenger/chains/evm/.gitignore @@ -0,0 +1,2 @@ +cache/ +out/ \ No newline at end of file diff --git a/projects/messenger/chains/evm/foundry.toml b/projects/messenger/chains/evm/foundry.toml new file mode 100644 index 0000000..0457402 --- /dev/null +++ b/projects/messenger/chains/evm/foundry.toml @@ -0,0 +1,7 @@ +[default] +src = 'src' +out = 'out' +libs = ['lib'] +solc_version = '0.8.10' + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file diff --git a/projects/messenger/chains/evm/src/Messenger.sol b/projects/messenger/chains/evm/src/Messenger.sol new file mode 100644 index 0000000..1ddb574 --- /dev/null +++ b/projects/messenger/chains/evm/src/Messenger.sol @@ -0,0 +1,53 @@ +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.0; + +import "./Wormhole/IWormhole.sol"; + +contract Messenger { + string private solana_msg; + address private wormhole_core_bridge_address = address(0xC89Ce4735882C9F0f0FE26686c53074E09B0D550); + IWormhole core_bridge = IWormhole(wormhole_core_bridge_address); + uint32 nonce = 0; + mapping(uint16 => bytes32) _applicationContracts; + address owner; + mapping(bytes32 => bool) _completedMessages; + + constructor(){ + owner = msg.sender; + } + + function sendMsg(bytes memory str) public returns (uint64 sequence) { + sequence = core_bridge.publishMessage(nonce, str, 1); + nonce = nonce+1; + } + + function recieveEncodedMsg(bytes memory encodedMsg) public { + (IWormhole.VM memory vm, bool valid, string memory reason) = core_bridge.parseAndVerifyVM(encodedMsg); + + //1. Check Wormhole Guardian Signatures + // If the VM is NOT valid, will return the reason it's not valid + // If the VM IS valid, reason will be blank + require(valid, reason); + + //2. Check if the Emitter Chain contract is registered + require(_applicationContracts[vm.emitterChainId] == vm.emitterAddress, "Invalid Emitter Address!"); + + //3. Check that the message hasn't already been processed + require(!_completedMessages[vm.hash], "Message already processed"); + _completedMessages[vm.hash] = true; + + //Do the thing + solana_msg = string(vm.payload); + } + + function getSolanaMsg() public view returns (string memory){ + return solana_msg; + } + /** + Registers it's sibling applications on other chains as the only ones that can send this instance messages + */ + function registerApplicationContracts(uint16 chainId, bytes32 applicationAddr) public { + require(msg.sender == owner, "Only owner can register new chains!"); + _applicationContracts[chainId] = applicationAddr; + } +} diff --git a/projects/messenger/chains/evm/src/Wormhole/IWormhole.sol b/projects/messenger/chains/evm/src/Wormhole/IWormhole.sol new file mode 100644 index 0000000..0c437eb --- /dev/null +++ b/projects/messenger/chains/evm/src/Wormhole/IWormhole.sol @@ -0,0 +1,42 @@ +// contracts/Messages.sol +// SPDX-License-Identifier: Apache 2 + +pragma solidity ^0.8.0; + +import "./Structs.sol"; + +interface IWormhole is Structs { + event LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel); + + function publishMessage( + uint32 nonce, + bytes memory payload, + uint8 consistencyLevel + ) external payable returns (uint64 sequence); + + function parseAndVerifyVM(bytes calldata encodedVM) external view returns (Structs.VM memory vm, bool valid, string memory reason); + + function verifyVM(Structs.VM memory vm) external view returns (bool valid, string memory reason); + + function verifySignatures(bytes32 hash, Structs.Signature[] memory signatures, Structs.GuardianSet memory guardianSet) external pure returns (bool valid, string memory reason) ; + + function parseVM(bytes memory encodedVM) external pure returns (Structs.VM memory vm); + + function getGuardianSet(uint32 index) external view returns (Structs.GuardianSet memory) ; + + function getCurrentGuardianSetIndex() external view returns (uint32) ; + + function getGuardianSetExpiry() external view returns (uint32) ; + + function governanceActionIsConsumed(bytes32 hash) external view returns (bool) ; + + function isInitialized(address impl) external view returns (bool) ; + + function chainId() external view returns (uint16) ; + + function governanceChainId() external view returns (uint16); + + function governanceContract() external view returns (bytes32); + + function messageFee() external view returns (uint256) ; +} \ No newline at end of file diff --git a/projects/messenger/chains/evm/src/Wormhole/Structs.sol b/projects/messenger/chains/evm/src/Wormhole/Structs.sol new file mode 100644 index 0000000..b4d3329 --- /dev/null +++ b/projects/messenger/chains/evm/src/Wormhole/Structs.sol @@ -0,0 +1,40 @@ +// contracts/Structs.sol +// SPDX-License-Identifier: Apache 2 + +pragma solidity ^0.8.0; + +interface Structs { + struct Provider { + uint16 chainId; + uint16 governanceChainId; + bytes32 governanceContract; + } + + struct GuardianSet { + address[] keys; + uint32 expirationTime; + } + + struct Signature { + bytes32 r; + bytes32 s; + uint8 v; + uint8 guardianIndex; + } + + struct VM { + uint8 version; + uint32 timestamp; + uint32 nonce; + uint16 emitterChainId; + bytes32 emitterAddress; + uint64 sequence; + uint8 consistencyLevel; + bytes payload; + + uint32 guardianSetIndex; + Signature[] signatures; + + bytes32 hash; + } +} \ No newline at end of file diff --git a/projects/messenger/messenger.js b/projects/messenger/messenger.js new file mode 100644 index 0000000..57eec37 --- /dev/null +++ b/projects/messenger/messenger.js @@ -0,0 +1,44 @@ +import { exec } from "child_process"; +import fs from "fs"; + +async function main(){ + let config = JSON.parse(fs.readFileSync('./xdapp.config.json').toString()); + + if(process.argv[2] == "deploy"){ + let network = config.networks[process.argv[3]]; + if (!network){ + throw new Error("Network not defined in config file.") + } + + if(network.type == "evm"){ + console.log(`Deploying EVM network: ${process.argv[3]} to ${network.rpc}`); + exec( + `cd chains/evm && forge build && forge create --legacy --rpc-url ${network.rpc} --private-key ${network.privateKey} src/Messenger.sol:Messenger && exit`, + ((err, out, errStr) => { + if(err){ + throw new Error(err); + } + + if(out) { + console.log(out); + network.deployed_address = out.split("Deployed to: ")[1].split('\n')[0].trim(); + config.networks[process.argv[3]] = network; + fs.writeFileSync('./xdapp.config.json', JSON.stringify(config, null, 4)); + } + }) + ); + } + } else if (process.argv[2] == "register_chain") { + + } else if (process.argv[2] == "send_msg") { + + } else if (process.argv[2] == "submit_vaa") { + + } else if (process.argv[2] == "get_current_msg") { + + } else { + console.error("Unknown command!"); + } +} + +main(); \ No newline at end of file diff --git a/projects/messenger/package.json b/projects/messenger/package.json new file mode 100644 index 0000000..8229505 --- /dev/null +++ b/projects/messenger/package.json @@ -0,0 +1,16 @@ +{ + "name": "messenger", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "deploy evm": "node xdapp.js deploy evm" + }, + "keywords": [], + "author": "", + "license": "MIT", + "workspaces": [ + "chains/evm" + ], + "type": "module" +} diff --git a/projects/messenger/xdapp.config.json b/projects/messenger/xdapp.config.json new file mode 100644 index 0000000..a25eacb --- /dev/null +++ b/projects/messenger/xdapp.config.json @@ -0,0 +1,15 @@ +{ + "networks": { + "eth0": { + "type": "evm", + "rpc": "http://147.182.160.210:8545", + "privateKey": "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d", + "deployed_address": "0x4cfb3f70bf6a80397c2e634e5bdd85bc0bb189ee" + }, + "eth1": { + "type": "evm", + "rpc": "http://147.182.160.210:8546", + "privateKey": "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d" + } + } +} \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 4eba042..3741ea7 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -26,7 +26,10 @@ - [Linux]() - [Project Scaffold]() - [EVM]() + - [Foundry]() - [Solana]() + - [Solana CLI]() + - [Anchor]() - [Algorand]() - [Sending Messages]() - [EVM]() @@ -40,8 +43,10 @@ - [EVM]() - [Solana]() - [Algorand]() -- [Projects]() - - [Messenger]() +- [Projects](./projects/summary.md) + - [Messenger](./projects/messenger/introduction.md) + - [Prerequistes]() + - [EVM]() - [Lever Puzzle]() --- - [Wormhole Reference]() diff --git a/src/projects/messenger/introduction.md b/src/projects/messenger/introduction.md new file mode 100644 index 0000000..e69de29 diff --git a/src/projects/messenger/prerequistes.md b/src/projects/messenger/prerequistes.md new file mode 100644 index 0000000..e69de29 diff --git a/src/projects/summary.md b/src/projects/summary.md new file mode 100644 index 0000000..e69de29