diff --git a/wallets/provider-all/package.json b/wallets/provider-all/package.json index 4769244c24..f604ce6835 100644 --- a/wallets/provider-all/package.json +++ b/wallets/provider-all/package.json @@ -24,7 +24,6 @@ "@rango-dev/provider-bitget": "^0.52.1-next.2", "@rango-dev/provider-braavos": "^0.49.1-next.2", "@rango-dev/provider-brave": "^0.57.1-next.2", - "@rango-dev/provider-clover": "^0.57.0", "@rango-dev/provider-coin98": "^0.57.1-next.2", "@rango-dev/provider-coinbase": "^0.56.1-next.2", "@rango-dev/provider-cosmostation": "^0.55.1-next.2", @@ -64,4 +63,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/wallets/provider-all/src/index.ts b/wallets/provider-all/src/index.ts index b827d86649..5b12bef5b3 100644 --- a/wallets/provider-all/src/index.ts +++ b/wallets/provider-all/src/index.ts @@ -23,7 +23,7 @@ import { versions as metamask } from '@rango-dev/provider-metamask'; import { versions as okx } from '@rango-dev/provider-okx'; import { versions as phantom } from '@rango-dev/provider-phantom'; import { versions as rabby } from '@rango-dev/provider-rabby'; -import * as ready from '@rango-dev/provider-ready'; +import { versions as ready } from '@rango-dev/provider-ready'; import * as safe from '@rango-dev/provider-safe'; import { versions as safepal } from '@rango-dev/provider-safepal'; import { versions as slush } from '@rango-dev/provider-slush'; @@ -104,7 +104,7 @@ export const allProviders = ( lazyProvider(legacyProviderImportsToVersionsInterface(tonconnect)), lazyProvider(legacyProviderImportsToVersionsInterface(keplr)), phantom, - lazyProvider(legacyProviderImportsToVersionsInterface(ready)), + ready, lazyProvider(legacyProviderImportsToVersionsInterface(tronLink)), trustwallet, enkrypt, diff --git a/wallets/provider-ready/package.json b/wallets/provider-ready/package.json index a1c8b8faa7..fbdc06d097 100644 --- a/wallets/provider-ready/package.json +++ b/wallets/provider-ready/package.json @@ -3,18 +3,14 @@ "version": "0.55.1-next.2", "license": "MIT", "type": "module", - "source": "./src/index.ts", - "main": "./dist/index.js", + "source": "./src/mod.ts", + "main": "./dist/mod.js", "exports": { - ".": "./dist/index.js" + ".": "./dist/mod.js" }, - "typings": "dist/index.d.ts", - "files": [ - "dist", - "src" - ], + "typings": "dist/mod.d.ts", "scripts": { - "build": "node ../../scripts/build/command.mjs --path wallets/provider-ready", + "build": "node ../../scripts/build/command.mjs --path wallets/provider-ready --inputs src/mod.ts", "ts-check": "tsc --declaration --emitDeclarationOnly -p ./tsconfig.json", "clean": "rimraf dist", "format": "prettier --write '{.,src}/**/*.{ts,tsx}'", @@ -23,9 +19,10 @@ "dependencies": { "@rango-dev/signer-starknet": "^0.40.0", "@rango-dev/wallets-shared": "^0.55.1-next.2", + "@rango-dev/wallets-core": "^0.54.1-next.1", "rango-types": "^0.1.89" }, "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/wallets/provider-ready/readme.md b/wallets/provider-ready/readme.md index 555c1f873a..d89e9cceec 100644 --- a/wallets/provider-ready/readme.md +++ b/wallets/provider-ready/readme.md @@ -1 +1,14 @@ -# @rango-dev/provider-ready +# Ready (formerly Argent X) +Ready Wallet integration for hub. +[Homepage](https://www.ready.tech/) | [Docs](https://docs.ready.tech/) + +More about implementation status can be found [here](../readme.md). + +## Implementation notes/limitations + +### Feature +All features are currently supported, and **no limitations** have been identified in this integration. + +--- + +More wallet information can be found in [readme.md](../readme.md). diff --git a/wallets/provider-ready/src/actions/starknet.ts b/wallets/provider-ready/src/actions/starknet.ts new file mode 100644 index 0000000000..241275451c --- /dev/null +++ b/wallets/provider-ready/src/actions/starknet.ts @@ -0,0 +1,33 @@ +import type { Context, FunctionWithContext } from '@rango-dev/wallets-core'; + +import { + CAIP_STARKNET_CHAIN_ID, + type ProviderAPI, + type StarknetActions, + utils, +} from '@rango-dev/wallets-core/namespaces/starknet'; + +export function connect( + instance: () => ProviderAPI +): FunctionWithContext { + return async () => { + const starknetInstance = instance(); + + const connectResult = await starknetInstance?.enable(); + if ( + !connectResult || + !starknetInstance.isConnected || + !connectResult?.length + ) { + throw new Error('Error during connection'); + } + if (starknetInstance?.chainId !== CAIP_STARKNET_CHAIN_ID) { + throw new Error( + `Please switch to Mainnet, current network is ${starknetInstance?.chainId}` + ); + } + + return utils.formatAccountsToCAIP(connectResult); + }; +} +export const starknetActions = { connect }; diff --git a/wallets/provider-ready/src/builders/starknet.ts b/wallets/provider-ready/src/builders/starknet.ts new file mode 100644 index 0000000000..244f60725b --- /dev/null +++ b/wallets/provider-ready/src/builders/starknet.ts @@ -0,0 +1,26 @@ +import type { + ProviderAPI, + StarknetActions, +} from '@rango-dev/wallets-core/namespaces/starknet'; + +import { ChangeAccountSubscriberBuilder } from '@rango-dev/wallets-core/namespaces/common'; +import { utils } from '@rango-dev/wallets-core/namespaces/starknet'; +// Hooks +export const changeAccountSubscriber = (getInstance: () => ProviderAPI) => + new ChangeAccountSubscriberBuilder() + .getInstance(getInstance) + + .onSwitchAccount((event) => { + if (!event.payload.length) { + event.preventDefault(); + } + }) + .format(async (_, accounts) => utils.formatAccountsToCAIP(accounts)) + .addEventListener((instance, callback) => { + instance.on('accountsChanged', callback); + }) + .removeEventListener((instance, callback) => { + instance.off('accountsChanged', callback); + }); + +export const starknetBuilders = { changeAccountSubscriber }; diff --git a/wallets/provider-ready/src/constants.ts b/wallets/provider-ready/src/constants.ts new file mode 100644 index 0000000000..1c9621f96f --- /dev/null +++ b/wallets/provider-ready/src/constants.ts @@ -0,0 +1,40 @@ +import { type ProviderMetadata } from '@rango-dev/wallets-core'; +import { type BlockchainMeta, starknetBlockchain } from 'rango-types'; + +import getSigners from './signer.js'; +import { getInstanceOrThrow } from './utils.js'; + +export const WALLET_ID = 'ready'; +export const metadata: ProviderMetadata = { + name: 'Ready', + icon: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/argentx/icon.svg', + extensions: { + chrome: + 'https://chromewebstore.google.com/detail/ready-wallet-formerly-arg/dlcobpjiigpikoobohmabehhmhfoodbb', + brave: + 'https://chromewebstore.google.com/detail/ready-wallet-formerly-arg/dlcobpjiigpikoobohmabehhmhfoodbb', + firefox: 'https://addons.mozilla.org/en-GB/firefox/addon/argent-x', + homepage: 'https://www.ready.co/', + }, + properties: [ + { + name: 'namespaces', + value: { + selection: 'multiple', + data: [ + { + label: 'Ready', + value: 'Starknet', + id: 'STARKNET', + getSupportedChains: (allBlockchains: BlockchainMeta[]) => + starknetBlockchain(allBlockchains), + }, + ], + }, + }, + { + name: 'signers', + value: { getSigners: async () => getSigners(getInstanceOrThrow()) }, + }, + ], +}; diff --git a/wallets/provider-ready/src/helpers.ts b/wallets/provider-ready/src/helpers.ts deleted file mode 100644 index 25bfef228a..0000000000 --- a/wallets/provider-ready/src/helpers.ts +++ /dev/null @@ -1,9 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type StarknetProviderAPI = Record; -export function ready() { - const { starknet_argentX } = window; - if (!!starknet_argentX) { - return starknet_argentX; - } - return null; -} diff --git a/wallets/provider-ready/src/index.ts b/wallets/provider-ready/src/index.ts deleted file mode 100644 index cf4dcd04d6..0000000000 --- a/wallets/provider-ready/src/index.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type { - CanEagerConnect, - CanSwitchNetwork, - Connect, - Subscribe, - WalletInfo, -} from '@rango-dev/wallets-shared'; -import type { BlockchainMeta, SignerFactory } from 'rango-types'; - -import { Networks, WalletTypes } from '@rango-dev/wallets-shared'; -import { starknetBlockchain } from 'rango-types'; - -import { - ready as readyInstances, - type StarknetProviderAPI, -} from './helpers.js'; -import signer from './signer.js'; - -/* - * https://www.starknetjs.com/docs/API/signer - * https://github.com/apibara/starknet-react - * https://github.com/0xs34n/starknet.js - * https://github.com/argentlabs/argent-x#-usage-with-your-dapp - */ - -const WALLET = WalletTypes.READY; -const MAINNET_CHAIN_ID = 'SN_MAIN'; - -export const config = { - type: WALLET, - defaultNetwork: Networks.STARKNET, -}; - -export const getInstance = readyInstances; - -export const connect: Connect = async ({ instance }) => { - let r = undefined; - r = await instance?.enable(); - if (!r || !instance.isConnected || r?.length === 0) { - throw new Error('Error connecting Ready'); - } - if (instance?.chainId !== MAINNET_CHAIN_ID) { - throw new Error( - `Please switch to Mainnet, current network is ${instance?.chainId}` - ); - } - return { accounts: r ? r : [], chainId: Networks.STARKNET }; -}; - -export const subscribe: Subscribe = ({ instance, state, updateAccounts }) => { - const handleAccountsChanged = (accounts: string[]) => { - if (state.connected) { - if (instance) { - updateAccounts(accounts, Networks.STARKNET); - } - } - }; - instance?.on?.('accountsChanged', handleAccountsChanged); - - return () => { - instance?.off?.('accountsChanged', handleAccountsChanged); - }; -}; - -export const canSwitchNetworkTo: CanSwitchNetwork = () => false; - -export const getSigners: ( - provider: StarknetProviderAPI -) => Promise = signer; - -export const canEagerConnect: CanEagerConnect = ({ instance }) => - instance.isPreauthorized(); - -export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = ( - allBlockChains -) => { - const starknet = starknetBlockchain(allBlockChains); - return { - name: 'Ready', - img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/argentx/icon.svg', - installLink: { - CHROME: - 'https://chromewebstore.google.com/detail/ready-wallet-formerly-arg/dlcobpjiigpikoobohmabehhmhfoodbb', - BRAVE: - 'https://chromewebstore.google.com/detail/ready-wallet-formerly-arg/dlcobpjiigpikoobohmabehhmhfoodbb', - FIREFOX: 'https://addons.mozilla.org/en-GB/firefox/addon/argent-x', - DEFAULT: 'https://www.ready.co/', - }, - - color: '#96e7ed', - supportedChains: starknet, - }; -}; diff --git a/wallets/provider-ready/src/mod.ts b/wallets/provider-ready/src/mod.ts new file mode 100644 index 0000000000..3ac86548e6 --- /dev/null +++ b/wallets/provider-ready/src/mod.ts @@ -0,0 +1,8 @@ +import { defineVersions } from '@rango-dev/wallets-core/utils'; + +import { buildProvider } from './provider.js'; + +const versions = () => + defineVersions().version('1.0.0', buildProvider()).build(); + +export { versions }; diff --git a/wallets/provider-ready/src/namespaces/starknet.ts b/wallets/provider-ready/src/namespaces/starknet.ts new file mode 100644 index 0000000000..c62860e3eb --- /dev/null +++ b/wallets/provider-ready/src/namespaces/starknet.ts @@ -0,0 +1,42 @@ +import type { StarknetActions } from '@rango-dev/wallets-core/namespaces/starknet'; + +import { NamespaceBuilder } from '@rango-dev/wallets-core'; +import { + builders as commonBuilders, + standardizeAndThrowError, +} from '@rango-dev/wallets-core/namespaces/common'; +import { actions, builders } from '@rango-dev/wallets-core/namespaces/starknet'; + +import { starknetActions } from '../actions/starknet.js'; +import { starknetBuilders } from '../builders/starknet.js'; +import { WALLET_ID } from '../constants.js'; +import { starknetReady } from '../utils.js'; + +const [changeAccountSubscriber, changeAccountCleanup] = starknetBuilders + .changeAccountSubscriber(starknetReady) + .build(); +const connect = builders + .connect() + .action(starknetActions.connect(starknetReady)) + .before(changeAccountSubscriber) + .or(changeAccountCleanup) + .or(standardizeAndThrowError) + .build(); + +const disconnect = commonBuilders + .disconnect() + .after(changeAccountCleanup) + .build(); + +const canEagerConnect = builders + .canEagerConnect() + .action(actions.canEagerConnect(starknetReady)) + .build(); + +const starknet = new NamespaceBuilder('Starknet', WALLET_ID) + .action(connect) + .action(disconnect) + .action(canEagerConnect) + .build(); + +export { starknet }; diff --git a/wallets/provider-ready/src/provider.ts b/wallets/provider-ready/src/provider.ts new file mode 100644 index 0000000000..969813874e --- /dev/null +++ b/wallets/provider-ready/src/provider.ts @@ -0,0 +1,21 @@ +import { ProviderBuilder } from '@rango-dev/wallets-core'; + +import { metadata, WALLET_ID } from './constants.js'; +import { starknet } from './namespaces/starknet.js'; +import { ready } from './utils.js'; + +const buildProvider = () => + new ProviderBuilder(WALLET_ID) + .init(function (context) { + const [, setState] = context.state(); + + if (ready()) { + setState('installed', true); + console.debug('[ready] instance detected.', context); + } + }) + .config('metadata', metadata) + .add('starknet', starknet) + .build(); + +export { buildProvider }; diff --git a/wallets/provider-ready/src/signer.ts b/wallets/provider-ready/src/signer.ts index 6661215af4..36b06b944d 100644 --- a/wallets/provider-ready/src/signer.ts +++ b/wallets/provider-ready/src/signer.ts @@ -1,13 +1,28 @@ -import type { StarknetProviderAPI } from './helpers.js'; +import type { Provider } from './types.js'; import type { SignerFactory } from 'rango-types'; -import { DefaultStarknetSigner } from '@rango-dev/signer-starknet'; -import { DefaultSignerFactory, TransactionType as TxType } from 'rango-types'; +import { LegacyNetworks } from '@rango-dev/wallets-core/legacy'; +import { + dynamicImportWithRefinedError, + getNetworkInstance, +} from '@rango-dev/wallets-shared'; +import { DefaultSignerFactory, TransactionType } from 'rango-types'; export default async function getSigners( - provider: StarknetProviderAPI + provider: Provider ): Promise { const signers = new DefaultSignerFactory(); - signers.registerSigner(TxType.STARKNET, new DefaultStarknetSigner(provider)); + const starknetProvider = getNetworkInstance( + provider, + LegacyNetworks.STARKNET + ); + + const { DefaultStarknetSigner } = await dynamicImportWithRefinedError( + async () => await import('@rango-dev/signer-starknet') + ); + signers.registerSigner( + TransactionType.STARKNET, + new DefaultStarknetSigner(starknetProvider) + ); return signers; } diff --git a/wallets/provider-ready/src/types.ts b/wallets/provider-ready/src/types.ts new file mode 100644 index 0000000000..d88ecabb26 --- /dev/null +++ b/wallets/provider-ready/src/types.ts @@ -0,0 +1,10 @@ +import type { LegacyNetworks } from '@rango-dev/wallets-core/legacy'; +import type { ProviderAPI as StarknetProviderAPI } from '@rango-dev/wallets-core/namespaces/starknet'; + +export type ProviderObject = { + [LegacyNetworks.STARKNET]: StarknetProviderAPI; +}; +export type Provider = Map< + keyof ProviderObject, + ProviderObject[keyof ProviderObject] +>; diff --git a/wallets/provider-ready/src/utils.ts b/wallets/provider-ready/src/utils.ts new file mode 100644 index 0000000000..7eb3e5b15b --- /dev/null +++ b/wallets/provider-ready/src/utils.ts @@ -0,0 +1,41 @@ +import type { Provider } from './types.js'; +import type { ProviderAPI as StarknetProviderAPI } from '@rango-dev/wallets-core/namespaces/starknet'; + +import { LegacyNetworks } from '@rango-dev/wallets-core/legacy'; + +export function ready(): Provider | null { + const instances: Provider = new Map(); + const { starknet_argentX } = window; + + if (!starknet_argentX) { + return null; + } + + instances.set(LegacyNetworks.STARKNET, starknet_argentX); + + return instances; +} + +export function getInstanceOrThrow(): Provider { + const instances = ready(); + + if (!instances) { + throw new Error('Ready is not injected. Please check your wallet.'); + } + + return instances; +} + +export function starknetReady(): StarknetProviderAPI { + const instances = ready(); + + const evmInstance = instances?.get(LegacyNetworks.STARKNET); + + if (!evmInstance) { + throw new Error( + 'Ready not injected or Starknet not enabled. Please check your wallet.' + ); + } + + return evmInstance; +} diff --git a/wallets/provider-solflare/package.json b/wallets/provider-solflare/package.json index c32c6aa5b3..168e123b52 100644 --- a/wallets/provider-solflare/package.json +++ b/wallets/provider-solflare/package.json @@ -25,11 +25,10 @@ "@rango-dev/wallets-core": "^0.54.1-next.1", "@rango-dev/wallets-shared": "^0.55.1-next.2", "@solana/web3.js": "^1.91.4", - "@solflare-wallet/sdk": "^1.4.2", "bs58": "^5.0.0", "rango-types": "^0.1.89" }, "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/wallets/readme.md b/wallets/readme.md index 2196eb5de7..230b79af60 100644 --- a/wallets/readme.md +++ b/wallets/readme.md @@ -132,27 +132,28 @@ For better user experience, wallet provider tries to connect to a wallet only wh ## By Group -| Wallet | EVM | UTXO | Solana | Cosmos | TON | Tron | SUI | -| ----------------------------------------------- | --- | ---- | ------ | ------ | --- | ---- | --- | -| [Bitget](provider-bitget/readme.md) | ✅ | 🚧 | 🚧 | ❌ | ❌ | ✅ | ❌ | -| [Brave](provider-brave/readme.md) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | -| [CoinBase](provider-coinbase/readme.md) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | -| [Enkrypt](provider-enkrypt/readme.md) | ✅ | 🚧 | 🚧 | ❌ | ❌ | ❌ | ❌ | -| [Exodus](provider-exodus/readme.md) | ⚠️ | 🚧 | ✅ | ❌ | ❌ | ❌ | ❌ | -| [Ledger](provider-ledger/readme.md) | ⚠️ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | -| [MathWallet](provider-math-wallet/readme.md) | ✅ | 🚧 | ✅ | ❌ | ❌ | ❌ | ❌ | -| [MetaMask](provider-metamask/readme.md) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | -| [Phantom](provider-phantom/readme.md) | ⚠️ | ⚠️ | ✅ | ❌ | ❌ | ❌ | ✅ | -| [OKX](provider-okx/readme.md) | ⚠️ | ⚠️ | ✅ | 🚧 | 🚧 | ❌ | 🚧 | -| [Rabby](provider-rabby/readme.md) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | -| [Slush](provider-slush/readme.md) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | -| [SafePal](provider-safepal/readme.md) | ✅ | 🚧 | 🚧 | ❌ | ❌ | ❌ | ❌ | -| [Solflare](provider-solflare/readme.md) | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | -| [Taho](provider-taho/readme.md) | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | -| [Token Pocket](provider-tokenpocket/readme.md) | ✅ | ❌ | 🚧 | ❌ | ❌ | ❌ | 🚧 | -| [Trust Wallet](provider-trust-wallet/readme.md) | ✅ | ❌ | ✅ | 🚧 | 🚧 | ❌ | 🚧 | -| [UniSat](provider-unisat/readme.md) | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | -| [Xverse](provider-xverse/readme.md) | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | +| Wallet | EVM | UTXO | Solana | Cosmos | TON | Tron | SUI | StarkNet | +| ----------------------------------------------- | --- | ---- | ------ | ------ | --- | ---- | --- | -------- | +| [Bitget](provider-bitget/readme.md) | ✅ | 🚧 | 🚧 | ❌ | ❌ | ✅ | ❌ | ❌ | +| [Brave](provider-brave/readme.md) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [CoinBase](provider-coinbase/readme.md) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Enkrypt](provider-enkrypt/readme.md) | ✅ | 🚧 | 🚧 | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Exodus](provider-exodus/readme.md) | ⚠️ | 🚧 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Ledger](provider-ledger/readme.md) | ⚠️ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [MathWallet](provider-math-wallet/readme.md) | ✅ | 🚧 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [MetaMask](provider-metamask/readme.md) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Phantom](provider-phantom/readme.md) | ⚠️ | ⚠️ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| [OKX](provider-okx/readme.md) | ⚠️ | ⚠️ | ✅ | 🚧 | 🚧 | ❌ | 🚧 | ❌ | +| [Rabby](provider-rabby/readme.md) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Ready](provider-ready/readme.md) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | +| [Slush](provider-slush/readme.md) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | +| [SafePal](provider-safepal/readme.md) | ✅ | 🚧 | 🚧 | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Solflare](provider-solflare/readme.md) | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Taho](provider-taho/readme.md) | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Token Pocket](provider-tokenpocket/readme.md) | ✅ | ❌ | 🚧 | ❌ | ❌ | ❌ | 🚧 | ❌ | +| [Trust Wallet](provider-trust-wallet/readme.md) | ✅ | ❌ | ✅ | 🚧 | 🚧 | ❌ | 🚧 | ❌ | +| [UniSat](provider-unisat/readme.md) | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| [Xverse](provider-xverse/readme.md) | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ## By Feature @@ -169,6 +170,7 @@ For better user experience, wallet provider tries to connect to a wallet only wh | OKX | ⚠️ | ✅ | ✅ | Injected | ✅ | | Phantom | ✅ | ✅ | ⚠️ | Wallet Standard, Injected | ✅ | | Rabby | ✅ | ✅ | ✅ | Injected | ✅ | +| Ready | ✅ | ❌ | ✅ | Injected | ✅ | | Slush | ❌ | ❌ | ✅ | Wallet Standard | ❌ | | SafePal | ✅ | ✅ | ❌ | Injected | ✅ | | Solflare | ⚠️ | ❌ | ✅ | Injected | ✅ | @@ -192,7 +194,7 @@ For better user experience, wallet provider tries to connect to a wallet only wh | Halo | - | - | ✗ | https://halo.social/ | | Keplr | Cosmos | - | ✗ | https://www.keplr.app/ | | Leap Cosmos | Cosmos | Cosmos | ✗ | https://www.leapwallet.io/cosmos | -| Ready | Starknet | - | ✓ | https://www.ready.co/ | +rate ready to the hub) | Safe | EVM | - | ✓ | https://safe.global/ | | Solflare Snap | Solana | - | ✗ | https://solflare.com/metamask | | Station | Terra Classic, Terra | - | ✗ | https://station.terra.money/ |