diff --git a/evm/contracts/MessageBox.sol b/evm/contracts/MessageBox.sol
index b9a1f1a..63a0bf7 100644
--- a/evm/contracts/MessageBox.sol
+++ b/evm/contracts/MessageBox.sol
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: UNLICENSED
+// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract MessageBox {
diff --git a/frontend/src/components/ConnectMetamaskButton.tsx b/frontend/src/components/ConnectMetamaskButton.tsx
index d4fc723..d34e981 100644
--- a/frontend/src/components/ConnectMetamaskButton.tsx
+++ b/frontend/src/components/ConnectMetamaskButton.tsx
@@ -1,5 +1,6 @@
import { useStore } from "../store";
-import { shortenAddress, tryWithToast } from "../utils";
+import { tryWithToast } from "../utils/toast";
+import { formatPadTokenAmount, shortenAddress } from "../utils/ui";
import { web3 } from "../web3";
export function ConnectMetamaskButton() {
@@ -8,6 +9,7 @@ export function ConnectMetamaskButton() {
const unsetConnectedAccount = useStore(
(state) => state.unsetConnectedAccount
);
+ const padTokenBalance = useStore((state) => state.padTokenBalance);
// https://docs.web3js.org/guides/getting_started/metamask/#react-app
async function connectMetamask() {
@@ -35,7 +37,18 @@ export function ConnectMetamaskButton() {
connectedAccount ? disconnectWallet() : connectMetamask()
}
>
- {connectedAccount ? shortenAddress(connectedAccount) : "Connect MetaMask"}
+ {connectedAccount ? (
+ <>
+ {shortenAddress(connectedAccount)}
+ {padTokenBalance !== null && (
+
+ {formatPadTokenAmount(padTokenBalance)}
+
+ )}
+ >
+ ) : (
+ "Connect MetaMask"
+ )}
);
}
diff --git a/frontend/src/components/ContextsProvider.tsx b/frontend/src/components/ContextsProvider.tsx
new file mode 100644
index 0000000..55be2b6
--- /dev/null
+++ b/frontend/src/components/ContextsProvider.tsx
@@ -0,0 +1,15 @@
+import { buildMainContextValue, MainContext } from "../contexts/MainContext";
+
+interface Props {
+ children: React.ReactNode;
+}
+
+export function ContextsProvider({ children }: Props) {
+ const mainContextValue = buildMainContextValue();
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/frontend/src/contexts/MainContext.ts b/frontend/src/contexts/MainContext.ts
new file mode 100644
index 0000000..927d5b5
--- /dev/null
+++ b/frontend/src/contexts/MainContext.ts
@@ -0,0 +1,39 @@
+/* eslint-disable react-hooks/rules-of-hooks */
+
+import { useEffect } from "react";
+import { useStore } from "../store";
+import buildContext from "../utils/context";
+import { padToken } from "../web3";
+
+interface IMainContext {
+ fetchPadTokenBalance: () => Promise;
+}
+
+export const [MainContext, useMainContext] = buildContext();
+
+export function buildMainContextValue(): IMainContext {
+ const connectedAccount = useStore((state) => state.connectedAccount);
+ const setPadTokenBalance = useStore((state) => state.setPadTokenBalance);
+ const unsetPadTokenBalance = useStore((state) => state.unsetPadTokenBalance);
+
+ const fetchPadTokenBalance = async () => {
+ const balance: bigint = await padToken.methods
+ .balanceOf(connectedAccount)
+ .call();
+ if (typeof balance === "bigint") {
+ setPadTokenBalance(balance);
+ } else {
+ unsetPadTokenBalance();
+ }
+ };
+
+ useEffect(() => {
+ if (connectedAccount) {
+ fetchPadTokenBalance();
+ }
+ }, [connectedAccount]);
+
+ return {
+ fetchPadTokenBalance,
+ };
+}
diff --git a/frontend/src/evm-output/MessageBox.artifacts.json b/frontend/src/evm-output/MessageBox.artifacts.json
index d870307..26060c8 100644
--- a/frontend/src/evm-output/MessageBox.artifacts.json
+++ b/frontend/src/evm-output/MessageBox.artifacts.json
@@ -92,8 +92,8 @@
"type": "function"
}
],
- "bytecode": "0x60a06040523480156200001157600080fd5b5060405162000df738038062000df7833981810160405281019062000037919062000217565b3373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505080600090816200007c9190620004b3565b50506200059a565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000ed82620000a2565b810181811067ffffffffffffffff821117156200010f576200010e620000b3565b5b80604052505050565b60006200012462000084565b9050620001328282620000e2565b919050565b600067ffffffffffffffff821115620001555762000154620000b3565b5b6200016082620000a2565b9050602081019050919050565b60005b838110156200018d57808201518184015260208101905062000170565b60008484015250505050565b6000620001b0620001aa8462000137565b62000118565b905082815260208101848484011115620001cf57620001ce6200009d565b5b620001dc8482856200016d565b509392505050565b600082601f830112620001fc57620001fb62000098565b5b81516200020e84826020860162000199565b91505092915050565b60006020828403121562000230576200022f6200008e565b5b600082015167ffffffffffffffff81111562000251576200025062000093565b5b6200025f84828501620001e4565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002bb57607f821691505b602082108103620002d157620002d062000273565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fc565b620003478683620002fc565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003946200038e62000388846200035f565b62000369565b6200035f565b9050919050565b6000819050919050565b620003b08362000373565b620003c8620003bf826200039b565b84845462000309565b825550505050565b600090565b620003df620003d0565b620003ec818484620003a5565b505050565b5b81811015620004145762000408600082620003d5565b600181019050620003f2565b5050565b601f82111562000463576200042d81620002d7565b6200043884620002ec565b8101602085101562000448578190505b620004606200045785620002ec565b830182620003f1565b50505b505050565b600082821c905092915050565b6000620004886000198460080262000468565b1980831691505092915050565b6000620004a3838362000475565b9150826002028217905092915050565b620004be8262000268565b67ffffffffffffffff811115620004da57620004d9620000b3565b5b620004e68254620002a2565b620004f382828562000418565b600060209050601f8311600181146200052b576000841562000516578287015190505b62000522858262000495565b86555062000592565b601f1984166200053b86620002d7565b60005b8281101562000565578489015182556001820191506020850194506020810190506200053e565b8683101562000585578489015162000581601f89168262000475565b8355505b6001600288020188555050505b505050505050565b60805161083b620005bc6000396000818160c9015261016d015261083b6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063368b8772146100515780638da5cb5b1461006d578063ce6d41de1461008b578063e21f37ce146100a9575b600080fd5b61006b6004803603810190610066919061031e565b6100c7565b005b61007561016b565b60405161008291906103ac565b60405180910390f35b61009361018f565b6040516100a09190610457565b60405180910390f35b6100b1610221565b6040516100be9190610457565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014c906104c5565b60405180910390fd5b818160009182610166929190610735565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000805461019e9061054e565b80601f01602080910402602001604051908101604052809291908181526020018280546101ca9061054e565b80156102175780601f106101ec57610100808354040283529160200191610217565b820191906000526020600020905b8154815290600101906020018083116101fa57829003601f168201915b5050505050905090565b6000805461022e9061054e565b80601f016020809104026020016040519081016040528092919081815260200182805461025a9061054e565b80156102a75780601f1061027c576101008083540402835291602001916102a7565b820191906000526020600020905b81548152906001019060200180831161028a57829003601f168201915b505050505081565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126102de576102dd6102b9565b5b8235905067ffffffffffffffff8111156102fb576102fa6102be565b5b602083019150836001820283011115610317576103166102c3565b5b9250929050565b60008060208385031215610335576103346102af565b5b600083013567ffffffffffffffff811115610353576103526102b4565b5b61035f858286016102c8565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103968261036b565b9050919050565b6103a68161038b565b82525050565b60006020820190506103c1600083018461039d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104015780820151818401526020810190506103e6565b60008484015250505050565b6000601f19601f8301169050919050565b6000610429826103c7565b61043381856103d2565b93506104438185602086016103e3565b61044c8161040d565b840191505092915050565b60006020820190508181036000830152610471818461041e565b905092915050565b7f4f6e6c7920746865206f776e65722063616e20646f20746861742e0000000000600082015250565b60006104af601b836103d2565b91506104ba82610479565b602082019050919050565b600060208201905081810360008301526104de816104a2565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061056657607f821691505b6020821081036105795761057861051f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026105e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105a4565b6105eb86836105a4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061063261062d61062884610603565b61060d565b610603565b9050919050565b6000819050919050565b61064c83610617565b61066061065882610639565b8484546105b1565b825550505050565b600090565b610675610668565b610680818484610643565b505050565b5b818110156106a45761069960008261066d565b600181019050610686565b5050565b601f8211156106e9576106ba8161057f565b6106c384610594565b810160208510156106d2578190505b6106e66106de85610594565b830182610685565b50505b505050565b600082821c905092915050565b600061070c600019846008026106ee565b1980831691505092915050565b600061072583836106fb565b9150826002028217905092915050565b61073f83836104e5565b67ffffffffffffffff811115610758576107576104f0565b5b610762825461054e565b61076d8282856106a8565b6000601f83116001811461079c576000841561078a578287013590505b6107948582610719565b8655506107fc565b601f1984166107aa8661057f565b60005b828110156107d2578489013582556001820191506020850194506020810190506107ad565b868310156107ef57848901356107eb601f8916826106fb565b8355505b6001600288020188555050505b5050505050505056fea26469706673582212204ee1e2b1c6277c5f77a82579fb10a6a2b84c35c9c1f04e3232aef341dc74725264736f6c63430008180033",
- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063368b8772146100515780638da5cb5b1461006d578063ce6d41de1461008b578063e21f37ce146100a9575b600080fd5b61006b6004803603810190610066919061031e565b6100c7565b005b61007561016b565b60405161008291906103ac565b60405180910390f35b61009361018f565b6040516100a09190610457565b60405180910390f35b6100b1610221565b6040516100be9190610457565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014c906104c5565b60405180910390fd5b818160009182610166929190610735565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000805461019e9061054e565b80601f01602080910402602001604051908101604052809291908181526020018280546101ca9061054e565b80156102175780601f106101ec57610100808354040283529160200191610217565b820191906000526020600020905b8154815290600101906020018083116101fa57829003601f168201915b5050505050905090565b6000805461022e9061054e565b80601f016020809104026020016040519081016040528092919081815260200182805461025a9061054e565b80156102a75780601f1061027c576101008083540402835291602001916102a7565b820191906000526020600020905b81548152906001019060200180831161028a57829003601f168201915b505050505081565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126102de576102dd6102b9565b5b8235905067ffffffffffffffff8111156102fb576102fa6102be565b5b602083019150836001820283011115610317576103166102c3565b5b9250929050565b60008060208385031215610335576103346102af565b5b600083013567ffffffffffffffff811115610353576103526102b4565b5b61035f858286016102c8565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103968261036b565b9050919050565b6103a68161038b565b82525050565b60006020820190506103c1600083018461039d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104015780820151818401526020810190506103e6565b60008484015250505050565b6000601f19601f8301169050919050565b6000610429826103c7565b61043381856103d2565b93506104438185602086016103e3565b61044c8161040d565b840191505092915050565b60006020820190508181036000830152610471818461041e565b905092915050565b7f4f6e6c7920746865206f776e65722063616e20646f20746861742e0000000000600082015250565b60006104af601b836103d2565b91506104ba82610479565b602082019050919050565b600060208201905081810360008301526104de816104a2565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061056657607f821691505b6020821081036105795761057861051f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026105e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105a4565b6105eb86836105a4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061063261062d61062884610603565b61060d565b610603565b9050919050565b6000819050919050565b61064c83610617565b61066061065882610639565b8484546105b1565b825550505050565b600090565b610675610668565b610680818484610643565b505050565b5b818110156106a45761069960008261066d565b600181019050610686565b5050565b601f8211156106e9576106ba8161057f565b6106c384610594565b810160208510156106d2578190505b6106e66106de85610594565b830182610685565b50505b505050565b600082821c905092915050565b600061070c600019846008026106ee565b1980831691505092915050565b600061072583836106fb565b9150826002028217905092915050565b61073f83836104e5565b67ffffffffffffffff811115610758576107576104f0565b5b610762825461054e565b61076d8282856106a8565b6000601f83116001811461079c576000841561078a578287013590505b6107948582610719565b8655506107fc565b601f1984166107aa8661057f565b60005b828110156107d2578489013582556001820191506020850194506020810190506107ad565b868310156107ef57848901356107eb601f8916826106fb565b8355505b6001600288020188555050505b5050505050505056fea26469706673582212204ee1e2b1c6277c5f77a82579fb10a6a2b84c35c9c1f04e3232aef341dc74725264736f6c63430008180033",
+ "bytecode": "0x60a06040523480156200001157600080fd5b5060405162000df738038062000df7833981810160405281019062000037919062000217565b3373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505080600090816200007c9190620004b3565b50506200059a565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000ed82620000a2565b810181811067ffffffffffffffff821117156200010f576200010e620000b3565b5b80604052505050565b60006200012462000084565b9050620001328282620000e2565b919050565b600067ffffffffffffffff821115620001555762000154620000b3565b5b6200016082620000a2565b9050602081019050919050565b60005b838110156200018d57808201518184015260208101905062000170565b60008484015250505050565b6000620001b0620001aa8462000137565b62000118565b905082815260208101848484011115620001cf57620001ce6200009d565b5b620001dc8482856200016d565b509392505050565b600082601f830112620001fc57620001fb62000098565b5b81516200020e84826020860162000199565b91505092915050565b60006020828403121562000230576200022f6200008e565b5b600082015167ffffffffffffffff81111562000251576200025062000093565b5b6200025f84828501620001e4565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002bb57607f821691505b602082108103620002d157620002d062000273565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fc565b620003478683620002fc565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003946200038e62000388846200035f565b62000369565b6200035f565b9050919050565b6000819050919050565b620003b08362000373565b620003c8620003bf826200039b565b84845462000309565b825550505050565b600090565b620003df620003d0565b620003ec818484620003a5565b505050565b5b81811015620004145762000408600082620003d5565b600181019050620003f2565b5050565b601f82111562000463576200042d81620002d7565b6200043884620002ec565b8101602085101562000448578190505b620004606200045785620002ec565b830182620003f1565b50505b505050565b600082821c905092915050565b6000620004886000198460080262000468565b1980831691505092915050565b6000620004a3838362000475565b9150826002028217905092915050565b620004be8262000268565b67ffffffffffffffff811115620004da57620004d9620000b3565b5b620004e68254620002a2565b620004f382828562000418565b600060209050601f8311600181146200052b576000841562000516578287015190505b62000522858262000495565b86555062000592565b601f1984166200053b86620002d7565b60005b8281101562000565578489015182556001820191506020850194506020810190506200053e565b8683101562000585578489015162000581601f89168262000475565b8355505b6001600288020188555050505b505050505050565b60805161083b620005bc6000396000818160c9015261016d015261083b6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063368b8772146100515780638da5cb5b1461006d578063ce6d41de1461008b578063e21f37ce146100a9575b600080fd5b61006b6004803603810190610066919061031e565b6100c7565b005b61007561016b565b60405161008291906103ac565b60405180910390f35b61009361018f565b6040516100a09190610457565b60405180910390f35b6100b1610221565b6040516100be9190610457565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014c906104c5565b60405180910390fd5b818160009182610166929190610735565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000805461019e9061054e565b80601f01602080910402602001604051908101604052809291908181526020018280546101ca9061054e565b80156102175780601f106101ec57610100808354040283529160200191610217565b820191906000526020600020905b8154815290600101906020018083116101fa57829003601f168201915b5050505050905090565b6000805461022e9061054e565b80601f016020809104026020016040519081016040528092919081815260200182805461025a9061054e565b80156102a75780601f1061027c576101008083540402835291602001916102a7565b820191906000526020600020905b81548152906001019060200180831161028a57829003601f168201915b505050505081565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126102de576102dd6102b9565b5b8235905067ffffffffffffffff8111156102fb576102fa6102be565b5b602083019150836001820283011115610317576103166102c3565b5b9250929050565b60008060208385031215610335576103346102af565b5b600083013567ffffffffffffffff811115610353576103526102b4565b5b61035f858286016102c8565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103968261036b565b9050919050565b6103a68161038b565b82525050565b60006020820190506103c1600083018461039d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104015780820151818401526020810190506103e6565b60008484015250505050565b6000601f19601f8301169050919050565b6000610429826103c7565b61043381856103d2565b93506104438185602086016103e3565b61044c8161040d565b840191505092915050565b60006020820190508181036000830152610471818461041e565b905092915050565b7f4f6e6c7920746865206f776e65722063616e20646f20746861742e0000000000600082015250565b60006104af601b836103d2565b91506104ba82610479565b602082019050919050565b600060208201905081810360008301526104de816104a2565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061056657607f821691505b6020821081036105795761057861051f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026105e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105a4565b6105eb86836105a4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061063261062d61062884610603565b61060d565b610603565b9050919050565b6000819050919050565b61064c83610617565b61066061065882610639565b8484546105b1565b825550505050565b600090565b610675610668565b610680818484610643565b505050565b5b818110156106a45761069960008261066d565b600181019050610686565b5050565b601f8211156106e9576106ba8161057f565b6106c384610594565b810160208510156106d2578190505b6106e66106de85610594565b830182610685565b50505b505050565b600082821c905092915050565b600061070c600019846008026106ee565b1980831691505092915050565b600061072583836106fb565b9150826002028217905092915050565b61073f83836104e5565b67ffffffffffffffff811115610758576107576104f0565b5b610762825461054e565b61076d8282856106a8565b6000601f83116001811461079c576000841561078a578287013590505b6107948582610719565b8655506107fc565b601f1984166107aa8661057f565b60005b828110156107d2578489013582556001820191506020850194506020810190506107ad565b868310156107ef57848901356107eb601f8916826106fb565b8355505b6001600288020188555050505b5050505050505056fea2646970667358221220857f282e7fe7b42efc67e25fd9bfb82923b121ac6c201bc3bb0ce3395baaa0d664736f6c63430008180033",
+ "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063368b8772146100515780638da5cb5b1461006d578063ce6d41de1461008b578063e21f37ce146100a9575b600080fd5b61006b6004803603810190610066919061031e565b6100c7565b005b61007561016b565b60405161008291906103ac565b60405180910390f35b61009361018f565b6040516100a09190610457565b60405180910390f35b6100b1610221565b6040516100be9190610457565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014c906104c5565b60405180910390fd5b818160009182610166929190610735565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000805461019e9061054e565b80601f01602080910402602001604051908101604052809291908181526020018280546101ca9061054e565b80156102175780601f106101ec57610100808354040283529160200191610217565b820191906000526020600020905b8154815290600101906020018083116101fa57829003601f168201915b5050505050905090565b6000805461022e9061054e565b80601f016020809104026020016040519081016040528092919081815260200182805461025a9061054e565b80156102a75780601f1061027c576101008083540402835291602001916102a7565b820191906000526020600020905b81548152906001019060200180831161028a57829003601f168201915b505050505081565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126102de576102dd6102b9565b5b8235905067ffffffffffffffff8111156102fb576102fa6102be565b5b602083019150836001820283011115610317576103166102c3565b5b9250929050565b60008060208385031215610335576103346102af565b5b600083013567ffffffffffffffff811115610353576103526102b4565b5b61035f858286016102c8565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103968261036b565b9050919050565b6103a68161038b565b82525050565b60006020820190506103c1600083018461039d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104015780820151818401526020810190506103e6565b60008484015250505050565b6000601f19601f8301169050919050565b6000610429826103c7565b61043381856103d2565b93506104438185602086016103e3565b61044c8161040d565b840191505092915050565b60006020820190508181036000830152610471818461041e565b905092915050565b7f4f6e6c7920746865206f776e65722063616e20646f20746861742e0000000000600082015250565b60006104af601b836103d2565b91506104ba82610479565b602082019050919050565b600060208201905081810360008301526104de816104a2565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061056657607f821691505b6020821081036105795761057861051f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026105e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105a4565b6105eb86836105a4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061063261062d61062884610603565b61060d565b610603565b9050919050565b6000819050919050565b61064c83610617565b61066061065882610639565b8484546105b1565b825550505050565b600090565b610675610668565b610680818484610643565b505050565b5b818110156106a45761069960008261066d565b600181019050610686565b5050565b601f8211156106e9576106ba8161057f565b6106c384610594565b810160208510156106d2578190505b6106e66106de85610594565b830182610685565b50505b505050565b600082821c905092915050565b600061070c600019846008026106ee565b1980831691505092915050565b600061072583836106fb565b9150826002028217905092915050565b61073f83836104e5565b67ffffffffffffffff811115610758576107576104f0565b5b610762825461054e565b61076d8282856106a8565b6000601f83116001811461079c576000841561078a578287013590505b6107948582610719565b8655506107fc565b601f1984166107aa8661057f565b60005b828110156107d2578489013582556001820191506020850194506020810190506107ad565b868310156107ef57848901356107eb601f8916826106fb565b8355505b6001600288020188555050505b5050505050505056fea2646970667358221220857f282e7fe7b42efc67e25fd9bfb82923b121ac6c201bc3bb0ce3395baaa0d664736f6c63430008180033",
"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
index cd3767e..864e7c9 100644
--- a/frontend/src/evm-output/deployed_addresses.json
+++ b/frontend/src/evm-output/deployed_addresses.json
@@ -1,4 +1,4 @@
{
- "MessageBoxModule#MessageBox": "0x5FbDB2315678afecb367f032d93F642f64180aa3",
- "MainModule#PADToken": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9"
+ "MainModule#PADToken": "0x5FbDB2315678afecb367f032d93F642f64180aa3",
+ "MessageBoxModule#MessageBox": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"
}
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
index b32ba6c..5bddb1e 100644
--- a/frontend/src/main.tsx
+++ b/frontend/src/main.tsx
@@ -1,6 +1,7 @@
import { RouterProvider, createRouter } from "@tanstack/react-router";
import React from "react";
import ReactDOM from "react-dom/client";
+import { ContextsProvider } from "./components/ContextsProvider";
import "./index.css";
import { routeTree } from "./routeTree.gen";
@@ -13,6 +14,8 @@ declare module "@tanstack/react-router" {
ReactDOM.createRoot(document.getElementById("root")!).render(
-
+
+
+
);
diff --git a/frontend/src/routes/message-box.lazy.tsx b/frontend/src/routes/message-box.lazy.tsx
index 0f5e03c..daca144 100644
--- a/frontend/src/routes/message-box.lazy.tsx
+++ b/frontend/src/routes/message-box.lazy.tsx
@@ -1,7 +1,7 @@
import { createLazyFileRoute } from "@tanstack/react-router";
import { useState } from "react";
import { useStore } from "../store";
-import { toastError, tryWithToast } from "../utils";
+import { toastError, tryWithToast } from "../utils/toast";
import { messageBox } from "../web3";
export const Route = createLazyFileRoute("/message-box")({
diff --git a/frontend/src/routes/pad-token.lazy.tsx b/frontend/src/routes/pad-token.lazy.tsx
index e1dc3f4..b27feaf 100644
--- a/frontend/src/routes/pad-token.lazy.tsx
+++ b/frontend/src/routes/pad-token.lazy.tsx
@@ -1,8 +1,9 @@
import { createLazyFileRoute } from "@tanstack/react-router";
import { useState } from "react";
-import type { Numbers } from "web3";
import { useStore } from "../store";
-import { getFormInputValue, toastError, tryWithToast } from "../utils";
+import { getFormInputValue } from "../utils/form";
+import { toastError, tryWithToast } from "../utils/toast";
+import { formatPadTokenAmount } from "../utils/ui";
import { padToken, web3 } from "../web3";
export const Route = createLazyFileRoute("/pad-token")({
@@ -28,10 +29,8 @@ function PadTokenPage() {
}
await tryWithToast("Balance Of", async () => {
- const balanceBN: Numbers = await padToken.methods
- .balanceOf(address)
- .call();
- setBalance(web3.utils.fromWei(balanceBN, "ether"));
+ const _balance: bigint = await padToken.methods.balanceOf(address).call();
+ setBalance(formatPadTokenAmount(_balance));
});
};
@@ -86,7 +85,7 @@ function PadTokenPage() {
Get
- Balance: {balance} PAD
+ Balance: {balance}
diff --git a/frontend/src/store.ts b/frontend/src/store.ts
new file mode 100644
index 0000000..bc9dfa5
--- /dev/null
+++ b/frontend/src/store.ts
@@ -0,0 +1,19 @@
+import { create } from "zustand";
+
+interface State {
+ connectedAccount: string | null;
+ setConnectedAccount: (connectedAccount: string) => void;
+ unsetConnectedAccount: () => void;
+ padTokenBalance: bigint | null;
+ setPadTokenBalance: (padTokenBalance: bigint) => void;
+ unsetPadTokenBalance: () => void;
+}
+
+export const useStore = create()((set, get) => ({
+ connectedAccount: null,
+ setConnectedAccount: (connectedAccount) => set({ connectedAccount }),
+ unsetConnectedAccount: () => set({ connectedAccount: null }),
+ padTokenBalance: null,
+ setPadTokenBalance: (padTokenBalance) => set({ padTokenBalance }),
+ unsetPadTokenBalance: () => set({ padTokenBalance: null }),
+}));
diff --git a/frontend/src/store.tsx b/frontend/src/store.tsx
deleted file mode 100644
index 92adf15..0000000
--- a/frontend/src/store.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { create } from "zustand";
-
-interface State {
- connectedAccount: string | null;
- setConnectedAccount: (newAccount: string) => void;
- unsetConnectedAccount: () => void;
-}
-
-export const useStore = create()((set) => ({
- connectedAccount: null,
- setConnectedAccount: (newAccount) => set({ connectedAccount: newAccount }),
- unsetConnectedAccount: () => set({ connectedAccount: null }),
-}));
diff --git a/frontend/src/utils/context.ts b/frontend/src/utils/context.ts
new file mode 100644
index 0000000..38a8d98
--- /dev/null
+++ b/frontend/src/utils/context.ts
@@ -0,0 +1,21 @@
+import { createContext, useContext } from "react";
+
+export default function buildContext(): [
+ React.Context,
+ () => TContext,
+] {
+ const builtContext = createContext(null);
+
+ const builtUseContext = () => {
+ // eslint-disable-next-line react-hooks/rules-of-hooks
+ const contextInstance = useContext(builtContext);
+ if (contextInstance === null) {
+ throw new Error(
+ "You can use this hook only inside the context's provider."
+ );
+ }
+ return contextInstance;
+ };
+
+ return [builtContext, builtUseContext];
+}
diff --git a/frontend/src/utils/form.ts b/frontend/src/utils/form.ts
new file mode 100644
index 0000000..3516595
--- /dev/null
+++ b/frontend/src/utils/form.ts
@@ -0,0 +1,5 @@
+export function getFormInputValue(form: HTMLFormElement, name: string) {
+ // @ts-expect-error
+ const input = form.elements[name] as HTMLInputElement;
+ return input.value;
+}
diff --git a/frontend/src/utils.ts b/frontend/src/utils/toast.ts
similarity index 69%
rename from frontend/src/utils.ts
rename to frontend/src/utils/toast.ts
index 197e78b..57386cb 100644
--- a/frontend/src/utils.ts
+++ b/frontend/src/utils/toast.ts
@@ -29,13 +29,3 @@ export async function tryWithToast(
);
}
}
-
-export function shortenAddress(address: string) {
- return address.slice(0, 6) + "..." + address.slice(-4);
-}
-
-export function getFormInputValue(form: HTMLFormElement, name: string) {
- // @ts-expect-error
- const input = form.elements[name] as HTMLInputElement;
- return input.value;
-}
diff --git a/frontend/src/utils/ui.ts b/frontend/src/utils/ui.ts
new file mode 100644
index 0000000..a6705d4
--- /dev/null
+++ b/frontend/src/utils/ui.ts
@@ -0,0 +1,9 @@
+import { web3 } from "../web3";
+
+export function shortenAddress(address: string) {
+ return address.slice(0, 6) + "..." + address.slice(-4);
+}
+
+export function formatPadTokenAmount(amount: bigint) {
+ return `${web3.utils.fromWei(amount, "ether").replace(/\.*$/, "")} PAD`;
+}