From 8c6d4a454ded427afd343ded3da952aa6d358bf2 Mon Sep 17 00:00:00 2001 From: toniocodo Date: Fri, 1 Sep 2023 19:46:19 +0200 Subject: [PATCH 1/5] feat: replace infura with alchemy --- .env | 1 + apps/oeth/src/clients/wagmi.ts | 6 +++--- apps/oeth/src/env.d.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.env b/.env index 154aa821b..533b9d1dc 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ VITE_WALLET_CONNECT_PROJECT_ID= VITE_INFURA_ID= +VITE_ALCHEMY_ID= diff --git a/apps/oeth/src/clients/wagmi.ts b/apps/oeth/src/clients/wagmi.ts index 5c807f52c..8deaed664 100644 --- a/apps/oeth/src/clients/wagmi.ts +++ b/apps/oeth/src/clients/wagmi.ts @@ -13,16 +13,16 @@ import { } from '@rainbow-me/rainbowkit/wallets'; import { configureChains, createConfig } from 'wagmi'; import { goerli, localhost, mainnet } from 'wagmi/chains'; -import { infuraProvider } from 'wagmi/providers/infura'; +import { alchemyProvider } from 'wagmi/providers/alchemy'; import { publicProvider } from 'wagmi/providers/public'; const VITE_WALLET_CONNECT_PROJECT_ID = import.meta.env .VITE_WALLET_CONNECT_PROJECT_ID; -const VITE_INFURA_ID = import.meta.env.VITE_INFURA_ID; +const VITE_ALCHEMY_ID = import.meta.env.VITE_ALCHEMY_ID; export const { chains, publicClient, webSocketPublicClient } = configureChains( [mainnet, goerli, localhost], - [infuraProvider({ apiKey: VITE_INFURA_ID }), publicProvider()], + [alchemyProvider({ apiKey: VITE_ALCHEMY_ID }), publicProvider()], ); const connectors = connectorsForWallets([ diff --git a/apps/oeth/src/env.d.ts b/apps/oeth/src/env.d.ts index 147044ddc..6d4a619cf 100644 --- a/apps/oeth/src/env.d.ts +++ b/apps/oeth/src/env.d.ts @@ -2,7 +2,7 @@ interface ImportMetaEnv { readonly VITE_WALLET_CONNECT_PROJECT_ID: string; - readonly VITE_INFURA_ID: string; + readonly VITE_ALCHEMY_ID: string; } interface ImportMeta { From e830256d6f006934927524535dd6d9422cb857fa Mon Sep 17 00:00:00 2001 From: toniocodo Date: Fri, 1 Sep 2023 19:47:11 +0200 Subject: [PATCH 2/5] fix: proper api files --- libs/oeth/swap/src/actions/index.ts | 8 ++++---- libs/oeth/swap/src/hooks.ts | 14 +++++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/libs/oeth/swap/src/actions/index.ts b/libs/oeth/swap/src/actions/index.ts index d82441d44..f915c2cab 100644 --- a/libs/oeth/swap/src/actions/index.ts +++ b/libs/oeth/swap/src/actions/index.ts @@ -5,10 +5,10 @@ import redeemMix from './redeemMix'; import type { SwapAction, SwapApi } from '../types'; export const swapActions: Record = { - 'swap-curve': { ...defaultApi, ...mintVault }, - 'swap-zapper': { ...defaultApi, ...redeemMix }, - 'mint-vault': { ...defaultApi }, - 'redeem-mix': { ...defaultApi }, + 'swap-curve': { ...defaultApi }, + 'swap-zapper': { ...defaultApi }, + 'mint-vault': { ...defaultApi, ...mintVault }, + 'redeem-mix': { ...defaultApi, ...redeemMix }, 'wrap-oeth': { ...defaultApi }, 'unwrap-woeth': { ...defaultApi }, }; diff --git a/libs/oeth/swap/src/hooks.ts b/libs/oeth/swap/src/hooks.ts index aecc872c5..4ba6f084f 100644 --- a/libs/oeth/swap/src/hooks.ts +++ b/libs/oeth/swap/src/hooks.ts @@ -4,7 +4,11 @@ import { isNilOrEmpty } from '@origin/shared/utils'; import { produce } from 'immer'; import { useSwapState } from './state'; -import { getAllAvailableTokens, getAvailableTokensForSource } from './utils'; +import { + getAllAvailableTokens, + getAvailableRoutes, + getAvailableTokensForSource, +} from './utils'; import type { Token } from '@origin/shared/contracts'; @@ -79,6 +83,10 @@ export const useHandleTokenChange = () => { state.tokenIn = availableTokensIn[0]; } } + state.swapRoute = getAvailableRoutes( + state.tokenIn, + state.tokenOut, + )[0]; }), ); }, @@ -103,11 +111,11 @@ export const useHandleTokenFlip = () => { }; export const useHandleSwap = () => { - const [{ tokenIn, tokenOut, amountIn, swapRoute }] = useSwapState(); + const [{ swapRoute }] = useSwapState(); return useCallback(async () => { if (isNilOrEmpty(swapRoute)) { return; } - }, [amountIn, swapRoute, tokenIn, tokenOut]); + }, [swapRoute]); }; From 6f6b43790af16e1d1d4d1a0c259032a9e68518e1 Mon Sep 17 00:00:00 2001 From: toniocodo Date: Fri, 1 Sep 2023 19:47:50 +0200 Subject: [PATCH 3/5] feat: add curve sdk, add ethers adapters --- libs/shared/providers/src/curve/index.ts | 1 + libs/shared/providers/src/curve/state.ts | 43 +++++ libs/shared/providers/src/index.ts | 1 + libs/shared/providers/src/wagmi/index.ts | 1 + libs/shared/providers/src/wagmi/utils.ts | 60 +++++++ package.json | 2 + pnpm-lock.yaml | 207 ++++++++++++++++++++++- 7 files changed, 313 insertions(+), 2 deletions(-) create mode 100644 libs/shared/providers/src/curve/index.ts create mode 100644 libs/shared/providers/src/curve/state.ts create mode 100644 libs/shared/providers/src/wagmi/utils.ts diff --git a/libs/shared/providers/src/curve/index.ts b/libs/shared/providers/src/curve/index.ts new file mode 100644 index 000000000..da8854349 --- /dev/null +++ b/libs/shared/providers/src/curve/index.ts @@ -0,0 +1 @@ +export * from './state'; diff --git a/libs/shared/providers/src/curve/state.ts b/libs/shared/providers/src/curve/state.ts new file mode 100644 index 000000000..8bb237f7c --- /dev/null +++ b/libs/shared/providers/src/curve/state.ts @@ -0,0 +1,43 @@ +import { useEffect, useState } from 'react'; + +import curve from '@curvefi/api'; +import { createContainer } from 'react-tracked'; +import { useAccount, useNetwork } from 'wagmi'; + +import { getEthersSigner } from '../wagmi'; + +export const { Provider: CurveProvider, useTrackedState: useCurve } = + createContainer(() => { + const [state, setState] = useState(null); + const { isConnected } = useAccount(); + const { chain } = useNetwork(); + + useEffect(() => { + const initPublic = async () => { + await curve.init('JsonRpc', {}, {}); + setState(curve); + }; + + const initWallet = async () => { + const ethersSigner = await getEthersSigner({ + chainId: chain.id, + }); + + await curve.init( + 'Web3', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + { externalProvider: ethersSigner.provider as any }, + {}, + ); + setState(curve); + }; + + if (isConnected) { + initWallet(); + } else { + initPublic(); + } + }, [chain?.id, isConnected]); + + return [state, setState]; + }); diff --git a/libs/shared/providers/src/index.ts b/libs/shared/providers/src/index.ts index 14734c906..7d8399512 100644 --- a/libs/shared/providers/src/index.ts +++ b/libs/shared/providers/src/index.ts @@ -1,2 +1,3 @@ +export * from './curve'; export * from './prices'; export * from './wagmi'; diff --git a/libs/shared/providers/src/wagmi/index.ts b/libs/shared/providers/src/wagmi/index.ts index 41af50d8f..89568093e 100644 --- a/libs/shared/providers/src/wagmi/index.ts +++ b/libs/shared/providers/src/wagmi/index.ts @@ -1,3 +1,4 @@ export * from './components/AddressLabel'; export * from './components/ConnectedButton'; export * from './components/OpenAccountModalButton'; +export * from './utils'; diff --git a/libs/shared/providers/src/wagmi/utils.ts b/libs/shared/providers/src/wagmi/utils.ts new file mode 100644 index 000000000..09c43af37 --- /dev/null +++ b/libs/shared/providers/src/wagmi/utils.ts @@ -0,0 +1,60 @@ +// Adapted from https://wagmi.sh/core/ethers-adapters +import { getPublicClient, getWalletClient } from '@wagmi/core'; +import { + BrowserProvider, + FallbackProvider, + JsonRpcProvider, + JsonRpcSigner, +} from 'ethers'; + +import type { PublicClient } from '@wagmi/core'; +import type { HttpTransport } from 'viem'; +import type { WalletClient } from 'wagmi'; + +export function publicClientToProvider(publicClient: PublicClient) { + const { chain, transport } = publicClient; + const network = { + chainId: chain.id, + name: chain.name, + ensAddress: chain.contracts?.ensRegistry?.address, + }; + if (transport.type === 'fallback') { + const providers = (transport.transports as ReturnType[]).map( + ({ value }) => new JsonRpcProvider(value?.url, network), + ); + if (providers.length === 1) return providers[0]; + + return new FallbackProvider(providers); + } + + return new JsonRpcProvider(transport.url, network); +} + +/** Action to convert a viem Public Client to an ethers.js Provider. */ +export function getEthersProvider({ chainId }: { chainId?: number } = {}) { + const publicClient = getPublicClient({ chainId }); + + return publicClientToProvider(publicClient); +} + +export function walletClientToSigner(walletClient: WalletClient) { + const { account, chain, transport } = walletClient; + const network = { + chainId: chain.id, + name: chain.name, + ensAddress: chain.contracts?.ensRegistry?.address, + }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const provider = new BrowserProvider(transport as any, network); + const signer = new JsonRpcSigner(provider, account.address); + + return signer; +} + +/** Action to convert a viem Wallet Client to an ethers.js Signer. */ +export async function getEthersSigner({ chainId }: { chainId?: number } = {}) { + const walletClient = await getWalletClient({ chainId }); + if (!walletClient) return undefined; + + return walletClientToSigner(walletClient); +} diff --git a/package.json b/package.json index 73144eae0..193f7f757 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "private": true, "dependencies": { + "@curvefi/api": "^2.46.1", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@mui/material": "^5.14.3", @@ -19,6 +20,7 @@ "@tanstack/react-table": "^8.9.3", "@wagmi/core": "^1.3.9", "axios": "^1.4.0", + "ethers": "^6.7.1", "immer": "^10.0.2", "ramda": "^0.29.0", "react": "18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 604ef595a..57458cc11 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@curvefi/api': + specifier: ^2.46.1 + version: 2.46.1 '@emotion/react': specifier: ^11.11.1 version: 11.11.1(@types/react@18.2.18)(react@18.2.0) @@ -32,6 +35,9 @@ dependencies: axios: specifier: ^1.4.0 version: 1.4.0 + ethers: + specifier: ^6.7.1 + version: 6.7.1 immer: specifier: ^10.0.2 version: 10.0.2 @@ -245,6 +251,10 @@ packages: resolution: {integrity: sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==} dev: false + /@adraffy/ens-normalize@1.9.2: + resolution: {integrity: sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==} + dev: false + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -1832,6 +1842,20 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@curvefi/api@2.46.1: + resolution: {integrity: sha512-HStPkxD3soM9amxYvaBWxj2R1TsOQ6y9YWz6q3hTATn1HYTZQTQmw/+2FAkZOrkikPth+n5yAUmimiQDDf6Suw==} + dependencies: + axios: 0.21.4 + bignumber.js: 9.1.2 + ethcall: 6.0.2(ethers@6.7.1) + ethers: 6.7.1 + memoizee: 0.4.15 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} @@ -2827,6 +2851,10 @@ packages: '@noble/hashes': 1.3.2 dev: false + /@noble/hashes@1.1.2: + resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} + dev: false + /@noble/hashes@1.3.0: resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} dev: false @@ -2841,6 +2869,10 @@ packages: engines: {node: '>= 16'} dev: false + /@noble/secp256k1@1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4167,14 +4199,14 @@ packages: resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==} dependencies: '@noble/curves': 1.0.0 - '@noble/hashes': 1.3.0 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.1 dev: false /@scure/bip39@1.2.0: resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} dependencies: - '@noble/hashes': 1.3.0 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.1 dev: false @@ -5949,6 +5981,14 @@ packages: /@types/node@18.14.2: resolution: {integrity: sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==} + /@types/node@18.15.13: + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + dev: false + + /@types/node@20.5.7: + resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} + dev: false + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true @@ -7141,6 +7181,14 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true + /abi-coder@5.0.0(ethers@6.7.1): + resolution: {integrity: sha512-Kpyv/AhAaIaVJiJ6S/xqoTsiJrfSMc3QsBCiRDqic3o1CZNKGR3CIeT1K/1VZ7Wk5uSwsOAxQcke1TVUEz+usg==} + peerDependencies: + ethers: ^6.0.0 + dependencies: + ethers: 6.7.1 + dev: false + /abitype@0.8.7(typescript@5.2.2): resolution: {integrity: sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w==} peerDependencies: @@ -7230,6 +7278,10 @@ packages: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} dev: false + /aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + dev: false + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -7498,6 +7550,14 @@ packages: engines: {node: '>=4'} dev: true + /axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: false + /axios@1.4.0: resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} dependencies: @@ -7668,6 +7728,10 @@ packages: bindings: 1.5.0 dev: false + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: false + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -8233,6 +8297,13 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: false + /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true @@ -8773,6 +8844,24 @@ packages: is-symbol: 1.0.4 dev: true + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: false + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: false + /es6-object-assign@1.1.0: resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} dev: true @@ -8787,6 +8876,22 @@ packages: es6-promise: 4.2.8 dev: false + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: false + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: false + /esbuild-plugin-alias@0.2.1: resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} dev: true @@ -9260,6 +9365,39 @@ packages: fast-safe-stringify: 2.1.1 dev: false + /ethcall@6.0.2(ethers@6.7.1): + resolution: {integrity: sha512-FyaKLlxtaVt+kRmhzDG3YfW4VxqasxZE2CDSfylMVp8kCxsBikzFE1BO90yAMGdjdwaX0kHlvjWSxKRpiEcI4w==} + peerDependencies: + ethers: ^6.0.0 + dependencies: + '@types/node': 20.5.7 + abi-coder: 5.0.0(ethers@6.7.1) + ethers: 6.7.1 + dev: false + + /ethers@6.7.1: + resolution: {integrity: sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.9.2 + '@noble/hashes': 1.1.2 + '@noble/secp256k1': 1.7.1 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: false + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -9348,6 +9486,12 @@ packages: - supports-color dev: true + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: false + /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: true @@ -10241,6 +10385,10 @@ packages: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: false + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -10906,6 +11054,12 @@ packages: dependencies: yallist: 4.0.0 + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + dev: false + /lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -10991,6 +11145,19 @@ packages: engines: {node: '>= 0.6'} dev: true + /memoizee@0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.7 + dev: false + /memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} dependencies: @@ -11166,6 +11333,10 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false + /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: @@ -13056,6 +13227,13 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: false + /tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: true @@ -13222,6 +13400,10 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: true @@ -13279,6 +13461,14 @@ packages: mime-types: 2.1.35 dev: true + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: false + /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -14157,6 +14347,19 @@ packages: bufferutil: 4.0.7 utf-8-validate: 5.0.10 + /ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} From 179d88e900cdc610c48837baa6bb31a3dce3cdee Mon Sep 17 00:00:00 2001 From: toniocodo Date: Fri, 1 Sep 2023 20:15:07 +0200 Subject: [PATCH 4/5] fix: curve setup with alchemy, update env access --- .env | 1 - apps/oeth/src/clients/wagmi.ts | 33 ++++++++++++++++-------- apps/oeth/src/main.tsx | 2 ++ libs/shared/providers/src/curve/state.ts | 32 +++++++++++++++++------ 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/.env b/.env index 533b9d1dc..0a04ca94e 100644 --- a/.env +++ b/.env @@ -1,3 +1,2 @@ VITE_WALLET_CONNECT_PROJECT_ID= -VITE_INFURA_ID= VITE_ALCHEMY_ID= diff --git a/apps/oeth/src/clients/wagmi.ts b/apps/oeth/src/clients/wagmi.ts index 8deaed664..697d76b02 100644 --- a/apps/oeth/src/clients/wagmi.ts +++ b/apps/oeth/src/clients/wagmi.ts @@ -16,13 +16,12 @@ import { goerli, localhost, mainnet } from 'wagmi/chains'; import { alchemyProvider } from 'wagmi/providers/alchemy'; import { publicProvider } from 'wagmi/providers/public'; -const VITE_WALLET_CONNECT_PROJECT_ID = import.meta.env - .VITE_WALLET_CONNECT_PROJECT_ID; -const VITE_ALCHEMY_ID = import.meta.env.VITE_ALCHEMY_ID; - export const { chains, publicClient, webSocketPublicClient } = configureChains( [mainnet, goerli, localhost], - [alchemyProvider({ apiKey: VITE_ALCHEMY_ID }), publicProvider()], + [ + alchemyProvider({ apiKey: import.meta.env.VITE_ALCHEMY_ID }), + publicProvider(), + ], ); const connectors = connectorsForWallets([ @@ -32,12 +31,15 @@ const connectors = connectorsForWallets([ metaMaskWallet({ chains, shimDisconnect: true, - projectId: VITE_WALLET_CONNECT_PROJECT_ID, + projectId: import.meta.env.VITE_WALLET_CONNECT_PROJECT_ID, + }), + ledgerWallet({ + chains, + projectId: import.meta.env.VITE_WALLET_CONNECT_PROJECT_ID, }), - ledgerWallet({ chains, projectId: VITE_WALLET_CONNECT_PROJECT_ID }), walletConnectWallet({ chains, - projectId: VITE_WALLET_CONNECT_PROJECT_ID, + projectId: import.meta.env.VITE_WALLET_CONNECT_PROJECT_ID, }), coinbaseWallet({ appName: 'mStable', chains }), ], @@ -47,10 +49,19 @@ const connectors = connectorsForWallets([ wallets: [ injectedWallet({ chains, shimDisconnect: true }), safeWallet({ chains }), - rainbowWallet({ chains, projectId: VITE_WALLET_CONNECT_PROJECT_ID }), + rainbowWallet({ + chains, + projectId: import.meta.env.VITE_WALLET_CONNECT_PROJECT_ID, + }), braveWallet({ chains, shimDisconnect: true }), - argentWallet({ chains, projectId: VITE_WALLET_CONNECT_PROJECT_ID }), - imTokenWallet({ chains, projectId: VITE_WALLET_CONNECT_PROJECT_ID }), + argentWallet({ + chains, + projectId: import.meta.env.VITE_WALLET_CONNECT_PROJECT_ID, + }), + imTokenWallet({ + chains, + projectId: import.meta.env.VITE_WALLET_CONNECT_PROJECT_ID, + }), ], }, ]); diff --git a/apps/oeth/src/main.tsx b/apps/oeth/src/main.tsx index 39e46ad93..399cb097a 100644 --- a/apps/oeth/src/main.tsx +++ b/apps/oeth/src/main.tsx @@ -8,6 +8,7 @@ import { CssBaseline, Experimental_CssVarsProvider as CssVarsProvider, } from '@mui/material'; +import { CurveProvider } from '@origin/shared/providers'; import { theme } from '@origin/shared/theme'; import { composeContexts } from '@origin/shared/utils'; import { darkTheme, RainbowKitProvider } from '@rainbow-me/rainbowkit'; @@ -33,6 +34,7 @@ root.render( [CssVarsProvider, { theme: theme, defaultMode: 'dark' }], [WagmiConfig, { config: wagmiConfig }], [RainbowKitProvider, { chains: chains, theme: darkTheme() }], + [CurveProvider, { alchemyApiKey: import.meta.env.VITE_ALCHEMY_ID }], ], <> diff --git a/libs/shared/providers/src/curve/state.ts b/libs/shared/providers/src/curve/state.ts index 8bb237f7c..9691ddea2 100644 --- a/libs/shared/providers/src/curve/state.ts +++ b/libs/shared/providers/src/curve/state.ts @@ -2,19 +2,32 @@ import { useEffect, useState } from 'react'; import curve from '@curvefi/api'; import { createContainer } from 'react-tracked'; -import { useAccount, useNetwork } from 'wagmi'; +import { mainnet, useAccount, useNetwork } from 'wagmi'; -import { getEthersSigner } from '../wagmi'; +import { getEthersProvider, getEthersSigner } from '../wagmi'; + +export type CurveProviderProps = { alchemyApiKey: string }; export const { Provider: CurveProvider, useTrackedState: useCurve } = - createContainer(() => { + createContainer(({ alchemyApiKey }: CurveProviderProps) => { const [state, setState] = useState(null); const { isConnected } = useAccount(); const { chain } = useNetwork(); useEffect(() => { const initPublic = async () => { - await curve.init('JsonRpc', {}, {}); + const ethersProvider = getEthersProvider({ + chainId: chain?.id ?? mainnet.id, + }); + await curve.init( + 'Alchemy', + { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + externalProvider: ethersProvider as any, + apiKey: alchemyApiKey, + }, + {}, + ); setState(curve); }; @@ -24,9 +37,12 @@ export const { Provider: CurveProvider, useTrackedState: useCurve } = }); await curve.init( - 'Web3', - // eslint-disable-next-line @typescript-eslint/no-explicit-any - { externalProvider: ethersSigner.provider as any }, + 'Alchemy', + { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + externalProvider: ethersSigner as any, + apiKey: alchemyApiKey, + }, {}, ); setState(curve); @@ -37,7 +53,7 @@ export const { Provider: CurveProvider, useTrackedState: useCurve } = } else { initPublic(); } - }, [chain?.id, isConnected]); + }, [alchemyApiKey, chain?.id, isConnected]); return [state, setState]; }); From 94bf47850d17412915027e79a6a693d881e1b7a8 Mon Sep 17 00:00:00 2001 From: toniocodo Date: Fri, 1 Sep 2023 20:21:31 +0200 Subject: [PATCH 5/5] feat: add chain id to curve sdk --- libs/shared/providers/src/curve/state.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/shared/providers/src/curve/state.ts b/libs/shared/providers/src/curve/state.ts index 9691ddea2..4d1b31cc9 100644 --- a/libs/shared/providers/src/curve/state.ts +++ b/libs/shared/providers/src/curve/state.ts @@ -26,7 +26,7 @@ export const { Provider: CurveProvider, useTrackedState: useCurve } = externalProvider: ethersProvider as any, apiKey: alchemyApiKey, }, - {}, + { chainId: chain?.id ?? mainnet.id }, ); setState(curve); }; @@ -43,7 +43,9 @@ export const { Provider: CurveProvider, useTrackedState: useCurve } = externalProvider: ethersSigner as any, apiKey: alchemyApiKey, }, - {}, + { + chainId: chain.id, + }, ); setState(curve); };