@multiplatform.one/web3 7.25.0 → 7.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +157 -8
- package/dist/cjs/bridge/base58.cjs +48 -0
- package/dist/cjs/bridge/base58.native.js +51 -0
- package/dist/cjs/bridge/base58.native.js.map +1 -0
- package/dist/cjs/bridge/core.cjs +5 -1
- package/dist/cjs/bridge/core.native.js +5 -1
- package/dist/cjs/bridge/core.native.js.map +1 -1
- package/dist/cjs/bridge/drivers.cjs +141 -0
- package/dist/cjs/bridge/drivers.native.js +161 -0
- package/dist/cjs/bridge/drivers.native.js.map +1 -0
- package/dist/cjs/bridge/nativeHost.cjs +49 -9
- package/dist/cjs/bridge/nativeHost.native.js +56 -9
- package/dist/cjs/bridge/nativeHost.native.js.map +1 -1
- package/dist/cjs/clients/adapter.native.js.map +1 -1
- package/dist/cjs/clients/connector.native.js.map +1 -1
- package/dist/cjs/clients/evm.cjs +1 -0
- package/dist/cjs/clients/evm.native.js +1 -0
- package/dist/cjs/clients/evm.native.js.map +1 -1
- package/dist/cjs/clients/evmRead.cjs +104 -0
- package/dist/cjs/clients/evmRead.native.js +124 -0
- package/dist/cjs/clients/evmRead.native.js.map +1 -0
- package/dist/cjs/clients/hooks.cjs +37 -7
- package/dist/cjs/clients/hooks.native.js +43 -5
- package/dist/cjs/clients/hooks.native.js.map +1 -1
- package/dist/cjs/clients/index.cjs +5 -0
- package/dist/cjs/clients/index.native.js +5 -0
- package/dist/cjs/clients/index.native.js.map +1 -1
- package/dist/cjs/clients/types.cjs +7 -0
- package/dist/cjs/clients/types.native.js +14 -0
- package/dist/cjs/clients/types.native.js.map +1 -1
- package/dist/cjs/connectkit/adapters/BitcoinAdapter.cjs +44 -2
- package/dist/cjs/connectkit/adapters/BitcoinAdapter.native.js +73 -5
- package/dist/cjs/connectkit/adapters/BitcoinAdapter.native.js.map +1 -1
- package/dist/cjs/connectkit/adapters/SolanaAdapter.cjs +46 -0
- package/dist/cjs/connectkit/adapters/SolanaAdapter.native.js +55 -0
- package/dist/cjs/connectkit/adapters/SolanaAdapter.native.js.map +1 -1
- package/dist/cjs/connectkit/adapters/SuiAdapter.cjs +40 -0
- package/dist/cjs/connectkit/adapters/SuiAdapter.native.js +50 -0
- package/dist/cjs/connectkit/adapters/SuiAdapter.native.js.map +1 -1
- package/dist/cjs/connectkit/connectors/ensureWalletConnectors.cjs +4 -1
- package/dist/cjs/connectkit/connectors/ensureWalletConnectors.native.js +8 -1
- package/dist/cjs/connectkit/connectors/ensureWalletConnectors.native.js.map +1 -1
- package/dist/cjs/connectkit/connectors/getWalletConnectors.native.js.map +1 -1
- package/dist/cjs/connectkit/connectors/syntheticChains.native.js.map +1 -1
- package/dist/cjs/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
- package/dist/cjs/connectkit/defaultConfig.cjs +5 -2
- package/dist/cjs/connectkit/defaultConfig.native.js +9 -2
- package/dist/cjs/connectkit/defaultConfig.native.js.map +1 -1
- package/dist/cjs/connectkit/siwe/SIWEContext.native.js.map +1 -1
- package/dist/cjs/connectkit/siwe/SIWEProvider.cjs +6 -4
- package/dist/cjs/connectkit/siwe/SIWEProvider.native.js +8 -4
- package/dist/cjs/connectkit/siwe/SIWEProvider.native.js.map +1 -1
- package/dist/cjs/connectkit/siwe/connectIntent.cjs +56 -16
- package/dist/cjs/connectkit/siwe/connectIntent.native.js +100 -16
- package/dist/cjs/connectkit/siwe/connectIntent.native.js.map +1 -1
- package/dist/cjs/connectkit/siwe/useSIWE.native.js.map +1 -1
- package/dist/cjs/connectkit/web3Bridge.cjs +58 -12
- package/dist/cjs/connectkit/web3Bridge.native.js +64 -14
- package/dist/cjs/connectkit/web3Bridge.native.js.map +1 -1
- package/dist/cjs/core/family.cjs +105 -0
- package/dist/cjs/core/family.native.js +132 -0
- package/dist/cjs/core/family.native.js.map +1 -0
- package/dist/cjs/core/index.cjs +50 -0
- package/dist/cjs/core/index.native.js +53 -0
- package/dist/cjs/core/index.native.js.map +1 -0
- package/dist/cjs/core/lightDriver.cjs +182 -0
- package/dist/cjs/core/lightDriver.native.js +260 -0
- package/dist/cjs/core/lightDriver.native.js.map +1 -0
- package/dist/cjs/core/message.cjs +89 -0
- package/dist/cjs/core/message.native.js +104 -0
- package/dist/cjs/core/message.native.js.map +1 -0
- package/dist/cjs/core/names.cjs +51 -0
- package/dist/cjs/core/names.native.js +95 -0
- package/dist/cjs/core/names.native.js.map +1 -0
- package/dist/cjs/core/react.cjs +59 -0
- package/dist/cjs/core/react.native.js +67 -0
- package/dist/cjs/core/react.native.js.map +1 -0
- package/dist/cjs/core/signIn.cjs +201 -0
- package/dist/cjs/core/signIn.native.js +240 -0
- package/dist/cjs/core/signIn.native.js.map +1 -0
- package/dist/cjs/core/store.cjs +495 -0
- package/dist/cjs/core/store.native.js +684 -0
- package/dist/cjs/core/store.native.js.map +1 -0
- package/dist/cjs/core/types.cjs +18 -0
- package/dist/cjs/core/types.native.js +21 -0
- package/dist/cjs/core/types.native.js.map +1 -0
- package/dist/cjs/families/btc.cjs +44 -0
- package/dist/cjs/families/btc.native.js +49 -0
- package/dist/cjs/families/btc.native.js.map +1 -0
- package/dist/cjs/families/eth.cjs +57 -0
- package/dist/cjs/families/eth.native.js +61 -0
- package/dist/cjs/families/eth.native.js.map +1 -0
- package/dist/cjs/families/gpg.cjs +40 -0
- package/dist/cjs/families/gpg.native.js +43 -0
- package/dist/cjs/families/gpg.native.js.map +1 -0
- package/dist/cjs/families/host.cjs +38 -0
- package/dist/cjs/families/host.native.js +41 -0
- package/dist/cjs/families/host.native.js.map +1 -0
- package/dist/cjs/families/index.cjs +53 -0
- package/dist/cjs/families/index.native.js +56 -0
- package/dist/cjs/families/index.native.js.map +1 -0
- package/dist/cjs/families/messages.cjs +61 -0
- package/dist/cjs/families/messages.native.js +66 -0
- package/dist/cjs/families/messages.native.js.map +1 -0
- package/dist/cjs/families/sol.cjs +55 -0
- package/dist/cjs/families/sol.native.js +64 -0
- package/dist/cjs/families/sol.native.js.map +1 -0
- package/dist/cjs/families/sui.cjs +48 -0
- package/dist/cjs/families/sui.native.js +53 -0
- package/dist/cjs/families/sui.native.js.map +1 -0
- package/dist/cjs/index.cjs +23 -2
- package/dist/cjs/index.native.js +22 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/keycloak/keycloakWallet.cjs +13 -0
- package/dist/cjs/keycloak/keycloakWallet.native.js +15 -0
- package/dist/cjs/keycloak/keycloakWallet.native.js.map +1 -1
- package/dist/cjs/keycloak/useDirectLogin.cjs +10 -5
- package/dist/cjs/keycloak/useDirectLogin.native.js +12 -5
- package/dist/cjs/keycloak/useDirectLogin.native.js.map +1 -1
- package/dist/cjs/keycloak/useWalletLogin.cjs +16 -8
- package/dist/cjs/light/drivers.cjs +73 -0
- package/dist/cjs/light/drivers.native.js +97 -0
- package/dist/cjs/light/drivers.native.js.map +1 -0
- package/dist/cjs/light/index.cjs +30 -0
- package/dist/cjs/light/index.native.js +33 -0
- package/dist/cjs/light/index.native.js.map +1 -0
- package/dist/cjs/providers/WalletProvider.cjs +59 -17
- package/dist/cjs/providers/WalletProvider.native.js +99 -56
- package/dist/cjs/providers/WalletProvider.native.js.map +1 -1
- package/dist/cjs/providers/families.cjs +53 -0
- package/dist/cjs/providers/families.native.js +59 -0
- package/dist/cjs/providers/families.native.js.map +1 -0
- package/dist/cjs/providers/index.cjs +1 -0
- package/dist/cjs/providers/index.native.js +1 -0
- package/dist/cjs/providers/index.native.js.map +1 -1
- package/dist/cjs/providers/walletConfig.cjs +41 -0
- package/dist/cjs/providers/walletConfig.native.js +68 -0
- package/dist/cjs/providers/walletConfig.native.js.map +1 -1
- package/dist/cjs/wagmi/driver.cjs +257 -0
- package/dist/cjs/wagmi/driver.native.js +331 -0
- package/dist/cjs/wagmi/driver.native.js.map +1 -0
- package/dist/cjs/wagmi/host.cjs +239 -0
- package/dist/cjs/wagmi/host.native.js +320 -0
- package/dist/cjs/wagmi/host.native.js.map +1 -0
- package/dist/cjs/wagmi/index.cjs +28 -0
- package/dist/cjs/wagmi/index.native.js +31 -0
- package/dist/cjs/wagmi/index.native.js.map +1 -0
- package/dist/cjs/web.cjs +84 -0
- package/dist/esm/bridge/base58.mjs +23 -0
- package/dist/esm/bridge/base58.mjs.map +1 -0
- package/dist/esm/bridge/base58.native.js +23 -0
- package/dist/esm/bridge/base58.native.js.map +1 -0
- package/dist/esm/bridge/core.mjs +3 -2
- package/dist/esm/bridge/core.mjs.map +1 -1
- package/dist/esm/bridge/core.native.js +3 -2
- package/dist/esm/bridge/core.native.js.map +1 -1
- package/dist/esm/bridge/drivers.mjs +113 -0
- package/dist/esm/bridge/drivers.mjs.map +1 -0
- package/dist/esm/bridge/drivers.native.js +130 -0
- package/dist/esm/bridge/drivers.native.js.map +1 -0
- package/dist/esm/bridge/nativeHost.mjs +50 -11
- package/dist/esm/bridge/nativeHost.mjs.map +1 -1
- package/dist/esm/bridge/nativeHost.native.js +57 -11
- package/dist/esm/bridge/nativeHost.native.js.map +1 -1
- package/dist/esm/clients/adapter.mjs.map +1 -1
- package/dist/esm/clients/adapter.native.js.map +1 -1
- package/dist/esm/clients/connector.mjs.map +1 -1
- package/dist/esm/clients/connector.native.js.map +1 -1
- package/dist/esm/clients/evm.mjs +1 -0
- package/dist/esm/clients/evm.mjs.map +1 -1
- package/dist/esm/clients/evm.native.js +1 -0
- package/dist/esm/clients/evm.native.js.map +1 -1
- package/dist/esm/clients/evmRead.mjs +78 -0
- package/dist/esm/clients/evmRead.mjs.map +1 -0
- package/dist/esm/clients/evmRead.native.js +95 -0
- package/dist/esm/clients/evmRead.native.js.map +1 -0
- package/dist/esm/clients/hooks.mjs +38 -9
- package/dist/esm/clients/hooks.mjs.map +1 -1
- package/dist/esm/clients/hooks.native.js +44 -7
- package/dist/esm/clients/hooks.native.js.map +1 -1
- package/dist/esm/clients/index.mjs +4 -3
- package/dist/esm/clients/index.mjs.map +1 -1
- package/dist/esm/clients/index.native.js +4 -3
- package/dist/esm/clients/index.native.js.map +1 -1
- package/dist/esm/clients/types.mjs +7 -1
- package/dist/esm/clients/types.mjs.map +1 -1
- package/dist/esm/clients/types.native.js +14 -1
- package/dist/esm/clients/types.native.js.map +1 -1
- package/dist/esm/connectkit/adapters/BitcoinAdapter.mjs +44 -2
- package/dist/esm/connectkit/adapters/BitcoinAdapter.mjs.map +1 -1
- package/dist/esm/connectkit/adapters/BitcoinAdapter.native.js +73 -5
- package/dist/esm/connectkit/adapters/BitcoinAdapter.native.js.map +1 -1
- package/dist/esm/connectkit/adapters/SolanaAdapter.mjs +46 -0
- package/dist/esm/connectkit/adapters/SolanaAdapter.mjs.map +1 -1
- package/dist/esm/connectkit/adapters/SolanaAdapter.native.js +55 -0
- package/dist/esm/connectkit/adapters/SolanaAdapter.native.js.map +1 -1
- package/dist/esm/connectkit/adapters/SuiAdapter.mjs +40 -0
- package/dist/esm/connectkit/adapters/SuiAdapter.mjs.map +1 -1
- package/dist/esm/connectkit/adapters/SuiAdapter.native.js +50 -0
- package/dist/esm/connectkit/adapters/SuiAdapter.native.js.map +1 -1
- package/dist/esm/connectkit/connectors/ensureWalletConnectors.mjs +4 -1
- package/dist/esm/connectkit/connectors/ensureWalletConnectors.mjs.map +1 -1
- package/dist/esm/connectkit/connectors/ensureWalletConnectors.native.js +8 -1
- package/dist/esm/connectkit/connectors/ensureWalletConnectors.native.js.map +1 -1
- package/dist/esm/connectkit/connectors/getWalletConnectors.mjs.map +1 -1
- package/dist/esm/connectkit/connectors/getWalletConnectors.native.js.map +1 -1
- package/dist/esm/connectkit/connectors/syntheticChains.mjs.map +1 -1
- package/dist/esm/connectkit/connectors/syntheticChains.native.js.map +1 -1
- package/dist/esm/connectkit/connectors/walletAdapterConnector.mjs.map +1 -1
- package/dist/esm/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
- package/dist/esm/connectkit/defaultConfig.mjs +6 -3
- package/dist/esm/connectkit/defaultConfig.mjs.map +1 -1
- package/dist/esm/connectkit/defaultConfig.native.js +10 -3
- package/dist/esm/connectkit/defaultConfig.native.js.map +1 -1
- package/dist/esm/connectkit/siwe/SIWEContext.mjs.map +1 -1
- package/dist/esm/connectkit/siwe/SIWEContext.native.js.map +1 -1
- package/dist/esm/connectkit/siwe/SIWEProvider.mjs +6 -4
- package/dist/esm/connectkit/siwe/SIWEProvider.mjs.map +1 -1
- package/dist/esm/connectkit/siwe/SIWEProvider.native.js +8 -4
- package/dist/esm/connectkit/siwe/SIWEProvider.native.js.map +1 -1
- package/dist/esm/connectkit/siwe/connectIntent.mjs +54 -16
- package/dist/esm/connectkit/siwe/connectIntent.mjs.map +1 -1
- package/dist/esm/connectkit/siwe/connectIntent.native.js +98 -16
- package/dist/esm/connectkit/siwe/connectIntent.native.js.map +1 -1
- package/dist/esm/connectkit/siwe/useSIWE.mjs.map +1 -1
- package/dist/esm/connectkit/siwe/useSIWE.native.js.map +1 -1
- package/dist/esm/connectkit/web3Bridge.mjs +61 -16
- package/dist/esm/connectkit/web3Bridge.mjs.map +1 -1
- package/dist/esm/connectkit/web3Bridge.native.js +67 -18
- package/dist/esm/connectkit/web3Bridge.native.js.map +1 -1
- package/dist/esm/core/family.mjs +79 -0
- package/dist/esm/core/family.mjs.map +1 -0
- package/dist/esm/core/family.native.js +103 -0
- package/dist/esm/core/family.native.js.map +1 -0
- package/dist/esm/core/index.mjs +9 -0
- package/dist/esm/core/index.mjs.map +1 -0
- package/dist/esm/core/index.native.js +9 -0
- package/dist/esm/core/index.native.js.map +1 -0
- package/dist/esm/core/lightDriver.mjs +157 -0
- package/dist/esm/core/lightDriver.mjs.map +1 -0
- package/dist/esm/core/lightDriver.native.js +232 -0
- package/dist/esm/core/lightDriver.native.js.map +1 -0
- package/dist/esm/core/message.mjs +63 -0
- package/dist/esm/core/message.mjs.map +1 -0
- package/dist/esm/core/message.native.js +75 -0
- package/dist/esm/core/message.native.js.map +1 -0
- package/dist/esm/core/names.mjs +25 -0
- package/dist/esm/core/names.mjs.map +1 -0
- package/dist/esm/core/names.native.js +66 -0
- package/dist/esm/core/names.native.js.map +1 -0
- package/dist/esm/core/react.mjs +30 -0
- package/dist/esm/core/react.mjs.map +1 -0
- package/dist/esm/core/react.native.js +35 -0
- package/dist/esm/core/react.native.js.map +1 -0
- package/dist/esm/core/signIn.mjs +173 -0
- package/dist/esm/core/signIn.mjs.map +1 -0
- package/dist/esm/core/signIn.native.js +209 -0
- package/dist/esm/core/signIn.native.js.map +1 -0
- package/dist/esm/core/store.mjs +469 -0
- package/dist/esm/core/store.mjs.map +1 -0
- package/dist/esm/core/store.native.js +655 -0
- package/dist/esm/core/store.native.js.map +1 -0
- package/dist/esm/core/types.mjs +2 -0
- package/dist/esm/core/types.mjs.map +1 -0
- package/dist/esm/core/types.native.js +2 -0
- package/dist/esm/core/types.native.js.map +1 -0
- package/dist/esm/families/btc.mjs +19 -0
- package/dist/esm/families/btc.mjs.map +1 -0
- package/dist/esm/families/btc.native.js +21 -0
- package/dist/esm/families/btc.native.js.map +1 -0
- package/dist/esm/families/eth.mjs +32 -0
- package/dist/esm/families/eth.mjs.map +1 -0
- package/dist/esm/families/eth.native.js +33 -0
- package/dist/esm/families/eth.native.js.map +1 -0
- package/dist/esm/families/gpg.mjs +15 -0
- package/dist/esm/families/gpg.mjs.map +1 -0
- package/dist/esm/families/gpg.native.js +15 -0
- package/dist/esm/families/gpg.native.js.map +1 -0
- package/dist/esm/families/host.mjs +12 -0
- package/dist/esm/families/host.mjs.map +1 -0
- package/dist/esm/families/host.native.js +12 -0
- package/dist/esm/families/host.native.js.map +1 -0
- package/dist/esm/families/index.mjs +23 -0
- package/dist/esm/families/index.mjs.map +1 -0
- package/dist/esm/families/index.native.js +23 -0
- package/dist/esm/families/index.native.js.map +1 -0
- package/dist/esm/families/messages.mjs +32 -0
- package/dist/esm/families/messages.mjs.map +1 -0
- package/dist/esm/families/messages.native.js +34 -0
- package/dist/esm/families/messages.native.js.map +1 -0
- package/dist/esm/families/sol.mjs +30 -0
- package/dist/esm/families/sol.mjs.map +1 -0
- package/dist/esm/families/sol.native.js +36 -0
- package/dist/esm/families/sol.native.js.map +1 -0
- package/dist/esm/families/sui.mjs +23 -0
- package/dist/esm/families/sui.mjs.map +1 -0
- package/dist/esm/families/sui.native.js +25 -0
- package/dist/esm/families/sui.native.js.map +1 -0
- package/dist/esm/index.mjs +7 -3
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +7 -3
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/keycloak/keycloakWallet.mjs +13 -0
- package/dist/esm/keycloak/keycloakWallet.mjs.map +1 -1
- package/dist/esm/keycloak/keycloakWallet.native.js +15 -0
- package/dist/esm/keycloak/keycloakWallet.native.js.map +1 -1
- package/dist/esm/keycloak/useDirectLogin.mjs +10 -5
- package/dist/esm/keycloak/useDirectLogin.mjs.map +1 -1
- package/dist/esm/keycloak/useDirectLogin.native.js +12 -5
- package/dist/esm/keycloak/useDirectLogin.native.js.map +1 -1
- package/dist/esm/keycloak/useWalletLogin.mjs +16 -8
- package/dist/esm/keycloak/useWalletLogin.mjs.map +1 -1
- package/dist/esm/light/drivers.mjs +46 -0
- package/dist/esm/light/drivers.mjs.map +1 -0
- package/dist/esm/light/drivers.native.js +67 -0
- package/dist/esm/light/drivers.native.js.map +1 -0
- package/dist/esm/light/index.mjs +3 -0
- package/dist/esm/light/index.mjs.map +1 -0
- package/dist/esm/light/index.native.js +3 -0
- package/dist/esm/light/index.native.js.map +1 -0
- package/dist/esm/providers/WalletProvider.mjs +60 -19
- package/dist/esm/providers/WalletProvider.mjs.map +1 -1
- package/dist/esm/providers/WalletProvider.native.js +101 -59
- package/dist/esm/providers/WalletProvider.native.js.map +1 -1
- package/dist/esm/providers/families.mjs +27 -0
- package/dist/esm/providers/families.mjs.map +1 -0
- package/dist/esm/providers/families.native.js +30 -0
- package/dist/esm/providers/families.native.js.map +1 -0
- package/dist/esm/providers/index.mjs +2 -2
- package/dist/esm/providers/index.mjs.map +1 -1
- package/dist/esm/providers/index.native.js +2 -2
- package/dist/esm/providers/index.native.js.map +1 -1
- package/dist/esm/providers/walletConfig.mjs +40 -1
- package/dist/esm/providers/walletConfig.mjs.map +1 -1
- package/dist/esm/providers/walletConfig.native.js +67 -1
- package/dist/esm/providers/walletConfig.native.js.map +1 -1
- package/dist/esm/wagmi/driver.mjs +232 -0
- package/dist/esm/wagmi/driver.mjs.map +1 -0
- package/dist/esm/wagmi/driver.native.js +303 -0
- package/dist/esm/wagmi/driver.native.js.map +1 -0
- package/dist/esm/wagmi/host.mjs +213 -0
- package/dist/esm/wagmi/host.mjs.map +1 -0
- package/dist/esm/wagmi/host.native.js +291 -0
- package/dist/esm/wagmi/host.native.js.map +1 -0
- package/dist/esm/wagmi/index.mjs +3 -0
- package/dist/esm/wagmi/index.mjs.map +1 -0
- package/dist/esm/wagmi/index.native.js +3 -0
- package/dist/esm/wagmi/index.native.js.map +1 -0
- package/dist/esm/web.mjs +13 -0
- package/dist/esm/web.mjs.map +1 -0
- package/dist/jsx/bridge/base58.mjs +23 -0
- package/dist/jsx/bridge/base58.mjs.map +1 -0
- package/dist/jsx/bridge/base58.native.js +51 -0
- package/dist/jsx/bridge/base58.native.js.map +1 -0
- package/dist/jsx/bridge/core.mjs +3 -2
- package/dist/jsx/bridge/core.mjs.map +1 -1
- package/dist/jsx/bridge/core.native.js +5 -1
- package/dist/jsx/bridge/core.native.js.map +1 -1
- package/dist/jsx/bridge/drivers.mjs +113 -0
- package/dist/jsx/bridge/drivers.mjs.map +1 -0
- package/dist/jsx/bridge/drivers.native.js +161 -0
- package/dist/jsx/bridge/drivers.native.js.map +1 -0
- package/dist/jsx/bridge/nativeHost.mjs +50 -11
- package/dist/jsx/bridge/nativeHost.mjs.map +1 -1
- package/dist/jsx/bridge/nativeHost.native.js +56 -9
- package/dist/jsx/bridge/nativeHost.native.js.map +1 -1
- package/dist/jsx/clients/adapter.mjs.map +1 -1
- package/dist/jsx/clients/adapter.native.js.map +1 -1
- package/dist/jsx/clients/connector.mjs.map +1 -1
- package/dist/jsx/clients/connector.native.js.map +1 -1
- package/dist/jsx/clients/evm.mjs +1 -0
- package/dist/jsx/clients/evm.mjs.map +1 -1
- package/dist/jsx/clients/evm.native.js +1 -0
- package/dist/jsx/clients/evm.native.js.map +1 -1
- package/dist/jsx/clients/evmRead.mjs +78 -0
- package/dist/jsx/clients/evmRead.mjs.map +1 -0
- package/dist/jsx/clients/evmRead.native.js +124 -0
- package/dist/jsx/clients/evmRead.native.js.map +1 -0
- package/dist/jsx/clients/hooks.mjs +38 -9
- package/dist/jsx/clients/hooks.mjs.map +1 -1
- package/dist/jsx/clients/hooks.native.js +43 -5
- package/dist/jsx/clients/hooks.native.js.map +1 -1
- package/dist/jsx/clients/index.mjs +4 -3
- package/dist/jsx/clients/index.mjs.map +1 -1
- package/dist/jsx/clients/index.native.js +5 -0
- package/dist/jsx/clients/index.native.js.map +1 -1
- package/dist/jsx/clients/types.mjs +7 -1
- package/dist/jsx/clients/types.mjs.map +1 -1
- package/dist/jsx/clients/types.native.js +14 -0
- package/dist/jsx/clients/types.native.js.map +1 -1
- package/dist/jsx/connectkit/adapters/BitcoinAdapter.mjs +44 -2
- package/dist/jsx/connectkit/adapters/BitcoinAdapter.mjs.map +1 -1
- package/dist/jsx/connectkit/adapters/BitcoinAdapter.native.js +73 -5
- package/dist/jsx/connectkit/adapters/BitcoinAdapter.native.js.map +1 -1
- package/dist/jsx/connectkit/adapters/SolanaAdapter.mjs +46 -0
- package/dist/jsx/connectkit/adapters/SolanaAdapter.mjs.map +1 -1
- package/dist/jsx/connectkit/adapters/SolanaAdapter.native.js +55 -0
- package/dist/jsx/connectkit/adapters/SolanaAdapter.native.js.map +1 -1
- package/dist/jsx/connectkit/adapters/SuiAdapter.mjs +40 -0
- package/dist/jsx/connectkit/adapters/SuiAdapter.mjs.map +1 -1
- package/dist/jsx/connectkit/adapters/SuiAdapter.native.js +50 -0
- package/dist/jsx/connectkit/adapters/SuiAdapter.native.js.map +1 -1
- package/dist/jsx/connectkit/connectors/ensureWalletConnectors.mjs +4 -1
- package/dist/jsx/connectkit/connectors/ensureWalletConnectors.mjs.map +1 -1
- package/dist/jsx/connectkit/connectors/ensureWalletConnectors.native.js +8 -1
- package/dist/jsx/connectkit/connectors/ensureWalletConnectors.native.js.map +1 -1
- package/dist/jsx/connectkit/connectors/getWalletConnectors.mjs.map +1 -1
- package/dist/jsx/connectkit/connectors/getWalletConnectors.native.js.map +1 -1
- package/dist/jsx/connectkit/connectors/syntheticChains.mjs.map +1 -1
- package/dist/jsx/connectkit/connectors/syntheticChains.native.js.map +1 -1
- package/dist/jsx/connectkit/connectors/walletAdapterConnector.mjs.map +1 -1
- package/dist/jsx/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
- package/dist/jsx/connectkit/defaultConfig.mjs +6 -3
- package/dist/jsx/connectkit/defaultConfig.mjs.map +1 -1
- package/dist/jsx/connectkit/defaultConfig.native.js +9 -2
- package/dist/jsx/connectkit/defaultConfig.native.js.map +1 -1
- package/dist/jsx/connectkit/siwe/SIWEContext.mjs.map +1 -1
- package/dist/jsx/connectkit/siwe/SIWEContext.native.js.map +1 -1
- package/dist/jsx/connectkit/siwe/SIWEProvider.mjs +6 -4
- package/dist/jsx/connectkit/siwe/SIWEProvider.mjs.map +1 -1
- package/dist/jsx/connectkit/siwe/SIWEProvider.native.js +8 -4
- package/dist/jsx/connectkit/siwe/SIWEProvider.native.js.map +1 -1
- package/dist/jsx/connectkit/siwe/connectIntent.mjs +54 -16
- package/dist/jsx/connectkit/siwe/connectIntent.mjs.map +1 -1
- package/dist/jsx/connectkit/siwe/connectIntent.native.js +100 -16
- package/dist/jsx/connectkit/siwe/connectIntent.native.js.map +1 -1
- package/dist/jsx/connectkit/siwe/useSIWE.mjs.map +1 -1
- package/dist/jsx/connectkit/siwe/useSIWE.native.js.map +1 -1
- package/dist/jsx/connectkit/web3Bridge.mjs +61 -16
- package/dist/jsx/connectkit/web3Bridge.mjs.map +1 -1
- package/dist/jsx/connectkit/web3Bridge.native.js +64 -14
- package/dist/jsx/connectkit/web3Bridge.native.js.map +1 -1
- package/dist/jsx/core/family.mjs +79 -0
- package/dist/jsx/core/family.mjs.map +1 -0
- package/dist/jsx/core/family.native.js +132 -0
- package/dist/jsx/core/family.native.js.map +1 -0
- package/dist/jsx/core/index.mjs +9 -0
- package/dist/jsx/core/index.mjs.map +1 -0
- package/dist/jsx/core/index.native.js +53 -0
- package/dist/jsx/core/index.native.js.map +1 -0
- package/dist/jsx/core/lightDriver.mjs +157 -0
- package/dist/jsx/core/lightDriver.mjs.map +1 -0
- package/dist/jsx/core/lightDriver.native.js +260 -0
- package/dist/jsx/core/lightDriver.native.js.map +1 -0
- package/dist/jsx/core/message.mjs +63 -0
- package/dist/jsx/core/message.mjs.map +1 -0
- package/dist/jsx/core/message.native.js +104 -0
- package/dist/jsx/core/message.native.js.map +1 -0
- package/dist/jsx/core/names.mjs +25 -0
- package/dist/jsx/core/names.mjs.map +1 -0
- package/dist/jsx/core/names.native.js +95 -0
- package/dist/jsx/core/names.native.js.map +1 -0
- package/dist/jsx/core/react.mjs +30 -0
- package/dist/jsx/core/react.mjs.map +1 -0
- package/dist/jsx/core/react.native.js +67 -0
- package/dist/jsx/core/react.native.js.map +1 -0
- package/dist/jsx/core/signIn.mjs +173 -0
- package/dist/jsx/core/signIn.mjs.map +1 -0
- package/dist/jsx/core/signIn.native.js +240 -0
- package/dist/jsx/core/signIn.native.js.map +1 -0
- package/dist/jsx/core/store.mjs +469 -0
- package/dist/jsx/core/store.mjs.map +1 -0
- package/dist/jsx/core/store.native.js +684 -0
- package/dist/jsx/core/store.native.js.map +1 -0
- package/dist/jsx/core/types.mjs +2 -0
- package/dist/jsx/core/types.mjs.map +1 -0
- package/dist/jsx/core/types.native.js +21 -0
- package/dist/jsx/core/types.native.js.map +1 -0
- package/dist/jsx/families/btc.mjs +19 -0
- package/dist/jsx/families/btc.mjs.map +1 -0
- package/dist/jsx/families/btc.native.js +49 -0
- package/dist/jsx/families/btc.native.js.map +1 -0
- package/dist/jsx/families/eth.mjs +32 -0
- package/dist/jsx/families/eth.mjs.map +1 -0
- package/dist/jsx/families/eth.native.js +61 -0
- package/dist/jsx/families/eth.native.js.map +1 -0
- package/dist/jsx/families/gpg.mjs +15 -0
- package/dist/jsx/families/gpg.mjs.map +1 -0
- package/dist/jsx/families/gpg.native.js +43 -0
- package/dist/jsx/families/gpg.native.js.map +1 -0
- package/dist/jsx/families/host.mjs +12 -0
- package/dist/jsx/families/host.mjs.map +1 -0
- package/dist/jsx/families/host.native.js +41 -0
- package/dist/jsx/families/host.native.js.map +1 -0
- package/dist/jsx/families/index.mjs +23 -0
- package/dist/jsx/families/index.mjs.map +1 -0
- package/dist/jsx/families/index.native.js +56 -0
- package/dist/jsx/families/index.native.js.map +1 -0
- package/dist/jsx/families/messages.mjs +32 -0
- package/dist/jsx/families/messages.mjs.map +1 -0
- package/dist/jsx/families/messages.native.js +66 -0
- package/dist/jsx/families/messages.native.js.map +1 -0
- package/dist/jsx/families/sol.mjs +30 -0
- package/dist/jsx/families/sol.mjs.map +1 -0
- package/dist/jsx/families/sol.native.js +64 -0
- package/dist/jsx/families/sol.native.js.map +1 -0
- package/dist/jsx/families/sui.mjs +23 -0
- package/dist/jsx/families/sui.mjs.map +1 -0
- package/dist/jsx/families/sui.native.js +53 -0
- package/dist/jsx/families/sui.native.js.map +1 -0
- package/dist/jsx/index.js +7 -3
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +7 -3
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +22 -1
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/keycloak/keycloakWallet.mjs +13 -0
- package/dist/jsx/keycloak/keycloakWallet.mjs.map +1 -1
- package/dist/jsx/keycloak/keycloakWallet.native.js +15 -0
- package/dist/jsx/keycloak/keycloakWallet.native.js.map +1 -1
- package/dist/jsx/keycloak/useDirectLogin.mjs +10 -5
- package/dist/jsx/keycloak/useDirectLogin.mjs.map +1 -1
- package/dist/jsx/keycloak/useDirectLogin.native.js +12 -5
- package/dist/jsx/keycloak/useDirectLogin.native.js.map +1 -1
- package/dist/jsx/keycloak/useWalletLogin.mjs +16 -8
- package/dist/jsx/keycloak/useWalletLogin.mjs.map +1 -1
- package/dist/jsx/light/drivers.mjs +46 -0
- package/dist/jsx/light/drivers.mjs.map +1 -0
- package/dist/jsx/light/drivers.native.js +97 -0
- package/dist/jsx/light/drivers.native.js.map +1 -0
- package/dist/jsx/light/index.mjs +3 -0
- package/dist/jsx/light/index.mjs.map +1 -0
- package/dist/jsx/light/index.native.js +33 -0
- package/dist/jsx/light/index.native.js.map +1 -0
- package/dist/jsx/providers/WalletProvider.mjs +60 -19
- package/dist/jsx/providers/WalletProvider.mjs.map +1 -1
- package/dist/jsx/providers/WalletProvider.native.js +99 -56
- package/dist/jsx/providers/WalletProvider.native.js.map +1 -1
- package/dist/jsx/providers/families.mjs +27 -0
- package/dist/jsx/providers/families.mjs.map +1 -0
- package/dist/jsx/providers/families.native.js +59 -0
- package/dist/jsx/providers/families.native.js.map +1 -0
- package/dist/jsx/providers/index.mjs +2 -2
- package/dist/jsx/providers/index.mjs.map +1 -1
- package/dist/jsx/providers/index.native.js +1 -0
- package/dist/jsx/providers/index.native.js.map +1 -1
- package/dist/jsx/providers/walletConfig.mjs +40 -1
- package/dist/jsx/providers/walletConfig.mjs.map +1 -1
- package/dist/jsx/providers/walletConfig.native.js +68 -0
- package/dist/jsx/providers/walletConfig.native.js.map +1 -1
- package/dist/jsx/wagmi/driver.mjs +232 -0
- package/dist/jsx/wagmi/driver.mjs.map +1 -0
- package/dist/jsx/wagmi/driver.native.js +331 -0
- package/dist/jsx/wagmi/driver.native.js.map +1 -0
- package/dist/jsx/wagmi/host.mjs +213 -0
- package/dist/jsx/wagmi/host.mjs.map +1 -0
- package/dist/jsx/wagmi/host.native.js +320 -0
- package/dist/jsx/wagmi/host.native.js.map +1 -0
- package/dist/jsx/wagmi/index.mjs +3 -0
- package/dist/jsx/wagmi/index.mjs.map +1 -0
- package/dist/jsx/wagmi/index.native.js +31 -0
- package/dist/jsx/wagmi/index.native.js.map +1 -0
- package/dist/jsx/web.mjs +13 -0
- package/dist/jsx/web.mjs.map +1 -0
- package/dist/keycloak/login.iife.js +449 -443
- package/docs/bridge-protocol.md +41 -14
- package/package.json +13 -6
- package/src/bridge/base58.spec.ts +18 -0
- package/src/bridge/base58.ts +25 -0
- package/src/bridge/core.ts +2 -0
- package/src/bridge/drivers.spec.ts +283 -0
- package/src/bridge/drivers.ts +155 -0
- package/src/bridge/index.spec.ts +3 -0
- package/src/bridge/nativeHost.spec.ts +139 -15
- package/src/bridge/nativeHost.ts +84 -14
- package/src/bundler/metaMaskConnectTimeouts.spec.ts +3 -0
- package/src/clients/adapter.ts +5 -1
- package/src/clients/connector.ts +2 -0
- package/src/clients/evm.spec.ts +8 -0
- package/src/clients/evm.ts +3 -0
- package/src/clients/evmRead.spec.ts +180 -0
- package/src/clients/evmRead.ts +140 -0
- package/src/clients/hooks.spec.tsx +58 -0
- package/src/clients/hooks.ts +73 -14
- package/src/clients/index.ts +11 -1
- package/src/clients/types.ts +15 -1
- package/src/clients/useEvmReadClient.spec.tsx +93 -0
- package/src/connectkit/adapters/BitcoinAdapter.ts +64 -4
- package/src/connectkit/adapters/SolanaAdapter.ts +49 -0
- package/src/connectkit/adapters/SuiAdapter.ts +47 -1
- package/src/connectkit/connectors/ensureWalletConnectors.ts +10 -1
- package/src/connectkit/connectors/getWalletConnectors.ts +2 -0
- package/src/connectkit/connectors/syntheticChains.ts +8 -0
- package/src/connectkit/connectors/walletAdapterConnector.ts +2 -0
- package/src/connectkit/defaultConfig.ts +21 -7
- package/src/connectkit/siwe/SIWEContext.tsx +3 -0
- package/src/connectkit/siwe/SIWEProvider.spec.tsx +109 -0
- package/src/connectkit/siwe/SIWEProvider.tsx +16 -7
- package/src/connectkit/siwe/connectIntent.spec.ts +100 -30
- package/src/connectkit/siwe/connectIntent.ts +99 -25
- package/src/connectkit/siwe/useSIWE.ts +4 -1
- package/src/connectkit/web3Bridge.tsx +75 -15
- package/src/core/family.spec.ts +136 -0
- package/src/core/family.ts +146 -0
- package/src/core/imports.spec.ts +82 -0
- package/src/core/index.ts +70 -0
- package/src/core/lightDriver.spec.ts +284 -0
- package/src/core/lightDriver.ts +235 -0
- package/src/core/message.spec.ts +178 -0
- package/src/core/message.ts +119 -0
- package/src/core/names.ts +29 -0
- package/src/core/react.spec.tsx +75 -0
- package/src/core/react.ts +52 -0
- package/src/core/signIn.spec.tsx +305 -0
- package/src/core/signIn.ts +282 -0
- package/src/core/store.spec.ts +973 -0
- package/src/core/store.ts +609 -0
- package/src/core/types.ts +110 -0
- package/src/families/btc.ts +16 -0
- package/src/families/eth.ts +35 -0
- package/src/families/families.spec.ts +180 -0
- package/src/families/gpg.ts +13 -0
- package/src/families/host.ts +34 -0
- package/src/families/index.ts +32 -0
- package/src/families/messages.ts +39 -0
- package/src/families/sol.ts +25 -0
- package/src/families/sui.ts +17 -0
- package/src/index.ts +42 -1
- package/src/keycloak/KeycloakWalletLogin.spec.tsx +211 -4
- package/src/keycloak/keycloakWallet.spec.ts +81 -1
- package/src/keycloak/keycloakWallet.ts +24 -2
- package/src/keycloak/useDirectLogin.spec.tsx +77 -4
- package/src/keycloak/useDirectLogin.ts +23 -11
- package/src/keycloak/useWalletLogin.spec.tsx +52 -0
- package/src/keycloak/useWalletLogin.ts +24 -6
- package/src/light/drivers.spec.ts +330 -0
- package/src/light/drivers.ts +54 -0
- package/src/light/index.ts +1 -0
- package/src/light/native.spec.ts +22 -0
- package/src/providers/WalletProvider.native.spec.tsx +288 -0
- package/src/providers/WalletProvider.native.tsx +132 -59
- package/src/providers/WalletProvider.spec.tsx +521 -0
- package/src/providers/WalletProvider.tsx +90 -19
- package/src/providers/families.tsx +39 -0
- package/src/providers/index.ts +3 -0
- package/src/providers/walletConfig.spec.ts +19 -1
- package/src/providers/walletConfig.ts +80 -2
- package/src/wagmi/driver.spec.ts +407 -0
- package/src/wagmi/driver.ts +303 -0
- package/src/wagmi/host.spec.tsx +416 -0
- package/src/wagmi/host.tsx +260 -0
- package/src/wagmi/index.ts +1 -0
- package/src/web.spec.ts +58 -0
- package/src/web.ts +82 -0
- package/types/bridge/base58.d.ts +2 -0
- package/types/bridge/base58.d.ts.map +1 -0
- package/types/bridge/core.d.ts +2 -1
- package/types/bridge/core.d.ts.map +1 -1
- package/types/bridge/drivers.d.ts +24 -0
- package/types/bridge/drivers.d.ts.map +1 -0
- package/types/bridge/nativeHost.d.ts +34 -4
- package/types/bridge/nativeHost.d.ts.map +1 -1
- package/types/clients/adapter.d.ts +5 -1
- package/types/clients/adapter.d.ts.map +1 -1
- package/types/clients/connector.d.ts +2 -0
- package/types/clients/connector.d.ts.map +1 -1
- package/types/clients/evm.d.ts +2 -0
- package/types/clients/evm.d.ts.map +1 -1
- package/types/clients/evmRead.d.ts +54 -0
- package/types/clients/evmRead.d.ts.map +1 -0
- package/types/clients/hooks.d.ts +23 -3
- package/types/clients/hooks.d.ts.map +1 -1
- package/types/clients/index.d.ts +4 -2
- package/types/clients/index.d.ts.map +1 -1
- package/types/clients/types.d.ts +11 -1
- package/types/clients/types.d.ts.map +1 -1
- package/types/connectkit/adapters/BitcoinAdapter.d.ts +9 -0
- package/types/connectkit/adapters/BitcoinAdapter.d.ts.map +1 -1
- package/types/connectkit/adapters/SolanaAdapter.d.ts +12 -0
- package/types/connectkit/adapters/SolanaAdapter.d.ts.map +1 -1
- package/types/connectkit/adapters/SuiAdapter.d.ts +8 -0
- package/types/connectkit/adapters/SuiAdapter.d.ts.map +1 -1
- package/types/connectkit/connectors/ensureWalletConnectors.d.ts +3 -0
- package/types/connectkit/connectors/ensureWalletConnectors.d.ts.map +1 -1
- package/types/connectkit/connectors/getWalletConnectors.d.ts +2 -0
- package/types/connectkit/connectors/getWalletConnectors.d.ts.map +1 -1
- package/types/connectkit/connectors/syntheticChains.d.ts +8 -0
- package/types/connectkit/connectors/syntheticChains.d.ts.map +1 -1
- package/types/connectkit/connectors/walletAdapterConnector.d.ts +2 -0
- package/types/connectkit/connectors/walletAdapterConnector.d.ts.map +1 -1
- package/types/connectkit/defaultConfig.d.ts +2 -1
- package/types/connectkit/defaultConfig.d.ts.map +1 -1
- package/types/connectkit/siwe/SIWEContext.d.ts.map +1 -1
- package/types/connectkit/siwe/SIWEProvider.d.ts +6 -0
- package/types/connectkit/siwe/SIWEProvider.d.ts.map +1 -1
- package/types/connectkit/siwe/connectIntent.d.ts +16 -5
- package/types/connectkit/siwe/connectIntent.d.ts.map +1 -1
- package/types/connectkit/siwe/useSIWE.d.ts +4 -0
- package/types/connectkit/siwe/useSIWE.d.ts.map +1 -1
- package/types/connectkit/web3Bridge.d.ts +2 -0
- package/types/connectkit/web3Bridge.d.ts.map +1 -1
- package/types/core/family.d.ts +70 -0
- package/types/core/family.d.ts.map +1 -0
- package/types/core/index.d.ts +9 -0
- package/types/core/index.d.ts.map +1 -0
- package/types/core/lightDriver.d.ts +52 -0
- package/types/core/lightDriver.d.ts.map +1 -0
- package/types/core/message.d.ts +44 -0
- package/types/core/message.d.ts.map +1 -0
- package/types/core/names.d.ts +7 -0
- package/types/core/names.d.ts.map +1 -0
- package/types/core/react.d.ts +18 -0
- package/types/core/react.d.ts.map +1 -0
- package/types/core/signIn.d.ts +85 -0
- package/types/core/signIn.d.ts.map +1 -0
- package/types/core/store.d.ts +73 -0
- package/types/core/store.d.ts.map +1 -0
- package/types/core/types.d.ts +101 -0
- package/types/core/types.d.ts.map +1 -0
- package/types/families/btc.d.ts +4 -0
- package/types/families/btc.d.ts.map +1 -0
- package/types/families/eth.d.ts +13 -0
- package/types/families/eth.d.ts.map +1 -0
- package/types/families/gpg.d.ts +4 -0
- package/types/families/gpg.d.ts.map +1 -0
- package/types/families/host.d.ts +24 -0
- package/types/families/host.d.ts.map +1 -0
- package/types/families/index.d.ts +14 -0
- package/types/families/index.d.ts.map +1 -0
- package/types/families/messages.d.ts +7 -0
- package/types/families/messages.d.ts.map +1 -0
- package/types/families/sol.d.ts +9 -0
- package/types/families/sol.d.ts.map +1 -0
- package/types/families/sui.d.ts +4 -0
- package/types/families/sui.d.ts.map +1 -0
- package/types/index.d.ts +6 -2
- package/types/index.d.ts.map +1 -1
- package/types/keycloak/keycloakWallet.d.ts +15 -2
- package/types/keycloak/keycloakWallet.d.ts.map +1 -1
- package/types/keycloak/useDirectLogin.d.ts +11 -6
- package/types/keycloak/useDirectLogin.d.ts.map +1 -1
- package/types/keycloak/useWalletLogin.d.ts +8 -1
- package/types/keycloak/useWalletLogin.d.ts.map +1 -1
- package/types/light/drivers.d.ts +13 -0
- package/types/light/drivers.d.ts.map +1 -0
- package/types/light/index.d.ts +2 -0
- package/types/light/index.d.ts.map +1 -0
- package/types/providers/WalletProvider.d.ts +37 -6
- package/types/providers/WalletProvider.d.ts.map +1 -1
- package/types/providers/WalletProvider.native.d.ts +32 -3
- package/types/providers/WalletProvider.native.d.ts.map +1 -1
- package/types/providers/families.d.ts +12 -0
- package/types/providers/families.d.ts.map +1 -0
- package/types/providers/index.d.ts +1 -1
- package/types/providers/index.d.ts.map +1 -1
- package/types/providers/walletConfig.d.ts +32 -2
- package/types/providers/walletConfig.d.ts.map +1 -1
- package/types/wagmi/driver.d.ts +44 -0
- package/types/wagmi/driver.d.ts.map +1 -0
- package/types/wagmi/host.d.ts +31 -0
- package/types/wagmi/host.d.ts.map +1 -0
- package/types/wagmi/index.d.ts +2 -0
- package/types/wagmi/index.d.ts.map +1 -0
- package/types/web.d.ts +13 -0
- package/types/web.d.ts.map +1 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createPublicClient,
|
|
3
|
+
erc20Abi,
|
|
4
|
+
http,
|
|
5
|
+
type Address,
|
|
6
|
+
type Chain,
|
|
7
|
+
type Hash,
|
|
8
|
+
type PublicClient,
|
|
9
|
+
} from "viem";
|
|
10
|
+
import { chainTransports, resolveChains, type Web3ChainConfig } from "../providers/walletConfig";
|
|
11
|
+
import { ReadOnlyClientError, type ChainClient } from "./types";
|
|
12
|
+
|
|
13
|
+
/** The ERC-20 reads, with the owner always named: a read-only client has no account. */
|
|
14
|
+
export interface Erc20ReadActions {
|
|
15
|
+
balanceOf(token: Address, owner: Address): Promise<bigint>;
|
|
16
|
+
allowance(token: Address, spender: Address, owner: Address): Promise<bigint>;
|
|
17
|
+
decimals(token: Address): Promise<number>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Reads one EVM chain with no wallet: prices, sale state, a quote or a balance
|
|
22
|
+
* for a visitor who has not connected, or a chain other than the connected
|
|
23
|
+
* one. Signing and sending reject with ReadOnlyClientError without a request.
|
|
24
|
+
*/
|
|
25
|
+
export interface EvmReadClient extends ChainClient<"evm"> {
|
|
26
|
+
readonly address: null;
|
|
27
|
+
readonly chainId: number;
|
|
28
|
+
readonly chain: Chain;
|
|
29
|
+
/** Reads, simulation, logs and receipts. */
|
|
30
|
+
readonly publicClient: PublicClient;
|
|
31
|
+
readonly readContract: PublicClient["readContract"];
|
|
32
|
+
readonly erc20: Erc20ReadActions;
|
|
33
|
+
/** The chain explorer's page for `hash`, when the chain names an explorer. */
|
|
34
|
+
explorerTxUrl(hash: Hash): string | undefined;
|
|
35
|
+
signMessage(message: string): Promise<never>;
|
|
36
|
+
sendTransaction(parameters: unknown): Promise<never>;
|
|
37
|
+
writeContract(parameters: unknown): Promise<never>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface EvmReadClientConfig {
|
|
41
|
+
chain: Chain;
|
|
42
|
+
/** Reads go here. Defaults to an http client on `rpcUrl`, else the chain's default RPC. */
|
|
43
|
+
publicClient?: PublicClient;
|
|
44
|
+
/** Used only when `publicClient` is not given. */
|
|
45
|
+
rpcUrl?: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** A read-only mpo EVM client for one chain. */
|
|
49
|
+
export function evmReadClient(config: EvmReadClientConfig): EvmReadClient {
|
|
50
|
+
const { chain } = config;
|
|
51
|
+
const publicClient =
|
|
52
|
+
config.publicClient ??
|
|
53
|
+
(createPublicClient({ chain, transport: http(config.rpcUrl) }) as PublicClient);
|
|
54
|
+
if (publicClient.chain && publicClient.chain.id !== chain.id) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`evmReadClient: the public client reads chain ${publicClient.chain.id}, not chain ${chain.id}`,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
const explorer = chain.blockExplorers?.default.url.replace(/\/+$/, "");
|
|
60
|
+
const refuse = (method: string) => async (): Promise<never> => {
|
|
61
|
+
throw new ReadOnlyClientError("evm", method);
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
family: "evm",
|
|
65
|
+
address: null,
|
|
66
|
+
chainId: chain.id,
|
|
67
|
+
chain,
|
|
68
|
+
capabilities: [],
|
|
69
|
+
publicClient,
|
|
70
|
+
readContract: publicClient.readContract,
|
|
71
|
+
erc20: {
|
|
72
|
+
balanceOf: (token, owner) =>
|
|
73
|
+
publicClient.readContract({
|
|
74
|
+
address: token,
|
|
75
|
+
abi: erc20Abi,
|
|
76
|
+
functionName: "balanceOf",
|
|
77
|
+
args: [owner],
|
|
78
|
+
}),
|
|
79
|
+
allowance: (token, spender, owner) =>
|
|
80
|
+
publicClient.readContract({
|
|
81
|
+
address: token,
|
|
82
|
+
abi: erc20Abi,
|
|
83
|
+
functionName: "allowance",
|
|
84
|
+
args: [owner, spender],
|
|
85
|
+
}),
|
|
86
|
+
decimals: (token) =>
|
|
87
|
+
publicClient.readContract({ address: token, abi: erc20Abi, functionName: "decimals" }),
|
|
88
|
+
},
|
|
89
|
+
explorerTxUrl: (hash) => (explorer ? `${explorer}/tx/${hash}` : undefined),
|
|
90
|
+
signMessage: refuse("signMessage"),
|
|
91
|
+
sendTransaction: refuse("sendTransaction"),
|
|
92
|
+
writeContract: refuse("writeContract"),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface EvmReadClients {
|
|
97
|
+
/** The chains a WalletProvider with the same config offers, its default first. */
|
|
98
|
+
readonly chains: readonly [Chain, ...Chain[]];
|
|
99
|
+
/**
|
|
100
|
+
* The read client for `chainId`, or for the default chain. One per chain,
|
|
101
|
+
* made on first use. Throws for a chain the config does not offer.
|
|
102
|
+
*/
|
|
103
|
+
get(chainId?: number): EvmReadClient;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Read clients for the chains of a Web3Config, outside React: the chain list
|
|
108
|
+
* WalletProvider resolves (testnet filter, localnet dev chain first) and the
|
|
109
|
+
* transports it reads them over. Inside a WalletProvider, useEvmReadClient
|
|
110
|
+
* reads through the provider's own wagmi clients instead.
|
|
111
|
+
*/
|
|
112
|
+
export function evmReadClients(config: Web3ChainConfig): EvmReadClients {
|
|
113
|
+
const chains = resolveChains(config);
|
|
114
|
+
const transports = chainTransports(chains);
|
|
115
|
+
const made = new Map<number, EvmReadClient>();
|
|
116
|
+
return {
|
|
117
|
+
chains,
|
|
118
|
+
get(chainId = chains[0].id) {
|
|
119
|
+
const cached = made.get(chainId);
|
|
120
|
+
if (cached) return cached;
|
|
121
|
+
const chain = chains.find((candidate) => candidate.id === chainId);
|
|
122
|
+
if (!chain) {
|
|
123
|
+
throw new Error(
|
|
124
|
+
`evmReadClients: chain ${chainId} is not configured; the config offers [${chains
|
|
125
|
+
.map((c) => c.id)
|
|
126
|
+
.join(", ")}]`,
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
const client = evmReadClient({
|
|
130
|
+
chain,
|
|
131
|
+
publicClient: createPublicClient({
|
|
132
|
+
chain,
|
|
133
|
+
transport: transports[chain.id],
|
|
134
|
+
}) as PublicClient,
|
|
135
|
+
});
|
|
136
|
+
made.set(chainId, client);
|
|
137
|
+
return client;
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
@@ -6,6 +6,10 @@ import { getBase58Decoder } from "@solana/kit";
|
|
|
6
6
|
import { createPublicClient, createWalletClient, custom } from "viem";
|
|
7
7
|
import { mainnet } from "viem/chains";
|
|
8
8
|
import { Web3ConfigContext, type Web3Config } from "../providers/walletConfig";
|
|
9
|
+
import { testDriver } from "../../tests/core/testDriver";
|
|
10
|
+
import { defineWalletFamily } from "../core/family";
|
|
11
|
+
import { ConnectionProvider } from "../core/react";
|
|
12
|
+
import { createConnectionStore } from "../core/store";
|
|
9
13
|
|
|
10
14
|
const { mockUseAccount, mockUseWalletClient, mockUsePublicClient } = vi.hoisted(() => ({
|
|
11
15
|
mockUseAccount: vi.fn(),
|
|
@@ -111,3 +115,57 @@ describe("useSuiClient / useBitcoinClient", () => {
|
|
|
111
115
|
expect(renderHook(() => useBitcoinClient()).result.current?.chainId).toBe("bitcoin");
|
|
112
116
|
});
|
|
113
117
|
});
|
|
118
|
+
|
|
119
|
+
describe("the family client hooks under a connection store", () => {
|
|
120
|
+
const message = { header: "wants you to sign in:", statement: null, chainId: null };
|
|
121
|
+
|
|
122
|
+
async function connected(family: "eth" | "sui" | "btc", address: string) {
|
|
123
|
+
const ecosystem = { eth: "evm", sui: "sui", btc: "bitcoin" }[family] as
|
|
124
|
+
| "evm"
|
|
125
|
+
| "sui"
|
|
126
|
+
| "bitcoin";
|
|
127
|
+
const driver = testDriver(ecosystem, [{ id: "wallet", name: "Wallet" }], {
|
|
128
|
+
wallet: { address, chainId: family === "eth" ? 1 : `${ecosystem}:mainnet` },
|
|
129
|
+
});
|
|
130
|
+
const store = createConnectionStore({
|
|
131
|
+
storage: null,
|
|
132
|
+
families: [defineWalletFamily({ id: family, label: family, message, driver: () => driver })],
|
|
133
|
+
});
|
|
134
|
+
await store.connect(family, "wallet");
|
|
135
|
+
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
136
|
+
<ConnectionProvider store={store}>{children}</ConnectionProvider>
|
|
137
|
+
);
|
|
138
|
+
return { store, wrapper };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
it("useSuiClient and useBitcoinClient read the store's connection, not wagmi's", async () => {
|
|
142
|
+
mockUseAccount.mockReturnValue({ connector: shim("bitcoin", "bc1q"), address: "bc1q" });
|
|
143
|
+
const { store, wrapper } = await connected("sui", "0xsui");
|
|
144
|
+
expect(renderHook(() => useSuiClient(), { wrapper }).result.current).toBe(
|
|
145
|
+
store.getState().client,
|
|
146
|
+
);
|
|
147
|
+
expect(renderHook(() => useBitcoinClient(), { wrapper }).result.current).toBeUndefined();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("useEvmClient is the store's EVM client, and undefined while another family is active", async () => {
|
|
151
|
+
mockUseAccount.mockReturnValue({ connector: { id: "metaMask" }, chainId: 1 });
|
|
152
|
+
mockUseWalletClient.mockReturnValue({ data: walletClient });
|
|
153
|
+
const evm = await connected("eth", evmAddress);
|
|
154
|
+
expect(renderHook(() => useEvmClient(), { wrapper: evm.wrapper }).result.current).toBe(
|
|
155
|
+
evm.store.getState().client,
|
|
156
|
+
);
|
|
157
|
+
const sui = await connected("sui", "0xsui");
|
|
158
|
+
expect(
|
|
159
|
+
renderHook(() => useEvmClient(), { wrapper: sui.wrapper }).result.current,
|
|
160
|
+
).toBeUndefined();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("useEvmClient for a named chain still asks wagmi for that chain", async () => {
|
|
164
|
+
mockUseAccount.mockReturnValue({ connector: { id: "metaMask" }, chainId: 1 });
|
|
165
|
+
mockUseWalletClient.mockReturnValue({ data: walletClient });
|
|
166
|
+
const { wrapper } = await connected("eth", evmAddress);
|
|
167
|
+
const { result } = renderHook(() => useEvmClient({ chainId: 1 }), { wrapper });
|
|
168
|
+
expect(result.current?.family).toBe("evm");
|
|
169
|
+
expect(mockUseWalletClient).toHaveBeenCalledWith(expect.objectContaining({ chainId: 1 }));
|
|
170
|
+
});
|
|
171
|
+
});
|
package/src/clients/hooks.ts
CHANGED
|
@@ -1,51 +1,110 @@
|
|
|
1
1
|
import { useMemo } from "react";
|
|
2
|
-
import { useAccount, usePublicClient, useWalletClient } from "wagmi";
|
|
2
|
+
import { useAccount, useChainId, useConfig, usePublicClient, useWalletClient } from "wagmi";
|
|
3
3
|
import { isSyntheticChainId } from "../connectkit/connectors/syntheticChains";
|
|
4
|
+
import { useOptionalConnection } from "../core/react";
|
|
4
5
|
import { bitcoinClient, type BitcoinClient } from "./bitcoin";
|
|
5
6
|
import { connectorAdapter } from "./adapter";
|
|
6
7
|
import { evmClient, type EvmClient, type EvmWalletClient } from "./evm";
|
|
8
|
+
import { evmReadClient, type EvmReadClient } from "./evmRead";
|
|
7
9
|
import { suiClient, type SuiClient } from "./sui";
|
|
8
10
|
import type { PublicClient } from "viem";
|
|
9
11
|
|
|
10
12
|
/**
|
|
11
13
|
* The connected EVM wallet as a viem WalletClient plus a PublicClient for reads,
|
|
12
14
|
* wrapped in the mpo EVM client. Undefined until an EVM wallet is connected, and
|
|
13
|
-
* while a non-EVM wallet holds the connection.
|
|
15
|
+
* while a non-EVM wallet holds the connection. Under a connection store
|
|
16
|
+
* (Web3Provider) it is the store's EVM client; for a named `chainId` it asks
|
|
17
|
+
* wagmi for a client on that chain.
|
|
14
18
|
*/
|
|
15
19
|
export function useEvmClient(parameters: { chainId?: number } = {}): EvmClient | undefined {
|
|
20
|
+
const connection = useOptionalConnection();
|
|
21
|
+
const fromStore = connection !== null && parameters.chainId === undefined;
|
|
16
22
|
const { connector, chainId: connectedChainId } = useAccount();
|
|
17
|
-
const evm =
|
|
23
|
+
const evm =
|
|
24
|
+
!!connector &&
|
|
25
|
+
!connectorAdapter(connector) &&
|
|
26
|
+
!isSyntheticChainId(connectedChainId) &&
|
|
27
|
+
(connection === null || connection.family === "eth");
|
|
18
28
|
const { data: walletClient } = useWalletClient({
|
|
19
29
|
chainId: parameters.chainId,
|
|
20
|
-
query: { enabled: evm },
|
|
30
|
+
query: { enabled: evm && !fromStore },
|
|
21
31
|
});
|
|
22
32
|
const publicClient = usePublicClient({ chainId: walletClient?.chain.id ?? parameters.chainId });
|
|
33
|
+
return useMemo(() => {
|
|
34
|
+
if (fromStore) {
|
|
35
|
+
return connection.family === "eth"
|
|
36
|
+
? ((connection.client as EvmClient | null) ?? undefined)
|
|
37
|
+
: undefined;
|
|
38
|
+
}
|
|
39
|
+
return evm && walletClient && publicClient
|
|
40
|
+
? evmClient({
|
|
41
|
+
walletClient: walletClient as unknown as EvmWalletClient,
|
|
42
|
+
publicClient: publicClient as PublicClient,
|
|
43
|
+
})
|
|
44
|
+
: undefined;
|
|
45
|
+
}, [fromStore, connection, evm, walletClient, publicClient]);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* A read-only EVM client over WalletProvider's own public client for
|
|
50
|
+
* `chainId`. It needs no wallet, so a page can read a chain before one
|
|
51
|
+
* connects. With no `chainId` it follows wagmi's current chain: the connected
|
|
52
|
+
* EVM wallet's, else the last one used, and the default chain while a non-EVM
|
|
53
|
+
* wallet holds the connection. Pass `chainId` to read a contract on a fixed
|
|
54
|
+
* chain. Undefined for a chain the provider does not offer.
|
|
55
|
+
*/
|
|
56
|
+
export function useEvmReadClient(parameters: { chainId?: number } = {}): EvmReadClient | undefined {
|
|
57
|
+
const config = useConfig();
|
|
58
|
+
const currentChainId = useChainId();
|
|
59
|
+
// A Solana, Sui or Bitcoin wallet moves wagmi onto a synthetic chain that
|
|
60
|
+
// has no transport, where usePublicClient returns undefined.
|
|
61
|
+
const chainId =
|
|
62
|
+
parameters.chainId ??
|
|
63
|
+
(isSyntheticChainId(currentChainId)
|
|
64
|
+
? config.chains.find((chain) => !isSyntheticChainId(chain.id))?.id
|
|
65
|
+
: undefined);
|
|
66
|
+
const publicClient = usePublicClient({ chainId });
|
|
23
67
|
return useMemo(
|
|
24
68
|
() =>
|
|
25
|
-
|
|
26
|
-
?
|
|
27
|
-
walletClient: walletClient as unknown as EvmWalletClient,
|
|
28
|
-
publicClient: publicClient as PublicClient,
|
|
29
|
-
})
|
|
69
|
+
publicClient
|
|
70
|
+
? evmReadClient({ chain: publicClient.chain, publicClient: publicClient as PublicClient })
|
|
30
71
|
: undefined,
|
|
31
|
-
[
|
|
72
|
+
[publicClient],
|
|
32
73
|
);
|
|
33
74
|
}
|
|
34
75
|
|
|
35
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* The connected Sui wallet (message signing only for now): the connection
|
|
78
|
+
* store's when one is mounted, else wagmi's shim connector's.
|
|
79
|
+
*/
|
|
36
80
|
export function useSuiClient(): SuiClient | undefined {
|
|
81
|
+
const connection = useOptionalConnection();
|
|
37
82
|
const { connector, address } = useAccount();
|
|
38
83
|
return useMemo(() => {
|
|
84
|
+
if (connection) {
|
|
85
|
+
return connection.family === "sui"
|
|
86
|
+
? ((connection.client as SuiClient | null) ?? undefined)
|
|
87
|
+
: undefined;
|
|
88
|
+
}
|
|
39
89
|
const adapter = connectorAdapter(connector, "sui");
|
|
40
90
|
return adapter?.address ? suiClient(adapter) : undefined;
|
|
41
|
-
}, [connector, address]);
|
|
91
|
+
}, [connection, connector, address]);
|
|
42
92
|
}
|
|
43
93
|
|
|
44
|
-
/**
|
|
94
|
+
/**
|
|
95
|
+
* The connected Bitcoin wallet (message signing only for now): the
|
|
96
|
+
* connection store's when one is mounted, else wagmi's shim connector's.
|
|
97
|
+
*/
|
|
45
98
|
export function useBitcoinClient(): BitcoinClient | undefined {
|
|
99
|
+
const connection = useOptionalConnection();
|
|
46
100
|
const { connector, address } = useAccount();
|
|
47
101
|
return useMemo(() => {
|
|
102
|
+
if (connection) {
|
|
103
|
+
return connection.family === "btc"
|
|
104
|
+
? ((connection.client as BitcoinClient | null) ?? undefined)
|
|
105
|
+
: undefined;
|
|
106
|
+
}
|
|
48
107
|
const adapter = connectorAdapter(connector, "bitcoin");
|
|
49
108
|
return adapter?.address ? bitcoinClient(adapter) : undefined;
|
|
50
|
-
}, [connector, address]);
|
|
109
|
+
}, [connection, connector, address]);
|
|
51
110
|
}
|
package/src/clients/index.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// native signs Solana through the WebView bridge, so @solana/kit must never
|
|
6
6
|
// enter that bundle, and sign-in (solanaMessageClient) does not need it.
|
|
7
7
|
export {
|
|
8
|
+
ReadOnlyClientError,
|
|
8
9
|
UnsupportedClientMethodError,
|
|
9
10
|
type ChainClient,
|
|
10
11
|
type ClientCapability,
|
|
@@ -27,6 +28,15 @@ export {
|
|
|
27
28
|
type EvmWriteContractParameters,
|
|
28
29
|
type TxErrorKind,
|
|
29
30
|
} from "./evm";
|
|
31
|
+
export {
|
|
32
|
+
evmReadClient,
|
|
33
|
+
evmReadClients,
|
|
34
|
+
type Erc20ReadActions,
|
|
35
|
+
type EvmReadClient,
|
|
36
|
+
type EvmReadClientConfig,
|
|
37
|
+
type EvmReadClients,
|
|
38
|
+
} from "./evmRead";
|
|
39
|
+
export type { Web3ChainConfig } from "../providers/walletConfig";
|
|
30
40
|
export { suiClient, type SuiClient } from "./sui";
|
|
31
41
|
export { bitcoinClient, type BitcoinClient } from "./bitcoin";
|
|
32
42
|
export {
|
|
@@ -45,4 +55,4 @@ export {
|
|
|
45
55
|
type SolanaCluster,
|
|
46
56
|
type SolanaMessageClient,
|
|
47
57
|
} from "./solanaMessage";
|
|
48
|
-
export { useBitcoinClient, useEvmClient, useSuiClient } from "./hooks";
|
|
58
|
+
export { useBitcoinClient, useEvmClient, useEvmReadClient, useSuiClient } from "./hooks";
|
package/src/clients/types.ts
CHANGED
|
@@ -19,7 +19,10 @@ export type ClientCapability =
|
|
|
19
19
|
*/
|
|
20
20
|
export interface ChainClient<F extends ClientFamily = ClientFamily> {
|
|
21
21
|
readonly family: F;
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Chain-native address. Null for GPG, whose identity arrives with the
|
|
24
|
+
* signature, and for a read-only client, which has no account.
|
|
25
|
+
*/
|
|
23
26
|
readonly address: string | null;
|
|
24
27
|
/** EVM numeric chain id, or a CAIP-2 style id (`solana:mainnet`, `sui:mainnet`, `bitcoin`). */
|
|
25
28
|
readonly chainId?: number | string;
|
|
@@ -38,3 +41,14 @@ export class UnsupportedClientMethodError extends Error {
|
|
|
38
41
|
this.name = "UnsupportedClientMethodError";
|
|
39
42
|
}
|
|
40
43
|
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A signing or sending method called on a read-only client, such as
|
|
47
|
+
* evmReadClient's. Nothing reached a wallet and nothing was sent.
|
|
48
|
+
*/
|
|
49
|
+
export class ReadOnlyClientError extends UnsupportedClientMethodError {
|
|
50
|
+
constructor(family: ClientFamily, method: string) {
|
|
51
|
+
super(family, method, "read-only client, connect a wallet to sign or send");
|
|
52
|
+
this.name = "ReadOnlyClientError";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
3
|
+
import { act, renderHook } from "@testing-library/react";
|
|
4
|
+
import type { ReactNode } from "react";
|
|
5
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
6
|
+
import { WagmiProvider, createConfig, createStorage } from "wagmi";
|
|
7
|
+
import { connect, disconnect } from "wagmi/actions";
|
|
8
|
+
import { mock } from "wagmi/connectors";
|
|
9
|
+
import { mainnet, polygon } from "wagmi/chains";
|
|
10
|
+
import { solanaChain } from "../connectkit/connectors/syntheticChains";
|
|
11
|
+
import { chainTransports } from "../providers/walletConfig";
|
|
12
|
+
import { useEvmReadClient } from "./hooks";
|
|
13
|
+
|
|
14
|
+
const account = "0x1111111111111111111111111111111111111111";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The wagmi config WalletProvider builds: its chains, then the synthetic
|
|
18
|
+
* non-EVM chains getDefaultConfig appends, with transports for the real ones
|
|
19
|
+
* only.
|
|
20
|
+
*/
|
|
21
|
+
function walletProviderConfig() {
|
|
22
|
+
const map = new Map<string, string>();
|
|
23
|
+
return createConfig({
|
|
24
|
+
chains: [mainnet, polygon, solanaChain],
|
|
25
|
+
connectors: [mock({ accounts: [account], features: {} })],
|
|
26
|
+
transports: chainTransports([mainnet, polygon]),
|
|
27
|
+
storage: createStorage({
|
|
28
|
+
storage: {
|
|
29
|
+
getItem: (key) => map.get(key) ?? null,
|
|
30
|
+
setItem: (key, value) => void map.set(key, value),
|
|
31
|
+
removeItem: (key) => void map.delete(key),
|
|
32
|
+
},
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const rendered: { unmount(): void }[] = [];
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
for (const r of rendered.splice(0)) r.unmount();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
function render(config: ReturnType<typeof walletProviderConfig>, chainId?: number) {
|
|
43
|
+
const queryClient = new QueryClient();
|
|
44
|
+
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
45
|
+
<WagmiProvider config={config}>
|
|
46
|
+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
47
|
+
</WagmiProvider>
|
|
48
|
+
);
|
|
49
|
+
const hook = renderHook(() => useEvmReadClient(chainId ? { chainId } : {}), { wrapper });
|
|
50
|
+
rendered.push(hook);
|
|
51
|
+
return hook;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
describe("useEvmReadClient in a WalletProvider's wagmi config", () => {
|
|
55
|
+
it("reads the default chain before any wallet connects", () => {
|
|
56
|
+
const { result } = render(walletProviderConfig());
|
|
57
|
+
expect(result.current?.chainId).toBe(mainnet.id);
|
|
58
|
+
expect(result.current?.address).toBeNull();
|
|
59
|
+
expect(result.current?.publicClient.chain?.id).toBe(mainnet.id);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("follows the connected EVM wallet's chain, and keeps the chain it names", async () => {
|
|
63
|
+
const config = walletProviderConfig();
|
|
64
|
+
const current = render(config);
|
|
65
|
+
const named = render(config, mainnet.id);
|
|
66
|
+
await act(() => connect(config, { connector: config.connectors[0], chainId: polygon.id }));
|
|
67
|
+
expect(current.result.current?.chainId).toBe(polygon.id);
|
|
68
|
+
expect(named.result.current?.chainId).toBe(mainnet.id);
|
|
69
|
+
await act(() => disconnect(config));
|
|
70
|
+
expect(current.result.current?.chainId).toBe(polygon.id);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("reads the default chain while a non-EVM wallet holds a synthetic chain", () => {
|
|
74
|
+
const config = walletProviderConfig();
|
|
75
|
+
const { result } = render(config);
|
|
76
|
+
act(() => config.setState((state) => ({ ...state, chainId: solanaChain.id })));
|
|
77
|
+
expect(result.current?.chainId).toBe(mainnet.id);
|
|
78
|
+
expect(render(config, polygon.id).result.current?.chainId).toBe(polygon.id);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("is undefined for a chain the config does not offer, or one with no RPC", () => {
|
|
82
|
+
const config = walletProviderConfig();
|
|
83
|
+
expect(render(config, 999).result.current).toBeUndefined();
|
|
84
|
+
expect(render(config, solanaChain.id).result.current).toBeUndefined();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("keeps one client while the chain stays put", () => {
|
|
88
|
+
const { result, rerender } = render(walletProviderConfig());
|
|
89
|
+
const first = result.current;
|
|
90
|
+
rerender();
|
|
91
|
+
expect(result.current).toBe(first);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
@@ -19,7 +19,10 @@ import type { SignInMessageOptions, WalletAdapter, WalletAddress } from "./types
|
|
|
19
19
|
|
|
20
20
|
interface UnisatProvider {
|
|
21
21
|
requestAccounts(): Promise<string[]>;
|
|
22
|
+
getAccounts?(): Promise<string[]>;
|
|
22
23
|
signMessage(message: string, type?: "ecdsa" | "bip322-simple"): Promise<string>;
|
|
24
|
+
on?(event: "accountsChanged", listener: (accounts: string[]) => void): void;
|
|
25
|
+
removeListener?(event: "accountsChanged", listener: (accounts: string[]) => void): void;
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
interface PhantomBtcAccount {
|
|
@@ -30,8 +33,18 @@ interface PhantomBtcAccount {
|
|
|
30
33
|
interface PhantomBtcProvider {
|
|
31
34
|
requestAccounts(): Promise<PhantomBtcAccount[]>;
|
|
32
35
|
signMessage(address: string, message: Uint8Array): Promise<{ signature: Uint8Array }>;
|
|
36
|
+
on?(event: "accountsChanged", listener: (accounts: PhantomBtcAccount[]) => void): void;
|
|
37
|
+
off?(event: "accountsChanged", listener: (accounts: PhantomBtcAccount[]) => void): void;
|
|
38
|
+
removeListener?(
|
|
39
|
+
event: "accountsChanged",
|
|
40
|
+
listener: (accounts: PhantomBtcAccount[]) => void,
|
|
41
|
+
): void;
|
|
33
42
|
}
|
|
34
43
|
|
|
44
|
+
/** BIP-322 P2WPKH only: the native-segwit "payment" account (bc1q…). */
|
|
45
|
+
const paymentAccount = (accounts: readonly PhantomBtcAccount[] | undefined) =>
|
|
46
|
+
accounts?.find((a) => a.purpose === "payment" || a.addressType === "p2wpkh") ?? accounts?.[0];
|
|
47
|
+
|
|
35
48
|
function bytesToBase64(bytes: Uint8Array): string {
|
|
36
49
|
let s = "";
|
|
37
50
|
for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
|
|
@@ -65,10 +78,7 @@ export class BitcoinAdapter implements WalletAdapter {
|
|
|
65
78
|
}
|
|
66
79
|
if (w.phantom?.bitcoin) {
|
|
67
80
|
const phantom = w.phantom.bitcoin;
|
|
68
|
-
const
|
|
69
|
-
// BIP-322 P2WPKH only: pick the native-segwit "payment" account (bc1q…).
|
|
70
|
-
const payment =
|
|
71
|
-
accounts.find((a) => a.purpose === "payment" || a.addressType === "p2wpkh") ?? accounts[0];
|
|
81
|
+
const payment = paymentAccount(await phantom.requestAccounts());
|
|
72
82
|
if (!payment) throw new Error("Bitcoin wallet returned no accounts");
|
|
73
83
|
this.kind = "phantom";
|
|
74
84
|
this.phantom = phantom;
|
|
@@ -79,6 +89,56 @@ export class BitcoinAdapter implements WalletAdapter {
|
|
|
79
89
|
throw new Error("No Bitcoin wallet found. Install a Bitcoin wallet (Unisat, OKX, Phantom).");
|
|
80
90
|
}
|
|
81
91
|
|
|
92
|
+
/**
|
|
93
|
+
* Reconnects without a prompt through UniSat's or OKX's `getAccounts`.
|
|
94
|
+
* Resolves false when the wallet no longer trusts the page, and for
|
|
95
|
+
* Phantom, whose Bitcoin provider has no silent path. Throws when no
|
|
96
|
+
* Bitcoin wallet is injected yet.
|
|
97
|
+
*/
|
|
98
|
+
async restore(): Promise<boolean> {
|
|
99
|
+
const w = window as unknown as {
|
|
100
|
+
unisat?: UnisatProvider;
|
|
101
|
+
okxwallet?: { bitcoin?: UnisatProvider };
|
|
102
|
+
phantom?: { bitcoin?: PhantomBtcProvider };
|
|
103
|
+
};
|
|
104
|
+
const unisat = w.unisat ?? w.okxwallet?.bitcoin;
|
|
105
|
+
if (unisat) {
|
|
106
|
+
const accounts = (await unisat.getAccounts?.()) ?? [];
|
|
107
|
+
if (!accounts.length) return false;
|
|
108
|
+
this.kind = "unisat";
|
|
109
|
+
this.unisat = unisat;
|
|
110
|
+
this.address = accounts[0];
|
|
111
|
+
this.isConnected = true;
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
if (w.phantom?.bitcoin) return false;
|
|
115
|
+
throw new Error("No Bitcoin wallet found yet.");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The wallet's account switches; an empty list means it disconnected. */
|
|
119
|
+
subscribe(listener: () => void): () => void {
|
|
120
|
+
const update = (address: string | null) => {
|
|
121
|
+
this.address = address;
|
|
122
|
+
this.isConnected = address !== null;
|
|
123
|
+
listener();
|
|
124
|
+
};
|
|
125
|
+
const unisat = this.kind === "unisat" ? this.unisat : null;
|
|
126
|
+
if (unisat?.on) {
|
|
127
|
+
const onAccounts = (accounts: string[]) => update(accounts[0] ?? null);
|
|
128
|
+
unisat.on("accountsChanged", onAccounts);
|
|
129
|
+
return () => unisat.removeListener?.("accountsChanged", onAccounts);
|
|
130
|
+
}
|
|
131
|
+
const phantom = this.kind === "phantom" ? this.phantom : null;
|
|
132
|
+
if (phantom?.on) {
|
|
133
|
+
const onAccounts = (accounts: PhantomBtcAccount[]) =>
|
|
134
|
+
update(paymentAccount(accounts)?.address ?? null);
|
|
135
|
+
phantom.on("accountsChanged", onAccounts);
|
|
136
|
+
return () =>
|
|
137
|
+
(phantom.off ?? phantom.removeListener)?.call(phantom, "accountsChanged", onAccounts);
|
|
138
|
+
}
|
|
139
|
+
return () => {};
|
|
140
|
+
}
|
|
141
|
+
|
|
82
142
|
async disconnect(): Promise<void> {
|
|
83
143
|
this.kind = null;
|
|
84
144
|
this.unisat = null;
|
|
@@ -37,12 +37,17 @@ function base58encode(bytes: Uint8Array): string {
|
|
|
37
37
|
return str;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
type SolanaListener = (publicKey?: { toString(): string } | null) => void;
|
|
41
|
+
|
|
40
42
|
interface InjectedSolana {
|
|
41
43
|
isPhantom?: boolean;
|
|
42
44
|
publicKey?: { toString(): string } | null;
|
|
43
45
|
connect(opts?: { onlyIfTrusted?: boolean }): Promise<{ publicKey: { toString(): string } }>;
|
|
44
46
|
disconnect(): Promise<void>;
|
|
45
47
|
signMessage(message: Uint8Array, display?: "utf8" | "hex"): Promise<{ signature: Uint8Array }>;
|
|
48
|
+
on?(event: "accountChanged" | "disconnect", listener: SolanaListener): void;
|
|
49
|
+
off?(event: "accountChanged" | "disconnect", listener: SolanaListener): void;
|
|
50
|
+
removeListener?(event: "accountChanged" | "disconnect", listener: SolanaListener): void;
|
|
46
51
|
}
|
|
47
52
|
|
|
48
53
|
function getInjectedProvider(): InjectedSolana {
|
|
@@ -72,6 +77,50 @@ export class SolanaAdapter implements WalletAdapter {
|
|
|
72
77
|
this.isConnected = true;
|
|
73
78
|
}
|
|
74
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Reconnects without a prompt (`onlyIfTrusted`). Resolves false when the
|
|
82
|
+
* wallet refuses because it no longer trusts the page (4001); throws on
|
|
83
|
+
* any other failure, and when no wallet is injected yet.
|
|
84
|
+
*/
|
|
85
|
+
async restore(): Promise<boolean> {
|
|
86
|
+
const provider = getInjectedProvider();
|
|
87
|
+
try {
|
|
88
|
+
const { publicKey } = await provider.connect({ onlyIfTrusted: true });
|
|
89
|
+
this.address = publicKey.toString();
|
|
90
|
+
this.isConnected = true;
|
|
91
|
+
return true;
|
|
92
|
+
} catch (error) {
|
|
93
|
+
if ((error as { code?: unknown } | null)?.code === 4001) return false;
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The wallet's account switches and disconnects. Phantom reports a null
|
|
100
|
+
* account when the user switches to one this page has not connected, so the
|
|
101
|
+
* page must connect again; the adapter treats it as a disconnect.
|
|
102
|
+
*/
|
|
103
|
+
subscribe(listener: () => void): () => void {
|
|
104
|
+
const provider = getInjectedProvider();
|
|
105
|
+
const onAccount: SolanaListener = (publicKey) => {
|
|
106
|
+
this.address = publicKey ? publicKey.toString() : null;
|
|
107
|
+
this.isConnected = this.address !== null;
|
|
108
|
+
listener();
|
|
109
|
+
};
|
|
110
|
+
const onDisconnect: SolanaListener = () => {
|
|
111
|
+
this.address = null;
|
|
112
|
+
this.isConnected = false;
|
|
113
|
+
listener();
|
|
114
|
+
};
|
|
115
|
+
provider.on?.("accountChanged", onAccount);
|
|
116
|
+
provider.on?.("disconnect", onDisconnect);
|
|
117
|
+
return () => {
|
|
118
|
+
const off = (provider.off ?? provider.removeListener)?.bind(provider);
|
|
119
|
+
off?.("accountChanged", onAccount);
|
|
120
|
+
off?.("disconnect", onDisconnect);
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
75
124
|
async disconnect(): Promise<void> {
|
|
76
125
|
try {
|
|
77
126
|
await getInjectedProvider().disconnect();
|