diff --git a/frontend/config-overrides.js b/frontend/config-overrides.js new file mode 100644 index 0000000..8b1ffbc --- /dev/null +++ b/frontend/config-overrides.js @@ -0,0 +1,7 @@ +const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); + +module.exports = function override(config, env) { + config.resolve.plugins = config.resolve.plugins.filter(plugin => !(plugin instanceof ModuleScopePlugin)); + + return config; +}; diff --git a/frontend/constants/goerliAddress.ts b/frontend/constants/goerliAddress.ts new file mode 100644 index 0000000..d3db51c --- /dev/null +++ b/frontend/constants/goerliAddress.ts @@ -0,0 +1 @@ +export const SNT_ADDRESS = '0x86e5C5c884740894644dAD30021aAaAdE2B7bAbd'; diff --git a/frontend/package.json b/frontend/package.json index de3bc38..a16be94 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,13 +12,14 @@ "@types/react-dom": "^16.9.0", "ethers": "^5.0.17", "react": "^16.14.0", + "react-app-rewired": "^2.1.8", "react-dom": "^16.14.0", "react-scripts": "3.4.3", "typescript": "^3.9.7", "web3modal": "^1.9.1" }, "scripts": { - "start": "react-scripts start", + "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 64d7df5..d291d8f 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -3,6 +3,7 @@ import logo from './logo.svg'; import './App.css'; import { Symfoni } from "./hardhat/SymfoniContext"; import { Greeter } from './components/Greeter'; +import { Bridge } from './components/Bridge' function App() { @@ -10,19 +11,7 @@ function App() {
- logo -

- Edit src/App.tsx and save to reload. -

- - Learn React - - +
diff --git a/frontend/src/components/Bridge.tsx b/frontend/src/components/Bridge.tsx new file mode 100644 index 0000000..4d88601 --- /dev/null +++ b/frontend/src/components/Bridge.tsx @@ -0,0 +1,65 @@ +import React, { useContext, useEffect, useState } from 'react'; +import { BridgeContext, SymfoniBridge } from "./../hardhat/SymfoniContext"; +import { Wallet, providers, Contract, VoidSigner } from "ethers"; +import { Bridge as IBridge } from "../types/Bridge" +import { SNT_ETHEREUM } from "../constants/goerliAddress"; + +const wallet = Wallet.createRandom(); + +interface Props { } +const FUJI_BRIDGE = '0xE57Eb49689bCAE4dE61D326F7E79Bd14aB527f0f'; +const GOERLI_BRIDGE = '0xD0E461b1Dc56503fC72565FA964C28E274146D44'; +const fujiProvider = new providers.JsonRpcProvider("https://api.avax-test.network/ext/bc/C/rpc"); +const goerliProvider = new providers.InfuraProvider("goerli"); +const fujiSigner = new Wallet(wallet.privateKey, fujiProvider); +const fujiVoidSigner = new VoidSigner(wallet.address, fujiProvider); +const goerliVoidsigner = new VoidSigner(wallet.address, goerliProvider); + + +export const Bridge: React.FC = () => { + const bridge: SymfoniBridge = useContext(BridgeContext); + /* fujiBridge.factory?.connect(fujiSigner); + * fujiBridge.factory?.attach(FUJI_BRIDGE); */ + const [message, setMessage] = useState(""); + const [inputGreeting, setInputGreeting] = useState(""); + const [goerliBridge, setGoerliBridge] = useState(); + const [fujiBridge, setFujiBridge] = useState(); + useEffect(() => { + const doAsync = async () => { + if (!bridge.instance) return + console.log("Bridge is deployed at ", bridge.instance.address) + let gBridge = new Contract( + GOERLI_BRIDGE, + bridge.instance.interface, + goerliVoidsigner + ) as IBridge; + setGoerliBridge(gBridge); + let fBridge = new Contract( + FUJI_BRIDGE, + bridge.instance.interface, + fujiVoidSigner + ) as IBridge; + setFujiBridge(fBridge); + }; + doAsync(); + }, [bridge]) + + const handleSetGreeting = async (e: React.MouseEvent) => { + e.preventDefault() + if (!bridge.instance) throw Error("Bridge instance not ready") + if (bridge.instance) { + //const tx = await bridge.instance.setGreeting(inputGreeting) + const tx = await bridge.instance._expiry(); + //const fuji = await fujiBridge.instance?._expiry(); + const goerli = await goerliBridge?._expiry(); + console.log("expiry", {tx, goerli}, goerliBridge?.address); + } + } + return ( +
+

{message}

+ setInputGreeting(e.target.value)}> + +
+ ) +}