From 768b44959f00df34c67fee0cd40ebd8fbc88a50a Mon Sep 17 00:00:00 2001 From: ademidun Date: Wed, 23 Feb 2022 18:33:23 -0500 Subject: [PATCH 1/9] refactor CryptoPaymentForm to be center-aligned horizontally in demo.atila.ca --- src/components/CryptoPaymentForm/CryptoPaymentForm.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx index 0a1cdc7..a740229 100644 --- a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx +++ b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx @@ -240,14 +240,16 @@ function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) { disabled={!isEditableAmount} onChange={updatePaymentForm} /> +
+
{ transactionUrl && From 375aa63dd7a1f9112755cbe09f47a6840b298aca Mon Sep 17 00:00:00 2001 From: ademidun Date: Wed, 23 Feb 2022 18:38:00 -0500 Subject: [PATCH 2/9] updated .bitmap file to new version changed components (components that got a version bump) > atila.web-components-library/ui/crypto-payment-form@0.0.6 --- .bitmap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bitmap b/.bitmap index 71fec4d..6557153 100644 --- a/.bitmap +++ b/.bitmap @@ -17,7 +17,7 @@ }, "ui/crypto-payment-form": { "scope": "atila.web-components-library", - "version": "0.0.5", + "version": "0.0.6", "mainFile": "CryptoPaymentForm.tsx", "rootDir": "src/components/CryptoPaymentForm" }, From 59ee8d1a0179e0c9aa5d3e3d421b03c71a974790 Mon Sep 17 00:00:00 2001 From: ademidun Date: Wed, 23 Feb 2022 18:44:18 -0500 Subject: [PATCH 3/9] rename CHAIN_IDS to CHAIN_NAMES --- .../CryptoPaymentForm.compositions.tsx | 10 ++++----- .../CryptoPaymentForm/CryptoPaymentForm.tsx | 22 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx b/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx index 8dd032b..4f44d65 100644 --- a/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx +++ b/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import CryptoPaymentForm, { CHAIN_IDS, CRYPTO_IN_USD, MAXIMUM_DECIMAL_PLACES } from './CryptoPaymentForm'; +import CryptoPaymentForm, { CHAIN_NAMES, CRYPTO_IN_USD, MAXIMUM_DECIMAL_PLACES } from './CryptoPaymentForm'; import 'bootstrap/dist/css/bootstrap.css'; import 'antd/dist/antd.css'; import { Radio, Select } from 'antd'; @@ -18,12 +18,12 @@ const paymentAmountOptions = [ const currencyOptions = [ { - name: CHAIN_IDS.ETHEREUM.NAME, - value: CHAIN_IDS.ETHEREUM.CURRENCY_CODE, + name: CHAIN_NAMES.ETHEREUM.NAME, + value: CHAIN_NAMES.ETHEREUM.CURRENCY_CODE, }, { - name: CHAIN_IDS.BINANCE.NAME, - value: CHAIN_IDS.BINANCE.CURRENCY_CODE, + name: CHAIN_NAMES.BINANCE.NAME, + value: CHAIN_NAMES.BINANCE.CURRENCY_CODE, } ] diff --git a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx index a740229..f207d8c 100644 --- a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx +++ b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx @@ -11,7 +11,7 @@ declare global { } } -export const CHAIN_IDS = { +export const CHAIN_NAMES = { BINANCE: { NAME: "Binance", CURRENCY_CODE: "BNB", @@ -99,11 +99,11 @@ function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) { let blockExplorerHost = "etherscan.io"; - if (currency === CHAIN_IDS.BINANCE.CURRENCY_CODE) { + if (currency === CHAIN_NAMES.BINANCE.CURRENCY_CODE) { blockExplorerHost = "bscscan.com" } if (isTestNet) { - networkName = currency === CHAIN_IDS.BINANCE.CURRENCY_CODE ? CHAIN_IDS.BINANCE.TEST_NET.NAME : CHAIN_IDS.ETHEREUM.ROPSTEN.NAME; + networkName = currency === CHAIN_NAMES.BINANCE.CURRENCY_CODE ? CHAIN_NAMES.BINANCE.TEST_NET.NAME : CHAIN_NAMES.ETHEREUM.ROPSTEN.NAME; blockExplorerHost = `${networkName}.${blockExplorerHost}` } else { networkName = "mainnet" @@ -123,24 +123,24 @@ function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) { const checkCorrectNetwork = (network: Network) => { let expectedChainId; - if (currency === CHAIN_IDS.ETHEREUM.CURRENCY_CODE) { + if (currency === CHAIN_NAMES.ETHEREUM.CURRENCY_CODE) { if (isTestNet) { - expectedChainId = CHAIN_IDS.ETHEREUM.ROPSTEN.ID; + expectedChainId = CHAIN_NAMES.ETHEREUM.ROPSTEN.ID; } else { - expectedChainId = CHAIN_IDS.ETHEREUM.MAIN_NET.ID; + expectedChainId = CHAIN_NAMES.ETHEREUM.MAIN_NET.ID; } - } else if (currency === CHAIN_IDS.BINANCE.CURRENCY_CODE) { + } else if (currency === CHAIN_NAMES.BINANCE.CURRENCY_CODE) { if (isTestNet) { - expectedChainId = CHAIN_IDS.BINANCE.TEST_NET.ID; + expectedChainId = CHAIN_NAMES.BINANCE.TEST_NET.ID; } else { - expectedChainId = CHAIN_IDS.BINANCE.MAIN_NET.ID; + expectedChainId = CHAIN_NAMES.BINANCE.MAIN_NET.ID; } } if (network.chainId !== expectedChainId) { - const actualNetworkName = [CHAIN_IDS.BINANCE.TEST_NET.ID, CHAIN_IDS.ETHEREUM.ROPSTEN.ID].includes(network.chainId) ? "testnet" : "mainnet"; - const actualCurrency = [CHAIN_IDS.BINANCE.MAIN_NET.ID, CHAIN_IDS.BINANCE.TEST_NET.ID].includes(network.chainId)? CHAIN_IDS.BINANCE.CURRENCY_CODE : CHAIN_IDS.ETHEREUM.CURRENCY_CODE; + const actualNetworkName = [CHAIN_NAMES.BINANCE.TEST_NET.ID, CHAIN_NAMES.ETHEREUM.ROPSTEN.ID].includes(network.chainId) ? "testnet" : "mainnet"; + const actualCurrency = [CHAIN_NAMES.BINANCE.MAIN_NET.ID, CHAIN_NAMES.BINANCE.TEST_NET.ID].includes(network.chainId)? CHAIN_NAMES.BINANCE.CURRENCY_CODE : CHAIN_NAMES.ETHEREUM.CURRENCY_CODE; return {isCorrectNetwork: false, message: `Change your network in Metamask. Expected "${isTestNet ? "testnet" : "mainnet"}" network (${networkName}) for currency: ${currency}. Instead received "${actualNetworkName}" network (${network.name}) for currency: ${actualCurrency}.`} } From 08b488f0de85a8a523ed46b1a73a6d5d0bcef985 Mon Sep 17 00:00:00 2001 From: ademidun Date: Wed, 23 Feb 2022 20:06:36 -0500 Subject: [PATCH 4/9] add component to add or switch blockchain --- src/App.tsx | 3 + .../AddOrSwitchBlockchain.tsx | 125 ++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx diff --git a/src/App.tsx b/src/App.tsx index 09ab851..c64c785 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,6 @@ import React from 'react'; import './App.css'; +import AddOrSwitchBlockchain from './components/AddOrSwitchBlockchain/AddOrSwitchBlockchain'; import CryptoPaymentForm, { TransactionResponsePayment } from './components/CryptoPaymentForm/CryptoPaymentForm'; import { ConfigurableCryptoPaymentForm } from './components/CryptoPaymentForm/CryptoPaymentForm.compositions'; import CurrencyDisplay from './components/CurrencyDisplay/CurrencyDisplay'; @@ -12,6 +13,8 @@ function App() { return (

Atila Web Components Library

+ +
diff --git a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx new file mode 100644 index 0000000..224cf98 --- /dev/null +++ b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx @@ -0,0 +1,125 @@ +import React from 'react' +// TODO find a way to update CHAIN_IDS import +// import { CHAIN_IDS } from '@atila/web-components-library.models.currency'; +import { Button } from 'antd' + +export interface AddOrSwitchBlockchainProps { + chainId: number; +} + +export interface BlockChain { + currencyCode: string, + currencyName: string, + chainId: number, + networkName: string, + isMainNet: boolean, + blockExplorerUrl: string; + rpcUrl: string; +} + +/** + * Use a key CHAIN_ID_{ID} instead of just the numerical ID so that CHAIN_IDS doesn't get converted to numerical index + */ + export const CHAIN_IDS: { [id: string] : BlockChain; } = { + CHAIN_ID_1: { + currencyCode: "ETH", + currencyName: "Ethereum", + chainId: 1, + networkName: "Ethereum Mainnet", + isMainNet: true, + blockExplorerUrl: "https://etherscan.io", + rpcUrl: "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", + }, + CHAIN_ID_3: { + currencyCode: "ETH", + currencyName: "Ethereum", + chainId: 3, + networkName: "Ethereum Ropsten", + isMainNet: false, + blockExplorerUrl: "https://ropsten.etherscan.io", + rpcUrl: "https://ropsten.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", + }, + CHAIN_ID_56: { + currencyCode: "BNB", + currencyName: "Binance Coin", + chainId: 56, + networkName: "Binance Smart Chain", + isMainNet: true, + blockExplorerUrl: "https://bscscan.com", + rpcUrl: "https://bsc-dataseed.binance.org/", + }, + CHAIN_ID_97: { + currencyCode: "BNB", + currencyName: "Binance Coin", + chainId: 97, + networkName: "Binance Smart Chain Testnet", + isMainNet: false, + blockExplorerUrl: "https://testnet.bscscan.com", + rpcUrl: "https://data-seed-prebsc-1-s1.binance.org:8545/", + } +} + +function AddOrSwitchBlockchain(props: AddOrSwitchBlockchainProps) { + + const { chainId } = props; + + const chainIdKey = `CHAIN_ID_${chainId}`; + + const chainIdHex = `0x${(chainId).toString(16)}`; + + const targetBlockChain: BlockChain = CHAIN_IDS[chainIdKey]; + + const changeBlockchain = async () => { + const provider = window.ethereum; + if(!provider){ + console.log("Crypto wallet is not installed, please install!"); + } + try { + await provider.request({ + method: 'wallet_switchEthereumChain', + // Convert numerical chain ID to hexadecimal string + params: [{ chainId: chainIdHex}], + }); + console.log("You have succefully switched to Binance Test network") + } catch (switchError: any) { + // This error code indicates that the chain has not been added to MetaMask. + if (switchError.code === 4902) { + console.log("This network is not available in your metamask, please add it"); + addBlockchain(); + } + console.log("Failed to switch to the network") + } + } + + + + const addBlockchain = async () => { + const provider = window.ethereum; + + try { + await provider.request({ + method: 'wallet_addEthereumChain', + params: [ { chainId: chainIdHex, + chainName: targetBlockChain.networkName, + rpcUrls:[targetBlockChain.rpcUrl], + blockExplorerUrls:[targetBlockChain.blockExplorerUrl], + nativeCurrency: { + symbol: targetBlockChain.currencyCode, + decimals: 18 + } }]} + ); + } catch (addError) { + console.log(addError); + } + } + + return ( +
+ +
+ ) +} + +export default AddOrSwitchBlockchain \ No newline at end of file From 4eeafb16a734b3b82e9cdc6039a9c724dc5afae8 Mon Sep 17 00:00:00 2001 From: ademidun Date: Thu, 24 Feb 2022 07:37:27 -0500 Subject: [PATCH 5/9] add component to add or switch blockchain networks --- .bitmap | 14 +- README.md | 2 + .../AddOrSwitchBlockchain.compositions.tsx | 26 +++ .../AddOrSwitchBlockchain.tsx | 167 ++++++++++-------- src/models/Currency/assets/binanceLogo.png | Bin 0 -> 19656 bytes src/models/Currency/assets/ethereumLogo.png | Bin 0 -> 50192 bytes src/models/Currency/index.ts | 61 ++++++- 7 files changed, 187 insertions(+), 83 deletions(-) create mode 100644 src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.compositions.tsx create mode 100644 src/models/Currency/assets/binanceLogo.png create mode 100644 src/models/Currency/assets/ethereumLogo.png diff --git a/.bitmap b/.bitmap index 6557153..c6f6ac6 100644 --- a/.bitmap +++ b/.bitmap @@ -11,25 +11,31 @@ { "models/currency": { "scope": "atila.web-components-library", - "version": "0.0.1", + "version": "0.0.2", "mainFile": "index.ts", "rootDir": "src/models/Currency" }, + "ui/add-or-switch-blockchain": { + "scope": "", + "version": "0.0.1", + "mainFile": "AddOrSwitchBlockchain.tsx", + "rootDir": "src/components/AddOrSwitchBlockchain" + }, "ui/crypto-payment-form": { "scope": "atila.web-components-library", - "version": "0.0.6", + "version": "0.0.7", "mainFile": "CryptoPaymentForm.tsx", "rootDir": "src/components/CryptoPaymentForm" }, "ui/currency-display": { "scope": "atila.web-components-library", - "version": "0.0.5", + "version": "0.0.6", "mainFile": "CurrencyDisplay.tsx", "rootDir": "src/components/CurrencyDisplay" }, "utils": { "scope": "atila.web-components-library", - "version": "0.0.3", + "version": "0.0.4", "mainFile": "index.ts", "rootDir": "src/services/utils" }, diff --git a/README.md b/README.md index f79d61c..e685980 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ A library of components used to build the Atila website You can view the components at: https://bit.dev/atila/web-components-library +For an example of what we're trying to build, see [ethereum-boilerplate/ethereum-boilerplate](https://github.com/ethereum-boilerplate/ethereum-boilerplate) + ## Quickstart This project can either be run as a React web server or a [Bit](https://bit.dev/) Server diff --git a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.compositions.tsx b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.compositions.tsx new file mode 100644 index 0000000..973e985 --- /dev/null +++ b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.compositions.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { CHAIN_IDS } from '@atila/web-components-library.models.currency' +import AddOrSwitchBlockchain from './AddOrSwitchBlockchain' + +export function SwitchBinanceSmartChainTestNet() { + return ( + + ) +} +export function AddBinanceSmartChainMainNet() { + return ( + + ) +} + +export function SwitchEthereumTestNet() { + return ( + + ) +} \ No newline at end of file diff --git a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx index 224cf98..7be8474 100644 --- a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx +++ b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx @@ -1,67 +1,42 @@ -import React from 'react' -// TODO find a way to update CHAIN_IDS import -// import { CHAIN_IDS } from '@atila/web-components-library.models.currency'; -import { Button } from 'antd' +import React, { useState } from 'react'; +import { Alert, Button, Spin } from 'antd' +import { BlockChain, CHAIN_IDS } from '@atila/web-components-library.models.currency'; -export interface AddOrSwitchBlockchainProps { - chainId: number; +// https://stackoverflow.com/questions/12709074/how-do-you-explicitly-set-a-new-property-on-window-in-typescript +declare global { + interface Window { + ethereum:any; + } } -export interface BlockChain { - currencyCode: string, - currencyName: string, - chainId: number, - networkName: string, - isMainNet: boolean, - blockExplorerUrl: string; - rpcUrl: string; +export interface AddOrSwitchBlockChainProps { + chainId: number; + showAddBlockChain: boolean; + showSwitchBlockChain: boolean; } -/** - * Use a key CHAIN_ID_{ID} instead of just the numerical ID so that CHAIN_IDS doesn't get converted to numerical index - */ - export const CHAIN_IDS: { [id: string] : BlockChain; } = { - CHAIN_ID_1: { - currencyCode: "ETH", - currencyName: "Ethereum", - chainId: 1, - networkName: "Ethereum Mainnet", - isMainNet: true, - blockExplorerUrl: "https://etherscan.io", - rpcUrl: "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", - }, - CHAIN_ID_3: { - currencyCode: "ETH", - currencyName: "Ethereum", - chainId: 3, - networkName: "Ethereum Ropsten", - isMainNet: false, - blockExplorerUrl: "https://ropsten.etherscan.io", - rpcUrl: "https://ropsten.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", - }, - CHAIN_ID_56: { - currencyCode: "BNB", - currencyName: "Binance Coin", - chainId: 56, - networkName: "Binance Smart Chain", - isMainNet: true, - blockExplorerUrl: "https://bscscan.com", - rpcUrl: "https://bsc-dataseed.binance.org/", - }, - CHAIN_ID_97: { - currencyCode: "BNB", - currencyName: "Binance Coin", - chainId: 97, - networkName: "Binance Smart Chain Testnet", - isMainNet: false, - blockExplorerUrl: "https://testnet.bscscan.com", - rpcUrl: "https://data-seed-prebsc-1-s1.binance.org:8545/", - } +AddOrSwitchBlockChain.defaultProps = { + showAddBlockChain: true, + showSwitchBlockChain: false } -function AddOrSwitchBlockchain(props: AddOrSwitchBlockchainProps) { +function AddOrSwitchBlockChain(props: AddOrSwitchBlockChainProps) { + + const { chainId, showAddBlockChain, showSwitchBlockChain } = props; + + const provider = window.ethereum; + + const [errorMessage, setErrorMessage] = useState(""); + const [successMessage, setSuccessMessage] = useState(""); + const [isPending, setIsPending] = useState(""); - const { chainId } = props; + + if(!provider){ + return ; + } const chainIdKey = `CHAIN_ID_${chainId}`; @@ -69,33 +44,37 @@ function AddOrSwitchBlockchain(props: AddOrSwitchBlockchainProps) { const targetBlockChain: BlockChain = CHAIN_IDS[chainIdKey]; - const changeBlockchain = async () => { - const provider = window.ethereum; - if(!provider){ - console.log("Crypto wallet is not installed, please install!"); - } + const switchBlockChain = async () => { + + setErrorMessage(""); + + setIsPending("Switching blockchain"); try { await provider.request({ method: 'wallet_switchEthereumChain', // Convert numerical chain ID to hexadecimal string params: [{ chainId: chainIdHex}], }); - console.log("You have succefully switched to Binance Test network") - } catch (switchError: any) { - // This error code indicates that the chain has not been added to MetaMask. - if (switchError.code === 4902) { - console.log("This network is not available in your metamask, please add it"); - addBlockchain(); + setSuccessMessage(`Switched to ${targetBlockChain.networkName}`); + } catch (error: any) { + if (error.code === 4902) { + console.log({error}) + // This error code indicates that the chain has not been added to MetaMask. + setErrorMessage("This network is not available in your crypto wallet, please add it"); + addBlockChain(); + } else { + setErrorMessage(error.message); } - console.log("Failed to switch to the network") - } - } - + } + setIsPending(""); + } - const addBlockchain = async () => { + const addBlockChain = async () => { const provider = window.ethereum; + setErrorMessage(""); + setIsPending("Adding blockchain"); try { await provider.request({ method: 'wallet_addEthereumChain', @@ -108,18 +87,50 @@ function AddOrSwitchBlockchain(props: AddOrSwitchBlockchainProps) { decimals: 18 } }]} ); - } catch (addError) { - console.log(addError); + setSuccessMessage(`Added ${targetBlockChain.networkName}`); + } + catch (error: any) { + console.log({error}); + setErrorMessage(error.message); + } + + setIsPending(""); } + + + const AddOrSwitchButton = ({isAddMode, onClick}: {isAddMode: boolean, onClick: ()=> {}}) => { + + return ( + + ) } return (
- + + + {showAddBlockChain && + + } + {showSwitchBlockChain && + + } + {errorMessage && + + } + {successMessage && + + } +
) } -export default AddOrSwitchBlockchain \ No newline at end of file +export default AddOrSwitchBlockChain \ No newline at end of file diff --git a/src/models/Currency/assets/binanceLogo.png b/src/models/Currency/assets/binanceLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..0c8175afcb06080112b7ff1533f6a8fa71850aa7 GIT binary patch literal 19656 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 T+QHr?i@jL*wjCm{eEITkdb5}Q literal 0 HcmV?d00001 diff --git a/src/models/Currency/assets/ethereumLogo.png b/src/models/Currency/assets/ethereumLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..56d8991669d5838543dbdd8449015ef2803b6c86 GIT binary patch literal 50192 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 NO${CO5>=}w{|7~tNIC!j literal 0 HcmV?d00001 diff --git a/src/models/Currency/index.ts b/src/models/Currency/index.ts index 4aff41b..79663d6 100644 --- a/src/models/Currency/index.ts +++ b/src/models/Currency/index.ts @@ -1,3 +1,5 @@ +import ethereumLogo from './assets/ethereumLogo.png'; +import binanceLogo from './assets/binanceLogo.png'; export class Currency { code: string = ""; @@ -67,4 +69,61 @@ export const MAXIMUM_DECIMAL_PLACES = 8; * Sometimes showing 8 decimal places is too many numbers in the UI. * Show only fewer decimal places to keep the UI cleaner. */ -export const MEDIUM_LENGTH_DECIMAL_PLACES = 4; \ No newline at end of file +export const MEDIUM_LENGTH_DECIMAL_PLACES = 4; + +export interface BlockChain { + currencyCode: string, + currencyName: string, + chainId: number, + networkName: string, + isMainNet: boolean, + blockExplorerUrl: string; + rpcUrl: string; + logo: string; +} + +/** + * Use a key CHAIN_ID_{ID} instead of just the numerical ID so that CHAIN_IDS doesn't get converted to numerical index + */ + export const CHAIN_IDS: { [id: string] : BlockChain; } = { + CHAIN_ID_1: { + currencyCode: "ETH", + currencyName: "Ethereum", + chainId: 1, + networkName: "Ethereum Mainnet", + isMainNet: true, + blockExplorerUrl: "https://etherscan.io", + rpcUrl: "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", + logo: ethereumLogo, + }, + CHAIN_ID_3: { + currencyCode: "ETH", + currencyName: "Ethereum", + chainId: 3, + networkName: "Ethereum Ropsten", + isMainNet: false, + blockExplorerUrl: "https://ropsten.etherscan.io", + rpcUrl: "https://ropsten.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", + logo: ethereumLogo, + }, + CHAIN_ID_56: { + currencyCode: "BNB", + currencyName: "Binance Coin", + chainId: 56, + networkName: "Binance Smart Chain", + isMainNet: true, + blockExplorerUrl: "https://bscscan.com", + rpcUrl: "https://bsc-dataseed.binance.org/", + logo: binanceLogo, + }, + CHAIN_ID_97: { + currencyCode: "BNB", + currencyName: "Binance Coin", + chainId: 97, + networkName: "Binance Smart Chain Testnet", + isMainNet: false, + blockExplorerUrl: "https://testnet.bscscan.com", + rpcUrl: "https://data-seed-prebsc-1-s1.binance.org:8545/", + logo: binanceLogo, + } +} \ No newline at end of file From 02c68c6400607296aeae0cf91b3331400d690d3c Mon Sep 17 00:00:00 2001 From: ademidun Date: Thu, 24 Feb 2022 08:24:43 -0500 Subject: [PATCH 6/9] show option to switch blockchain if paying on the wrong network --- .../AddOrSwitchBlockchain.tsx | 10 ++- .../CryptoPaymentForm/CryptoPaymentForm.tsx | 64 +++++++++++-------- src/models/Currency/index.ts | 9 +++ 3 files changed, 55 insertions(+), 28 deletions(-) diff --git a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx index 7be8474..3c70874 100644 --- a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx +++ b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx @@ -13,6 +13,8 @@ export interface AddOrSwitchBlockChainProps { chainId: number; showAddBlockChain: boolean; showSwitchBlockChain: boolean; + onAddComplete?: (newBlockchain: BlockChain) => void; + onSwitchComplete?: (newBlockchain: BlockChain) => void; } AddOrSwitchBlockChain.defaultProps = { @@ -22,7 +24,7 @@ AddOrSwitchBlockChain.defaultProps = { function AddOrSwitchBlockChain(props: AddOrSwitchBlockChainProps) { - const { chainId, showAddBlockChain, showSwitchBlockChain } = props; + const { chainId, showAddBlockChain, showSwitchBlockChain, onAddComplete, onSwitchComplete } = props; const provider = window.ethereum; @@ -56,6 +58,9 @@ function AddOrSwitchBlockChain(props: AddOrSwitchBlockChainProps) { params: [{ chainId: chainIdHex}], }); setSuccessMessage(`Switched to ${targetBlockChain.networkName}`); + if (onSwitchComplete) { + onSwitchComplete(targetBlockChain) + } } catch (error: any) { if (error.code === 4902) { console.log({error}) @@ -88,6 +93,9 @@ function AddOrSwitchBlockChain(props: AddOrSwitchBlockChainProps) { } }]} ); setSuccessMessage(`Added ${targetBlockChain.networkName}`); + if (onAddComplete) { + onAddComplete(targetBlockChain) + } } catch (error: any) { console.log({error}); diff --git a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx index f207d8c..154e393 100644 --- a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx +++ b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx @@ -3,6 +3,8 @@ import { Alert, Button } from 'antd'; import { ethers } from 'ethers'; import { Network } from '@ethersproject/networks'; import "./CryptoPaymentForm.css"; +import { CHAIN_IDS, findBlockChain } from '@atila/web-components-library.models.currency'; +import AddOrSwitchBlockChain from '@atila/web-components-library.ui.add-or-switch-blockchain'; // https://stackoverflow.com/questions/12709074/how-do-you-explicitly-set-a-new-property-on-window-in-typescript declare global { @@ -93,10 +95,13 @@ function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) { const [transaction, setTransaction] = useState(null); const [amount, setAmount] = useState(props.amount); const [destinationAddress, setDestinationAddress] = useState(props.destinationAddress); - const [isTestNet, setIsTestNet] = useState(props.isTestNet) + const [isTestNet, setIsTestNet] = useState(props.isTestNet); + const [isCorrectNetwork, setIsCorrectNetwork] = useState(true); + const targetBlockChain = findBlockChain(currency, !isTestNet); + let blockExplorerHost = "etherscan.io"; if (currency === CHAIN_NAMES.BINANCE.CURRENCY_CODE) { @@ -109,10 +114,10 @@ function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) { networkName = "mainnet" } - const transactionUrl = transaction?.hash ? `https://${blockExplorerHost}/tx/${transaction.hash}` : ""; + const transactionUrl = transaction?.hash ? `${targetBlockChain?.blockExplorerUrl}/tx/${transaction.hash}` : ""; // Note: This destination address does not distinguish between if the mainnet or Test (e.g. Ropsten) network is being used - let destinationAddressUrl = `https://${blockExplorerHost}/address/${destinationAddress}`; + let destinationAddressUrl = `${targetBlockChain?.blockExplorerUrl}/address/${destinationAddress}`; /** * Check that the selected network in the browser matches the network in the user's settings. @@ -121,29 +126,14 @@ function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) { * @returns */ const checkCorrectNetwork = (network: Network) => { - let expectedChainId; - - if (currency === CHAIN_NAMES.ETHEREUM.CURRENCY_CODE) { - if (isTestNet) { - expectedChainId = CHAIN_NAMES.ETHEREUM.ROPSTEN.ID; - } else { - expectedChainId = CHAIN_NAMES.ETHEREUM.MAIN_NET.ID; - - } - } else if (currency === CHAIN_NAMES.BINANCE.CURRENCY_CODE) { - if (isTestNet) { - expectedChainId = CHAIN_NAMES.BINANCE.TEST_NET.ID; - } else { - expectedChainId = CHAIN_NAMES.BINANCE.MAIN_NET.ID; - } - } + const actualBlockChain = CHAIN_IDS[`CHAIN_ID_${network.chainId}`]; - if (network.chainId !== expectedChainId) { - const actualNetworkName = [CHAIN_NAMES.BINANCE.TEST_NET.ID, CHAIN_NAMES.ETHEREUM.ROPSTEN.ID].includes(network.chainId) ? "testnet" : "mainnet"; - const actualCurrency = [CHAIN_NAMES.BINANCE.MAIN_NET.ID, CHAIN_NAMES.BINANCE.TEST_NET.ID].includes(network.chainId)? CHAIN_NAMES.BINANCE.CURRENCY_CODE : CHAIN_NAMES.ETHEREUM.CURRENCY_CODE; - return {isCorrectNetwork: false, message: `Change your network in Metamask. Expected "${isTestNet ? "testnet" : "mainnet"}" network (${networkName}) for currency: ${currency}. - Instead received "${actualNetworkName}" network (${network.name}) for currency: ${actualCurrency}.`} + if (actualBlockChain.chainId !== targetBlockChain?.chainId) { + setIsCorrectNetwork(false); + return { isCorrectNetwork: false, + message: `Change your network in your crypto wallet. Expected ${targetBlockChain?.networkName} but received ${actualBlockChain.networkName}.`} } + setIsCorrectNetwork(true); return { isCorrectNetwork: true, message: "" } } @@ -243,7 +233,7 @@ function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) {
) diff --git a/src/models/Currency/index.ts b/src/models/Currency/index.ts index 79663d6..f721a83 100644 --- a/src/models/Currency/index.ts +++ b/src/models/Currency/index.ts @@ -126,4 +126,13 @@ export interface BlockChain { rpcUrl: "https://data-seed-prebsc-1-s1.binance.org:8545/", logo: binanceLogo, } +} + +export const findBlockChain = (currency: string, isMainNet: boolean) => { + + for (const blockChain of Object.values(CHAIN_IDS)) { + if (currency === blockChain.currencyCode && isMainNet === blockChain.isMainNet) { + return blockChain + } + } } \ No newline at end of file From 3a7d78367b02d16d79937639ccb0ec18bcac995a Mon Sep 17 00:00:00 2001 From: ademidun Date: Thu, 24 Feb 2022 08:37:35 -0500 Subject: [PATCH 7/9] deprecate use of CHAIN_NAMES --- .bitmap | 10 ++--- .../CryptoPaymentForm.compositions.tsx | 11 ++--- .../CryptoPaymentForm/CryptoPaymentForm.tsx | 40 ------------------- 3 files changed, 11 insertions(+), 50 deletions(-) diff --git a/.bitmap b/.bitmap index c6f6ac6..40e7601 100644 --- a/.bitmap +++ b/.bitmap @@ -11,31 +11,31 @@ { "models/currency": { "scope": "atila.web-components-library", - "version": "0.0.2", + "version": "0.0.3", "mainFile": "index.ts", "rootDir": "src/models/Currency" }, "ui/add-or-switch-blockchain": { "scope": "", - "version": "0.0.1", + "version": "0.0.2", "mainFile": "AddOrSwitchBlockchain.tsx", "rootDir": "src/components/AddOrSwitchBlockchain" }, "ui/crypto-payment-form": { "scope": "atila.web-components-library", - "version": "0.0.7", + "version": "0.0.8", "mainFile": "CryptoPaymentForm.tsx", "rootDir": "src/components/CryptoPaymentForm" }, "ui/currency-display": { "scope": "atila.web-components-library", - "version": "0.0.6", + "version": "0.0.7", "mainFile": "CurrencyDisplay.tsx", "rootDir": "src/components/CurrencyDisplay" }, "utils": { "scope": "atila.web-components-library", - "version": "0.0.4", + "version": "0.0.5", "mainFile": "index.ts", "rootDir": "src/services/utils" }, diff --git a/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx b/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx index 4f44d65..a21fdf3 100644 --- a/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx +++ b/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx @@ -1,8 +1,9 @@ import React, { useState } from 'react'; -import CryptoPaymentForm, { CHAIN_NAMES, CRYPTO_IN_USD, MAXIMUM_DECIMAL_PLACES } from './CryptoPaymentForm'; +import CryptoPaymentForm, { CRYPTO_IN_USD, MAXIMUM_DECIMAL_PLACES } from './CryptoPaymentForm'; import 'bootstrap/dist/css/bootstrap.css'; import 'antd/dist/antd.css'; import { Radio, Select } from 'antd'; +import { CHAIN_IDS } from '@atila/web-components-library.models.currency'; const { Option } = Select; @@ -18,12 +19,12 @@ const paymentAmountOptions = [ const currencyOptions = [ { - name: CHAIN_NAMES.ETHEREUM.NAME, - value: CHAIN_NAMES.ETHEREUM.CURRENCY_CODE, + name: CHAIN_IDS.CHAIN_ID_1.currencyName, + value: CHAIN_IDS.CHAIN_ID_1.currencyCode, }, { - name: CHAIN_NAMES.BINANCE.NAME, - value: CHAIN_NAMES.BINANCE.CURRENCY_CODE, + name: CHAIN_IDS.CHAIN_ID_56.currencyName, + value: CHAIN_IDS.CHAIN_ID_56.currencyName, } ] diff --git a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx index 154e393..8a4d438 100644 --- a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx +++ b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx @@ -13,31 +13,6 @@ declare global { } } -export const CHAIN_NAMES = { - BINANCE: { - NAME: "Binance", - CURRENCY_CODE: "BNB", - MAIN_NET: { - ID: 56 - }, - TEST_NET: { - NAME: "testnet", - ID: 97, - } - }, - ETHEREUM: { - NAME: "Ethereum", - CURRENCY_CODE: "ETH", - MAIN_NET: { - ID: 1 - }, - ROPSTEN: { - NAME: "ropsten", - ID: 3 - } - } -} - export const MAXIMUM_DECIMAL_PLACES = 8; export const CRYPTO_IN_USD: any = { @@ -57,7 +32,6 @@ interface CryptoPaymentFormPropTypes { amount: number; destinationAddress: string; isTestNet: boolean; - networkName: string; title: string; currency: string; /** Controls if the amount can be edited. */ @@ -72,7 +46,6 @@ interface CryptoPaymentFormPropTypes { CryptoPaymentForm.defaultProps = { destinationAddress: "0x38103603fEB199fba32be9b3A464877f28e659A7", //atilatech.eth isTestNet: true, - networkName: "", title: "", currency: "ETH", isEditableAmount: false, @@ -89,7 +62,6 @@ CryptoPaymentForm.defaultProps = { function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) { const { onError, onSuccess, isEditableAmount, isEditableDestinationAddress, className, style, title, currency } = props; - let { networkName } = props; const [error, setError] = useState(""); const [transaction, setTransaction] = useState(null); @@ -102,18 +74,6 @@ function CryptoPaymentForm(props: CryptoPaymentFormPropTypes) { const targetBlockChain = findBlockChain(currency, !isTestNet); - let blockExplorerHost = "etherscan.io"; - - if (currency === CHAIN_NAMES.BINANCE.CURRENCY_CODE) { - blockExplorerHost = "bscscan.com" - } - if (isTestNet) { - networkName = currency === CHAIN_NAMES.BINANCE.CURRENCY_CODE ? CHAIN_NAMES.BINANCE.TEST_NET.NAME : CHAIN_NAMES.ETHEREUM.ROPSTEN.NAME; - blockExplorerHost = `${networkName}.${blockExplorerHost}` - } else { - networkName = "mainnet" - } - const transactionUrl = transaction?.hash ? `${targetBlockChain?.blockExplorerUrl}/tx/${transaction.hash}` : ""; // Note: This destination address does not distinguish between if the mainnet or Test (e.g. Ropsten) network is being used From e25fcd8304c5605010d1bc54737a1809e521a0d3 Mon Sep 17 00:00:00 2001 From: ademidun Date: Thu, 24 Feb 2022 09:27:54 -0500 Subject: [PATCH 8/9] fixed imports and export for AddOrSwitchBlockchain fixed typ in currency code value --- .bitmap | 6 +++--- README.md | 4 +++- .../AddOrSwitchBlockchain.compositions.tsx | 8 ++++---- .../AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx | 6 ++---- src/components/AddOrSwitchBlockchain/index.ts | 2 ++ .../CryptoPaymentForm/CryptoPaymentForm.compositions.tsx | 2 +- src/components/CryptoPaymentForm/CryptoPaymentForm.tsx | 2 +- 7 files changed, 16 insertions(+), 14 deletions(-) create mode 100644 src/components/AddOrSwitchBlockchain/index.ts diff --git a/.bitmap b/.bitmap index 40e7601..1a13a5d 100644 --- a/.bitmap +++ b/.bitmap @@ -16,14 +16,14 @@ "rootDir": "src/models/Currency" }, "ui/add-or-switch-blockchain": { - "scope": "", - "version": "0.0.2", + "scope": "atila.web-components-library", + "version": "0.0.3", "mainFile": "AddOrSwitchBlockchain.tsx", "rootDir": "src/components/AddOrSwitchBlockchain" }, "ui/crypto-payment-form": { "scope": "atila.web-components-library", - "version": "0.0.8", + "version": "0.0.11", "mainFile": "CryptoPaymentForm.tsx", "rootDir": "src/components/CryptoPaymentForm" }, diff --git a/README.md b/README.md index e685980..4fcc68c 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,9 @@ To test a specific file: `yarn test SomeTestFileToRun`, for example `yarn test - Summary of this tutorial: [Getting Started with Bit](https://harmony-docs.bit.dev/getting-started/creating-components) -- Create a tsx folder and file for the component: `src/components/MyComponent/MyComponent.tsx` +- Create a tsx folder and file for the component: `src/components/MyComponent/MyComponent.tsx` or `src/components/MyComponent/index.tsx` + - If you want to use your component in other components in the project, you might have to create a seperate file called `index.ts` that exports the components created in `MyComponent.tsx` + - For example, see: `src/components/AddOrSwitchBlockchain/index.ts` and `src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx` - Create a compositions file `src/components/MyComponent/MyComponent.compositions.tsx` - Make sure to import stylesheets into the compostions file - Note: We're looking into a way to automatically import the stylesheets in all compositions diff --git a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.compositions.tsx b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.compositions.tsx index 973e985..b50ff93 100644 --- a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.compositions.tsx +++ b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.compositions.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { CHAIN_IDS } from '@atila/web-components-library.models.currency' -import AddOrSwitchBlockchain from './AddOrSwitchBlockchain' +import { AddOrSwitchBlockChain } from '.'; export function SwitchBinanceSmartChainTestNet() { return ( - @@ -12,7 +12,7 @@ export function SwitchBinanceSmartChainTestNet() { } export function AddBinanceSmartChainMainNet() { return ( - @@ -21,6 +21,6 @@ export function AddBinanceSmartChainMainNet() { export function SwitchEthereumTestNet() { return ( - + ) } \ No newline at end of file diff --git a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx index 3c70874..24f72e9 100644 --- a/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx +++ b/src/components/AddOrSwitchBlockchain/AddOrSwitchBlockchain.tsx @@ -22,7 +22,7 @@ AddOrSwitchBlockChain.defaultProps = { showSwitchBlockChain: false } -function AddOrSwitchBlockChain(props: AddOrSwitchBlockChainProps) { +export function AddOrSwitchBlockChain(props: AddOrSwitchBlockChainProps) { const { chainId, showAddBlockChain, showSwitchBlockChain, onAddComplete, onSwitchComplete } = props; @@ -139,6 +139,4 @@ function AddOrSwitchBlockChain(props: AddOrSwitchBlockChainProps) { ) -} - -export default AddOrSwitchBlockChain \ No newline at end of file +} \ No newline at end of file diff --git a/src/components/AddOrSwitchBlockchain/index.ts b/src/components/AddOrSwitchBlockchain/index.ts new file mode 100644 index 0000000..f5c973a --- /dev/null +++ b/src/components/AddOrSwitchBlockchain/index.ts @@ -0,0 +1,2 @@ +export { AddOrSwitchBlockChain } from "./AddOrSwitchBlockchain"; +export type { AddOrSwitchBlockChainProps } from "./AddOrSwitchBlockchain"; diff --git a/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx b/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx index a21fdf3..b0a1e07 100644 --- a/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx +++ b/src/components/CryptoPaymentForm/CryptoPaymentForm.compositions.tsx @@ -24,7 +24,7 @@ const currencyOptions = [ }, { name: CHAIN_IDS.CHAIN_ID_56.currencyName, - value: CHAIN_IDS.CHAIN_ID_56.currencyName, + value: CHAIN_IDS.CHAIN_ID_56.currencyCode, } ] diff --git a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx index 8a4d438..c0fb550 100644 --- a/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx +++ b/src/components/CryptoPaymentForm/CryptoPaymentForm.tsx @@ -4,7 +4,7 @@ import { ethers } from 'ethers'; import { Network } from '@ethersproject/networks'; import "./CryptoPaymentForm.css"; import { CHAIN_IDS, findBlockChain } from '@atila/web-components-library.models.currency'; -import AddOrSwitchBlockChain from '@atila/web-components-library.ui.add-or-switch-blockchain'; +import { AddOrSwitchBlockChain } from '@atila/web-components-library.ui.add-or-switch-blockchain'; // https://stackoverflow.com/questions/12709074/how-do-you-explicitly-set-a-new-property-on-window-in-typescript declare global { From f8afa7e810055c84869db21c4a862f568db6abca Mon Sep 17 00:00:00 2001 From: ademidun Date: Fri, 25 Feb 2022 06:42:41 -0500 Subject: [PATCH 9/9] add instructions for using in other projects --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 4fcc68c..abb4c20 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,13 @@ To run as a Bit server - `bit install` +## Using in Other Projects + +- Configure `@atila` as a scoped repository: `npm config set '@atila:registry' https://node.bit.dev` +- Install component: For example, `npm i @atila/web-components-library.ui.crypto-payment-form` + +![Example of using web-components-library](https://i.imgur.com/cusLOEK.png) + ## Testing `yarn test`