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"]
+);