{"_id":"@c2x/wallet-provider","name":"@c2x/wallet-provider","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"C2X"},"license":"Apache-2.0","repository":{"type":"git","url":"git://github:xpladev/c2x-wallet-provider"},"bugs":{"url":"https://github.com/xpladev/c2x-wallet-provider/issues"},"homepage":"https://github.com/xpladev/c2x-wallet-provider/tree/main/packages/src/@c2x/wallet-provider","engines":{"node":">=16"},"publishConfig":{"cache":"~/.npm","access":"public"},"typings":"index.d.ts","name":"@c2x/wallet-provider","version":"0.0.1","dependencies":{"@c2x/web-extension-interface":"^0.0.1","@c2x/use-wallet":"^0.0.1","@c2x/wallet-controller":"^0.0.1"},"main":"./_commonjs/index.js","module":"./index.js","peerDependencies":{"react":">=17.0.0"},"exports":{".":{"import":"./index.js","require":"./_commonjs/index.js","node":"./_commonjs/index.js","default":"./index.js"},"./public/*":"./public/*","./README.md":"./README.md","./StaticWalletProvider":{"import":"./StaticWalletProvider.js","require":"./_commonjs/StaticWalletProvider.js","node":"./_commonjs/StaticWalletProvider.js","default":"./StaticWalletProvider.js"},"./StaticWalletProvider.js":{"import":"./StaticWalletProvider.js","require":"./_commonjs/StaticWalletProvider.js","node":"./_commonjs/StaticWalletProvider.js","default":"./StaticWalletProvider.js"},"./useChainOptions":{"import":"./useChainOptions.js","require":"./_commonjs/useChainOptions.js","node":"./_commonjs/useChainOptions.js","default":"./useChainOptions.js"},"./useChainOptions.js":{"import":"./useChainOptions.js","require":"./_commonjs/useChainOptions.js","node":"./_commonjs/useChainOptions.js","default":"./useChainOptions.js"},"./useInstallChromeExtension":{"import":"./useInstallChromeExtension.js","require":"./_commonjs/useInstallChromeExtension.js","node":"./_commonjs/useInstallChromeExtension.js","default":"./useInstallChromeExtension.js"},"./useInstallChromeExtension.js":{"import":"./useInstallChromeExtension.js","require":"./_commonjs/useInstallChromeExtension.js","node":"./_commonjs/useInstallChromeExtension.js","default":"./useInstallChromeExtension.js"},"./WalletProvider":{"import":"./WalletProvider.js","require":"./_commonjs/WalletProvider.js","node":"./_commonjs/WalletProvider.js","default":"./WalletProvider.js"},"./WalletProvider.js":{"import":"./WalletProvider.js","require":"./_commonjs/WalletProvider.js","node":"./_commonjs/WalletProvider.js","default":"./WalletProvider.js"}},"gitHead":"881cfedbd3a1bdbbf78bf51627184b4cfe94b38d","description":"Library to make React dApps easier using C2X Extension or C2X Mobile.","_id":"@c2x/wallet-provider@0.0.1","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-PMOFF0rQaMh78uAuhfi5ieM3TUNEm4DG3cQtKzHTwR3x2EC9JbYK8wbLy1S6JYj0FgnbotG1+Flp8xuR+v1uWA==","shasum":"6ddb68820652112e653d62dc8f4e44e8d5845ab5","tarball":"https://registry.npmjs.org/@c2x/wallet-provider/-/wallet-provider-0.0.1.tgz","fileCount":17,"unpackedSize":82490,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID6Ro4EFvg88lUkTH1jtzUuRuyDFctaw+bUyciDnp4stAiEA/CKkMGjk7x+fkJBgc1bxnv7PcHK076cStEebH8y6Oj4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjY8YbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoGchAAotAEjJd0+r0rzjQqqYBuO1og6NpbHtQvjPviHTkGuMky7rHW\r\nhzlBYyGnzMBoKf1HXA7XW4J5/5YV2xkavwRDtybkNvFaNky7D5tQ/4hOeVHt\r\nE6m8oYoGjZmQdCdRclpQ81jlashvRW/8pLen62Un68aUuoErSGwS5LCskspt\r\nuFjB83X0HAwDqZ71j7A9p8rygerzkl2+Pgqad7cB1ZnBXVmQwbEFJOd/I0/X\r\nhUt78Dazpf4NUcTeenGP9B+DsCXQeidjutuAcqY6EDrkCr3Vf9yXEOcQHbjh\r\ndHPzKmo5QdEIAMp7EdQAC1LoSjkLKuyh5bndhR53ARLozncD5x4bdmp9ptbE\r\nL+bRzNoLRS0WHKR/ruQHbX4fSOcnn47nXTMcr171pNsFXbNObi58G260494p\r\nxc7JPMYDY9ulH6WeDxWqStMY0FOjfWIFoQofoP0kxQYMfgj7IwgHy7EyaSX/\r\nxqBodTtIhY1HuJhVJbQ1+OqNKhGTKgiwVq3yRGHqicwy6ruQrPlZWAc+Mwb4\r\nX2hNcAcAFtYPM2Vuol36/IHcsiwWwo7HTTwurrtUdSi6mISUyQTtcL5XZfaT\r\nXODopVPwnjhWDadGpjPSdByUwOTE3Gg7rEmITcOfzKY9Pah2hK0Gl41iT9UZ\r\n53k5Gm7cnNjuAjWQEsbgwmYFt9wqssdJA7M=\r\n=JYqV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"woosweb","email":"woosweb@gmail.com"},"directories":{},"maintainers":[{"name":"woosweb","email":"woosweb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wallet-provider_0.0.1_1667483163476_0.7825954753447084"},"_hasShrinkwrap":false}},"time":{"created":"2022-11-03T13:46:03.397Z","0.0.1":"2022-11-03T13:46:03.689Z","modified":"2022-11-03T13:46:03.941Z"},"maintainers":[{"name":"woosweb","email":"woosweb@gmail.com"}],"description":"Library to make React dApps easier using C2X Extension or C2X Mobile.","homepage":"https://github.com/xpladev/c2x-wallet-provider/tree/main/packages/src/@c2x/wallet-provider","repository":{"type":"git","url":"git://github:xpladev/c2x-wallet-provider"},"author":{"name":"C2X"},"bugs":{"url":"https://github.com/xpladev/c2x-wallet-provider/issues"},"license":"Apache-2.0","readme":"# C2X Wallet Provider\n\nLibrary to make React dApps easier using C2X Extension or C2X Mobile.\n\n## Installation\n\nGrab the latest version off [NPM](https://www.npmjs.com/package/@c2x/wallet-provider):\n\n```sh\nnpm i --save @c2x/wallet-provider\n```\n\n# Basic Usage\n\nFirst, please add `<meta name=\"c2x-wallet\" />` on your html page.\n\nSince then, browser extensions (e.g. C2X chrome extension) will not attempt to connect in a Web app where this `<meta name=\"c2x-wallet\">` tag is not found.\n\n```html\n<html lang=\"en\">\n  <head>\n    <meta name=\"c2x-wallet\" />\n  </head>\n</html>\n```\n\nIf you have used `react-router-dom`'s `<BrowserRouter>`, `useLocation()`, you can easily understand it.\n\n```jsx\nimport {\n  NetworkInfo,\n  WalletProvider,\n  WalletStatus,\n  getChainOptions,\n} from '@c2x/wallet-provider';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\n// getChainOptions(): Promise<{ defaultNetwork, walletConnectChainIds }>\ngetChainOptions().then((chainOptions) => {\n  ReactDOM.render(\n    <WalletProvider {...chainOptions}>\n      <YOUR_APP />\n    </WalletProvider>,\n    document.getElementById('root'),\n  );\n});\n```\n\nFirst, you need to wrap your React App with the `<WalletProvider>` component.\n\n```jsx\nimport { useWallet } from '@c2x/wallet-provider';\nimport React from 'react';\n\nfunction Component() {\n  const { status, network, wallets } = useWallet();\n\n  return (\n    <div>\n      <section>\n        <pre>\n          {JSON.stringify(\n            {\n              status,\n              network,\n              wallets,\n            },\n            null,\n            2,\n          )}\n        </pre>\n      </section>\n    </div>\n  );\n}\n```\n\nAfterwards, you can use React Hooks such as `useWallet()`, `useConnectedWallet()` and `useLCDClient()` anywhere in your app.\n\n# API\n\n<details>\n\n<summary><code>&lt;WalletProvider&gt;</code></summary>\n\n```jsx\nimport {\n  WalletProvider,\n  NetworkInfo,\n  ReadonlyWalletSession,\n} from '@c2x/wallet-provider';\n\n// network information\nconst mainnet: NetworkInfo = {\n  name: 'mainnet',\n  chainID: 'dimension-1',\n  lcd: 'https://lcd.xpla.net',\n};\n\nconst testnet: NetworkInfo = {\n  name: 'testnet',\n  chainID: 'cube-1',\n  lcd: 'https://lcd.xpla.net',\n};\n\n// WalletConnect separates chainId by number.\n// Currently TerraStation Mobile uses 0 as Testnet, 1 as Mainnet.\nconst walletConnectChainIds: Record<number, NetworkInfo> = {\n  0: testnet,\n  1: mainnet,\n};\n\n// ⚠️ If there is no special reason, use `getChainOptions()` instead of `walletConnectChainIds` above.\n\n// Optional\n// If you need to modify the modal, such as changing the design, you can put it in,\n// and if you don't put the value in, there is a default modal.\nasync function createReadonlyWalletSession(): Promise<ReadonlyWalletSession> {\n  const terraAddress = prompt('YOUR XPLA ADDRESS');\n  return {\n    network: mainnet,\n    terraAddress,\n  };\n}\n\n// Optional\n// WalletConnect Client option.\nconst connectorOpts: IWalletConnectOptions | undefined = undefined;\nconst pushServerOpts: IPushServerOptions | undefined = undefined;\n\n// Optional\n// Time to wait for the Chrome Extension window.isTerraExtensionAvailable.\n// If not entered, wait for default 1000 * 3 miliseconds.\n// If you reduce excessively, Session recovery of Chrome Extension may fail.\nconst waitingChromeExtensionInstallCheck: number | undefined = undefined;\n\nReactDOM.render(\n  <WalletProvider\n    defaultNetwork={mainnet}\n    walletConnectChainIds={walletConnectChainIds}\n    createReadonlyWalletSession={createReadonlyWalletSession}\n    connectorOpts={connectorOpts}\n    pushServerOpts={pushServerOpts}\n    waitingChromeExtensionInstallCheck={waitingChromeExtensionInstallCheck}\n  >\n    <YOUR_APP />\n  </WalletProvider>,\n  document.getElementById('root'),\n);\n```\n\n</details>\n\n<details>\n\n<summary><code>useWallet()</code></summary>\n\nThis is a React Hook that can receive all the information. (Other hooks are functions for the convenience of Wrapping\nthis `useWallet()`)\n\n<!-- source packages/src/@c2x/use-wallet/useWallet.ts --pick \"Wallet\" -->\n\n[packages/src/@c2x/use-wallet/useWallet.ts](packages/src/@c2x/use-wallet/useWallet.ts)\n\n````ts\nexport interface Wallet {\n  /**\n   * current client status\n   *\n   * this will be one of WalletStatus.INITIALIZING | WalletStatus.WALLET_NOT_CONNECTED | WalletStatus.WALLET_CONNECTED\n   *\n   * INITIALIZING = checking that the session and the chrome extension installation. (show the loading to users)\n   * WALLET_NOT_CONNECTED = there is no connected wallet (show the connect and install options to users)\n   * WALLET_CONNECTED = there is aconnected wallet (show the wallet info and disconnect button to users)\n   *\n   * @see Wallet#refetchStates\n   * @see WalletController#status\n   */\n  status: WalletStatus;\n  /**\n   * current selected network\n   *\n   * - if status is INITIALIZING or WALLET_NOT_CONNECTED = this will be the defaultNetwork\n   * - if status is WALLET_CONNECTED = this depends on the connected environment\n   *\n   * @see WalletProviderProps#defaultNetwork\n   * @see WalletController#network\n   */\n  network: NetworkInfo;\n  /**\n   * available connect types on the browser\n   *\n   * @see Wallet#connect\n   * @see WalletController#availableConnectTypes\n   */\n  availableConnectTypes: ConnectType[];\n  /**\n   * available connections includes identifier, name, icon\n   *\n   * @example\n   * ```\n   * const { availableConnections, connect } = useWallet()\n   *\n   * return (\n   *  <div>\n   *    {\n   *      availableConnections.map(({type, identifier, name, icon}) => (\n   *        <butotn key={`${type}:${identifier}`} onClick={() => connect(type, identifier)}>\n   *          <img src={icon} /> {name}\n   *        </button>\n   *      ))\n   *    }\n   *  </div>\n   * )\n   * ```\n   */\n  availableConnections: Connection[];\n  /**\n   * current connected connection\n   */\n  connection: Connection | undefined;\n  /**\n   * connect to wallet\n   *\n   * @example\n   * ```\n   * const { status, availableConnectTypes, connect } = useWallet()\n   *\n   * return status === WalletStatus.WALLET_NOT_CONNECTED &&\n   *        availableConnectTypes.includs(ConnectType.EXTENSION) &&\n   *  <button onClick={() => connect(ConnectType.EXTENSION)}>\n   *    Connct Chrome Extension\n   *  </button>\n   * ```\n   *\n   * @see Wallet#availableConnectTypes\n   * @see WalletController#connect\n   */\n  connect: (type?: ConnectType, identifier?: string) => void;\n  /**\n   * manual connect to read only session\n   *\n   * @see Wallet#connectReadonly\n   */\n  connectReadonly: (xplaAddress: string, network: NetworkInfo) => void;\n  /**\n   * available install types on the browser\n   *\n   * in this time, this only contains [ConnectType.EXTENSION]\n   *\n   * @see Wallet#install\n   * @see WalletController#availableInstallTypes\n   */\n  availableInstallTypes: ConnectType[];\n  /**\n   * available installations includes identifier, name, icon, url\n   *\n   * @example\n   * ```\n   * const { availableInstallations } = useWallet()\n   *\n   * return (\n   *  <div>\n   *    {\n   *      availableInstallations.map(({type, identifier, name, icon, url}) => (\n   *        <a key={`${type}:${identifier}`} href={url}>\n   *          <img src={icon} /> {name}\n   *        </a>\n   *      ))\n   *    }\n   *  </div>\n   * )\n   * ```\n   *\n   * @see Wallet#install\n   * @see WalletController#availableInstallations\n   */\n  availableInstallations: Installation[];\n  /**\n   * @deprecated Please use availableInstallations\n   *\n   * install for the connect type\n   *\n   * @example\n   * ```\n   * const { status, availableInstallTypes } = useWallet()\n   *\n   * return status === WalletStatus.WALLET_NOT_CONNECTED &&\n   *        availableInstallTypes.includes(ConnectType.EXTENSION) &&\n   *  <button onClick={() => install(ConnectType.EXTENSION)}>\n   *    Install Extension\n   *  </button>\n   * ```\n   *\n   * @see Wallet#availableInstallTypes\n   * @see WalletController#install\n   */\n  install: (type: ConnectType) => void;\n  /**\n   * connected wallets\n   *\n   * this will be like\n   * `[{ connectType: ConnectType.WALLETCONNECT, xplaAddress: 'XXXXXXXXX' }]`\n   *\n   * in this time, you can get only one wallet. `wallets[0]`\n   *\n   * @see WalletController#wallets\n   */\n  wallets: WalletInfo[];\n  /**\n   * disconnect\n   *\n   * @example\n   * ```\n   * const { status, disconnect } = useWallet()\n   *\n   * return status === WalletStatus.WALLET_CONNECTED &&\n   *  <button onClick={() => disconnect()}>\n   *    Disconnect\n   *  </button>\n   * ```\n   */\n  disconnect: () => void;\n  /**\n   * reload the connected wallet states\n   *\n   * in this time, this only work on the ConnectType.EXTENSION\n   *\n   * @see WalletController#refetchStates\n   */\n  refetchStates: () => void;\n  /**\n   * @deprecated please use refetchStates(). this function will remove on next major update\n   */\n  recheckStatus: () => void;\n  /**\n   * support features of this connection\n   *\n   * @example\n   * ```\n   * const { supportFeatures } = useWallet()\n   *\n   * return (\n   *  <div>\n   *    {\n   *      supportFeatures.has('post') &&\n   *      <button onClick={post}>post</button>\n   *    }\n   *    {\n   *      supportFeatures.has('cw20-token') &&\n   *      <button onClick={addCW20Token}>add cw20 token</button>\n   *    }\n   *  </div>\n   * )\n   * ```\n   *\n   * This type is same as `import type { XplaWebExtensionFeatures } from '@xpla/web-extension-interface'`\n   */\n  supportFeatures: Set<\n    'post' | 'sign' | 'sign-bytes' | 'cw20-token' | 'network'\n  >;\n  /**\n   * post transaction\n   *\n   * @example\n   * ```\n   * const { post } = useWallet()\n   *\n   * const callback = useCallback(async () => {\n   *   try {\n   *    const result: TxResult = await post({...CreateTxOptions})\n   *    // DO SOMETHING...\n   *   } catch (error) {\n   *     if (error instanceof UserDenied) {\n   *       // DO SOMETHING...\n   *     } else {\n   *       // DO SOMETHING...\n   *     }\n   *   }\n   * }, [])\n   * ```\n   *\n   * @param { CreateTxOptions } tx transaction data\n   * @param xplaAddress - does not work at this time. for the future extension\n   *\n   * @return { Promise<TxResult> }\n   *\n   * @throws { UserDenied } user denied the tx\n   * @throws { CreateTxFailed } did not create txhash (error dose not broadcasted)\n   * @throws { TxFailed } created txhash (error broadcated)\n   * @throws { Timeout } user does not act anything in specific time\n   * @throws { TxUnspecifiedError } unknown error\n   *\n   * @see WalletController#post\n   */\n  post: (tx: CreateTxOptions, xplaAddress?: string) => Promise<TxResult>;\n  /**\n   * sign transaction\n   *\n   * @example\n   * ```\n   * const { sign } = useWallet()\n   *\n   * const callback = useCallback(async () => {\n   *   try {\n   *    const result: SignResult = await sign({...CreateTxOptions})\n   *\n   *    // Broadcast SignResult\n   *    const tx = result.result\n   *\n   *    const lcd = new LCDClient({\n   *      chainID: connectedWallet.network.chainID,\n   *      URL: connectedWallet.network.lcd,\n   *    })\n   *\n   *    const txResult = await lcd.tx.broadcastSync(tx)\n   *\n   *    // DO SOMETHING...\n   *   } catch (error) {\n   *     if (error instanceof UserDenied) {\n   *       // DO SOMETHING...\n   *     } else {\n   *       // DO SOMETHING...\n   *     }\n   *   }\n   * }, [])\n   * ```\n   *\n   * @param { CreateTxOptions } tx transaction data\n   * @param xplaAddress - does not work at this time. for the future extension\n   *\n   * @return { Promise<SignResult> }\n   *\n   * @throws { UserDenied } user denied the tx\n   * @throws { CreateTxFailed } did not create txhash (error dose not broadcasted)\n   * @throws { TxFailed } created txhash (error broadcated)\n   * @throws { Timeout } user does not act anything in specific time\n   * @throws { TxUnspecifiedError } unknown error\n   *\n   * @see WalletController#sign\n   */\n  sign: (tx: CreateTxOptions, xplaAddress?: string) => Promise<SignResult>;\n  /**\n   * sign any bytes\n   *\n   * @example\n   * ```\n   * const { signBytes } = useWallet()\n   *\n   * const BYTES = Buffer.from('hello world')\n   *\n   * const callback = useCallback(async () => {\n   *   try {\n   *     const { result }: SignBytesResult = await signBytes(BYTES)\n   *\n   *     console.log(result.recid)\n   *     console.log(result.signature)\n   *     console.log(result.public_key)\n   *\n   *     const verified: boolean = verifyBytes(BYTES, result)\n   *   } catch (error) {\n   *     if (error instanceof UserDenied) {\n   *       // DO SOMETHING...\n   *     } else {\n   *       // DO SOMETHING...\n   *     }\n   *   }\n   * }, [])\n   * ```\n   *\n   * @param bytes\n   */\n  signBytes: (bytes: Buffer, xplaAddress?: string) => Promise<SignBytesResult>;\n  /**\n   * check if tokens are added on the extension\n   *\n   * @param chainID\n   * @param tokenAddrs cw20 token addresses\n   *\n   * @return token exists\n   *\n   * @see WalletController#hasCW20Tokens\n   */\n  hasCW20Tokens: (\n    chainID: string,\n    ...tokenAddrs: string[]\n  ) => Promise<{\n    [tokenAddr: string]: boolean;\n  }>;\n  /**\n   * request add token addresses to browser extension\n   *\n   * @param chainID\n   * @param tokenAddrs cw20 token addresses\n   *\n   * @return token exists\n   *\n   * @see WalletController#addCW20Tokens\n   */\n  addCW20Tokens: (\n    chainID: string,\n    ...tokenAddrs: string[]\n  ) => Promise<{\n    [tokenAddr: string]: boolean;\n  }>;\n  /**\n   * check if network is added on the extension\n   *\n   * @param network\n   *\n   * @return network exists\n   *\n   * @see WalletController#hasNetwork\n   */\n  hasNetwork: (network: Omit<NetworkInfo, 'name'>) => Promise<boolean>;\n  /**\n   * request add network to browser extension\n   *\n   * @param network\n   *\n   * @return network exists\n   *\n   * @see WalletController#addNetwork\n   */\n  addNetwork: (network: NetworkInfo) => Promise<boolean>;\n  /**\n   * Some mobile wallet emulates the behavior of chrome extension.\n   * It confirms that the current connection environment is such a wallet.\n   * (If you are running connect() by checking availableConnectType, you do not need to use this API.)\n   *\n   * @see WalletController#isChromeExtensionCompatibleBrowser\n   */\n  isChromeExtensionCompatibleBrowser: () => boolean;\n}\n````\n\n<!-- /source -->\n\n</details>\n\n<details>\n\n<summary><code>useConnectedWallet()</code></summary>\n\n```jsx\nimport { useConnectedWallet } from '@c2x/wallet-provider'\n\nfunction Component() {\n  const connectedWallet = useConnectedWallet()\n\n  const postTx = useCallback(async () => {\n    if (!connectedWallet) return\n\n    console.log('walletAddress is', connectedWallet.walletAddress)\n    console.log('network is', connectedWallet.network)\n    console.log('connectType is', connectedWallet.connectType)\n\n    const result = await connectedWallet.post({...})\n  }, [])\n\n  return (\n    <button disabled={!connectedWallet || !connectedWallet.availablePost} onClick={() => postTx}>\n      Post Tx\n    </button>\n  )\n}\n```\n\n</details>\n\n<details>\n\n<summary><code>useLCDClient()</code></summary>\n\n```jsx\nimport { useLCDClient } from '@c2x/wallet-provider';\n\nfunction Component() {\n  const lcd = useLCDClient();\n\n  const [result, setResult] = useState('');\n\n  useEffect(() => {\n    lcd.treasury.taxRate().then((taxRate) => {\n      setResult(taxRate.toString());\n    });\n  }, []);\n\n  return <div>Result: {result}</div>;\n}\n```\n\n</details>\n\n# Trouble-shooting guide\n\nwallet-provider contains the original source codes in sourcemaps.\n\nYou can check `src/@c2x/wallet-provider/` in the Chrome Devtools / Sources Tab, and you can also use breakpoints\nhere for debug.\n\n(It may not be visible depending on your development settings such as Webpack.)\n\n# For Chrome Extension compatible wallet developers\n\n<details>\n\n<summary><code>Chrome Extension compatible wallet development guide</code></summary>\n\n### 1. Create dApp for test\n\nThere is the `dangerously__chromeExtensionCompatibleBrowserCheck` option to allow you to create a test environment for\nwallet development.\n\nBy declaring the `dangerously__chromeExtensionCompatibleBrowserCheck`, you can make your wallet recognized as the chrome\nextension.\n\n```jsx\n<WalletProvider\n  dangerously__chromeExtensionCompatibleBrowserCheck={(userAgent) =>\n    /YourWallet/.test(userAgent)\n  }\n>\n  ...\n</WalletProvider>\n```\n\n### 2. Register your wallet as default allow\n\nIf your wallet has been developed,\n\nPlease send me your wallet App link (Testlight version is OK)\n\nAnd send me Pull Request by modifying `DEFAULT_CHROME_EXTENSION_COMPATIBLE_BROWSER_CHECK` in\nthe `packages/src/@c2x/wallet-provider/env.ts` file. (or just make an issue is OK)\n\n```diff\nexport const DEFAULT_CHROME_EXTENSION_COMPATIBLE_BROWSER_CHECK = (userAgent: string) => {\n-  return /MathWallet\\//.test(userAgent);\n+  return /MathWallet\\//.test(userAgent) || /YourWallet/.test(userAgent);\n}\n```\n\n</details>\n","readmeFilename":"README.md"}