diff --git a/.DS_Store b/.DS_Store index 2a41f05..e4b1ad8 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/wallets/.DS_Store b/wallets/.DS_Store index 99a39a8..2e17a2f 100644 Binary files a/wallets/.DS_Store and b/wallets/.DS_Store differ diff --git a/wallets/react-wallet-v2/next.config.js b/wallets/react-wallet-v2/next.config.js index da1bb77..58a97fa 100644 --- a/wallets/react-wallet-v2/next.config.js +++ b/wallets/react-wallet-v2/next.config.js @@ -1,3 +1,3 @@ module.exports = { - reactStrictMode: true, -}; + reactStrictMode: true +} diff --git a/wallets/react-wallet-v2/package.json b/wallets/react-wallet-v2/package.json index 63e28e5..6a367ee 100644 --- a/wallets/react-wallet-v2/package.json +++ b/wallets/react-wallet-v2/package.json @@ -12,18 +12,22 @@ "@walletconnect/utils": "2.0.0-beta.22", "@json-rpc-tools/utils": "1.7.6", "@nextui-org/react": "1.0.2-beta.4", + "bip39": "3.0.4", + "bip32": "3.0.1", + "bech32": "2.0.0", + "tiny-secp256k1": "1.1.6", "next": "12.1.0", "react": "17.0.2", "react-dom": "17.0.2", "react-qr-reader-es6": "2.2.1-2", - "framer-motion": "6.2.7", + "framer-motion": "6.2.8", "ethers": "5.5.4", "valtio": "1.3.0", "react-code-blocks": "0.0.9-0" }, "devDependencies": { "@walletconnect/types": "2.0.0-beta.22", - "@types/node": "17.0.19", + "@types/node": "17.0.21", "@types/react": "17.0.39", "eslint": "8.9.0", "eslint-config-next": "12.1.0", diff --git a/wallets/react-wallet-v2/public/chain-logos/cosmos-cosmoshub-4.png b/wallets/react-wallet-v2/public/chain-logos/cosmos-cosmoshub-4.png new file mode 100644 index 0000000..03cc60a Binary files /dev/null and b/wallets/react-wallet-v2/public/chain-logos/cosmos-cosmoshub-4.png differ diff --git a/wallets/react-wallet-v2/public/icons/arrow-right-icon.svg b/wallets/react-wallet-v2/public/icons/arrow-right-icon.svg new file mode 100644 index 0000000..6c5acea --- /dev/null +++ b/wallets/react-wallet-v2/public/icons/arrow-right-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/wallets/react-wallet-v2/src/components/AccountPicker.tsx b/wallets/react-wallet-v2/src/components/AccountPicker.tsx index 1c0db84..8fc5098 100644 --- a/wallets/react-wallet-v2/src/components/AccountPicker.tsx +++ b/wallets/react-wallet-v2/src/components/AccountPicker.tsx @@ -1,18 +1,22 @@ import SettingsStore from '@/store/SettingsStore' -import { addresses } from '@/utils/WalletUtil' +import { cosmosAddresses } from '@/utils/CosmosWalletUtil' +import { eip155Addresses } from '@/utils/EIP155WalletUtil' import { useSnapshot } from 'valtio' export default function AccountPicker() { - const { address } = useSnapshot(SettingsStore.state) + const { account } = useSnapshot(SettingsStore.state) + + function onSelect(value: string) { + const account = Number(value) + SettingsStore.setAccount(account) + SettingsStore.setEIP155Address(eip155Addresses[account]) + SettingsStore.setCosmosAddress(cosmosAddresses[account]) + } return ( - onSelect(e.currentTarget.value)} aria-label="addresses"> + + ) } diff --git a/wallets/react-wallet-v2/src/components/SessionCard.tsx b/wallets/react-wallet-v2/src/components/SessionCard.tsx index 5976aab..750710f 100644 --- a/wallets/react-wallet-v2/src/components/SessionCard.tsx +++ b/wallets/react-wallet-v2/src/components/SessionCard.tsx @@ -1,54 +1,55 @@ import { truncate } from '@/utils/HelperUtil' -import { Avatar, Button, Card, Link, Text, Tooltip } from '@nextui-org/react' +import { Avatar, Card, Link, Text } from '@nextui-org/react' import Image from 'next/image' +import NextLink from 'next/link' /** * Types */ interface IProps { + topic?: string logo?: string name?: string url?: string - onDelete: () => Promise } /** * Component */ -export default function SessionCard({ logo, name, url, onDelete }: IProps) { +export default function SessionCard({ logo, name, url, topic }: IProps) { return ( - - + - -
- - {name} - - - {truncate(url?.split('https://')[1] ?? 'Unknown', 23)} - -
- - - -
-
+ + +
+ + {name} + + + {truncate(url?.split('https://')[1] ?? 'Unknown', 23)} + +
+ + session icon +
+ + ) } diff --git a/wallets/react-wallet-v2/src/data/COSMOSData.ts b/wallets/react-wallet-v2/src/data/COSMOSData.ts new file mode 100644 index 0000000..ae0d4aa --- /dev/null +++ b/wallets/react-wallet-v2/src/data/COSMOSData.ts @@ -0,0 +1,17 @@ +/** + * Types + */ +export type TCosmosChain = keyof typeof COSMOS_MAINNET_CHAINS + +/** + * Chains + */ +export const COSMOS_MAINNET_CHAINS = { + 'cosmos:cosmoshub-4': { + chainId: 'cosmoshub-4', + name: 'Cosmos Hub', + logo: '/chain-logos/cosmos-cosmoshub-4.png', + rgb: '107, 111, 147', + rpc: '' + } +} diff --git a/wallets/react-wallet-v2/src/hooks/useInitialization.ts b/wallets/react-wallet-v2/src/hooks/useInitialization.ts index 5b97ad6..cd2bf4e 100644 --- a/wallets/react-wallet-v2/src/hooks/useInitialization.ts +++ b/wallets/react-wallet-v2/src/hooks/useInitialization.ts @@ -1,6 +1,7 @@ import SettingsStore from '@/store/SettingsStore' +import { createOrRestoreCosmosWallet } from '@/utils/CosmosWalletUtil' +import { createOrRestoreEIP155Wallet } from '@/utils/EIP155WalletUtil' import { createWalletConnectClient } from '@/utils/WalletConnectUtil' -import { createOrRestoreWallet } from '@/utils/WalletUtil' import { useCallback, useEffect, useState } from 'react' export default function useInitialization() { @@ -8,9 +9,14 @@ export default function useInitialization() { const onInitialize = useCallback(async () => { try { - const { addresses } = createOrRestoreWallet() - SettingsStore.setAddress(addresses[0]) + const { eip155Addresses } = createOrRestoreEIP155Wallet() + const { cosmosAddresses } = await createOrRestoreCosmosWallet() + + SettingsStore.setEIP155Address(eip155Addresses[0]) + SettingsStore.setCosmosAddress(cosmosAddresses[0]) + await createWalletConnectClient() + setInitialized(true) } catch (err: unknown) { alert(err) diff --git a/wallets/react-wallet-v2/src/pages/index.tsx b/wallets/react-wallet-v2/src/pages/index.tsx index feae016..189b7e9 100644 --- a/wallets/react-wallet-v2/src/pages/index.tsx +++ b/wallets/react-wallet-v2/src/pages/index.tsx @@ -1,6 +1,7 @@ import AccountCard from '@/components/AccountCard' import AccountPicker from '@/components/AccountPicker' import PageHeader from '@/components/PageHeader' +import { COSMOS_MAINNET_CHAINS } from '@/data/COSMOSData' import { EIP155_MAINNET_CHAINS, EIP155_TEST_CHAINS } from '@/data/EIP155Data' import SettingsStore from '@/store/SettingsStore' import { Text } from '@nextui-org/react' @@ -8,7 +9,7 @@ import { Fragment } from 'react' import { useSnapshot } from 'valtio' export default function HomePage() { - const { testNets, address } = useSnapshot(SettingsStore.state) + const { testNets, eip155Address, cosmosAddress } = useSnapshot(SettingsStore.state) return ( @@ -19,7 +20,10 @@ export default function HomePage() { Mainnets {Object.values(EIP155_MAINNET_CHAINS).map(({ name, logo, rgb }) => ( - + + ))} + {Object.values(COSMOS_MAINNET_CHAINS).map(({ name, logo, rgb }) => ( + ))} {testNets ? ( @@ -28,7 +32,7 @@ export default function HomePage() { Testnets {Object.values(EIP155_TEST_CHAINS).map(({ name, logo, rgb }) => ( - + ))} ) : null} diff --git a/wallets/react-wallet-v2/src/pages/session.tsx b/wallets/react-wallet-v2/src/pages/session.tsx new file mode 100644 index 0000000..82b9c5b --- /dev/null +++ b/wallets/react-wallet-v2/src/pages/session.tsx @@ -0,0 +1,57 @@ +import PageHeader from '@/components/PageHeader' +import { truncate } from '@/utils/HelperUtil' +import { walletConnectClient } from '@/utils/WalletConnectUtil' +import { Avatar, Col, Link, Row, Text } from '@nextui-org/react' +import { useRouter } from 'next/router' +import { Fragment, useEffect, useState } from 'react' + +/** + * Component + */ +export default function SessionPage() { + const [topic, setTopic] = useState('') + const { query } = useRouter() + + useEffect(() => { + if (query?.topic) { + setTopic(query.topic as string) + } + }, [query]) + + // async function onDelete(topic: string) { + // await walletConnectClient.session.delete({ + // topic, + // reason: ERROR.DELETED.format() + // }) + // const newSessions = sessions.filter(sessions => sessions.topic !== topic) + // setSessions(newSessions) + // } + + const session = walletConnectClient.session.values.find(s => s.topic === topic) + + console.log(session) + + if (!session) { + return null + } + + const { name, url, icons } = session.peer.metadata + + return ( + + + + + + + + + {name} + + {truncate(url?.split('https://')[1] ?? 'Unknown', 23)} + + + + + ) +} diff --git a/wallets/react-wallet-v2/src/pages/sessions.tsx b/wallets/react-wallet-v2/src/pages/sessions.tsx index 951a107..e544a04 100644 --- a/wallets/react-wallet-v2/src/pages/sessions.tsx +++ b/wallets/react-wallet-v2/src/pages/sessions.tsx @@ -2,21 +2,11 @@ import PageHeader from '@/components/PageHeader' import SessionCard from '@/components/SessionCard' import { walletConnectClient } from '@/utils/WalletConnectUtil' import { Text } from '@nextui-org/react' -import { ERROR } from '@walletconnect/utils' import { Fragment, useState } from 'react' export default function SessionsPage() { const [sessions, setSessions] = useState(walletConnectClient.session.values) - async function onDelete(topic: string) { - await walletConnectClient.session.delete({ - topic, - reason: ERROR.DELETED.format() - }) - const newSessions = sessions.filter(sessions => sessions.topic !== topic) - setSessions(newSessions) - } - return ( @@ -27,10 +17,10 @@ export default function SessionsPage() { return ( onDelete(session.topic)} /> ) }) diff --git a/wallets/react-wallet-v2/src/pages/settings.tsx b/wallets/react-wallet-v2/src/pages/settings.tsx index 3964abe..b971a03 100644 --- a/wallets/react-wallet-v2/src/pages/settings.tsx +++ b/wallets/react-wallet-v2/src/pages/settings.tsx @@ -1,12 +1,12 @@ import PageHeader from '@/components/PageHeader' import SettingsStore from '@/store/SettingsStore' -import { wallets } from '@/utils/WalletUtil' +import { eip155Wallets } from '@/utils/EIP155WalletUtil' import { Card, Divider, Row, Switch, Text } from '@nextui-org/react' import { Fragment } from 'react' import { useSnapshot } from 'valtio' export default function SettingsPage() { - const { testNets, address } = useSnapshot(SettingsStore.state) + const { testNets, eip155Address } = useSnapshot(SettingsStore.state) return ( @@ -15,7 +15,7 @@ export default function SettingsPage() { Mnemonic - {wallets[address].mnemonic.phrase} + {eip155Wallets[eip155Address].mnemonic.phrase} diff --git a/wallets/react-wallet-v2/src/store/SettingsStore.ts b/wallets/react-wallet-v2/src/store/SettingsStore.ts index e50eafe..84fb881 100644 --- a/wallets/react-wallet-v2/src/store/SettingsStore.ts +++ b/wallets/react-wallet-v2/src/store/SettingsStore.ts @@ -5,7 +5,9 @@ import { proxy } from 'valtio' */ interface State { testNets: boolean - address: string + account: number + eip155Address: string + cosmosAddress: string } /** @@ -13,7 +15,9 @@ interface State { */ const state = proxy({ testNets: typeof localStorage !== 'undefined' ? Boolean(localStorage.getItem('TEST_NETS')) : true, - address: '' + account: 0, + eip155Address: '', + cosmosAddress: '' }) /** @@ -22,8 +26,16 @@ const state = proxy({ const SettingsStore = { state, - setAddress(address: string) { - state.address = address + setAccount(value: number) { + state.account = value + }, + + setEIP155Address(eip155Address: string) { + state.eip155Address = eip155Address + }, + + setCosmosAddress(cosmosAddresses: string) { + state.cosmosAddress = cosmosAddresses }, toggleTestNets() { diff --git a/wallets/react-wallet-v2/src/utils/CosmosUtil.ts b/wallets/react-wallet-v2/src/utils/CosmosUtil.ts new file mode 100644 index 0000000..895d132 --- /dev/null +++ b/wallets/react-wallet-v2/src/utils/CosmosUtil.ts @@ -0,0 +1,53 @@ +import { bech32 } from 'bech32' +import BIP32Factory from 'bip32' +import * as bip39 from 'bip39' +// @ts-expect-error +import * as ecc from 'tiny-secp256k1' + +/** + * Helpers + */ +const bip32 = BIP32Factory(ecc) + +/** + * Types + */ +interface IConstructor { + url?: string + prefix?: string + chainId?: string + path?: string + mnemonic?: string +} + +/** + * Utility + */ +export class Cosmos { + url: string + prefix: string + chainId: string + path: string + mnemonic: string + + constructor({ url, prefix, chainId, path, mnemonic }: IConstructor) { + this.url = url ?? 'https://api.cosmos.network' + this.prefix = prefix ?? 'cosmos' + this.chainId = chainId ?? 'cosmoshub-4' + this.path = path ?? "m/44'/118'/0'/0/0" + this.mnemonic = mnemonic ?? this.generateMnemonic() + } + + generateMnemonic(strength = 128) { + return bip39.generateMnemonic(strength) + } + + async getAddress() { + const seed = await bip39.mnemonicToSeed(this.mnemonic) + const node = bip32.fromSeed(seed) + const child = node.derivePath(this.path) + const words = bech32.toWords(child.identifier) + + return bech32.encode(this.prefix, words) + } +} diff --git a/wallets/react-wallet-v2/src/utils/CosmosWalletUtil.ts b/wallets/react-wallet-v2/src/utils/CosmosWalletUtil.ts new file mode 100644 index 0000000..1085710 --- /dev/null +++ b/wallets/react-wallet-v2/src/utils/CosmosWalletUtil.ts @@ -0,0 +1,43 @@ +import { Cosmos } from '@/utils/CosmosUtil' + +export let wallet1: Cosmos +export let wallet2: Cosmos +export let cosmosWallets: Record +export let cosmosAddresses: string[] + +let address1: string +let address2: string + +/** + * Utilities + */ +export async function createOrRestoreCosmosWallet() { + const mnemonic = localStorage.getItem('WALLET_MNEMONIC') + + if (mnemonic) { + wallet1 = new Cosmos({ mnemonic, path: "m/44'/118'/0'/0/0" }) + wallet2 = new Cosmos({ mnemonic, path: "m/44'/118'/0'/0/1" }) + address1 = await wallet1.getAddress() + address2 = await wallet2.getAddress() + } else { + wallet1 = new Cosmos({ path: "m/44'/118'/0'/0/0" }) + const mnemonic = wallet1.mnemonic + // We can reuse same mnemonic for both wallets + wallet2 = new Cosmos({ mnemonic, path: "m/44'/118'/0'/0/1" }) + address1 = await wallet1.getAddress() + address2 = await wallet2.getAddress() + // Don't store mnemonic in local storage in a production project! + localStorage.setItem('WALLET_MNEMONIC', mnemonic) + } + + cosmosWallets = { + [address1]: wallet1, + [address2]: wallet2 + } + cosmosAddresses = Object.keys(cosmosWallets) + + return { + cosmosWallets, + cosmosAddresses + } +} diff --git a/wallets/react-wallet-v2/src/utils/RequestHandlerUtil.ts b/wallets/react-wallet-v2/src/utils/EIP155RequestHandlerUtil.ts similarity index 93% rename from wallets/react-wallet-v2/src/utils/RequestHandlerUtil.ts rename to wallets/react-wallet-v2/src/utils/EIP155RequestHandlerUtil.ts index b9e9acb..9a3f4e6 100644 --- a/wallets/react-wallet-v2/src/utils/RequestHandlerUtil.ts +++ b/wallets/react-wallet-v2/src/utils/EIP155RequestHandlerUtil.ts @@ -1,10 +1,10 @@ import { EIP155_CHAINS, EIP155_SIGNING_METHODS, TEIP155Chain } from '@/data/EIP155Data' +import { eip155Addresses, eip155Wallets } from '@/utils/EIP155WalletUtil' import { getSignParamsMessage, getSignTypedDataParamsData, getWalletAddressFromParams } from '@/utils/HelperUtil' -import { addresses, wallets } from '@/utils/WalletUtil' import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils' import { RequestEvent } from '@walletconnect/types' import { ERROR } from '@walletconnect/utils' @@ -13,7 +13,7 @@ import { providers } from 'ethers' export async function approveEIP155Request(requestEvent: RequestEvent) { const { method, params, id } = requestEvent.request const { chainId } = requestEvent - const wallet = wallets[getWalletAddressFromParams(addresses, params)] + const wallet = eip155Wallets[getWalletAddressFromParams(eip155Addresses, params)] switch (method) { case EIP155_SIGNING_METHODS.PERSONAL_SIGN: diff --git a/wallets/react-wallet-v2/src/utils/WalletUtil.ts b/wallets/react-wallet-v2/src/utils/EIP155WalletUtil.ts similarity index 66% rename from wallets/react-wallet-v2/src/utils/WalletUtil.ts rename to wallets/react-wallet-v2/src/utils/EIP155WalletUtil.ts index 67e771c..fa212f8 100644 --- a/wallets/react-wallet-v2/src/utils/WalletUtil.ts +++ b/wallets/react-wallet-v2/src/utils/EIP155WalletUtil.ts @@ -1,11 +1,15 @@ import { Wallet } from 'ethers' -export let wallets: Record -export let addresses: string[] -export let wallet1: Wallet -export let wallet2: Wallet +export let eip155Wallets: Record +export let eip155Addresses: string[] -export function createOrRestoreWallet() { +let wallet1: Wallet +let wallet2: Wallet + +/** + * Utilities + */ +export function createOrRestoreEIP155Wallet() { const mnemonic = localStorage.getItem('WALLET_MNEMONIC') if (mnemonic) { @@ -18,14 +22,14 @@ export function createOrRestoreWallet() { localStorage.setItem('WALLET_MNEMONIC', wallet1.mnemonic.phrase) } - wallets = { + eip155Wallets = { [wallet1.address]: wallet1, [wallet2.address]: wallet2 } - addresses = Object.keys(wallets) + eip155Addresses = Object.keys(eip155Wallets) return { - wallets, - addresses + eip155Wallets, + eip155Addresses } } diff --git a/wallets/react-wallet-v2/src/views/SessionProposalModal.tsx b/wallets/react-wallet-v2/src/views/SessionProposalModal.tsx index f0ca6b4..baed015 100644 --- a/wallets/react-wallet-v2/src/views/SessionProposalModal.tsx +++ b/wallets/react-wallet-v2/src/views/SessionProposalModal.tsx @@ -1,7 +1,8 @@ +import { COSMOS_MAINNET_CHAINS, TCosmosChain } from '@/data/COSMOSData' import { EIP155_CHAINS, TEIP155Chain } from '@/data/EIP155Data' import ModalStore from '@/store/ModalStore' +import { eip155Addresses } from '@/utils/EIP155WalletUtil' import { walletConnectClient } from '@/utils/WalletConnectUtil' -import { addresses } from '@/utils/WalletUtil' import { Avatar, Button, @@ -98,7 +99,12 @@ export default function SessionProposalModal() { Blockchains {chains - .map(chain => EIP155_CHAINS[chain as TEIP155Chain]?.name ?? chain) + .map( + chain => + EIP155_CHAINS[chain as TEIP155Chain]?.name ?? + COSMOS_MAINNET_CHAINS[chain as TCosmosChain]?.name ?? + chain + ) .join(', ')} @@ -127,7 +133,7 @@ export default function SessionProposalModal() { Select Accounts to Connect - {addresses.map((address, index) => ( + {eip155Addresses.map((address, index) => ( onSelectAddress(address)} clickable diff --git a/wallets/react-wallet-v2/src/views/SessionSendTransactionModal.tsx b/wallets/react-wallet-v2/src/views/SessionSendTransactionModal.tsx index e975b5c..0f8508e 100644 --- a/wallets/react-wallet-v2/src/views/SessionSendTransactionModal.tsx +++ b/wallets/react-wallet-v2/src/views/SessionSendTransactionModal.tsx @@ -1,7 +1,7 @@ import { EIP155_CHAINS, TEIP155Chain } from '@/data/EIP155Data' import ModalStore from '@/store/ModalStore' +import { approveEIP155Request, rejectEIP155Request } from '@/utils/EIP155RequestHandlerUtil' import { truncate } from '@/utils/HelperUtil' -import { approveEIP155Request, rejectEIP155Request } from '@/utils/RequestHandlerUtil' import { walletConnectClient } from '@/utils/WalletConnectUtil' import { Avatar, diff --git a/wallets/react-wallet-v2/src/views/SessionSignModal.tsx b/wallets/react-wallet-v2/src/views/SessionSignModal.tsx index c43eef8..991111a 100644 --- a/wallets/react-wallet-v2/src/views/SessionSignModal.tsx +++ b/wallets/react-wallet-v2/src/views/SessionSignModal.tsx @@ -1,7 +1,7 @@ import { EIP155_CHAINS, TEIP155Chain } from '@/data/EIP155Data' import ModalStore from '@/store/ModalStore' +import { approveEIP155Request, rejectEIP155Request } from '@/utils/EIP155RequestHandlerUtil' import { getSignParamsMessage } from '@/utils/HelperUtil' -import { approveEIP155Request, rejectEIP155Request } from '@/utils/RequestHandlerUtil' import { walletConnectClient } from '@/utils/WalletConnectUtil' import { Avatar, Button, Col, Container, Divider, Link, Modal, Row, Text } from '@nextui-org/react' import { Fragment } from 'react' diff --git a/wallets/react-wallet-v2/src/views/SessionSignTypedDataModal.tsx b/wallets/react-wallet-v2/src/views/SessionSignTypedDataModal.tsx index 53d2c30..3b3211a 100644 --- a/wallets/react-wallet-v2/src/views/SessionSignTypedDataModal.tsx +++ b/wallets/react-wallet-v2/src/views/SessionSignTypedDataModal.tsx @@ -1,7 +1,7 @@ import { EIP155_CHAINS, TEIP155Chain } from '@/data/EIP155Data' import ModalStore from '@/store/ModalStore' +import { approveEIP155Request, rejectEIP155Request } from '@/utils/EIP155RequestHandlerUtil' import { getSignTypedDataParamsData } from '@/utils/HelperUtil' -import { approveEIP155Request, rejectEIP155Request } from '@/utils/RequestHandlerUtil' import { walletConnectClient } from '@/utils/WalletConnectUtil' import { Avatar, Button, Col, Container, Divider, Link, Modal, Row, Text } from '@nextui-org/react' import { Fragment } from 'react' diff --git a/wallets/react-wallet-v2/yarn.lock b/wallets/react-wallet-v2/yarn.lock index 2deb539..f06e6b1 100644 --- a/wallets/react-wallet-v2/yarn.lock +++ b/wallets/react-wallet-v2/yarn.lock @@ -805,10 +805,20 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@17.0.19": - version "17.0.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.19.tgz#726171367f404bfbe8512ba608a09ebad810c7e6" - integrity sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA== +"@types/node@10.12.18": + version "10.12.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" + integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== + +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + +"@types/node@17.0.21": + version "17.0.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" + integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== "@types/prop-types@*": version "15.7.4" @@ -1212,6 +1222,13 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1222,6 +1239,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bech32@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" + integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== + better-sqlite3@^7.1.2: version "7.5.0" resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-7.5.0.tgz#2a91cb616453f002096743b0e5b66a7021cd1c63" @@ -1230,13 +1252,35 @@ better-sqlite3@^7.1.2: bindings "^1.5.0" prebuild-install "^7.0.0" -bindings@^1.5.0: +bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" +bip32@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/bip32/-/bip32-3.0.1.tgz#1d1121469cce6e910e0ec3a5a1990dd62687e2a3" + integrity sha512-Uhpp9aEx3iyiO7CpbNGFxv9WcMIVdGoHG04doQ5Ln0u60uwDah7jUSc3QMV/fSZGm/Oo01/OeAmYevXV+Gz5jQ== + dependencies: + "@types/node" "10.12.18" + bs58check "^2.1.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + typeforce "^1.11.5" + wif "^2.0.6" + +bip39@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -1246,7 +1290,7 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bn.js@^4.11.9: +bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -1271,6 +1315,22 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bs58check@<3.0.0, bs58check@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -1344,6 +1404,14 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + clipboard@^2.0.0: version "2.0.10" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.10.tgz#e61f6f7139ac5044c58c0484dcac9fb2a918bfd6" @@ -1412,6 +1480,29 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1536,7 +1627,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -elliptic@6.5.4: +elliptic@6.5.4, elliptic@^6.4.0: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -1964,10 +2055,10 @@ format@^0.2.0: resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= -framer-motion@6.2.7: - version "6.2.7" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-6.2.7.tgz#14e71ca933b63dc85327b3ea9ba2f1564f116dd3" - integrity sha512-RExmZCFpJ3OCakoXmZz8iW8ZI5MoaHmVadydetvTSrNaKmZ7ZC/JDQpNyw1NoDG+fchRGP86lXoiTFSQuin+Cg== +framer-motion@6.2.8: + version "6.2.8" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-6.2.8.tgz#02abb529191af7e2df444185fe27e932215b715d" + integrity sha512-4PtBWFJ6NqR350zYVt9AsFDtISTqsdqna79FvSYPfYDXuuqFmiKtZdkTnYPslnsOMedTW0pEvaQ7eqjD+sA+HA== dependencies: framesync "6.0.1" hey-listen "^1.0.8" @@ -2148,6 +2239,15 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -2233,7 +2333,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2551,6 +2651,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -2616,6 +2725,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nan@^2.13.2: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + nanoid@^3.1.30: version "3.3.1" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" @@ -2818,6 +2932,17 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbkdf2@^3.0.9: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -2993,7 +3118,7 @@ quick-format-unescaped@^4.0.3: resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== -randombytes@^2.1.0: +randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -3149,6 +3274,14 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -3156,7 +3289,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -3206,6 +3339,14 @@ set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -3466,6 +3607,17 @@ tiny-emitter@^2.0.0: resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== +tiny-secp256k1@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c" + integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA== + dependencies: + bindings "^1.3.0" + bn.js "^4.11.8" + create-hmac "^1.1.7" + elliptic "^6.4.0" + nan "^2.13.2" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -3531,6 +3683,11 @@ typedarray-to-buffer@3.1.5: dependencies: is-typedarray "^1.0.0" +typeforce@^1.11.5: + version "1.18.0" + resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" + integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== + typescript@4.5.5: version "4.5.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" @@ -3602,6 +3759,13 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +wif@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" + integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ= + dependencies: + bs58check "<3.0.0" + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"