@multiplatform.one/web3 7.26.0 → 7.28.1
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 +17 -0
- package/dist/cjs/core/family.native.js +17 -0
- package/dist/cjs/core/family.native.js.map +1 -1
- package/dist/cjs/core/index.cjs +10 -1
- package/dist/cjs/core/index.native.js +10 -1
- package/dist/cjs/core/index.native.js.map +1 -1
- 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/react.cjs +12 -1
- package/dist/cjs/core/react.native.js +16 -1
- package/dist/cjs/core/react.native.js.map +1 -1
- 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 +47 -2
- package/dist/cjs/core/store.native.js +49 -2
- package/dist/cjs/core/store.native.js.map +1 -1
- 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 +22 -2
- package/dist/cjs/index.native.js +21 -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 +17 -0
- package/dist/esm/core/family.mjs.map +1 -1
- package/dist/esm/core/family.native.js +17 -0
- package/dist/esm/core/family.native.js.map +1 -1
- package/dist/esm/core/index.mjs +5 -3
- package/dist/esm/core/index.mjs.map +1 -1
- package/dist/esm/core/index.native.js +5 -3
- package/dist/esm/core/index.native.js.map +1 -1
- 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/react.mjs +10 -1
- package/dist/esm/core/react.mjs.map +1 -1
- package/dist/esm/core/react.native.js +14 -1
- package/dist/esm/core/react.native.js.map +1 -1
- 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 +47 -2
- package/dist/esm/core/store.mjs.map +1 -1
- package/dist/esm/core/store.native.js +49 -2
- package/dist/esm/core/store.native.js.map +1 -1
- 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 +6 -3
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +6 -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 +17 -0
- package/dist/jsx/core/family.mjs.map +1 -1
- package/dist/jsx/core/family.native.js +17 -0
- package/dist/jsx/core/family.native.js.map +1 -1
- package/dist/jsx/core/index.mjs +5 -3
- package/dist/jsx/core/index.mjs.map +1 -1
- package/dist/jsx/core/index.native.js +10 -1
- package/dist/jsx/core/index.native.js.map +1 -1
- 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/react.mjs +10 -1
- package/dist/jsx/core/react.mjs.map +1 -1
- package/dist/jsx/core/react.native.js +16 -1
- package/dist/jsx/core/react.native.js.map +1 -1
- 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 +47 -2
- package/dist/jsx/core/store.mjs.map +1 -1
- package/dist/jsx/core/store.native.js +49 -2
- package/dist/jsx/core/store.native.js.map +1 -1
- 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 +6 -3
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +6 -3
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +21 -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 +19 -0
- package/src/core/family.ts +43 -0
- package/src/core/imports.spec.ts +1 -1
- package/src/core/index.ts +23 -0
- package/src/core/lightDriver.spec.ts +284 -0
- package/src/core/lightDriver.ts +235 -0
- package/src/core/react.ts +18 -0
- package/src/core/signIn.spec.tsx +305 -0
- package/src/core/signIn.ts +282 -0
- package/src/core/store.spec.ts +83 -0
- package/src/core/store.ts +60 -9
- package/src/core/types.ts +15 -1
- 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 +38 -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 +26 -0
- package/types/core/family.d.ts.map +1 -1
- package/types/core/index.d.ts +6 -4
- package/types/core/index.d.ts.map +1 -1
- package/types/core/lightDriver.d.ts +52 -0
- package/types/core/lightDriver.d.ts.map +1 -0
- package/types/core/react.d.ts +4 -0
- package/types/core/react.d.ts.map +1 -1
- package/types/core/signIn.d.ts +85 -0
- package/types/core/signIn.d.ts.map +1 -0
- package/types/core/store.d.ts +12 -3
- package/types/core/store.d.ts.map +1 -1
- package/types/core/types.d.ts +14 -1
- package/types/core/types.d.ts.map +1 -1
- 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 +5 -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
package/docs/bridge-protocol.md
CHANGED
|
@@ -77,7 +77,12 @@ The React Native host in this package is looser than this section asks:
|
|
|
77
77
|
react-native-webview reports the sending frame's URL but not whether it is
|
|
78
78
|
the top frame, so it accepts same-origin frames, and on an Android WebView
|
|
79
79
|
without `WEB_MESSAGE_LISTENER` it sees the top frame's URL for every frame.
|
|
80
|
-
The origin check in the delivery script still holds there.
|
|
80
|
+
The origin check in the delivery script still holds there. Navigations are
|
|
81
|
+
the same on Android: react-native-webview leaves `isTopFrame` out of
|
|
82
|
+
`onShouldStartLoadWithRequest`, or hardcodes it to true on its fallback path
|
|
83
|
+
(`TopShouldStartLoadWithRequestEvent.kt`), so every navigation Android asks
|
|
84
|
+
about counts as the top frame and the sub-frame rule in section 5 never runs
|
|
85
|
+
there. A sub-frame navigation to another web origin goes to the OS.
|
|
81
86
|
|
|
82
87
|
**Android (Kotlin).** Receive page messages with
|
|
83
88
|
`WebViewCompat.addWebMessageListener(webView, "ReactNativeWebView", setOf(pageOrigin), listener)`,
|
|
@@ -194,7 +199,8 @@ Event:
|
|
|
194
199
|
it answers `-32601`.
|
|
195
200
|
4. On a reload the page sends `ready` again. Requests in flight when the page
|
|
196
201
|
went away never get an answer: fail them on the host (a reload, a crash,
|
|
197
|
-
`onRenderProcessGone` / `webViewWebContentProcessDidTerminate`)
|
|
202
|
+
`onRenderProcessGone` / `webViewWebContentProcessDidTerminate`), and
|
|
203
|
+
close anything showing the page, since the reloaded page starts closed.
|
|
198
204
|
5. When the app returns to the foreground (typically back from a wallet app)
|
|
199
205
|
the host sends `sys.resync` so the page re-reports account state.
|
|
200
206
|
|
|
@@ -233,10 +239,17 @@ tokens, and a foreign page would receive them. Android does not ask
|
|
|
233
239
|
`shouldOverrideUrlLoading` about a POST (a form with `target=_top`), so also
|
|
234
240
|
watch the top frame start loading (`onPageStarted` /
|
|
235
241
|
`didStartProvisionalNavigation`): a document on another origin means the page
|
|
236
|
-
is gone. Fail what is in flight
|
|
237
|
-
`sys.ready`,
|
|
238
|
-
|
|
239
|
-
|
|
242
|
+
is gone. Fail what is in flight, deliver nothing until the next
|
|
243
|
+
`sys.ready`, and close anything showing the page: the page that comes back
|
|
244
|
+
has none of its old state. Then load the page's URL again (not a reload,
|
|
245
|
+
which would reload the foreign document). Count one reload per foreign
|
|
246
|
+
document: until the page's own URL starts loading, a further foreign report
|
|
247
|
+
is the same document (Android reports a pushState or a client redirect
|
|
248
|
+
again). Twice at most until the page announces itself; after that stop
|
|
249
|
+
loading it, drop the foreign document, fail every request at once with
|
|
250
|
+
`-33002`, and try again only on a user action such as the app returning to
|
|
251
|
+
the foreground. Sub-frame loads
|
|
252
|
+
are the page's business; allow them unless they are wallet links.
|
|
240
253
|
|
|
241
254
|
New windows (`window.open`, `target=_blank`; `onCreateWindow` /
|
|
242
255
|
`createWebViewWith`) never open in the app: wallet links and `http`/`https`
|
|
@@ -274,6 +287,14 @@ redirect, whose `code` is the host's. MetaMask Connect needs only the
|
|
|
274
287
|
|
|
275
288
|
`evm` errors are whatever the wallet's EIP-1193 provider threw, with its code.
|
|
276
289
|
|
|
290
|
+
The host raises two more codes to its own callers when the page cannot
|
|
291
|
+
answer. They never cross the wire.
|
|
292
|
+
|
|
293
|
+
| code | meaning |
|
|
294
|
+
| -------- | ---------------------------------------------------------------------------------------- |
|
|
295
|
+
| `-33001` | the page went away (a reload, a crash, a foreign document) before it answered; retry |
|
|
296
|
+
| `-33002` | the host stopped loading the page back (section 5); requests fail at once until it tries |
|
|
297
|
+
|
|
277
298
|
## 7. Namespaces
|
|
278
299
|
|
|
279
300
|
### `sys`
|
|
@@ -315,26 +336,32 @@ Events: `accountsChanged` (array of addresses), `chainChanged` (hex chain id),
|
|
|
315
336
|
|
|
316
337
|
| method | params | result |
|
|
317
338
|
| --------------------- | ------------------------------ | --------------------------------------------- |
|
|
339
|
+
| `account` | none | `{ "publicKey": base58 \| null }` |
|
|
318
340
|
| `connect` | none | `{ "publicKey": base58 }` |
|
|
319
341
|
| `disconnect` | none | `null` |
|
|
320
342
|
| `signMessage` | `{ "message": base64 }` | `{ "signature": base64 }` (ed25519, 64 bytes) |
|
|
321
343
|
| `signTransaction` | `{ "transaction": base64 }` | `{ "transaction": base64 }` |
|
|
322
344
|
| `signAllTransactions` | `{ "transactions": [base64] }` | `{ "transactions": [base64] }` |
|
|
323
345
|
|
|
324
|
-
|
|
325
|
-
|
|
346
|
+
`account` never prompts: it answers the connected wallet's key, or reconnects
|
|
347
|
+
one that already trusts the page, or answers null. A page older than this
|
|
348
|
+
method answers it with an error. Transactions are serialized legacy or
|
|
349
|
+
versioned transactions. Event: `accountChanged` with
|
|
350
|
+
`{ "publicKey": base58 | null }`.
|
|
326
351
|
|
|
327
352
|
### `sui`
|
|
328
353
|
|
|
329
|
-
| method | params | result
|
|
330
|
-
| ------------- | ----------------------- |
|
|
331
|
-
| `
|
|
332
|
-
| `
|
|
333
|
-
| `
|
|
354
|
+
| method | params | result |
|
|
355
|
+
| ------------- | ----------------------- | ------------------------------ |
|
|
356
|
+
| `account` | none | `{ "address": "0x…" \| null }` |
|
|
357
|
+
| `connect` | none | `{ "address": "0x…" }` |
|
|
358
|
+
| `disconnect` | none | `null` |
|
|
359
|
+
| `signMessage` | `{ "message": string }` | `{ "signature": base64 }` |
|
|
334
360
|
|
|
335
361
|
`message` is UTF-8 text, signed as a Sui personal message. `signature` is
|
|
336
362
|
Sui's serialized signature (flag, signature, public key), the form the
|
|
337
|
-
Keycloak Sui verifier takes. `signMessage` connects first when needed
|
|
363
|
+
Keycloak Sui verifier takes. `signMessage` connects first when needed, and
|
|
364
|
+
`account` never prompts, as on `solana`. Event:
|
|
338
365
|
`accountChanged` with `{ "address": string | null }`.
|
|
339
366
|
|
|
340
367
|
```json
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplatform.one/web3",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.28.1",
|
|
4
4
|
"description": "Web3 wallet integration for multiplatform.one ecosystem with ConnectKit and wagmi",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"connectkit",
|
|
@@ -54,6 +54,12 @@
|
|
|
54
54
|
"require": "./dist/cjs/index.native.js",
|
|
55
55
|
"default": "./dist/esm/index.native.js"
|
|
56
56
|
},
|
|
57
|
+
"./web": {
|
|
58
|
+
"source": "./src/web.ts",
|
|
59
|
+
"types": "./types/web.d.ts",
|
|
60
|
+
"import": "./dist/esm/web.mjs",
|
|
61
|
+
"require": "./dist/cjs/web.cjs"
|
|
62
|
+
},
|
|
57
63
|
"./bridge": {
|
|
58
64
|
"source": "./src/bridge/core.ts",
|
|
59
65
|
"react-native": "./src/bridge/core.ts",
|
|
@@ -107,10 +113,10 @@
|
|
|
107
113
|
"dependencies": {
|
|
108
114
|
"@aave/account": "^0.2.0",
|
|
109
115
|
"@metamask/connect-evm": "^2.1.1",
|
|
110
|
-
"@multiplatform.one/connectkit": "7.
|
|
111
|
-
"@multiplatform.one/gpg": "7.
|
|
112
|
-
"@multiplatform.one/platform": "7.
|
|
113
|
-
"@multiplatform.one/theme": "7.
|
|
116
|
+
"@multiplatform.one/connectkit": "7.28.1",
|
|
117
|
+
"@multiplatform.one/gpg": "7.28.1",
|
|
118
|
+
"@multiplatform.one/platform": "7.28.1",
|
|
119
|
+
"@multiplatform.one/theme": "7.28.1",
|
|
114
120
|
"@noble/curves": "^1.9.7",
|
|
115
121
|
"@solana/kit": "^8.3.0",
|
|
116
122
|
"@solana/wallet-adapter-base": "^0.9.27",
|
|
@@ -134,7 +140,7 @@
|
|
|
134
140
|
"wagmi": "^3.7.1"
|
|
135
141
|
},
|
|
136
142
|
"devDependencies": {
|
|
137
|
-
"@multiplatform.one/config": "7.
|
|
143
|
+
"@multiplatform.one/config": "7.28.1",
|
|
138
144
|
"@tamagui/build": "2.7.6",
|
|
139
145
|
"@tanstack/react-query": "^5.100.7",
|
|
140
146
|
"@testing-library/jest-dom": "^6.9.1",
|
|
@@ -174,6 +180,7 @@
|
|
|
174
180
|
"build:webview": "vite build --config webview/vite.config.ts && mv -f assets/index.html assets/webview.html && node scripts/verify-no-walletconnect.mjs assets/webview.html",
|
|
175
181
|
"build:mock-wallet": "vite build --config webview-mock-wallet/vite.config.ts && mv -f assets/index.html assets/mock-wallet.html",
|
|
176
182
|
"test:iife": "vite build --config keycloak-login/vite.config.ts && node scripts/verify-no-walletconnect.mjs dist/keycloak/login.iife.js && vitest run --config keycloak-login/vitest.config.mjs",
|
|
183
|
+
"test:web-entry": "vitest run --config web-entry/vitest.config.mjs",
|
|
177
184
|
"test": "vitest run --coverage --coverage.provider=v8 --coverage.reporter=text --coverage.reporter=lcov --coverage.reporter=html"
|
|
178
185
|
}
|
|
179
186
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import bs58 from "bs58";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { bytesToBase58 } from "./base58";
|
|
4
|
+
|
|
5
|
+
describe("bytesToBase58", () => {
|
|
6
|
+
it("matches bs58 on keys, signatures, leading zeros and the empty input", () => {
|
|
7
|
+
const samples = [
|
|
8
|
+
new Uint8Array([]),
|
|
9
|
+
new Uint8Array([0]),
|
|
10
|
+
new Uint8Array([0, 0, 1, 2, 255]),
|
|
11
|
+
new Uint8Array(32).fill(255),
|
|
12
|
+
...Array.from({ length: 50 }, (_, n) =>
|
|
13
|
+
crypto.getRandomValues(new Uint8Array(n % 2 ? 64 : 32)),
|
|
14
|
+
),
|
|
15
|
+
];
|
|
16
|
+
for (const bytes of samples) expect(bytesToBase58(bytes)).toBe(bs58.encode(bytes));
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Pure-JS base58 (the Bitcoin alphabet Solana uses) for the native side, where
|
|
2
|
+
// bs58's ESM-only build does not load under Hermes.
|
|
3
|
+
|
|
4
|
+
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
5
|
+
|
|
6
|
+
export function bytesToBase58(bytes: Uint8Array): string {
|
|
7
|
+
let zeros = 0;
|
|
8
|
+
while (zeros < bytes.length && bytes[zeros] === 0) zeros += 1;
|
|
9
|
+
const digits: number[] = [];
|
|
10
|
+
for (let i = zeros; i < bytes.length; i += 1) {
|
|
11
|
+
let carry = bytes[i];
|
|
12
|
+
for (let j = 0; j < digits.length; j += 1) {
|
|
13
|
+
carry += digits[j] << 8;
|
|
14
|
+
digits[j] = carry % 58;
|
|
15
|
+
carry = Math.floor(carry / 58);
|
|
16
|
+
}
|
|
17
|
+
while (carry > 0) {
|
|
18
|
+
digits.push(carry % 58);
|
|
19
|
+
carry = Math.floor(carry / 58);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
let out = "1".repeat(zeros);
|
|
23
|
+
for (let i = digits.length - 1; i >= 0; i -= 1) out += ALPHABET[digits[i]];
|
|
24
|
+
return out;
|
|
25
|
+
}
|
package/src/bridge/core.ts
CHANGED
|
@@ -11,6 +11,7 @@ export { bytesToBase64, base64ToBytes } from "./base64";
|
|
|
11
11
|
export { SolanaBridge } from "./SolanaBridge";
|
|
12
12
|
export { SuiBridge } from "./SuiBridge";
|
|
13
13
|
export { GpgBridge, type GpgPendingRequest } from "./GpgBridge";
|
|
14
|
+
export { solanaBridgeDriver, suiBridgeDriver, type SolanaBridgeDriverOptions } from "./drivers";
|
|
14
15
|
export {
|
|
15
16
|
AuthBridge,
|
|
16
17
|
type AuthBridgeOptions,
|
|
@@ -28,6 +29,7 @@ export {
|
|
|
28
29
|
export {
|
|
29
30
|
buildInjectScript,
|
|
30
31
|
createNativeBridge,
|
|
32
|
+
NativeBridgeErrorCode,
|
|
31
33
|
type NativeBridge,
|
|
32
34
|
type NativeBridgeOptions,
|
|
33
35
|
} from "./nativeHost";
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import bs58 from "bs58";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import {
|
|
4
|
+
createWallets,
|
|
5
|
+
describeConnectionDriver,
|
|
6
|
+
type DriverHarness,
|
|
7
|
+
type Wallets,
|
|
8
|
+
} from "../../tests/core/driverContract";
|
|
9
|
+
import { registerSolanaHandler, type SolanaByteSigner } from "../../webview/handlers/solana";
|
|
10
|
+
import { registerSuiHandler, type SuiMessageSigner } from "../../webview/handlers/sui";
|
|
11
|
+
import { createMockSolanaSigner } from "../../webview/wiring/mockSolanaSigner";
|
|
12
|
+
import { createMockSuiSigner } from "../../webview/wiring/mockSuiSigner";
|
|
13
|
+
import { solanaMessageClient } from "../clients/solanaMessage";
|
|
14
|
+
import { suiClient } from "../clients/sui";
|
|
15
|
+
import { lightDriver, type LightWallet } from "../core/lightDriver";
|
|
16
|
+
import { verifySiwsSignature } from "../siws/verify";
|
|
17
|
+
import { BridgeClient } from "./BridgeClient";
|
|
18
|
+
import { BridgeHost } from "./BridgeHost";
|
|
19
|
+
import {
|
|
20
|
+
solanaBridgeDriver,
|
|
21
|
+
solanaBridgeWallet,
|
|
22
|
+
suiBridgeDriver,
|
|
23
|
+
suiBridgeWallet,
|
|
24
|
+
} from "./drivers";
|
|
25
|
+
import { createMemoryTransportPair } from "./transport";
|
|
26
|
+
|
|
27
|
+
const utf8 = (text: string) => new TextEncoder().encode(text);
|
|
28
|
+
const signed = (address: string, message: string) => `signed:${address}:${message}`;
|
|
29
|
+
|
|
30
|
+
/** The page side of one scripted wallet: what the hosted page's signer does for it. */
|
|
31
|
+
function pageWallet(wallets: Wallets, id: string) {
|
|
32
|
+
let listener: ((address: string | null) => void) | null = null;
|
|
33
|
+
const wallet = () => wallets.get(id);
|
|
34
|
+
return {
|
|
35
|
+
current: () => (wallet().open ? wallet().address : null),
|
|
36
|
+
async connect() {
|
|
37
|
+
await wallets.answer(id, "prompt");
|
|
38
|
+
wallet().authorized = true;
|
|
39
|
+
wallet().open = true;
|
|
40
|
+
return wallet().address;
|
|
41
|
+
},
|
|
42
|
+
async restore() {
|
|
43
|
+
if (wallet().open) return wallet().address;
|
|
44
|
+
if (!wallet().authorized) return null;
|
|
45
|
+
await wallets.answer(id, "restore");
|
|
46
|
+
wallet().open = true;
|
|
47
|
+
return wallet().address;
|
|
48
|
+
},
|
|
49
|
+
async disconnect() {
|
|
50
|
+
wallet().open = false;
|
|
51
|
+
},
|
|
52
|
+
onAccountChanged(next: (address: string | null) => void) {
|
|
53
|
+
listener = next;
|
|
54
|
+
return () => {
|
|
55
|
+
listener = null;
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
emit: (address: string | null) => listener?.(address),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function solanaPage(wallets: Wallets, id: string, host: BridgeHost) {
|
|
63
|
+
const page = pageWallet(wallets, id);
|
|
64
|
+
const signer: SolanaByteSigner = {
|
|
65
|
+
getPublicKey: page.current,
|
|
66
|
+
connect: async () => ({ publicKey: await page.connect() }),
|
|
67
|
+
restore: page.restore,
|
|
68
|
+
disconnect: page.disconnect,
|
|
69
|
+
async signMessage(message) {
|
|
70
|
+
const address = page.current();
|
|
71
|
+
if (!address) throw new Error("not connected");
|
|
72
|
+
return utf8(signed(address, new TextDecoder().decode(message)));
|
|
73
|
+
},
|
|
74
|
+
signTransaction: async () => Promise.reject(new Error("unsupported")),
|
|
75
|
+
signAllTransactions: async () => Promise.reject(new Error("unsupported")),
|
|
76
|
+
onAccountChanged: page.onAccountChanged,
|
|
77
|
+
};
|
|
78
|
+
registerSolanaHandler(host, signer);
|
|
79
|
+
return page;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function suiPage(wallets: Wallets, id: string, host: BridgeHost) {
|
|
83
|
+
const page = pageWallet(wallets, id);
|
|
84
|
+
const signer: SuiMessageSigner = {
|
|
85
|
+
getAddress: page.current,
|
|
86
|
+
connect: async () => ({ address: await page.connect() }),
|
|
87
|
+
restore: page.restore,
|
|
88
|
+
disconnect: page.disconnect,
|
|
89
|
+
async signMessage(message) {
|
|
90
|
+
const address = page.current();
|
|
91
|
+
if (!address) throw new Error("not connected");
|
|
92
|
+
return signed(address, message);
|
|
93
|
+
},
|
|
94
|
+
onAccountChanged: page.onAccountChanged,
|
|
95
|
+
};
|
|
96
|
+
registerSuiHandler(host, signer);
|
|
97
|
+
return page;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** A page per wallet, each on its own bridge, so one light driver drives three bridge wallets. */
|
|
101
|
+
function harness(family: "solana" | "sui") {
|
|
102
|
+
const addresses =
|
|
103
|
+
family === "solana"
|
|
104
|
+
? {
|
|
105
|
+
phantom: "7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV",
|
|
106
|
+
solflare: "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
|
|
107
|
+
backpack: "DRpbCBMxVnDK7maPM5tGv6MvB3v1sRMC86PZ8okm21hy",
|
|
108
|
+
}
|
|
109
|
+
: {
|
|
110
|
+
phantom: `0x${"a1".repeat(32)}`,
|
|
111
|
+
solflare: `0x${"b2".repeat(32)}`,
|
|
112
|
+
backpack: `0x${"c3".repeat(32)}`,
|
|
113
|
+
};
|
|
114
|
+
const other =
|
|
115
|
+
family === "solana" ? "GLoWMgcn3VbyFKiC2FGMgfKxYSyTJS7uKFwKY2CSkq9X" : `0x${"d4".repeat(32)}`;
|
|
116
|
+
const wallets = createWallets(addresses);
|
|
117
|
+
const ids = Object.keys(addresses);
|
|
118
|
+
const pages = new Map<string, ReturnType<typeof pageWallet>>();
|
|
119
|
+
const clients = new Map<string, BridgeClient>();
|
|
120
|
+
for (const id of ids) {
|
|
121
|
+
const { a, b } = createMemoryTransportPair();
|
|
122
|
+
const host = new BridgeHost(b);
|
|
123
|
+
pages.set(id, family === "solana" ? solanaPage(wallets, id, host) : suiPage(wallets, id, host));
|
|
124
|
+
clients.set(id, new BridgeClient(a));
|
|
125
|
+
}
|
|
126
|
+
const build = () => {
|
|
127
|
+
const list: LightWallet[] = ids.map((id) =>
|
|
128
|
+
family === "solana"
|
|
129
|
+
? solanaBridgeWallet(clients.get(id)!, { id, name: id })
|
|
130
|
+
: suiBridgeWallet(clients.get(id)!, { id, name: id }),
|
|
131
|
+
);
|
|
132
|
+
return lightDriver({
|
|
133
|
+
wallets: () => list,
|
|
134
|
+
chainId: family === "solana" ? "solana:mainnet" : "sui:mainnet",
|
|
135
|
+
client: (wallet) =>
|
|
136
|
+
family === "solana" ? solanaMessageClient(wallet.adapter) : suiClient(wallet.adapter),
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
const result: DriverHarness = {
|
|
140
|
+
driver: build(),
|
|
141
|
+
wallets,
|
|
142
|
+
first: "phantom",
|
|
143
|
+
second: "solflare",
|
|
144
|
+
third: "backpack",
|
|
145
|
+
otherAddress: other,
|
|
146
|
+
multiple: true,
|
|
147
|
+
normalize: (address) => address,
|
|
148
|
+
switchAccount(id, address) {
|
|
149
|
+
wallets.get(id).address = address;
|
|
150
|
+
pages.get(id)!.emit(address);
|
|
151
|
+
},
|
|
152
|
+
walletDisconnect(id) {
|
|
153
|
+
wallets.get(id).open = false;
|
|
154
|
+
pages.get(id)!.emit(null);
|
|
155
|
+
},
|
|
156
|
+
remount: build,
|
|
157
|
+
verify: (address, message, signature) =>
|
|
158
|
+
family === "solana"
|
|
159
|
+
? signature === bs58.encode(utf8(signed(address, message)))
|
|
160
|
+
: signature === signed(address, message),
|
|
161
|
+
};
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
describeConnectionDriver("the Solana bridge wallet", () => harness("solana"));
|
|
166
|
+
describeConnectionDriver("the Sui bridge wallet", () => harness("sui"));
|
|
167
|
+
|
|
168
|
+
function page() {
|
|
169
|
+
const { a, b } = createMemoryTransportPair();
|
|
170
|
+
return { client: new BridgeClient(a), host: new BridgeHost(b) };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
describe("solanaBridgeDriver", () => {
|
|
174
|
+
it("connects the page's Solana wallet and signs a message the SIWS verifier accepts", async () => {
|
|
175
|
+
const { client, host } = page();
|
|
176
|
+
registerSolanaHandler(host, createMockSolanaSigner());
|
|
177
|
+
const driver = solanaBridgeDriver(client, { chain: "solana:devnet" });
|
|
178
|
+
expect(driver.connectors()).toEqual([{ id: "webViewSolana", name: "Solana Wallet" }]);
|
|
179
|
+
|
|
180
|
+
const account = await driver.connect("webViewSolana");
|
|
181
|
+
expect(account.chainId).toBe("solana:devnet");
|
|
182
|
+
const solana = await driver.client!(driver.getState());
|
|
183
|
+
const message = "app.example.com wants you to sign in with your Solana account:\n…";
|
|
184
|
+
const signature = await solana!.signMessage(message);
|
|
185
|
+
|
|
186
|
+
expect(verifySiwsSignature(message, signature, account.address)).toBe(true);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("a page with no account method cannot tell, so a restore rejects and the store keeps it", async () => {
|
|
190
|
+
const { client, host } = page();
|
|
191
|
+
registerSolanaHandler(host, createMockSolanaSigner());
|
|
192
|
+
const older = {
|
|
193
|
+
request: async (ns: string, method: string, params?: unknown) => {
|
|
194
|
+
if (method === "account") throw new Error("unknown solana method: account");
|
|
195
|
+
return client.request(ns as "solana", method, params);
|
|
196
|
+
},
|
|
197
|
+
on: client.on.bind(client),
|
|
198
|
+
};
|
|
199
|
+
await expect(solanaBridgeDriver(older).reconnect("webViewSolana")).rejects.toThrow(
|
|
200
|
+
/unknown solana method/,
|
|
201
|
+
);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
describe("a page reload", () => {
|
|
206
|
+
it.each(["solana", "sui"] as const)(
|
|
207
|
+
"%s: the new page's account replaces the one the old page connected",
|
|
208
|
+
async (family) => {
|
|
209
|
+
const { client, host } = page();
|
|
210
|
+
const wallets = createWallets({
|
|
211
|
+
w:
|
|
212
|
+
family === "solana"
|
|
213
|
+
? "7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV"
|
|
214
|
+
: `0x${"ab".repeat(32)}`,
|
|
215
|
+
});
|
|
216
|
+
(family === "solana" ? solanaPage : suiPage)(wallets, "w", host);
|
|
217
|
+
const driver = (family === "solana" ? solanaBridgeDriver : suiBridgeDriver)(client);
|
|
218
|
+
const id = family === "solana" ? "webViewSolana" : "webViewSui";
|
|
219
|
+
await driver.connect(id);
|
|
220
|
+
expect(driver.getState().status).toBe("connected");
|
|
221
|
+
|
|
222
|
+
// The WebView reloads: the new document holds no wallet session, the
|
|
223
|
+
// wallet will not restore it silently, and the page announces itself.
|
|
224
|
+
wallets.get("w").open = false;
|
|
225
|
+
wallets.get("w").authorized = false;
|
|
226
|
+
host.ready();
|
|
227
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
228
|
+
|
|
229
|
+
expect(driver.getState()).toMatchObject({ status: "disconnected", account: null });
|
|
230
|
+
},
|
|
231
|
+
);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
describe("a slow account answer", () => {
|
|
235
|
+
it("does not touch a connection opened after it was asked, nor a newer account", async () => {
|
|
236
|
+
const { client, host } = page();
|
|
237
|
+
const X = `0x${"a1".repeat(32)}`;
|
|
238
|
+
const Y = `0x${"b2".repeat(32)}`;
|
|
239
|
+
const answers: ((value: unknown) => void)[] = [];
|
|
240
|
+
host.register("sui", async (method) => {
|
|
241
|
+
if (method === "connect") return { address: X };
|
|
242
|
+
if (method === "disconnect") return null;
|
|
243
|
+
if (method === "account") return new Promise((resolve) => answers.push(resolve));
|
|
244
|
+
throw new Error(method);
|
|
245
|
+
});
|
|
246
|
+
const driver = suiBridgeDriver(client);
|
|
247
|
+
await driver.connect("webViewSui");
|
|
248
|
+
|
|
249
|
+
// The page reloads and is slow to answer; the user reconnects meanwhile.
|
|
250
|
+
host.ready();
|
|
251
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
252
|
+
await driver.disconnect();
|
|
253
|
+
await driver.connect("webViewSui");
|
|
254
|
+
answers.shift()!({ address: null });
|
|
255
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
256
|
+
expect(driver.getState()).toMatchObject({ status: "connected", account: { address: X } });
|
|
257
|
+
|
|
258
|
+
// A newer accountChanged wins over an older account answer.
|
|
259
|
+
host.ready();
|
|
260
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
261
|
+
host.emit("sui", "accountChanged", { address: Y });
|
|
262
|
+
answers.shift()!({ address: X });
|
|
263
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
264
|
+
expect(driver.getState()).toMatchObject({ account: { address: Y } });
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
describe("suiBridgeDriver", () => {
|
|
269
|
+
it("connects the page's Sui wallet and signs through it", async () => {
|
|
270
|
+
const { client, host } = page();
|
|
271
|
+
registerSuiHandler(host, createMockSuiSigner());
|
|
272
|
+
const driver = suiBridgeDriver(client);
|
|
273
|
+
expect(driver.connectors()).toEqual([{ id: "webViewSui", name: "Sui Wallet" }]);
|
|
274
|
+
|
|
275
|
+
const account = await driver.connect("webViewSui");
|
|
276
|
+
expect(account).toMatchObject({
|
|
277
|
+
address: expect.stringMatching(/^0x[0-9a-f]{64}$/),
|
|
278
|
+
chainId: "sui:mainnet",
|
|
279
|
+
});
|
|
280
|
+
const sui = await driver.client!(driver.getState());
|
|
281
|
+
await expect(sui!.signMessage("hello")).resolves.toMatch(/^[A-Za-z0-9+/]+=*$/);
|
|
282
|
+
});
|
|
283
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { solanaMessageClient, type SolanaChain } from "../clients/solanaMessage";
|
|
2
|
+
import { suiClient } from "../clients/sui";
|
|
3
|
+
import type { BridgeRequester } from "../core/family";
|
|
4
|
+
import { lightDriver, type LightWallet, type LightWalletAdapter } from "../core/lightDriver";
|
|
5
|
+
import type { ConnectionDriver } from "../core/types";
|
|
6
|
+
import { base64ToBytes, bytesToBase64 } from "./base64";
|
|
7
|
+
import { bytesToBase58 } from "./base58";
|
|
8
|
+
|
|
9
|
+
/** How one bridge namespace names its account and carries a signature. */
|
|
10
|
+
interface BridgeWalletSpec {
|
|
11
|
+
readonly namespace: string;
|
|
12
|
+
/** The field `connect`, `account` and `accountChanged` carry the address in. */
|
|
13
|
+
readonly key: string;
|
|
14
|
+
sign(bridge: BridgeRequester, message: string): Promise<string>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface BridgeWalletOptions {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly name: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The hosted page's wallet on one bridge namespace, as the light driver drives
|
|
24
|
+
* a wallet. It reads the account from `connect`, `account` and the page's
|
|
25
|
+
* `accountChanged` events, and asks `account` again when a reloaded page
|
|
26
|
+
* announces itself, since the new document may hold no session or another.
|
|
27
|
+
*/
|
|
28
|
+
function bridgeWallet(
|
|
29
|
+
bridge: BridgeRequester,
|
|
30
|
+
spec: BridgeWalletSpec,
|
|
31
|
+
{ id, name }: BridgeWalletOptions,
|
|
32
|
+
): LightWallet {
|
|
33
|
+
const read = (value: unknown): string | null => {
|
|
34
|
+
const address = (value as Record<string, unknown> | null | undefined)?.[spec.key];
|
|
35
|
+
return typeof address === "string" && address ? address : null;
|
|
36
|
+
};
|
|
37
|
+
const adapter: LightWalletAdapter & { address: string | null } = {
|
|
38
|
+
address: null,
|
|
39
|
+
async connect() {
|
|
40
|
+
const address = read(await bridge.request(spec.namespace, "connect"));
|
|
41
|
+
if (!address) throw new Error(`${name} connected no account`);
|
|
42
|
+
adapter.address = address;
|
|
43
|
+
},
|
|
44
|
+
async disconnect() {
|
|
45
|
+
adapter.address = null;
|
|
46
|
+
await bridge.request(spec.namespace, "disconnect");
|
|
47
|
+
},
|
|
48
|
+
// A page older than the account method answers it with an error, which
|
|
49
|
+
// the store reads as "cannot tell yet" and keeps the connection to restore.
|
|
50
|
+
async restore() {
|
|
51
|
+
adapter.address = read(await bridge.request(spec.namespace, "account"));
|
|
52
|
+
return adapter.address !== null;
|
|
53
|
+
},
|
|
54
|
+
subscribe(listener) {
|
|
55
|
+
// An answer to `account` counts only while this connection is open and
|
|
56
|
+
// nothing newer has said which account it is.
|
|
57
|
+
let live = true;
|
|
58
|
+
let latest = 0;
|
|
59
|
+
const off = bridge.on((ns, method, params) => {
|
|
60
|
+
if (ns === spec.namespace && method === "accountChanged") {
|
|
61
|
+
latest += 1;
|
|
62
|
+
adapter.address = read(params);
|
|
63
|
+
listener();
|
|
64
|
+
} else if (ns === "sys" && method === "ready") {
|
|
65
|
+
const asked = ++latest;
|
|
66
|
+
bridge.request(spec.namespace, "account").then(
|
|
67
|
+
(answer) => {
|
|
68
|
+
if (!live || asked !== latest) return;
|
|
69
|
+
adapter.address = read(answer);
|
|
70
|
+
listener();
|
|
71
|
+
},
|
|
72
|
+
// A page older than the account method: its own events have to say.
|
|
73
|
+
() => undefined,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return () => {
|
|
78
|
+
live = false;
|
|
79
|
+
off();
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
signMessage: (message) => spec.sign(bridge, message),
|
|
83
|
+
};
|
|
84
|
+
return { id, name, adapter };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const solana: BridgeWalletSpec = {
|
|
88
|
+
namespace: "solana",
|
|
89
|
+
key: "publicKey",
|
|
90
|
+
async sign(bridge, message) {
|
|
91
|
+
const answer = (await bridge.request("solana", "signMessage", {
|
|
92
|
+
message: bytesToBase64(new TextEncoder().encode(message)),
|
|
93
|
+
})) as { signature: string };
|
|
94
|
+
return bytesToBase58(base64ToBytes(answer.signature));
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const sui: BridgeWalletSpec = {
|
|
99
|
+
namespace: "sui",
|
|
100
|
+
key: "address",
|
|
101
|
+
async sign(bridge, message) {
|
|
102
|
+
const answer = (await bridge.request("sui", "signMessage", { message })) as {
|
|
103
|
+
signature: string;
|
|
104
|
+
};
|
|
105
|
+
return answer.signature;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export interface SolanaBridgeDriverOptions {
|
|
110
|
+
/** The cluster accounts are on. Defaults to `solana:mainnet`. */
|
|
111
|
+
chain?: SolanaChain;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The hosted page's Solana wallet, driven from a React Native app across the
|
|
116
|
+
* bridge's `solana` namespace. Signatures come back base58, as on web.
|
|
117
|
+
*/
|
|
118
|
+
export function solanaBridgeDriver(
|
|
119
|
+
bridge: BridgeRequester,
|
|
120
|
+
options: SolanaBridgeDriverOptions = {},
|
|
121
|
+
): ConnectionDriver {
|
|
122
|
+
const chain = options.chain ?? "solana:mainnet";
|
|
123
|
+
const wallets = [solanaBridgeWallet(bridge)];
|
|
124
|
+
return lightDriver({
|
|
125
|
+
wallets: () => wallets,
|
|
126
|
+
chainId: chain,
|
|
127
|
+
client: (wallet) => solanaMessageClient(wallet.adapter, chain),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** The hosted page's Sui wallet across the bridge's `sui` namespace. */
|
|
132
|
+
export function suiBridgeDriver(bridge: BridgeRequester): ConnectionDriver {
|
|
133
|
+
const wallets = [suiBridgeWallet(bridge)];
|
|
134
|
+
return lightDriver({
|
|
135
|
+
wallets: () => wallets,
|
|
136
|
+
chainId: "sui:mainnet",
|
|
137
|
+
client: (wallet) => suiClient(wallet.adapter),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** One Solana wallet on the page, for a driver of several (tests, a page per wallet). */
|
|
142
|
+
export function solanaBridgeWallet(
|
|
143
|
+
bridge: BridgeRequester,
|
|
144
|
+
options: BridgeWalletOptions = { id: "webViewSolana", name: "Solana Wallet" },
|
|
145
|
+
): LightWallet {
|
|
146
|
+
return bridgeWallet(bridge, solana, options);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** One Sui wallet on the page. */
|
|
150
|
+
export function suiBridgeWallet(
|
|
151
|
+
bridge: BridgeRequester,
|
|
152
|
+
options: BridgeWalletOptions = { id: "webViewSui", name: "Sui Wallet" },
|
|
153
|
+
): LightWallet {
|
|
154
|
+
return bridgeWallet(bridge, sui, options);
|
|
155
|
+
}
|
package/src/bridge/index.spec.ts
CHANGED
|
@@ -6,5 +6,8 @@ describe("bridge barrel", () => {
|
|
|
6
6
|
expect(typeof bridge.BridgeClient).toBe("function");
|
|
7
7
|
expect(typeof bridge.createMemoryTransportPair).toBe("function");
|
|
8
8
|
expect(typeof bridge.isBridgeMessage).toBe("function");
|
|
9
|
+
expect(bridge.NativeBridgeErrorCode.pageStranded).toBe(-33002);
|
|
10
|
+
expect(typeof bridge.solanaBridgeDriver).toBe("function");
|
|
11
|
+
expect(typeof bridge.suiBridgeDriver).toBe("function");
|
|
9
12
|
});
|
|
10
13
|
});
|