From f8abf6fcadbe2d2d874b7d9646753a56f923ad1f Mon Sep 17 00:00:00 2001 From: osmannyildiz Date: Thu, 18 Apr 2024 16:02:25 +0300 Subject: [PATCH] first contact --- copy_evm_deployments_to_frontend.sh | 5 + evm/contracts/MessageBox.sol | 27 +++++ evm/ignition/modules/MessageBox.ts | 13 +++ frontend/src/App.tsx | 8 +- .../src/evm-output/MessageBox.artifacts.json | 99 +++++++++++++++++++ .../src/evm-output/deployed_addresses.json | 3 + frontend/src/web3.ts | 7 ++ 7 files changed, 161 insertions(+), 1 deletion(-) create mode 100755 copy_evm_deployments_to_frontend.sh create mode 100644 evm/contracts/MessageBox.sol create mode 100644 evm/ignition/modules/MessageBox.ts create mode 100644 frontend/src/evm-output/MessageBox.artifacts.json create mode 100644 frontend/src/evm-output/deployed_addresses.json diff --git a/copy_evm_deployments_to_frontend.sh b/copy_evm_deployments_to_frontend.sh new file mode 100755 index 0000000..921c915 --- /dev/null +++ b/copy_evm_deployments_to_frontend.sh @@ -0,0 +1,5 @@ +rm "./frontend/src/evm-output/*" + +cp "./evm/ignition/deployments/chain-31337/deployed_addresses.json" "./frontend/src/evm-output/deployed_addresses.json" + +cp "./evm/ignition/deployments/chain-31337/artifacts/MessageBoxModule#MessageBox.json" "./frontend/src/evm-output/MessageBox.artifacts.json" diff --git a/evm/contracts/MessageBox.sol b/evm/contracts/MessageBox.sol new file mode 100644 index 0000000..b9a1f1a --- /dev/null +++ b/evm/contracts/MessageBox.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +contract MessageBox { + address public immutable owner; + string public message; + + event MessageSet(string oldMessage, string newMessage, uint changedAt); + + modifier onlyOwner() { + require(msg.sender == owner, "Only the owner can do that."); + _; + } + + constructor(string memory _initialMessage) { + owner = msg.sender; + message = _initialMessage; + } + + function getMessage() external view returns (string memory) { + return message; + } + + function setMessage(string calldata _newMessage) external onlyOwner { + message = _newMessage; + } +} diff --git a/evm/ignition/modules/MessageBox.ts b/evm/ignition/modules/MessageBox.ts new file mode 100644 index 0000000..90624c7 --- /dev/null +++ b/evm/ignition/modules/MessageBox.ts @@ -0,0 +1,13 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +const INITIAL_MESSAGE = "Hello OsiPad!"; + +const MessageBoxModule = buildModule("MessageBoxModule", (m) => { + const initialMessage = m.getParameter("initialMessage", INITIAL_MESSAGE); + + const messageBox = m.contract("MessageBox", [initialMessage]); + + return { messageBox }; +}); + +export default MessageBoxModule; diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 8b666c4..bd729ff 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,9 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { useState } from "react"; -import { web3 } from "./web3"; +import { messageBox, web3 } from "./web3"; function App() { const [connectedAccount, setConnectedAccount] = useState(""); + const [message, setMessage] = useState(""); // https://docs.web3js.org/guides/getting_started/metamask/#react-app async function connectMetamask() { @@ -15,6 +16,9 @@ function App() { // Show the first connected account in the page setConnectedAccount(accounts[0]); + + const _message: string = await messageBox.methods.getMessage().call(); + setMessage(_message); } return ( @@ -35,6 +39,8 @@ function App() { {/* Display the connected account */}

Connected account address: {connectedAccount}

+ +

Message: {message}

); diff --git a/frontend/src/evm-output/MessageBox.artifacts.json b/frontend/src/evm-output/MessageBox.artifacts.json new file mode 100644 index 0000000..d870307 --- /dev/null +++ b/frontend/src/evm-output/MessageBox.artifacts.json @@ -0,0 +1,99 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MessageBox", + "sourceName": "contracts/MessageBox.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_initialMessage", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "oldMessage", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "newMessage", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "changedAt", + "type": "uint256" + } + ], + "name": "MessageSet", + "type": "event" + }, + { + "inputs": [], + "name": "getMessage", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "message", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_newMessage", + "type": "string" + } + ], + "name": "setMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162000df738038062000df7833981810160405281019062000037919062000217565b3373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505080600090816200007c9190620004b3565b50506200059a565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000ed82620000a2565b810181811067ffffffffffffffff821117156200010f576200010e620000b3565b5b80604052505050565b60006200012462000084565b9050620001328282620000e2565b919050565b600067ffffffffffffffff821115620001555762000154620000b3565b5b6200016082620000a2565b9050602081019050919050565b60005b838110156200018d57808201518184015260208101905062000170565b60008484015250505050565b6000620001b0620001aa8462000137565b62000118565b905082815260208101848484011115620001cf57620001ce6200009d565b5b620001dc8482856200016d565b509392505050565b600082601f830112620001fc57620001fb62000098565b5b81516200020e84826020860162000199565b91505092915050565b60006020828403121562000230576200022f6200008e565b5b600082015167ffffffffffffffff81111562000251576200025062000093565b5b6200025f84828501620001e4565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002bb57607f821691505b602082108103620002d157620002d062000273565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fc565b620003478683620002fc565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003946200038e62000388846200035f565b62000369565b6200035f565b9050919050565b6000819050919050565b620003b08362000373565b620003c8620003bf826200039b565b84845462000309565b825550505050565b600090565b620003df620003d0565b620003ec818484620003a5565b505050565b5b81811015620004145762000408600082620003d5565b600181019050620003f2565b5050565b601f82111562000463576200042d81620002d7565b6200043884620002ec565b8101602085101562000448578190505b620004606200045785620002ec565b830182620003f1565b50505b505050565b600082821c905092915050565b6000620004886000198460080262000468565b1980831691505092915050565b6000620004a3838362000475565b9150826002028217905092915050565b620004be8262000268565b67ffffffffffffffff811115620004da57620004d9620000b3565b5b620004e68254620002a2565b620004f382828562000418565b600060209050601f8311600181146200052b576000841562000516578287015190505b62000522858262000495565b86555062000592565b601f1984166200053b86620002d7565b60005b8281101562000565578489015182556001820191506020850194506020810190506200053e565b8683101562000585578489015162000581601f89168262000475565b8355505b6001600288020188555050505b505050505050565b60805161083b620005bc6000396000818160c9015261016d015261083b6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063368b8772146100515780638da5cb5b1461006d578063ce6d41de1461008b578063e21f37ce146100a9575b600080fd5b61006b6004803603810190610066919061031e565b6100c7565b005b61007561016b565b60405161008291906103ac565b60405180910390f35b61009361018f565b6040516100a09190610457565b60405180910390f35b6100b1610221565b6040516100be9190610457565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014c906104c5565b60405180910390fd5b818160009182610166929190610735565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000805461019e9061054e565b80601f01602080910402602001604051908101604052809291908181526020018280546101ca9061054e565b80156102175780601f106101ec57610100808354040283529160200191610217565b820191906000526020600020905b8154815290600101906020018083116101fa57829003601f168201915b5050505050905090565b6000805461022e9061054e565b80601f016020809104026020016040519081016040528092919081815260200182805461025a9061054e565b80156102a75780601f1061027c576101008083540402835291602001916102a7565b820191906000526020600020905b81548152906001019060200180831161028a57829003601f168201915b505050505081565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126102de576102dd6102b9565b5b8235905067ffffffffffffffff8111156102fb576102fa6102be565b5b602083019150836001820283011115610317576103166102c3565b5b9250929050565b60008060208385031215610335576103346102af565b5b600083013567ffffffffffffffff811115610353576103526102b4565b5b61035f858286016102c8565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103968261036b565b9050919050565b6103a68161038b565b82525050565b60006020820190506103c1600083018461039d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104015780820151818401526020810190506103e6565b60008484015250505050565b6000601f19601f8301169050919050565b6000610429826103c7565b61043381856103d2565b93506104438185602086016103e3565b61044c8161040d565b840191505092915050565b60006020820190508181036000830152610471818461041e565b905092915050565b7f4f6e6c7920746865206f776e65722063616e20646f20746861742e0000000000600082015250565b60006104af601b836103d2565b91506104ba82610479565b602082019050919050565b600060208201905081810360008301526104de816104a2565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061056657607f821691505b6020821081036105795761057861051f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026105e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105a4565b6105eb86836105a4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061063261062d61062884610603565b61060d565b610603565b9050919050565b6000819050919050565b61064c83610617565b61066061065882610639565b8484546105b1565b825550505050565b600090565b610675610668565b610680818484610643565b505050565b5b818110156106a45761069960008261066d565b600181019050610686565b5050565b601f8211156106e9576106ba8161057f565b6106c384610594565b810160208510156106d2578190505b6106e66106de85610594565b830182610685565b50505b505050565b600082821c905092915050565b600061070c600019846008026106ee565b1980831691505092915050565b600061072583836106fb565b9150826002028217905092915050565b61073f83836104e5565b67ffffffffffffffff811115610758576107576104f0565b5b610762825461054e565b61076d8282856106a8565b6000601f83116001811461079c576000841561078a578287013590505b6107948582610719565b8655506107fc565b601f1984166107aa8661057f565b60005b828110156107d2578489013582556001820191506020850194506020810190506107ad565b868310156107ef57848901356107eb601f8916826106fb565b8355505b6001600288020188555050505b5050505050505056fea26469706673582212204ee1e2b1c6277c5f77a82579fb10a6a2b84c35c9c1f04e3232aef341dc74725264736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063368b8772146100515780638da5cb5b1461006d578063ce6d41de1461008b578063e21f37ce146100a9575b600080fd5b61006b6004803603810190610066919061031e565b6100c7565b005b61007561016b565b60405161008291906103ac565b60405180910390f35b61009361018f565b6040516100a09190610457565b60405180910390f35b6100b1610221565b6040516100be9190610457565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014c906104c5565b60405180910390fd5b818160009182610166929190610735565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000805461019e9061054e565b80601f01602080910402602001604051908101604052809291908181526020018280546101ca9061054e565b80156102175780601f106101ec57610100808354040283529160200191610217565b820191906000526020600020905b8154815290600101906020018083116101fa57829003601f168201915b5050505050905090565b6000805461022e9061054e565b80601f016020809104026020016040519081016040528092919081815260200182805461025a9061054e565b80156102a75780601f1061027c576101008083540402835291602001916102a7565b820191906000526020600020905b81548152906001019060200180831161028a57829003601f168201915b505050505081565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126102de576102dd6102b9565b5b8235905067ffffffffffffffff8111156102fb576102fa6102be565b5b602083019150836001820283011115610317576103166102c3565b5b9250929050565b60008060208385031215610335576103346102af565b5b600083013567ffffffffffffffff811115610353576103526102b4565b5b61035f858286016102c8565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103968261036b565b9050919050565b6103a68161038b565b82525050565b60006020820190506103c1600083018461039d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104015780820151818401526020810190506103e6565b60008484015250505050565b6000601f19601f8301169050919050565b6000610429826103c7565b61043381856103d2565b93506104438185602086016103e3565b61044c8161040d565b840191505092915050565b60006020820190508181036000830152610471818461041e565b905092915050565b7f4f6e6c7920746865206f776e65722063616e20646f20746861742e0000000000600082015250565b60006104af601b836103d2565b91506104ba82610479565b602082019050919050565b600060208201905081810360008301526104de816104a2565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061056657607f821691505b6020821081036105795761057861051f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026105e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105a4565b6105eb86836105a4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061063261062d61062884610603565b61060d565b610603565b9050919050565b6000819050919050565b61064c83610617565b61066061065882610639565b8484546105b1565b825550505050565b600090565b610675610668565b610680818484610643565b505050565b5b818110156106a45761069960008261066d565b600181019050610686565b5050565b601f8211156106e9576106ba8161057f565b6106c384610594565b810160208510156106d2578190505b6106e66106de85610594565b830182610685565b50505b505050565b600082821c905092915050565b600061070c600019846008026106ee565b1980831691505092915050565b600061072583836106fb565b9150826002028217905092915050565b61073f83836104e5565b67ffffffffffffffff811115610758576107576104f0565b5b610762825461054e565b61076d8282856106a8565b6000601f83116001811461079c576000841561078a578287013590505b6107948582610719565b8655506107fc565b601f1984166107aa8661057f565b60005b828110156107d2578489013582556001820191506020850194506020810190506107ad565b868310156107ef57848901356107eb601f8916826106fb565b8355505b6001600288020188555050505b5050505050505056fea26469706673582212204ee1e2b1c6277c5f77a82579fb10a6a2b84c35c9c1f04e3232aef341dc74725264736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/frontend/src/evm-output/deployed_addresses.json b/frontend/src/evm-output/deployed_addresses.json new file mode 100644 index 0000000..a3c2438 --- /dev/null +++ b/frontend/src/evm-output/deployed_addresses.json @@ -0,0 +1,3 @@ +{ + "MessageBoxModule#MessageBox": "0x5FbDB2315678afecb367f032d93F642f64180aa3" +} diff --git a/frontend/src/web3.ts b/frontend/src/web3.ts index 99b2d38..76a08ef 100644 --- a/frontend/src/web3.ts +++ b/frontend/src/web3.ts @@ -1,4 +1,6 @@ import { Web3 } from "web3"; +import messageBoxArtifacts from "./evm-output/MessageBox.artifacts.json"; +import deployedAddresses from "./evm-output/deployed_addresses.json"; export let web3: Web3; @@ -10,3 +12,8 @@ if (window.ethereum) { } else { alert("ERROR: Please download MetaMask."); } + +export const messageBox = new web3!.eth.Contract( + messageBoxArtifacts.abi, + deployedAddresses["MessageBoxModule#MessageBox"] +);