From b1a237db999f49c3242fcd63605762517f54e17b Mon Sep 17 00:00:00 2001
From: Evan Gray <56235822+evan-gray@users.noreply.github.com>
Date: Sun, 1 Aug 2021 23:21:28 -0400
Subject: [PATCH] bridge_ui: solana balances, begin wasm integration
Change-Id: Ifde4ec688ff678f46c1606e519fc36c0ece68fd4
---
bridge_ui/craco.config.js | 28 +++
bridge_ui/package-lock.json | 271 ++++++++++++++++++++-
bridge_ui/package.json | 14 +-
bridge_ui/src/components/KeyAndBalance.tsx | 50 ++++
bridge_ui/src/components/Transfer.tsx | 81 ++++--
bridge_ui/src/hooks/useEthereumBalance.ts | 61 +++--
bridge_ui/src/hooks/useSolanaBalance.ts | 47 ++++
bridge_ui/src/utils/consts.ts | 2 +
bridge_ui/src/utils/transferFrom.ts | 41 +++-
generate-wasm.sh | 12 +-
10 files changed, 554 insertions(+), 53 deletions(-)
create mode 100644 bridge_ui/craco.config.js
create mode 100644 bridge_ui/src/components/KeyAndBalance.tsx
create mode 100644 bridge_ui/src/hooks/useSolanaBalance.ts
diff --git a/bridge_ui/craco.config.js b/bridge_ui/craco.config.js
new file mode 100644
index 000000000..9ccca4fce
--- /dev/null
+++ b/bridge_ui/craco.config.js
@@ -0,0 +1,28 @@
+const { addBeforeLoader, loaderByName } = require("@craco/craco");
+
+module.exports = {
+ webpack: {
+ configure: (webpackConfig) => {
+ const wasmExtensionRegExp = /\.wasm$/;
+ webpackConfig.resolve.extensions.push(".wasm");
+
+ webpackConfig.module.rules.forEach((rule) => {
+ (rule.oneOf || []).forEach((oneOf) => {
+ if (oneOf.loader && oneOf.loader.indexOf("file-loader") >= 0) {
+ oneOf.exclude.push(wasmExtensionRegExp);
+ }
+ });
+ });
+
+ const wasmLoader = {
+ test: /\.wasm$/,
+ include: /node_modules\/(bridge|token-bridge)/,
+ loaders: ["wasm-loader"],
+ };
+
+ addBeforeLoader(webpackConfig, loaderByName("file-loader"), wasmLoader);
+
+ return webpackConfig;
+ },
+ },
+};
diff --git a/bridge_ui/package-lock.json b/bridge_ui/package-lock.json
index 5b68c3414..77839986b 100644
--- a/bridge_ui/package-lock.json
+++ b/bridge_ui/package-lock.json
@@ -5,7 +5,9 @@
"requires": true,
"packages": {
"": {
+ "name": "test_ui",
"version": "0.1.0",
+ "hasInstallScript": true,
"dependencies": {
"@material-ui/core": "^4.12.2",
"@metamask/detect-provider": "^1.2.0",
@@ -13,16 +15,20 @@
"@solana/wallet-base": "^0.0.1",
"@solana/web3.js": "^1.22.0",
"@typechain/ethers-v5": "^7.0.1",
+ "bridge": "file:rust_modules\\core",
"ethers": "^5.4.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
- "react-scripts": "4.0.3"
+ "react-scripts": "4.0.3",
+ "token-bridge": "file:rust_modules\\token"
},
"devDependencies": {
+ "@craco/craco": "^6.2.0",
"@openzeppelin/contracts": "^4.2.0",
"@truffle/hdwallet-provider": "^1.4.1",
"copy-dir": "^1.3.0",
- "truffle": "^5.4.1"
+ "truffle": "^5.4.1",
+ "wasm-loader": "^1.3.0"
}
},
"node_modules/@apollo/client": {
@@ -2005,6 +2011,27 @@
"ieee754": "^1.1.13"
}
},
+ "node_modules/@craco/craco": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-6.2.0.tgz",
+ "integrity": "sha512-kLc4GSdgR9D5JiZmSxtzbvBKcUFSJqMXImRjjYf5pacwiyAs3XfQwai7T+pExfLQNUnytgkL8jRFUJeYrkVr7g==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "lodash": "^4.17.15",
+ "semver": "^7.3.2",
+ "webpack-merge": "^4.2.2"
+ },
+ "bin": {
+ "craco": "bin/craco.js"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "react-scripts": "^4.0.0"
+ }
+ },
"node_modules/@csstools/convert-colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
@@ -10222,6 +10249,10 @@
"node": ">=8"
}
},
+ "node_modules/bridge": {
+ "resolved": "rust_modules/core",
+ "link": true
+ },
"node_modules/brorand": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
@@ -34482,6 +34513,10 @@
"node": ">=0.6"
}
},
+ "node_modules/token-bridge": {
+ "resolved": "rust_modules/token",
+ "link": true
+ },
"node_modules/tough-cookie": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
@@ -35551,6 +35586,72 @@
"makeerror": "1.0.x"
}
},
+ "node_modules/wasm-dce": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wasm-dce/-/wasm-dce-1.0.2.tgz",
+ "integrity": "sha512-Fq1+nu43ybsjSnBquLrW/cULmKs61qbv9k8ep13QUe0nABBezMoNAA+j6QY66MW0/eoDVDp1rjXDqQ2VKyS/Xg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.0.0-beta.39",
+ "@babel/traverse": "^7.0.0-beta.39",
+ "@babel/types": "^7.0.0-beta.39",
+ "babylon": "^7.0.0-beta.39",
+ "webassembly-interpreter": "0.0.30"
+ }
+ },
+ "node_modules/wasm-dce/node_modules/babylon": {
+ "version": "7.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz",
+ "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "babylon": "bin/babylon.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/wasm-loader": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/wasm-loader/-/wasm-loader-1.3.0.tgz",
+ "integrity": "sha512-R4s75XH+o8qM+WaRrAU9S2rbAMDzob18/S3V8R9ZoFpZkPWLAohWWlzWAp1ybeTkOuuku/X1zJtxiV0pBYxZww==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^1.1.0",
+ "wasm-dce": "^1.0.0"
+ },
+ "peerDependencies": {
+ "wasm-dce": "1.x"
+ }
+ },
+ "node_modules/wasm-loader/node_modules/json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/wasm-loader/node_modules/loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/watchpack": {
"version": "1.7.5",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
@@ -36335,6 +36436,46 @@
"xhr-request-promise": "^0.1.2"
}
},
+ "node_modules/webassembly-floating-point-hex-parser": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/webassembly-floating-point-hex-parser/-/webassembly-floating-point-hex-parser-0.1.2.tgz",
+ "integrity": "sha512-TUf1H++8U10+stJbFydnvrpG5Sznz5Rilez/oZlV5zI0C/e4cSxd8rALAJ8VpTvjVWxLmL3SVSJUK6Ap9AoiNg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/webassembly-interpreter": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/webassembly-interpreter/-/webassembly-interpreter-0.0.30.tgz",
+ "integrity": "sha512-+Jdy2piEvz9T5j751mOE8+rBO12p+nNW6Fg4kJZ+zP1oUfsm+151sbAbM8AFxWTURmWCGP+r8Lxwfv3pzN1bCQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0-beta.36",
+ "long": "^3.2.0",
+ "webassembly-floating-point-hex-parser": "0.1.2"
+ },
+ "bin": {
+ "wasm": "lib/bin/repl.js",
+ "wasm2wast": "lib/bin/wasm2wast.js",
+ "wasmast": "lib/bin/wasmast.js",
+ "wasmdump": "lib/bin/wasmdump.js",
+ "wasmrun": "lib/bin/wasmrun.js",
+ "wastast": "lib/bin/wastast.js"
+ }
+ },
+ "node_modules/webassembly-interpreter/node_modules/long": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
+ "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/webidl-conversions": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
@@ -37076,6 +37217,15 @@
"node": ">= 4.0.0"
}
},
+ "node_modules/webpack-merge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+ "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.15"
+ }
+ },
"node_modules/webpack-sources": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
@@ -38362,6 +38512,14 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true,
"optional": true
+ },
+ "rust_modules/core": {
+ "name": "bridge",
+ "version": "0.1.0"
+ },
+ "rust_modules/token": {
+ "name": "token-bridge",
+ "version": "0.1.0"
}
},
"dependencies": {
@@ -39743,6 +39901,18 @@
}
}
},
+ "@craco/craco": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-6.2.0.tgz",
+ "integrity": "sha512-kLc4GSdgR9D5JiZmSxtzbvBKcUFSJqMXImRjjYf5pacwiyAs3XfQwai7T+pExfLQNUnytgkL8jRFUJeYrkVr7g==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "lodash": "^4.17.15",
+ "semver": "^7.3.2",
+ "webpack-merge": "^4.2.2"
+ }
+ },
"@csstools/convert-colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
@@ -46437,6 +46607,9 @@
"fill-range": "^7.0.1"
}
},
+ "bridge": {
+ "version": "file:rust_modules/core"
+ },
"brorand": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
@@ -66128,6 +66301,9 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
+ "token-bridge": {
+ "version": "file:rust_modules/token"
+ },
"tough-cookie": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
@@ -66999,6 +67175,60 @@
"makeerror": "1.0.x"
}
},
+ "wasm-dce": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wasm-dce/-/wasm-dce-1.0.2.tgz",
+ "integrity": "sha512-Fq1+nu43ybsjSnBquLrW/cULmKs61qbv9k8ep13QUe0nABBezMoNAA+j6QY66MW0/eoDVDp1rjXDqQ2VKyS/Xg==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@babel/core": "^7.0.0-beta.39",
+ "@babel/traverse": "^7.0.0-beta.39",
+ "@babel/types": "^7.0.0-beta.39",
+ "babylon": "^7.0.0-beta.39",
+ "webassembly-interpreter": "0.0.30"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz",
+ "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==",
+ "dev": true,
+ "peer": true
+ }
+ }
+ },
+ "wasm-loader": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/wasm-loader/-/wasm-loader-1.3.0.tgz",
+ "integrity": "sha512-R4s75XH+o8qM+WaRrAU9S2rbAMDzob18/S3V8R9ZoFpZkPWLAohWWlzWAp1ybeTkOuuku/X1zJtxiV0pBYxZww==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.1.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
"watchpack": {
"version": "1.7.5",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
@@ -67692,6 +67922,34 @@
}
}
},
+ "webassembly-floating-point-hex-parser": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/webassembly-floating-point-hex-parser/-/webassembly-floating-point-hex-parser-0.1.2.tgz",
+ "integrity": "sha512-TUf1H++8U10+stJbFydnvrpG5Sznz5Rilez/oZlV5zI0C/e4cSxd8rALAJ8VpTvjVWxLmL3SVSJUK6Ap9AoiNg==",
+ "dev": true,
+ "peer": true
+ },
+ "webassembly-interpreter": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/webassembly-interpreter/-/webassembly-interpreter-0.0.30.tgz",
+ "integrity": "sha512-+Jdy2piEvz9T5j751mOE8+rBO12p+nNW6Fg4kJZ+zP1oUfsm+151sbAbM8AFxWTURmWCGP+r8Lxwfv3pzN1bCQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0-beta.36",
+ "long": "^3.2.0",
+ "webassembly-floating-point-hex-parser": "0.1.2"
+ },
+ "dependencies": {
+ "long": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
+ "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=",
+ "dev": true,
+ "peer": true
+ }
+ }
+ },
"webidl-conversions": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
@@ -68494,6 +68752,15 @@
}
}
},
+ "webpack-merge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+ "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.15"
+ }
+ },
"webpack-sources": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
diff --git a/bridge_ui/package.json b/bridge_ui/package.json
index 791a355ca..fecff3617 100644
--- a/bridge_ui/package.json
+++ b/bridge_ui/package.json
@@ -9,16 +9,18 @@
"@solana/wallet-base": "^0.0.1",
"@solana/web3.js": "^1.22.0",
"@typechain/ethers-v5": "^7.0.1",
+ "bridge": "file:rust_modules\\core",
"ethers": "^5.4.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
- "react-scripts": "4.0.3"
+ "react-scripts": "4.0.3",
+ "token-bridge": "file:rust_modules\\token"
},
"scripts": {
"postinstall": "npm run build-contracts",
- "start": "react-scripts start",
- "build": "npm run build-contracts && react-scripts build",
- "test": "npm run build-contracts && react-scripts test",
+ "start": "craco start",
+ "build": "npm run build-contracts && craco build",
+ "test": "npm run build-contracts && craco test",
"eject": "react-scripts eject",
"build-contracts": "npm run build --prefix ../ethereum && node scripts/copyContracts.js && typechain --target=ethers-v5 --out-dir=src/ethers-contracts contracts/*.json"
},
@@ -41,9 +43,11 @@
]
},
"devDependencies": {
+ "@craco/craco": "^6.2.0",
"@openzeppelin/contracts": "^4.2.0",
"@truffle/hdwallet-provider": "^1.4.1",
"copy-dir": "^1.3.0",
- "truffle": "^5.4.1"
+ "truffle": "^5.4.1",
+ "wasm-loader": "^1.3.0"
}
}
diff --git a/bridge_ui/src/components/KeyAndBalance.tsx b/bridge_ui/src/components/KeyAndBalance.tsx
new file mode 100644
index 000000000..670a33ef4
--- /dev/null
+++ b/bridge_ui/src/components/KeyAndBalance.tsx
@@ -0,0 +1,50 @@
+import { Typography } from "@material-ui/core";
+import { useEthereumProvider } from "../contexts/EthereumProviderContext";
+import { useSolanaWallet } from "../contexts/SolanaWalletContext";
+import useEthereumBalance from "../hooks/useEthereumBalance";
+import useSolanaBalance from "../hooks/useSolanaBalance";
+import { ChainId, CHAIN_ID_ETH, CHAIN_ID_SOLANA } from "../utils/consts";
+import EthereumSignerKey from "./EthereumSignerKey";
+import SolanaWalletKey from "./SolanaWalletKey";
+
+function KeyAndBalance({
+ chainId,
+ tokenAddress,
+}: {
+ chainId: ChainId;
+ tokenAddress?: string;
+}) {
+ // TODO: more generic way to get balance
+ const provider = useEthereumProvider();
+ const ethBalance = useEthereumBalance(
+ tokenAddress,
+ provider,
+ chainId === CHAIN_ID_ETH
+ );
+ const { wallet: solWallet } = useSolanaWallet();
+ const solPK = solWallet?.publicKey;
+ const solBalance = useSolanaBalance(
+ tokenAddress,
+ solPK,
+ chainId === CHAIN_ID_SOLANA
+ );
+ if (chainId === CHAIN_ID_ETH) {
+ return (
+ <>
+