import '../styles/globals.css' import { useEffect, useState } from "react"; import './reactCOIServiceWorker'; import ZkappWorkerClient from './zkappWorkerClient'; import { PublicKey, PrivateKey, Field, } from 'snarkyjs' let transactionFee = 0.1; export default function App() { let [state, setState] = useState({ zkappWorkerClient: null as null | ZkappWorkerClient, hasWallet: null as null | boolean, hasBeenSetup: false, accountExists: false, currentNum: null as null | Field, publicKey: null as null | PublicKey, zkappPublicKey: null as null | PublicKey, creatingTransaction: false, }); // ------------------------------------------------------- // Do Setup useEffect(() => { (async () => { if (!state.hasBeenSetup) { const zkappWorkerClient = new ZkappWorkerClient(); console.log('Loading SnarkyJS...'); await zkappWorkerClient.loadSnarkyJS(); console.log('done'); await zkappWorkerClient.setActiveInstanceToBerkeley(); const mina = (window as any).mina; if (mina == null) { setState({ ...state, hasWallet: false }); return; } const publicKeyBase58 : string = (await mina.requestAccounts())[0]; const publicKey = PublicKey.fromBase58(publicKeyBase58); console.log('using key', publicKey.toBase58()); console.log('checking if account exists...'); const res = await zkappWorkerClient.fetchAccount({ publicKey: publicKey! }); const accountExists = res.error == null; await zkappWorkerClient.loadContract(); console.log('compiling zkApp'); await zkappWorkerClient.compileContract(); console.log('zkApp compiled'); const zkappPublicKey = PublicKey.fromBase58('B62qph2VodgSo5NKn9gZta5BHNxppgZMDUihf1g7mXreL4uPJFXDGDA'); await zkappWorkerClient.initZkappInstance(zkappPublicKey); console.log('getting zkApp state...'); await zkappWorkerClient.fetchAccount({ publicKey: zkappPublicKey }) const currentNum = await zkappWorkerClient.getNum(); console.log('current state:', currentNum.toString()); setState({ ...state, zkappWorkerClient, hasWallet: true, hasBeenSetup: true, publicKey, zkappPublicKey, accountExists, currentNum }); } })(); }, []); // ------------------------------------------------------- // Wait for account to exist, if it didn't useEffect(() => { (async () => { if (state.hasBeenSetup && !state.accountExists) { for (;;) { console.log('checking if account exists...'); const res = await state.zkappWorkerClient!.fetchAccount({ publicKey: state.publicKey! }) const accountExists = res.error == null; if (accountExists) { break; } await new Promise((resolve) => setTimeout(resolve, 5000)); } setState({ ...state, accountExists: true }); } })(); }, [state.hasBeenSetup]); // ------------------------------------------------------- // Send a transaction const onSendTransaction = async () => { setState({ ...state, creatingTransaction: true }); console.log('sending a transaction...'); await state.zkappWorkerClient!.fetchAccount({ publicKey: state.publicKey! }); await state.zkappWorkerClient!.createUpdateTransaction(); console.log('creating proof...'); await state.zkappWorkerClient!.proveUpdateTransaction(); console.log('getting Transaction JSON...'); const transactionJSON = await state.zkappWorkerClient!.getTransactionJSON() console.log('requesting send transaction...'); const { hash } = await (window as any).mina.sendTransaction({ transaction: transactionJSON, feePayer: { fee: transactionFee, memo: '', }, }); console.log( 'See transaction at https://berkeley.minaexplorer.com/transaction/' + hash ); setState({ ...state, creatingTransaction: false }); } // ------------------------------------------------------- // Refresh the current state const onRefreshCurrentNum = async () => { console.log('getting zkApp state...'); await state.zkappWorkerClient!.fetchAccount({ publicKey: state.zkappPublicKey! }) const currentNum = await state.zkappWorkerClient!.getNum(); console.log('current state:', currentNum.toString()); setState({ ...state, currentNum }); } // ------------------------------------------------------- // Create UI elements let hasWallet; if (state.hasWallet != null && !state.hasWallet) { const auroLink = 'https://www.aurowallet.com/'; const auroLinkElem = [Link] hasWallet =
Could not find a wallet. Install Auro wallet here: { auroLinkElem }
} let setupText = state.hasBeenSetup ? 'SnarkyJS Ready' : 'Setting up SnarkyJS...'; let setup =
{ setupText } { hasWallet }
let accountDoesNotExist; if (state.hasBeenSetup && !state.accountExists) { const faucetLink = "https://faucet.minaprotocol.com/?address=" + state.publicKey!.toBase58(); accountDoesNotExist =
Account does not exist. Please visit the faucet to fund this account [Link]
} let mainContent; if (state.hasBeenSetup && state.accountExists) { mainContent =
Current Number in zkApp: { state.currentNum!.toString() }
} return
{ setup } { accountDoesNotExist } { mainContent }
}