@multiplatform.one/web3 7.26.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.
Files changed (714) hide show
  1. package/README.md +157 -8
  2. package/dist/cjs/bridge/base58.cjs +48 -0
  3. package/dist/cjs/bridge/base58.native.js +51 -0
  4. package/dist/cjs/bridge/base58.native.js.map +1 -0
  5. package/dist/cjs/bridge/core.cjs +5 -1
  6. package/dist/cjs/bridge/core.native.js +5 -1
  7. package/dist/cjs/bridge/core.native.js.map +1 -1
  8. package/dist/cjs/bridge/drivers.cjs +141 -0
  9. package/dist/cjs/bridge/drivers.native.js +161 -0
  10. package/dist/cjs/bridge/drivers.native.js.map +1 -0
  11. package/dist/cjs/bridge/nativeHost.cjs +49 -9
  12. package/dist/cjs/bridge/nativeHost.native.js +56 -9
  13. package/dist/cjs/bridge/nativeHost.native.js.map +1 -1
  14. package/dist/cjs/clients/adapter.native.js.map +1 -1
  15. package/dist/cjs/clients/connector.native.js.map +1 -1
  16. package/dist/cjs/clients/evm.cjs +1 -0
  17. package/dist/cjs/clients/evm.native.js +1 -0
  18. package/dist/cjs/clients/evm.native.js.map +1 -1
  19. package/dist/cjs/clients/evmRead.cjs +104 -0
  20. package/dist/cjs/clients/evmRead.native.js +124 -0
  21. package/dist/cjs/clients/evmRead.native.js.map +1 -0
  22. package/dist/cjs/clients/hooks.cjs +37 -7
  23. package/dist/cjs/clients/hooks.native.js +43 -5
  24. package/dist/cjs/clients/hooks.native.js.map +1 -1
  25. package/dist/cjs/clients/index.cjs +5 -0
  26. package/dist/cjs/clients/index.native.js +5 -0
  27. package/dist/cjs/clients/index.native.js.map +1 -1
  28. package/dist/cjs/clients/types.cjs +7 -0
  29. package/dist/cjs/clients/types.native.js +14 -0
  30. package/dist/cjs/clients/types.native.js.map +1 -1
  31. package/dist/cjs/connectkit/adapters/BitcoinAdapter.cjs +44 -2
  32. package/dist/cjs/connectkit/adapters/BitcoinAdapter.native.js +73 -5
  33. package/dist/cjs/connectkit/adapters/BitcoinAdapter.native.js.map +1 -1
  34. package/dist/cjs/connectkit/adapters/SolanaAdapter.cjs +46 -0
  35. package/dist/cjs/connectkit/adapters/SolanaAdapter.native.js +55 -0
  36. package/dist/cjs/connectkit/adapters/SolanaAdapter.native.js.map +1 -1
  37. package/dist/cjs/connectkit/adapters/SuiAdapter.cjs +40 -0
  38. package/dist/cjs/connectkit/adapters/SuiAdapter.native.js +50 -0
  39. package/dist/cjs/connectkit/adapters/SuiAdapter.native.js.map +1 -1
  40. package/dist/cjs/connectkit/connectors/ensureWalletConnectors.cjs +4 -1
  41. package/dist/cjs/connectkit/connectors/ensureWalletConnectors.native.js +8 -1
  42. package/dist/cjs/connectkit/connectors/ensureWalletConnectors.native.js.map +1 -1
  43. package/dist/cjs/connectkit/connectors/getWalletConnectors.native.js.map +1 -1
  44. package/dist/cjs/connectkit/connectors/syntheticChains.native.js.map +1 -1
  45. package/dist/cjs/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
  46. package/dist/cjs/connectkit/defaultConfig.cjs +5 -2
  47. package/dist/cjs/connectkit/defaultConfig.native.js +9 -2
  48. package/dist/cjs/connectkit/defaultConfig.native.js.map +1 -1
  49. package/dist/cjs/connectkit/siwe/SIWEContext.native.js.map +1 -1
  50. package/dist/cjs/connectkit/siwe/SIWEProvider.cjs +6 -4
  51. package/dist/cjs/connectkit/siwe/SIWEProvider.native.js +8 -4
  52. package/dist/cjs/connectkit/siwe/SIWEProvider.native.js.map +1 -1
  53. package/dist/cjs/connectkit/siwe/connectIntent.cjs +56 -16
  54. package/dist/cjs/connectkit/siwe/connectIntent.native.js +100 -16
  55. package/dist/cjs/connectkit/siwe/connectIntent.native.js.map +1 -1
  56. package/dist/cjs/connectkit/siwe/useSIWE.native.js.map +1 -1
  57. package/dist/cjs/connectkit/web3Bridge.cjs +58 -12
  58. package/dist/cjs/connectkit/web3Bridge.native.js +64 -14
  59. package/dist/cjs/connectkit/web3Bridge.native.js.map +1 -1
  60. package/dist/cjs/core/family.cjs +17 -0
  61. package/dist/cjs/core/family.native.js +17 -0
  62. package/dist/cjs/core/family.native.js.map +1 -1
  63. package/dist/cjs/core/index.cjs +10 -1
  64. package/dist/cjs/core/index.native.js +10 -1
  65. package/dist/cjs/core/index.native.js.map +1 -1
  66. package/dist/cjs/core/lightDriver.cjs +182 -0
  67. package/dist/cjs/core/lightDriver.native.js +260 -0
  68. package/dist/cjs/core/lightDriver.native.js.map +1 -0
  69. package/dist/cjs/core/react.cjs +12 -1
  70. package/dist/cjs/core/react.native.js +16 -1
  71. package/dist/cjs/core/react.native.js.map +1 -1
  72. package/dist/cjs/core/signIn.cjs +201 -0
  73. package/dist/cjs/core/signIn.native.js +240 -0
  74. package/dist/cjs/core/signIn.native.js.map +1 -0
  75. package/dist/cjs/core/store.cjs +47 -2
  76. package/dist/cjs/core/store.native.js +49 -2
  77. package/dist/cjs/core/store.native.js.map +1 -1
  78. package/dist/cjs/families/btc.cjs +44 -0
  79. package/dist/cjs/families/btc.native.js +49 -0
  80. package/dist/cjs/families/btc.native.js.map +1 -0
  81. package/dist/cjs/families/eth.cjs +57 -0
  82. package/dist/cjs/families/eth.native.js +61 -0
  83. package/dist/cjs/families/eth.native.js.map +1 -0
  84. package/dist/cjs/families/gpg.cjs +40 -0
  85. package/dist/cjs/families/gpg.native.js +43 -0
  86. package/dist/cjs/families/gpg.native.js.map +1 -0
  87. package/dist/cjs/families/host.cjs +38 -0
  88. package/dist/cjs/families/host.native.js +41 -0
  89. package/dist/cjs/families/host.native.js.map +1 -0
  90. package/dist/cjs/families/index.cjs +53 -0
  91. package/dist/cjs/families/index.native.js +56 -0
  92. package/dist/cjs/families/index.native.js.map +1 -0
  93. package/dist/cjs/families/messages.cjs +61 -0
  94. package/dist/cjs/families/messages.native.js +66 -0
  95. package/dist/cjs/families/messages.native.js.map +1 -0
  96. package/dist/cjs/families/sol.cjs +55 -0
  97. package/dist/cjs/families/sol.native.js +64 -0
  98. package/dist/cjs/families/sol.native.js.map +1 -0
  99. package/dist/cjs/families/sui.cjs +48 -0
  100. package/dist/cjs/families/sui.native.js +53 -0
  101. package/dist/cjs/families/sui.native.js.map +1 -0
  102. package/dist/cjs/index.cjs +22 -2
  103. package/dist/cjs/index.native.js +21 -1
  104. package/dist/cjs/index.native.js.map +1 -1
  105. package/dist/cjs/keycloak/keycloakWallet.cjs +13 -0
  106. package/dist/cjs/keycloak/keycloakWallet.native.js +15 -0
  107. package/dist/cjs/keycloak/keycloakWallet.native.js.map +1 -1
  108. package/dist/cjs/keycloak/useDirectLogin.cjs +10 -5
  109. package/dist/cjs/keycloak/useDirectLogin.native.js +12 -5
  110. package/dist/cjs/keycloak/useDirectLogin.native.js.map +1 -1
  111. package/dist/cjs/keycloak/useWalletLogin.cjs +16 -8
  112. package/dist/cjs/light/drivers.cjs +73 -0
  113. package/dist/cjs/light/drivers.native.js +97 -0
  114. package/dist/cjs/light/drivers.native.js.map +1 -0
  115. package/dist/cjs/light/index.cjs +30 -0
  116. package/dist/cjs/light/index.native.js +33 -0
  117. package/dist/cjs/light/index.native.js.map +1 -0
  118. package/dist/cjs/providers/WalletProvider.cjs +59 -17
  119. package/dist/cjs/providers/WalletProvider.native.js +99 -56
  120. package/dist/cjs/providers/WalletProvider.native.js.map +1 -1
  121. package/dist/cjs/providers/families.cjs +53 -0
  122. package/dist/cjs/providers/families.native.js +59 -0
  123. package/dist/cjs/providers/families.native.js.map +1 -0
  124. package/dist/cjs/providers/index.cjs +1 -0
  125. package/dist/cjs/providers/index.native.js +1 -0
  126. package/dist/cjs/providers/index.native.js.map +1 -1
  127. package/dist/cjs/providers/walletConfig.cjs +41 -0
  128. package/dist/cjs/providers/walletConfig.native.js +68 -0
  129. package/dist/cjs/providers/walletConfig.native.js.map +1 -1
  130. package/dist/cjs/wagmi/driver.cjs +257 -0
  131. package/dist/cjs/wagmi/driver.native.js +331 -0
  132. package/dist/cjs/wagmi/driver.native.js.map +1 -0
  133. package/dist/cjs/wagmi/host.cjs +239 -0
  134. package/dist/cjs/wagmi/host.native.js +320 -0
  135. package/dist/cjs/wagmi/host.native.js.map +1 -0
  136. package/dist/cjs/wagmi/index.cjs +28 -0
  137. package/dist/cjs/wagmi/index.native.js +31 -0
  138. package/dist/cjs/wagmi/index.native.js.map +1 -0
  139. package/dist/cjs/web.cjs +84 -0
  140. package/dist/esm/bridge/base58.mjs +23 -0
  141. package/dist/esm/bridge/base58.mjs.map +1 -0
  142. package/dist/esm/bridge/base58.native.js +23 -0
  143. package/dist/esm/bridge/base58.native.js.map +1 -0
  144. package/dist/esm/bridge/core.mjs +3 -2
  145. package/dist/esm/bridge/core.mjs.map +1 -1
  146. package/dist/esm/bridge/core.native.js +3 -2
  147. package/dist/esm/bridge/core.native.js.map +1 -1
  148. package/dist/esm/bridge/drivers.mjs +113 -0
  149. package/dist/esm/bridge/drivers.mjs.map +1 -0
  150. package/dist/esm/bridge/drivers.native.js +130 -0
  151. package/dist/esm/bridge/drivers.native.js.map +1 -0
  152. package/dist/esm/bridge/nativeHost.mjs +50 -11
  153. package/dist/esm/bridge/nativeHost.mjs.map +1 -1
  154. package/dist/esm/bridge/nativeHost.native.js +57 -11
  155. package/dist/esm/bridge/nativeHost.native.js.map +1 -1
  156. package/dist/esm/clients/adapter.mjs.map +1 -1
  157. package/dist/esm/clients/adapter.native.js.map +1 -1
  158. package/dist/esm/clients/connector.mjs.map +1 -1
  159. package/dist/esm/clients/connector.native.js.map +1 -1
  160. package/dist/esm/clients/evm.mjs +1 -0
  161. package/dist/esm/clients/evm.mjs.map +1 -1
  162. package/dist/esm/clients/evm.native.js +1 -0
  163. package/dist/esm/clients/evm.native.js.map +1 -1
  164. package/dist/esm/clients/evmRead.mjs +78 -0
  165. package/dist/esm/clients/evmRead.mjs.map +1 -0
  166. package/dist/esm/clients/evmRead.native.js +95 -0
  167. package/dist/esm/clients/evmRead.native.js.map +1 -0
  168. package/dist/esm/clients/hooks.mjs +38 -9
  169. package/dist/esm/clients/hooks.mjs.map +1 -1
  170. package/dist/esm/clients/hooks.native.js +44 -7
  171. package/dist/esm/clients/hooks.native.js.map +1 -1
  172. package/dist/esm/clients/index.mjs +4 -3
  173. package/dist/esm/clients/index.mjs.map +1 -1
  174. package/dist/esm/clients/index.native.js +4 -3
  175. package/dist/esm/clients/index.native.js.map +1 -1
  176. package/dist/esm/clients/types.mjs +7 -1
  177. package/dist/esm/clients/types.mjs.map +1 -1
  178. package/dist/esm/clients/types.native.js +14 -1
  179. package/dist/esm/clients/types.native.js.map +1 -1
  180. package/dist/esm/connectkit/adapters/BitcoinAdapter.mjs +44 -2
  181. package/dist/esm/connectkit/adapters/BitcoinAdapter.mjs.map +1 -1
  182. package/dist/esm/connectkit/adapters/BitcoinAdapter.native.js +73 -5
  183. package/dist/esm/connectkit/adapters/BitcoinAdapter.native.js.map +1 -1
  184. package/dist/esm/connectkit/adapters/SolanaAdapter.mjs +46 -0
  185. package/dist/esm/connectkit/adapters/SolanaAdapter.mjs.map +1 -1
  186. package/dist/esm/connectkit/adapters/SolanaAdapter.native.js +55 -0
  187. package/dist/esm/connectkit/adapters/SolanaAdapter.native.js.map +1 -1
  188. package/dist/esm/connectkit/adapters/SuiAdapter.mjs +40 -0
  189. package/dist/esm/connectkit/adapters/SuiAdapter.mjs.map +1 -1
  190. package/dist/esm/connectkit/adapters/SuiAdapter.native.js +50 -0
  191. package/dist/esm/connectkit/adapters/SuiAdapter.native.js.map +1 -1
  192. package/dist/esm/connectkit/connectors/ensureWalletConnectors.mjs +4 -1
  193. package/dist/esm/connectkit/connectors/ensureWalletConnectors.mjs.map +1 -1
  194. package/dist/esm/connectkit/connectors/ensureWalletConnectors.native.js +8 -1
  195. package/dist/esm/connectkit/connectors/ensureWalletConnectors.native.js.map +1 -1
  196. package/dist/esm/connectkit/connectors/getWalletConnectors.mjs.map +1 -1
  197. package/dist/esm/connectkit/connectors/getWalletConnectors.native.js.map +1 -1
  198. package/dist/esm/connectkit/connectors/syntheticChains.mjs.map +1 -1
  199. package/dist/esm/connectkit/connectors/syntheticChains.native.js.map +1 -1
  200. package/dist/esm/connectkit/connectors/walletAdapterConnector.mjs.map +1 -1
  201. package/dist/esm/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
  202. package/dist/esm/connectkit/defaultConfig.mjs +6 -3
  203. package/dist/esm/connectkit/defaultConfig.mjs.map +1 -1
  204. package/dist/esm/connectkit/defaultConfig.native.js +10 -3
  205. package/dist/esm/connectkit/defaultConfig.native.js.map +1 -1
  206. package/dist/esm/connectkit/siwe/SIWEContext.mjs.map +1 -1
  207. package/dist/esm/connectkit/siwe/SIWEContext.native.js.map +1 -1
  208. package/dist/esm/connectkit/siwe/SIWEProvider.mjs +6 -4
  209. package/dist/esm/connectkit/siwe/SIWEProvider.mjs.map +1 -1
  210. package/dist/esm/connectkit/siwe/SIWEProvider.native.js +8 -4
  211. package/dist/esm/connectkit/siwe/SIWEProvider.native.js.map +1 -1
  212. package/dist/esm/connectkit/siwe/connectIntent.mjs +54 -16
  213. package/dist/esm/connectkit/siwe/connectIntent.mjs.map +1 -1
  214. package/dist/esm/connectkit/siwe/connectIntent.native.js +98 -16
  215. package/dist/esm/connectkit/siwe/connectIntent.native.js.map +1 -1
  216. package/dist/esm/connectkit/siwe/useSIWE.mjs.map +1 -1
  217. package/dist/esm/connectkit/siwe/useSIWE.native.js.map +1 -1
  218. package/dist/esm/connectkit/web3Bridge.mjs +61 -16
  219. package/dist/esm/connectkit/web3Bridge.mjs.map +1 -1
  220. package/dist/esm/connectkit/web3Bridge.native.js +67 -18
  221. package/dist/esm/connectkit/web3Bridge.native.js.map +1 -1
  222. package/dist/esm/core/family.mjs +17 -0
  223. package/dist/esm/core/family.mjs.map +1 -1
  224. package/dist/esm/core/family.native.js +17 -0
  225. package/dist/esm/core/family.native.js.map +1 -1
  226. package/dist/esm/core/index.mjs +5 -3
  227. package/dist/esm/core/index.mjs.map +1 -1
  228. package/dist/esm/core/index.native.js +5 -3
  229. package/dist/esm/core/index.native.js.map +1 -1
  230. package/dist/esm/core/lightDriver.mjs +157 -0
  231. package/dist/esm/core/lightDriver.mjs.map +1 -0
  232. package/dist/esm/core/lightDriver.native.js +232 -0
  233. package/dist/esm/core/lightDriver.native.js.map +1 -0
  234. package/dist/esm/core/react.mjs +10 -1
  235. package/dist/esm/core/react.mjs.map +1 -1
  236. package/dist/esm/core/react.native.js +14 -1
  237. package/dist/esm/core/react.native.js.map +1 -1
  238. package/dist/esm/core/signIn.mjs +173 -0
  239. package/dist/esm/core/signIn.mjs.map +1 -0
  240. package/dist/esm/core/signIn.native.js +209 -0
  241. package/dist/esm/core/signIn.native.js.map +1 -0
  242. package/dist/esm/core/store.mjs +47 -2
  243. package/dist/esm/core/store.mjs.map +1 -1
  244. package/dist/esm/core/store.native.js +49 -2
  245. package/dist/esm/core/store.native.js.map +1 -1
  246. package/dist/esm/families/btc.mjs +19 -0
  247. package/dist/esm/families/btc.mjs.map +1 -0
  248. package/dist/esm/families/btc.native.js +21 -0
  249. package/dist/esm/families/btc.native.js.map +1 -0
  250. package/dist/esm/families/eth.mjs +32 -0
  251. package/dist/esm/families/eth.mjs.map +1 -0
  252. package/dist/esm/families/eth.native.js +33 -0
  253. package/dist/esm/families/eth.native.js.map +1 -0
  254. package/dist/esm/families/gpg.mjs +15 -0
  255. package/dist/esm/families/gpg.mjs.map +1 -0
  256. package/dist/esm/families/gpg.native.js +15 -0
  257. package/dist/esm/families/gpg.native.js.map +1 -0
  258. package/dist/esm/families/host.mjs +12 -0
  259. package/dist/esm/families/host.mjs.map +1 -0
  260. package/dist/esm/families/host.native.js +12 -0
  261. package/dist/esm/families/host.native.js.map +1 -0
  262. package/dist/esm/families/index.mjs +23 -0
  263. package/dist/esm/families/index.mjs.map +1 -0
  264. package/dist/esm/families/index.native.js +23 -0
  265. package/dist/esm/families/index.native.js.map +1 -0
  266. package/dist/esm/families/messages.mjs +32 -0
  267. package/dist/esm/families/messages.mjs.map +1 -0
  268. package/dist/esm/families/messages.native.js +34 -0
  269. package/dist/esm/families/messages.native.js.map +1 -0
  270. package/dist/esm/families/sol.mjs +30 -0
  271. package/dist/esm/families/sol.mjs.map +1 -0
  272. package/dist/esm/families/sol.native.js +36 -0
  273. package/dist/esm/families/sol.native.js.map +1 -0
  274. package/dist/esm/families/sui.mjs +23 -0
  275. package/dist/esm/families/sui.mjs.map +1 -0
  276. package/dist/esm/families/sui.native.js +25 -0
  277. package/dist/esm/families/sui.native.js.map +1 -0
  278. package/dist/esm/index.mjs +6 -3
  279. package/dist/esm/index.mjs.map +1 -1
  280. package/dist/esm/index.native.js +6 -3
  281. package/dist/esm/index.native.js.map +1 -1
  282. package/dist/esm/keycloak/keycloakWallet.mjs +13 -0
  283. package/dist/esm/keycloak/keycloakWallet.mjs.map +1 -1
  284. package/dist/esm/keycloak/keycloakWallet.native.js +15 -0
  285. package/dist/esm/keycloak/keycloakWallet.native.js.map +1 -1
  286. package/dist/esm/keycloak/useDirectLogin.mjs +10 -5
  287. package/dist/esm/keycloak/useDirectLogin.mjs.map +1 -1
  288. package/dist/esm/keycloak/useDirectLogin.native.js +12 -5
  289. package/dist/esm/keycloak/useDirectLogin.native.js.map +1 -1
  290. package/dist/esm/keycloak/useWalletLogin.mjs +16 -8
  291. package/dist/esm/keycloak/useWalletLogin.mjs.map +1 -1
  292. package/dist/esm/light/drivers.mjs +46 -0
  293. package/dist/esm/light/drivers.mjs.map +1 -0
  294. package/dist/esm/light/drivers.native.js +67 -0
  295. package/dist/esm/light/drivers.native.js.map +1 -0
  296. package/dist/esm/light/index.mjs +3 -0
  297. package/dist/esm/light/index.mjs.map +1 -0
  298. package/dist/esm/light/index.native.js +3 -0
  299. package/dist/esm/light/index.native.js.map +1 -0
  300. package/dist/esm/providers/WalletProvider.mjs +60 -19
  301. package/dist/esm/providers/WalletProvider.mjs.map +1 -1
  302. package/dist/esm/providers/WalletProvider.native.js +101 -59
  303. package/dist/esm/providers/WalletProvider.native.js.map +1 -1
  304. package/dist/esm/providers/families.mjs +27 -0
  305. package/dist/esm/providers/families.mjs.map +1 -0
  306. package/dist/esm/providers/families.native.js +30 -0
  307. package/dist/esm/providers/families.native.js.map +1 -0
  308. package/dist/esm/providers/index.mjs +2 -2
  309. package/dist/esm/providers/index.mjs.map +1 -1
  310. package/dist/esm/providers/index.native.js +2 -2
  311. package/dist/esm/providers/index.native.js.map +1 -1
  312. package/dist/esm/providers/walletConfig.mjs +40 -1
  313. package/dist/esm/providers/walletConfig.mjs.map +1 -1
  314. package/dist/esm/providers/walletConfig.native.js +67 -1
  315. package/dist/esm/providers/walletConfig.native.js.map +1 -1
  316. package/dist/esm/wagmi/driver.mjs +232 -0
  317. package/dist/esm/wagmi/driver.mjs.map +1 -0
  318. package/dist/esm/wagmi/driver.native.js +303 -0
  319. package/dist/esm/wagmi/driver.native.js.map +1 -0
  320. package/dist/esm/wagmi/host.mjs +213 -0
  321. package/dist/esm/wagmi/host.mjs.map +1 -0
  322. package/dist/esm/wagmi/host.native.js +291 -0
  323. package/dist/esm/wagmi/host.native.js.map +1 -0
  324. package/dist/esm/wagmi/index.mjs +3 -0
  325. package/dist/esm/wagmi/index.mjs.map +1 -0
  326. package/dist/esm/wagmi/index.native.js +3 -0
  327. package/dist/esm/wagmi/index.native.js.map +1 -0
  328. package/dist/esm/web.mjs +13 -0
  329. package/dist/esm/web.mjs.map +1 -0
  330. package/dist/jsx/bridge/base58.mjs +23 -0
  331. package/dist/jsx/bridge/base58.mjs.map +1 -0
  332. package/dist/jsx/bridge/base58.native.js +51 -0
  333. package/dist/jsx/bridge/base58.native.js.map +1 -0
  334. package/dist/jsx/bridge/core.mjs +3 -2
  335. package/dist/jsx/bridge/core.mjs.map +1 -1
  336. package/dist/jsx/bridge/core.native.js +5 -1
  337. package/dist/jsx/bridge/core.native.js.map +1 -1
  338. package/dist/jsx/bridge/drivers.mjs +113 -0
  339. package/dist/jsx/bridge/drivers.mjs.map +1 -0
  340. package/dist/jsx/bridge/drivers.native.js +161 -0
  341. package/dist/jsx/bridge/drivers.native.js.map +1 -0
  342. package/dist/jsx/bridge/nativeHost.mjs +50 -11
  343. package/dist/jsx/bridge/nativeHost.mjs.map +1 -1
  344. package/dist/jsx/bridge/nativeHost.native.js +56 -9
  345. package/dist/jsx/bridge/nativeHost.native.js.map +1 -1
  346. package/dist/jsx/clients/adapter.mjs.map +1 -1
  347. package/dist/jsx/clients/adapter.native.js.map +1 -1
  348. package/dist/jsx/clients/connector.mjs.map +1 -1
  349. package/dist/jsx/clients/connector.native.js.map +1 -1
  350. package/dist/jsx/clients/evm.mjs +1 -0
  351. package/dist/jsx/clients/evm.mjs.map +1 -1
  352. package/dist/jsx/clients/evm.native.js +1 -0
  353. package/dist/jsx/clients/evm.native.js.map +1 -1
  354. package/dist/jsx/clients/evmRead.mjs +78 -0
  355. package/dist/jsx/clients/evmRead.mjs.map +1 -0
  356. package/dist/jsx/clients/evmRead.native.js +124 -0
  357. package/dist/jsx/clients/evmRead.native.js.map +1 -0
  358. package/dist/jsx/clients/hooks.mjs +38 -9
  359. package/dist/jsx/clients/hooks.mjs.map +1 -1
  360. package/dist/jsx/clients/hooks.native.js +43 -5
  361. package/dist/jsx/clients/hooks.native.js.map +1 -1
  362. package/dist/jsx/clients/index.mjs +4 -3
  363. package/dist/jsx/clients/index.mjs.map +1 -1
  364. package/dist/jsx/clients/index.native.js +5 -0
  365. package/dist/jsx/clients/index.native.js.map +1 -1
  366. package/dist/jsx/clients/types.mjs +7 -1
  367. package/dist/jsx/clients/types.mjs.map +1 -1
  368. package/dist/jsx/clients/types.native.js +14 -0
  369. package/dist/jsx/clients/types.native.js.map +1 -1
  370. package/dist/jsx/connectkit/adapters/BitcoinAdapter.mjs +44 -2
  371. package/dist/jsx/connectkit/adapters/BitcoinAdapter.mjs.map +1 -1
  372. package/dist/jsx/connectkit/adapters/BitcoinAdapter.native.js +73 -5
  373. package/dist/jsx/connectkit/adapters/BitcoinAdapter.native.js.map +1 -1
  374. package/dist/jsx/connectkit/adapters/SolanaAdapter.mjs +46 -0
  375. package/dist/jsx/connectkit/adapters/SolanaAdapter.mjs.map +1 -1
  376. package/dist/jsx/connectkit/adapters/SolanaAdapter.native.js +55 -0
  377. package/dist/jsx/connectkit/adapters/SolanaAdapter.native.js.map +1 -1
  378. package/dist/jsx/connectkit/adapters/SuiAdapter.mjs +40 -0
  379. package/dist/jsx/connectkit/adapters/SuiAdapter.mjs.map +1 -1
  380. package/dist/jsx/connectkit/adapters/SuiAdapter.native.js +50 -0
  381. package/dist/jsx/connectkit/adapters/SuiAdapter.native.js.map +1 -1
  382. package/dist/jsx/connectkit/connectors/ensureWalletConnectors.mjs +4 -1
  383. package/dist/jsx/connectkit/connectors/ensureWalletConnectors.mjs.map +1 -1
  384. package/dist/jsx/connectkit/connectors/ensureWalletConnectors.native.js +8 -1
  385. package/dist/jsx/connectkit/connectors/ensureWalletConnectors.native.js.map +1 -1
  386. package/dist/jsx/connectkit/connectors/getWalletConnectors.mjs.map +1 -1
  387. package/dist/jsx/connectkit/connectors/getWalletConnectors.native.js.map +1 -1
  388. package/dist/jsx/connectkit/connectors/syntheticChains.mjs.map +1 -1
  389. package/dist/jsx/connectkit/connectors/syntheticChains.native.js.map +1 -1
  390. package/dist/jsx/connectkit/connectors/walletAdapterConnector.mjs.map +1 -1
  391. package/dist/jsx/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
  392. package/dist/jsx/connectkit/defaultConfig.mjs +6 -3
  393. package/dist/jsx/connectkit/defaultConfig.mjs.map +1 -1
  394. package/dist/jsx/connectkit/defaultConfig.native.js +9 -2
  395. package/dist/jsx/connectkit/defaultConfig.native.js.map +1 -1
  396. package/dist/jsx/connectkit/siwe/SIWEContext.mjs.map +1 -1
  397. package/dist/jsx/connectkit/siwe/SIWEContext.native.js.map +1 -1
  398. package/dist/jsx/connectkit/siwe/SIWEProvider.mjs +6 -4
  399. package/dist/jsx/connectkit/siwe/SIWEProvider.mjs.map +1 -1
  400. package/dist/jsx/connectkit/siwe/SIWEProvider.native.js +8 -4
  401. package/dist/jsx/connectkit/siwe/SIWEProvider.native.js.map +1 -1
  402. package/dist/jsx/connectkit/siwe/connectIntent.mjs +54 -16
  403. package/dist/jsx/connectkit/siwe/connectIntent.mjs.map +1 -1
  404. package/dist/jsx/connectkit/siwe/connectIntent.native.js +100 -16
  405. package/dist/jsx/connectkit/siwe/connectIntent.native.js.map +1 -1
  406. package/dist/jsx/connectkit/siwe/useSIWE.mjs.map +1 -1
  407. package/dist/jsx/connectkit/siwe/useSIWE.native.js.map +1 -1
  408. package/dist/jsx/connectkit/web3Bridge.mjs +61 -16
  409. package/dist/jsx/connectkit/web3Bridge.mjs.map +1 -1
  410. package/dist/jsx/connectkit/web3Bridge.native.js +64 -14
  411. package/dist/jsx/connectkit/web3Bridge.native.js.map +1 -1
  412. package/dist/jsx/core/family.mjs +17 -0
  413. package/dist/jsx/core/family.mjs.map +1 -1
  414. package/dist/jsx/core/family.native.js +17 -0
  415. package/dist/jsx/core/family.native.js.map +1 -1
  416. package/dist/jsx/core/index.mjs +5 -3
  417. package/dist/jsx/core/index.mjs.map +1 -1
  418. package/dist/jsx/core/index.native.js +10 -1
  419. package/dist/jsx/core/index.native.js.map +1 -1
  420. package/dist/jsx/core/lightDriver.mjs +157 -0
  421. package/dist/jsx/core/lightDriver.mjs.map +1 -0
  422. package/dist/jsx/core/lightDriver.native.js +260 -0
  423. package/dist/jsx/core/lightDriver.native.js.map +1 -0
  424. package/dist/jsx/core/react.mjs +10 -1
  425. package/dist/jsx/core/react.mjs.map +1 -1
  426. package/dist/jsx/core/react.native.js +16 -1
  427. package/dist/jsx/core/react.native.js.map +1 -1
  428. package/dist/jsx/core/signIn.mjs +173 -0
  429. package/dist/jsx/core/signIn.mjs.map +1 -0
  430. package/dist/jsx/core/signIn.native.js +240 -0
  431. package/dist/jsx/core/signIn.native.js.map +1 -0
  432. package/dist/jsx/core/store.mjs +47 -2
  433. package/dist/jsx/core/store.mjs.map +1 -1
  434. package/dist/jsx/core/store.native.js +49 -2
  435. package/dist/jsx/core/store.native.js.map +1 -1
  436. package/dist/jsx/families/btc.mjs +19 -0
  437. package/dist/jsx/families/btc.mjs.map +1 -0
  438. package/dist/jsx/families/btc.native.js +49 -0
  439. package/dist/jsx/families/btc.native.js.map +1 -0
  440. package/dist/jsx/families/eth.mjs +32 -0
  441. package/dist/jsx/families/eth.mjs.map +1 -0
  442. package/dist/jsx/families/eth.native.js +61 -0
  443. package/dist/jsx/families/eth.native.js.map +1 -0
  444. package/dist/jsx/families/gpg.mjs +15 -0
  445. package/dist/jsx/families/gpg.mjs.map +1 -0
  446. package/dist/jsx/families/gpg.native.js +43 -0
  447. package/dist/jsx/families/gpg.native.js.map +1 -0
  448. package/dist/jsx/families/host.mjs +12 -0
  449. package/dist/jsx/families/host.mjs.map +1 -0
  450. package/dist/jsx/families/host.native.js +41 -0
  451. package/dist/jsx/families/host.native.js.map +1 -0
  452. package/dist/jsx/families/index.mjs +23 -0
  453. package/dist/jsx/families/index.mjs.map +1 -0
  454. package/dist/jsx/families/index.native.js +56 -0
  455. package/dist/jsx/families/index.native.js.map +1 -0
  456. package/dist/jsx/families/messages.mjs +32 -0
  457. package/dist/jsx/families/messages.mjs.map +1 -0
  458. package/dist/jsx/families/messages.native.js +66 -0
  459. package/dist/jsx/families/messages.native.js.map +1 -0
  460. package/dist/jsx/families/sol.mjs +30 -0
  461. package/dist/jsx/families/sol.mjs.map +1 -0
  462. package/dist/jsx/families/sol.native.js +64 -0
  463. package/dist/jsx/families/sol.native.js.map +1 -0
  464. package/dist/jsx/families/sui.mjs +23 -0
  465. package/dist/jsx/families/sui.mjs.map +1 -0
  466. package/dist/jsx/families/sui.native.js +53 -0
  467. package/dist/jsx/families/sui.native.js.map +1 -0
  468. package/dist/jsx/index.js +6 -3
  469. package/dist/jsx/index.js.map +1 -1
  470. package/dist/jsx/index.mjs +6 -3
  471. package/dist/jsx/index.mjs.map +1 -1
  472. package/dist/jsx/index.native.js +21 -1
  473. package/dist/jsx/index.native.js.map +1 -1
  474. package/dist/jsx/keycloak/keycloakWallet.mjs +13 -0
  475. package/dist/jsx/keycloak/keycloakWallet.mjs.map +1 -1
  476. package/dist/jsx/keycloak/keycloakWallet.native.js +15 -0
  477. package/dist/jsx/keycloak/keycloakWallet.native.js.map +1 -1
  478. package/dist/jsx/keycloak/useDirectLogin.mjs +10 -5
  479. package/dist/jsx/keycloak/useDirectLogin.mjs.map +1 -1
  480. package/dist/jsx/keycloak/useDirectLogin.native.js +12 -5
  481. package/dist/jsx/keycloak/useDirectLogin.native.js.map +1 -1
  482. package/dist/jsx/keycloak/useWalletLogin.mjs +16 -8
  483. package/dist/jsx/keycloak/useWalletLogin.mjs.map +1 -1
  484. package/dist/jsx/light/drivers.mjs +46 -0
  485. package/dist/jsx/light/drivers.mjs.map +1 -0
  486. package/dist/jsx/light/drivers.native.js +97 -0
  487. package/dist/jsx/light/drivers.native.js.map +1 -0
  488. package/dist/jsx/light/index.mjs +3 -0
  489. package/dist/jsx/light/index.mjs.map +1 -0
  490. package/dist/jsx/light/index.native.js +33 -0
  491. package/dist/jsx/light/index.native.js.map +1 -0
  492. package/dist/jsx/providers/WalletProvider.mjs +60 -19
  493. package/dist/jsx/providers/WalletProvider.mjs.map +1 -1
  494. package/dist/jsx/providers/WalletProvider.native.js +99 -56
  495. package/dist/jsx/providers/WalletProvider.native.js.map +1 -1
  496. package/dist/jsx/providers/families.mjs +27 -0
  497. package/dist/jsx/providers/families.mjs.map +1 -0
  498. package/dist/jsx/providers/families.native.js +59 -0
  499. package/dist/jsx/providers/families.native.js.map +1 -0
  500. package/dist/jsx/providers/index.mjs +2 -2
  501. package/dist/jsx/providers/index.mjs.map +1 -1
  502. package/dist/jsx/providers/index.native.js +1 -0
  503. package/dist/jsx/providers/index.native.js.map +1 -1
  504. package/dist/jsx/providers/walletConfig.mjs +40 -1
  505. package/dist/jsx/providers/walletConfig.mjs.map +1 -1
  506. package/dist/jsx/providers/walletConfig.native.js +68 -0
  507. package/dist/jsx/providers/walletConfig.native.js.map +1 -1
  508. package/dist/jsx/wagmi/driver.mjs +232 -0
  509. package/dist/jsx/wagmi/driver.mjs.map +1 -0
  510. package/dist/jsx/wagmi/driver.native.js +331 -0
  511. package/dist/jsx/wagmi/driver.native.js.map +1 -0
  512. package/dist/jsx/wagmi/host.mjs +213 -0
  513. package/dist/jsx/wagmi/host.mjs.map +1 -0
  514. package/dist/jsx/wagmi/host.native.js +320 -0
  515. package/dist/jsx/wagmi/host.native.js.map +1 -0
  516. package/dist/jsx/wagmi/index.mjs +3 -0
  517. package/dist/jsx/wagmi/index.mjs.map +1 -0
  518. package/dist/jsx/wagmi/index.native.js +31 -0
  519. package/dist/jsx/wagmi/index.native.js.map +1 -0
  520. package/dist/jsx/web.mjs +13 -0
  521. package/dist/jsx/web.mjs.map +1 -0
  522. package/dist/keycloak/login.iife.js +449 -443
  523. package/docs/bridge-protocol.md +41 -14
  524. package/package.json +13 -6
  525. package/src/bridge/base58.spec.ts +18 -0
  526. package/src/bridge/base58.ts +25 -0
  527. package/src/bridge/core.ts +2 -0
  528. package/src/bridge/drivers.spec.ts +283 -0
  529. package/src/bridge/drivers.ts +155 -0
  530. package/src/bridge/index.spec.ts +3 -0
  531. package/src/bridge/nativeHost.spec.ts +139 -15
  532. package/src/bridge/nativeHost.ts +84 -14
  533. package/src/bundler/metaMaskConnectTimeouts.spec.ts +3 -0
  534. package/src/clients/adapter.ts +5 -1
  535. package/src/clients/connector.ts +2 -0
  536. package/src/clients/evm.spec.ts +8 -0
  537. package/src/clients/evm.ts +3 -0
  538. package/src/clients/evmRead.spec.ts +180 -0
  539. package/src/clients/evmRead.ts +140 -0
  540. package/src/clients/hooks.spec.tsx +58 -0
  541. package/src/clients/hooks.ts +73 -14
  542. package/src/clients/index.ts +11 -1
  543. package/src/clients/types.ts +15 -1
  544. package/src/clients/useEvmReadClient.spec.tsx +93 -0
  545. package/src/connectkit/adapters/BitcoinAdapter.ts +64 -4
  546. package/src/connectkit/adapters/SolanaAdapter.ts +49 -0
  547. package/src/connectkit/adapters/SuiAdapter.ts +47 -1
  548. package/src/connectkit/connectors/ensureWalletConnectors.ts +10 -1
  549. package/src/connectkit/connectors/getWalletConnectors.ts +2 -0
  550. package/src/connectkit/connectors/syntheticChains.ts +8 -0
  551. package/src/connectkit/connectors/walletAdapterConnector.ts +2 -0
  552. package/src/connectkit/defaultConfig.ts +21 -7
  553. package/src/connectkit/siwe/SIWEContext.tsx +3 -0
  554. package/src/connectkit/siwe/SIWEProvider.spec.tsx +109 -0
  555. package/src/connectkit/siwe/SIWEProvider.tsx +16 -7
  556. package/src/connectkit/siwe/connectIntent.spec.ts +100 -30
  557. package/src/connectkit/siwe/connectIntent.ts +99 -25
  558. package/src/connectkit/siwe/useSIWE.ts +4 -1
  559. package/src/connectkit/web3Bridge.tsx +75 -15
  560. package/src/core/family.spec.ts +19 -0
  561. package/src/core/family.ts +43 -0
  562. package/src/core/imports.spec.ts +1 -1
  563. package/src/core/index.ts +23 -0
  564. package/src/core/lightDriver.spec.ts +284 -0
  565. package/src/core/lightDriver.ts +235 -0
  566. package/src/core/react.ts +18 -0
  567. package/src/core/signIn.spec.tsx +305 -0
  568. package/src/core/signIn.ts +282 -0
  569. package/src/core/store.spec.ts +83 -0
  570. package/src/core/store.ts +60 -9
  571. package/src/core/types.ts +15 -1
  572. package/src/families/btc.ts +16 -0
  573. package/src/families/eth.ts +35 -0
  574. package/src/families/families.spec.ts +180 -0
  575. package/src/families/gpg.ts +13 -0
  576. package/src/families/host.ts +34 -0
  577. package/src/families/index.ts +32 -0
  578. package/src/families/messages.ts +39 -0
  579. package/src/families/sol.ts +25 -0
  580. package/src/families/sui.ts +17 -0
  581. package/src/index.ts +38 -1
  582. package/src/keycloak/KeycloakWalletLogin.spec.tsx +211 -4
  583. package/src/keycloak/keycloakWallet.spec.ts +81 -1
  584. package/src/keycloak/keycloakWallet.ts +24 -2
  585. package/src/keycloak/useDirectLogin.spec.tsx +77 -4
  586. package/src/keycloak/useDirectLogin.ts +23 -11
  587. package/src/keycloak/useWalletLogin.spec.tsx +52 -0
  588. package/src/keycloak/useWalletLogin.ts +24 -6
  589. package/src/light/drivers.spec.ts +330 -0
  590. package/src/light/drivers.ts +54 -0
  591. package/src/light/index.ts +1 -0
  592. package/src/light/native.spec.ts +22 -0
  593. package/src/providers/WalletProvider.native.spec.tsx +288 -0
  594. package/src/providers/WalletProvider.native.tsx +132 -59
  595. package/src/providers/WalletProvider.spec.tsx +521 -0
  596. package/src/providers/WalletProvider.tsx +90 -19
  597. package/src/providers/families.tsx +39 -0
  598. package/src/providers/index.ts +3 -0
  599. package/src/providers/walletConfig.spec.ts +19 -1
  600. package/src/providers/walletConfig.ts +80 -2
  601. package/src/wagmi/driver.spec.ts +407 -0
  602. package/src/wagmi/driver.ts +303 -0
  603. package/src/wagmi/host.spec.tsx +416 -0
  604. package/src/wagmi/host.tsx +260 -0
  605. package/src/wagmi/index.ts +1 -0
  606. package/src/web.spec.ts +58 -0
  607. package/src/web.ts +82 -0
  608. package/types/bridge/base58.d.ts +2 -0
  609. package/types/bridge/base58.d.ts.map +1 -0
  610. package/types/bridge/core.d.ts +2 -1
  611. package/types/bridge/core.d.ts.map +1 -1
  612. package/types/bridge/drivers.d.ts +24 -0
  613. package/types/bridge/drivers.d.ts.map +1 -0
  614. package/types/bridge/nativeHost.d.ts +34 -4
  615. package/types/bridge/nativeHost.d.ts.map +1 -1
  616. package/types/clients/adapter.d.ts +5 -1
  617. package/types/clients/adapter.d.ts.map +1 -1
  618. package/types/clients/connector.d.ts +2 -0
  619. package/types/clients/connector.d.ts.map +1 -1
  620. package/types/clients/evm.d.ts +2 -0
  621. package/types/clients/evm.d.ts.map +1 -1
  622. package/types/clients/evmRead.d.ts +54 -0
  623. package/types/clients/evmRead.d.ts.map +1 -0
  624. package/types/clients/hooks.d.ts +23 -3
  625. package/types/clients/hooks.d.ts.map +1 -1
  626. package/types/clients/index.d.ts +4 -2
  627. package/types/clients/index.d.ts.map +1 -1
  628. package/types/clients/types.d.ts +11 -1
  629. package/types/clients/types.d.ts.map +1 -1
  630. package/types/connectkit/adapters/BitcoinAdapter.d.ts +9 -0
  631. package/types/connectkit/adapters/BitcoinAdapter.d.ts.map +1 -1
  632. package/types/connectkit/adapters/SolanaAdapter.d.ts +12 -0
  633. package/types/connectkit/adapters/SolanaAdapter.d.ts.map +1 -1
  634. package/types/connectkit/adapters/SuiAdapter.d.ts +8 -0
  635. package/types/connectkit/adapters/SuiAdapter.d.ts.map +1 -1
  636. package/types/connectkit/connectors/ensureWalletConnectors.d.ts +3 -0
  637. package/types/connectkit/connectors/ensureWalletConnectors.d.ts.map +1 -1
  638. package/types/connectkit/connectors/getWalletConnectors.d.ts +2 -0
  639. package/types/connectkit/connectors/getWalletConnectors.d.ts.map +1 -1
  640. package/types/connectkit/connectors/syntheticChains.d.ts +8 -0
  641. package/types/connectkit/connectors/syntheticChains.d.ts.map +1 -1
  642. package/types/connectkit/connectors/walletAdapterConnector.d.ts +2 -0
  643. package/types/connectkit/connectors/walletAdapterConnector.d.ts.map +1 -1
  644. package/types/connectkit/defaultConfig.d.ts +2 -1
  645. package/types/connectkit/defaultConfig.d.ts.map +1 -1
  646. package/types/connectkit/siwe/SIWEContext.d.ts.map +1 -1
  647. package/types/connectkit/siwe/SIWEProvider.d.ts +6 -0
  648. package/types/connectkit/siwe/SIWEProvider.d.ts.map +1 -1
  649. package/types/connectkit/siwe/connectIntent.d.ts +16 -5
  650. package/types/connectkit/siwe/connectIntent.d.ts.map +1 -1
  651. package/types/connectkit/siwe/useSIWE.d.ts +4 -0
  652. package/types/connectkit/siwe/useSIWE.d.ts.map +1 -1
  653. package/types/connectkit/web3Bridge.d.ts +2 -0
  654. package/types/connectkit/web3Bridge.d.ts.map +1 -1
  655. package/types/core/family.d.ts +26 -0
  656. package/types/core/family.d.ts.map +1 -1
  657. package/types/core/index.d.ts +6 -4
  658. package/types/core/index.d.ts.map +1 -1
  659. package/types/core/lightDriver.d.ts +52 -0
  660. package/types/core/lightDriver.d.ts.map +1 -0
  661. package/types/core/react.d.ts +4 -0
  662. package/types/core/react.d.ts.map +1 -1
  663. package/types/core/signIn.d.ts +85 -0
  664. package/types/core/signIn.d.ts.map +1 -0
  665. package/types/core/store.d.ts +12 -3
  666. package/types/core/store.d.ts.map +1 -1
  667. package/types/core/types.d.ts +14 -1
  668. package/types/core/types.d.ts.map +1 -1
  669. package/types/families/btc.d.ts +4 -0
  670. package/types/families/btc.d.ts.map +1 -0
  671. package/types/families/eth.d.ts +13 -0
  672. package/types/families/eth.d.ts.map +1 -0
  673. package/types/families/gpg.d.ts +4 -0
  674. package/types/families/gpg.d.ts.map +1 -0
  675. package/types/families/host.d.ts +24 -0
  676. package/types/families/host.d.ts.map +1 -0
  677. package/types/families/index.d.ts +14 -0
  678. package/types/families/index.d.ts.map +1 -0
  679. package/types/families/messages.d.ts +7 -0
  680. package/types/families/messages.d.ts.map +1 -0
  681. package/types/families/sol.d.ts +9 -0
  682. package/types/families/sol.d.ts.map +1 -0
  683. package/types/families/sui.d.ts +4 -0
  684. package/types/families/sui.d.ts.map +1 -0
  685. package/types/index.d.ts +5 -2
  686. package/types/index.d.ts.map +1 -1
  687. package/types/keycloak/keycloakWallet.d.ts +15 -2
  688. package/types/keycloak/keycloakWallet.d.ts.map +1 -1
  689. package/types/keycloak/useDirectLogin.d.ts +11 -6
  690. package/types/keycloak/useDirectLogin.d.ts.map +1 -1
  691. package/types/keycloak/useWalletLogin.d.ts +8 -1
  692. package/types/keycloak/useWalletLogin.d.ts.map +1 -1
  693. package/types/light/drivers.d.ts +13 -0
  694. package/types/light/drivers.d.ts.map +1 -0
  695. package/types/light/index.d.ts +2 -0
  696. package/types/light/index.d.ts.map +1 -0
  697. package/types/providers/WalletProvider.d.ts +37 -6
  698. package/types/providers/WalletProvider.d.ts.map +1 -1
  699. package/types/providers/WalletProvider.native.d.ts +32 -3
  700. package/types/providers/WalletProvider.native.d.ts.map +1 -1
  701. package/types/providers/families.d.ts +12 -0
  702. package/types/providers/families.d.ts.map +1 -0
  703. package/types/providers/index.d.ts +1 -1
  704. package/types/providers/index.d.ts.map +1 -1
  705. package/types/providers/walletConfig.d.ts +32 -2
  706. package/types/providers/walletConfig.d.ts.map +1 -1
  707. package/types/wagmi/driver.d.ts +44 -0
  708. package/types/wagmi/driver.d.ts.map +1 -0
  709. package/types/wagmi/host.d.ts +31 -0
  710. package/types/wagmi/host.d.ts.map +1 -0
  711. package/types/wagmi/index.d.ts +2 -0
  712. package/types/wagmi/index.d.ts.map +1 -0
  713. package/types/web.d.ts +13 -0
  714. package/types/web.d.ts.map +1 -0
@@ -0,0 +1,305 @@
1
+ // @vitest-environment happy-dom
2
+ import { act, render, renderHook } from "@testing-library/react";
3
+ import type { ReactNode } from "react";
4
+ import { describe, expect, it, vi } from "vitest";
5
+ import { deferred, testDriver } from "../../tests/core/testDriver";
6
+ import type { ChainClient } from "../clients/types";
7
+ import { defineWalletFamily } from "./family";
8
+ import { ConnectionProvider } from "./react";
9
+ import {
10
+ SignInProvider,
11
+ signInWithConnection,
12
+ useOptionalSignIn,
13
+ useSignIn,
14
+ type SignInConfig,
15
+ type SignInCredential,
16
+ } from "./signIn";
17
+ import { createConnectionStore } from "./store";
18
+
19
+ const SOL_ADDRESS = "7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV";
20
+
21
+ function setup() {
22
+ const sol = testDriver("solana", [{ id: "phantom", name: "Phantom" }], {
23
+ phantom: { address: SOL_ADDRESS, chainId: "solana:devnet" },
24
+ });
25
+ const store = createConnectionStore({
26
+ storage: null,
27
+ families: [
28
+ defineWalletFamily({
29
+ id: "sol",
30
+ label: "Solana",
31
+ message: {
32
+ header: "wants you to sign in with your Solana account:",
33
+ statement: "Sign in — with Solana.",
34
+ chainId: "solana:mainnet",
35
+ },
36
+ driver: () => sol,
37
+ }),
38
+ ],
39
+ });
40
+ let nonces = 0;
41
+ const onSign = vi.fn<(credential: SignInCredential) => boolean | void>(() => undefined);
42
+ const config: SignInConfig = {
43
+ getNonce: vi.fn(async () => `nonce-${++nonces}`),
44
+ onSign,
45
+ domain: "app.example.com",
46
+ uri: "https://app.example.com",
47
+ };
48
+ const wrapper =
49
+ (props: Partial<SignInConfig> = {}) =>
50
+ ({ children }: { children: ReactNode }) => (
51
+ <ConnectionProvider store={store}>
52
+ <SignInProvider {...config} {...props}>
53
+ {children}
54
+ </SignInProvider>
55
+ </ConnectionProvider>
56
+ );
57
+ return { sol, store, config, onSign, wrapper };
58
+ }
59
+
60
+ const decode = (base64: string) =>
61
+ new TextDecoder().decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
62
+
63
+ describe("signInWithConnection", () => {
64
+ it("signs the connected family's message with its client and hands onSign the credential", async () => {
65
+ const { store, config, onSign } = setup();
66
+ await store.connect("sol", "phantom");
67
+
68
+ const credential = await signInWithConnection(store, config);
69
+
70
+ const lines = credential.message.split("\n");
71
+ expect(lines.slice(0, 4)).toEqual([
72
+ "app.example.com wants you to sign in with your Solana account:",
73
+ SOL_ADDRESS,
74
+ "",
75
+ "Sign in — with Solana.",
76
+ ]);
77
+ expect(lines).toContain("URI: https://app.example.com");
78
+ expect(lines).toContain("Chain ID: solana:devnet");
79
+ expect(lines).toContain("Nonce: nonce-1");
80
+ expect(credential.username).toBe(`solana:${credential.message}`);
81
+ expect(decode(credential.password)).toBe(credential.message);
82
+ expect(onSign).toHaveBeenCalledExactlyOnceWith(credential);
83
+ });
84
+
85
+ it("takes the message from createMessage when the config has one", async () => {
86
+ const { store, config } = setup();
87
+ await store.connect("sol", "phantom");
88
+ const createMessage = vi.fn(() => "custom message");
89
+
90
+ const credential = await signInWithConnection(store, { ...config, createMessage });
91
+
92
+ expect(createMessage).toHaveBeenCalledExactlyOnceWith({
93
+ family: "sol",
94
+ address: SOL_ADDRESS,
95
+ chainId: "solana:devnet",
96
+ nonce: "nonce-1",
97
+ });
98
+ expect(credential.username).toBe("solana:custom message");
99
+ });
100
+
101
+ it("refuses without a connection, before asking for a nonce", async () => {
102
+ const { store, config } = setup();
103
+ await expect(signInWithConnection(store, config)).rejects.toThrow(/needs a connected wallet/);
104
+ expect(config.getNonce).not.toHaveBeenCalled();
105
+ });
106
+
107
+ it("does not ask the wallet when the connection changes while the nonce loads", async () => {
108
+ const { sol, store, config, onSign } = setup();
109
+ await store.connect("sol", "phantom");
110
+ const nonce = deferred<string>();
111
+ const signing = signInWithConnection(store, { ...config, getNonce: () => nonce.promise });
112
+
113
+ sol.emit({
114
+ status: "connected",
115
+ connectorId: "phantom",
116
+ account: {
117
+ address: "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
118
+ chainId: "solana:devnet",
119
+ },
120
+ });
121
+ nonce.resolve("n");
122
+
123
+ await expect(signing).rejects.toThrow(/changed during sign-in/);
124
+ expect(onSign).not.toHaveBeenCalled();
125
+ });
126
+
127
+ it("waits for a client the driver hands the store after the connection opens", async () => {
128
+ const { sol, store, config, onSign } = setup();
129
+ const client = deferred<ReturnType<typeof sol.client>>();
130
+ const real = sol.client.getMockImplementation()!;
131
+ sol.client.mockImplementation(() => client.promise as never);
132
+ await store.connect("sol", "phantom");
133
+ expect(store.getState().client).toBeNull();
134
+
135
+ const signing = signInWithConnection(store, config);
136
+ client.resolve(real(sol.getState()));
137
+
138
+ await expect(signing).resolves.toMatchObject({ username: expect.stringMatching(/^solana:/) });
139
+ expect(onSign).toHaveBeenCalledTimes(1);
140
+ });
141
+
142
+ it("gives up on a client that never comes, and on a connection that goes while it waits", async () => {
143
+ vi.useFakeTimers();
144
+ try {
145
+ const { sol, store, config } = setup();
146
+ sol.client.mockImplementation(() => new Promise(() => {}) as never);
147
+ await store.connect("sol", "phantom");
148
+
149
+ const late = signInWithConnection(store, config);
150
+ const failed = expect(late).rejects.toThrow(/no client to sign with/);
151
+ await vi.advanceTimersByTimeAsync(10_000);
152
+ await failed;
153
+
154
+ const gone = signInWithConnection(store, config);
155
+ await store.disconnect();
156
+ await expect(gone).rejects.toThrow(/changed during sign-in/);
157
+ expect(config.getNonce).not.toHaveBeenCalled();
158
+ } finally {
159
+ vi.useRealTimers();
160
+ }
161
+ });
162
+
163
+ it("asks the store again for a client whose build failed once", async () => {
164
+ const { sol, store, config, onSign } = setup();
165
+ const real = sol.client.getMockImplementation()!;
166
+ sol.client.mockImplementationOnce(() => Promise.reject(new Error("transient")) as never);
167
+ await store.connect("sol", "phantom");
168
+ await Promise.resolve();
169
+ expect(store.getState().client).toBeNull();
170
+
171
+ await expect(signInWithConnection(store, config)).resolves.toMatchObject({
172
+ username: expect.stringMatching(/^solana:/),
173
+ });
174
+ expect(onSign).toHaveBeenCalledTimes(1);
175
+ sol.client.mockImplementation(real);
176
+ });
177
+
178
+ it("a false from onSign refuses the sign-in", async () => {
179
+ const { store, config } = setup();
180
+ await store.connect("sol", "phantom");
181
+ await expect(signInWithConnection(store, { ...config, onSign: () => false })).rejects.toThrow(
182
+ /rejected/,
183
+ );
184
+ });
185
+ });
186
+
187
+ describe("SignInProvider", () => {
188
+ it("goes loading then success, and joins a second press to the first", async () => {
189
+ const { store, config, onSign, wrapper } = setup();
190
+ await store.connect("sol", "phantom");
191
+ const nonce = deferred<string>();
192
+ const { result } = renderHook(() => useSignIn(), {
193
+ wrapper: wrapper({ getNonce: () => nonce.promise }),
194
+ });
195
+ expect(result.current.status).toBe("ready");
196
+
197
+ let first!: Promise<boolean>;
198
+ let second!: Promise<boolean>;
199
+ act(() => {
200
+ first = result.current.signIn();
201
+ second = result.current.signIn();
202
+ });
203
+ expect(second).toBe(first);
204
+ expect(result.current.status).toBe("loading");
205
+
206
+ await act(async () => {
207
+ nonce.resolve("n-1");
208
+ await first;
209
+ });
210
+ expect(await first).toBe(true);
211
+ expect(onSign).toHaveBeenCalledTimes(1);
212
+ expect(result.current.status).toBe("success");
213
+ expect(result.current.onSign).toBe(config.onSign);
214
+ });
215
+
216
+ it("a wallet's 4001 is rejected, anything else an error, and reset clears both", async () => {
217
+ const { sol, store, wrapper } = setup();
218
+ await store.connect("sol", "phantom");
219
+ const client = sol.client.getMockImplementation()!;
220
+ sol.client.mockImplementation((state) => {
221
+ const real = client(state) as ChainClient | null;
222
+ return real
223
+ ? { ...real, signMessage: async () => Promise.reject({ code: 4001, message: "no" }) }
224
+ : null;
225
+ });
226
+ const { result } = renderHook(() => useSignIn(), { wrapper: wrapper() });
227
+ // the store asks the driver for a client again only on a change
228
+ await act(async () => {
229
+ sol.emit({
230
+ status: "connected",
231
+ connectorId: "phantom",
232
+ account: { address: SOL_ADDRESS, chainId: "solana:mainnet" },
233
+ });
234
+ });
235
+
236
+ let accepted: boolean | undefined;
237
+ await act(async () => {
238
+ accepted = await result.current.signIn();
239
+ });
240
+ expect(accepted).toBe(false);
241
+ expect(result.current.status).toBe("rejected");
242
+ expect(result.current.error).toMatchObject({ code: 4001 });
243
+
244
+ act(() => result.current.reset());
245
+ expect(result.current.status).toBe("ready");
246
+ expect(result.current.error).toBeNull();
247
+
248
+ await act(() => store.disconnect());
249
+ await act(async () => {
250
+ accepted = await result.current.signIn();
251
+ });
252
+ expect(accepted).toBe(false);
253
+ expect(result.current.status).toBe("error");
254
+ expect(String(result.current.error)).toMatch(/needs a connected wallet/);
255
+ });
256
+
257
+ it("fetches a nonce ahead of the press, and again on every reset", () => {
258
+ const { config, wrapper } = setup();
259
+ const resets = new Set<() => void>();
260
+ const subscribeNonceReset = vi.fn((listener: () => void) => {
261
+ resets.add(listener);
262
+ return () => resets.delete(listener);
263
+ });
264
+ const { unmount } = renderHook(() => useSignIn(), {
265
+ wrapper: wrapper({ subscribeNonceReset }),
266
+ });
267
+ expect(config.getNonce).toHaveBeenCalledTimes(1);
268
+ for (const listener of resets) listener();
269
+ expect(config.getNonce).toHaveBeenCalledTimes(2);
270
+ unmount();
271
+ expect(resets.size).toBe(0);
272
+ });
273
+
274
+ it("a re-render fetches no nonce, even with an inline subscribeNonceReset", () => {
275
+ const { config, wrapper } = setup();
276
+ const listeners: (() => void)[] = [];
277
+ const { rerender } = renderHook(() => useSignIn(), {
278
+ wrapper: ({ children }: { children: ReactNode }) =>
279
+ wrapper({
280
+ subscribeNonceReset: (listener) => {
281
+ listeners.push(listener);
282
+ return () => undefined;
283
+ },
284
+ })({ children }),
285
+ });
286
+ rerender();
287
+ rerender();
288
+ expect(config.getNonce).toHaveBeenCalledTimes(1);
289
+ listeners.at(-1)?.();
290
+ expect(config.getNonce).toHaveBeenCalledTimes(2);
291
+ });
292
+
293
+ it("needs a connection store above it", () => {
294
+ const { config } = setup();
295
+ vi.spyOn(console, "error").mockImplementation(() => undefined);
296
+ expect(() => render(<SignInProvider {...config} />)).toThrow(
297
+ /Web3Provider or ConnectionProvider/,
298
+ );
299
+ });
300
+
301
+ it("useSignIn refuses outside a SignInProvider, useOptionalSignIn reads null", () => {
302
+ expect(() => renderHook(() => useSignIn())).toThrow(/needs a SignInProvider/);
303
+ expect(renderHook(() => useOptionalSignIn()).result.current).toBeNull();
304
+ });
305
+ });
@@ -0,0 +1,282 @@
1
+ import {
2
+ createContext,
3
+ createElement,
4
+ useCallback,
5
+ useContext,
6
+ useEffect,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ type ReactNode,
11
+ } from "react";
12
+ import type { ChainClient } from "../clients/types";
13
+ import { useOptionalConnectionStore } from "./react";
14
+ import type { ConnectionStore } from "./store";
15
+ import type { ConnectionState } from "./types";
16
+
17
+ /** The values of the SIWE provider's `StatusState`, so a button reads either. */
18
+ export type SignInStatus = "ready" | "loading" | "success" | "rejected" | "error";
19
+
20
+ /** What a signed sign-in hands over: Keycloak takes it as the login form's username and password. */
21
+ export interface SignInCredential {
22
+ /** The signature, in the family's own encoding. */
23
+ readonly username: string;
24
+ /** The signed message, UTF-8 then base64. */
25
+ readonly password: string;
26
+ readonly message: string;
27
+ }
28
+
29
+ export interface SignInMessageArgs {
30
+ readonly family: string;
31
+ readonly address: string;
32
+ readonly chainId: number | string | null;
33
+ readonly nonce: string;
34
+ }
35
+
36
+ /**
37
+ * How a sign-in gets its nonce and where the signed credential goes.
38
+ * `kc.signInConfig(onSign)` is one for a Keycloak browser flow, direct grant
39
+ * or wallet registration.
40
+ */
41
+ export interface SignInConfig {
42
+ /**
43
+ * A server nonce, asked once per sign-in, and ahead of it on mount and on
44
+ * every nonce reset. Only a source that caches its nonce until a reset, as
45
+ * keycloakWallet's does, saves the press its round trip that way.
46
+ */
47
+ getNonce(): Promise<string>;
48
+ /** Takes the credential. Resolving false refuses the sign-in. */
49
+ onSign(credential: SignInCredential): Promise<boolean | void> | boolean | void;
50
+ /** Written into the message. Defaults to the page's host. */
51
+ domain?: string;
52
+ /** Defaults to the page's origin, or `https://<domain>`. */
53
+ uri?: string;
54
+ /** Defaults to the family's statement; null or "" leaves it out. */
55
+ statement?: string | null;
56
+ /** Builds the message in place of the connected family's own. */
57
+ createMessage?(args: SignInMessageArgs): string | Promise<string>;
58
+ /**
59
+ * Called with a listener on mount; the provider fetches a nonce ahead of
60
+ * the next press whenever it fires, as kc's resetNonce does after a direct
61
+ * grant spent one. Returns the unsubscribe.
62
+ */
63
+ subscribeNonceReset?(listener: () => void): () => void;
64
+ }
65
+
66
+ export interface SignIn {
67
+ readonly status: SignInStatus;
68
+ /** Why the last sign-in failed, or null. */
69
+ readonly error: unknown;
70
+ /**
71
+ * Signs the family's message with the active connection and hands the
72
+ * credential to `onSign`. Resolves false when the wallet, `onSign` or the
73
+ * connection refused, with `status` and `error` saying which. A call while
74
+ * one runs joins it.
75
+ */
76
+ signIn(): Promise<boolean>;
77
+ /** Back to `ready`, clearing the error. */
78
+ reset(): void;
79
+ /** The config's `onSign`, so a caller can check it signs for them. */
80
+ readonly onSign: SignInConfig["onSign"];
81
+ }
82
+
83
+ const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
84
+
85
+ /** UTF-8 then base64, without btoa or Buffer, so it runs on Hermes. */
86
+ function utf8Base64(text: string): string {
87
+ const bytes = new TextEncoder().encode(text);
88
+ let out = "";
89
+ for (let i = 0; i < bytes.length; i += 3) {
90
+ const b0 = bytes[i];
91
+ const b1 = i + 1 < bytes.length ? bytes[i + 1] : 0;
92
+ const b2 = i + 2 < bytes.length ? bytes[i + 2] : 0;
93
+ out += alphabet[b0 >> 2];
94
+ out += alphabet[((b0 & 0x03) << 4) | (b1 >> 4)];
95
+ out += i + 1 < bytes.length ? alphabet[((b1 & 0x0f) << 2) | (b2 >> 6)] : "=";
96
+ out += i + 2 < bytes.length ? alphabet[b2 & 0x3f] : "=";
97
+ }
98
+ return out;
99
+ }
100
+
101
+ /** The codes wallets reject a signature request with, as the SIWE provider reads them. */
102
+ function isRejection(error: unknown): boolean {
103
+ for (let e = error, depth = 0; e && typeof e === "object" && depth < 4; depth += 1) {
104
+ const code = (e as { code?: unknown }).code;
105
+ if (code === 4001 || code === -32000 || code === "ACTION_REJECTED") return true;
106
+ e = (e as { cause?: unknown }).cause;
107
+ }
108
+ return false;
109
+ }
110
+
111
+ type Signable = ConnectionState & { family: string; address: string; client: ChainClient };
112
+
113
+ /** How long a sign-in waits for a connection's client, which a driver may build after it connects. */
114
+ const clientTimeout = 10_000;
115
+
116
+ /**
117
+ * The active connection once its client is there. A driver can hand the
118
+ * store its client a moment after the connection opens, or fail to build it
119
+ * once, so the store asks the driver again; the sign-in gives up when the
120
+ * connection goes or no client comes.
121
+ */
122
+ function signable(store: ConnectionStore): Promise<Signable> {
123
+ const ready = (state: ConnectionState): state is Signable =>
124
+ state.status === "connected" && !!state.family && !!state.address && !!state.client;
125
+ const first = store.getState();
126
+ if (ready(first)) return Promise.resolve(first);
127
+ if (first.status !== "connected" || !first.family || !first.address) {
128
+ return Promise.reject(new Error("sign-in needs a connected wallet"));
129
+ }
130
+ const { family, address } = first;
131
+ const noClient = () => new Error(`the ${family} connection has no client to sign with`);
132
+ const same = (state: ConnectionState) =>
133
+ state.status === "connected" && state.family === family && state.address === address;
134
+ return new Promise<Signable>((resolve, reject) => {
135
+ let done = false;
136
+ const finish = (settle: () => void) => {
137
+ if (done) return;
138
+ done = true;
139
+ clearTimeout(timer);
140
+ stop();
141
+ settle();
142
+ };
143
+ const timer = setTimeout(() => finish(() => reject(noClient())), clientTimeout);
144
+ const stop = store.subscribe(() => {
145
+ const state = store.getState();
146
+ if (ready(state) && same(state)) finish(() => resolve(state));
147
+ else if (!same(state)) {
148
+ finish(() => reject(new Error("the wallet connection changed during sign-in")));
149
+ }
150
+ });
151
+ store.client().then(
152
+ (client) => {
153
+ const state = store.getState();
154
+ if (!same(state)) {
155
+ finish(() => reject(new Error("the wallet connection changed during sign-in")));
156
+ } else if (client) finish(() => resolve({ ...state, client } as Signable));
157
+ else finish(() => reject(noClient()));
158
+ },
159
+ (error: unknown) => finish(() => reject(error)),
160
+ );
161
+ });
162
+ }
163
+
164
+ /**
165
+ * One sign-in on the store's active connection: nonce, the family's message,
166
+ * the connection's client signs it, `onSign` takes the credential. Throws
167
+ * when there is no connection, the connection changes before the wallet is
168
+ * asked, or `onSign` refuses.
169
+ */
170
+ export async function signInWithConnection(
171
+ store: ConnectionStore,
172
+ config: SignInConfig,
173
+ ): Promise<SignInCredential> {
174
+ const { family, address, chainId, client } = await signable(store);
175
+ const nonce = await config.getNonce();
176
+ if (!nonce) throw new Error("sign-in: the nonce is empty");
177
+ const message = config.createMessage
178
+ ? await config.createMessage({ family, address, chainId, nonce })
179
+ : store.registry.messages.build(family, {
180
+ address,
181
+ nonce,
182
+ ...(chainId === null ? {} : { chainId }),
183
+ domain: config.domain,
184
+ uri: config.uri,
185
+ ...(config.statement === undefined ? {} : { statement: config.statement }),
186
+ });
187
+ const now = store.getState();
188
+ if (now.status !== "connected" || now.family !== family || now.address !== address) {
189
+ throw new Error("the wallet connection changed during sign-in");
190
+ }
191
+ const signature = await client.signMessage(message);
192
+ const credential: SignInCredential = {
193
+ username: signature,
194
+ password: utf8Base64(message),
195
+ message,
196
+ };
197
+ if ((await config.onSign(credential)) === false) throw new Error("Sign-in was rejected");
198
+ return credential;
199
+ }
200
+
201
+ const SignInContext = createContext<SignIn | null>(null);
202
+
203
+ export interface SignInProviderProps extends SignInConfig {
204
+ children?: ReactNode;
205
+ }
206
+
207
+ /**
208
+ * Wallet sign-in on the connection store: whichever family holds the
209
+ * connection signs its own message through its client. It replaces
210
+ * SIWEProvider, and mounts anywhere under a Web3Provider or
211
+ * ConnectionProvider: `<SignInProvider {...kc.signInConfig(onSign)}>`.
212
+ */
213
+ export function SignInProvider({ children, ...config }: SignInProviderProps) {
214
+ const store = useOptionalConnectionStore();
215
+ if (!store) {
216
+ throw new Error("SignInProvider needs a Web3Provider or ConnectionProvider above it");
217
+ }
218
+ const [status, setStatus] = useState<SignInStatus>("ready");
219
+ const [error, setError] = useState<unknown>(null);
220
+ const configRef = useRef(config);
221
+ configRef.current = config;
222
+ const running = useRef<Promise<boolean> | null>(null);
223
+
224
+ // A nonce fetched ahead of the press, as SIWEProvider fetched it, so a
225
+ // nonce source that caches it (keycloakWallet's) answers the press at once
226
+ // and a phone's wallet opens inside the tap. The press still asks
227
+ // getNonce, which decides whether a nonce is reused.
228
+ const prefetch = useCallback(() => {
229
+ configRef.current.getNonce().catch(() => undefined);
230
+ }, []);
231
+ useEffect(prefetch, [prefetch]);
232
+ const { subscribeNonceReset } = config;
233
+ useEffect(() => subscribeNonceReset?.(prefetch), [subscribeNonceReset, prefetch]);
234
+
235
+ const signIn = useCallback(() => {
236
+ if (running.current) return running.current;
237
+ setStatus("loading");
238
+ setError(null);
239
+ const attempt = signInWithConnection(store, configRef.current).then(
240
+ () => {
241
+ // success, not ready: a browser flow is about to navigate away, and
242
+ // ready would let the button submit twice in that window.
243
+ setStatus("success");
244
+ return true;
245
+ },
246
+ (e: unknown) => {
247
+ setError(e);
248
+ setStatus(isRejection(e) ? "rejected" : "error");
249
+ return false;
250
+ },
251
+ );
252
+ const settled = attempt.finally(() => {
253
+ if (running.current === settled) running.current = null;
254
+ });
255
+ running.current = settled;
256
+ return settled;
257
+ }, [store]);
258
+
259
+ const reset = useCallback(() => {
260
+ setStatus("ready");
261
+ setError(null);
262
+ }, []);
263
+
264
+ const { onSign } = config;
265
+ const value = useMemo<SignIn>(
266
+ () => ({ status, error, signIn, reset, onSign }),
267
+ [status, error, signIn, reset, onSign],
268
+ );
269
+ return createElement(SignInContext.Provider, { value }, children);
270
+ }
271
+
272
+ /** The nearest SignInProvider's sign-in. */
273
+ export function useSignIn(): SignIn {
274
+ const value = useContext(SignInContext);
275
+ if (!value) throw new Error("useSignIn needs a SignInProvider above it");
276
+ return value;
277
+ }
278
+
279
+ /** The nearest SignInProvider's sign-in, or null where there is none. */
280
+ export function useOptionalSignIn(): SignIn | null {
281
+ return useContext(SignInContext);
282
+ }
@@ -279,6 +279,89 @@ describe("createConnectionStore", () => {
279
279
  expect(storage.map.size).toBe(0);
280
280
  });
281
281
 
282
+ describe("client()", () => {
283
+ it("asks the driver again for a client whose build failed, and keeps the one it gets", async () => {
284
+ const { store, sol } = setup();
285
+ const real = sol.client.getMockImplementation()!;
286
+ sol.client.mockImplementationOnce(() => Promise.reject(new Error("transient")) as never);
287
+ await store.connect("sol", "phantom");
288
+ await Promise.resolve();
289
+ expect(store.getState().client).toBeNull();
290
+
291
+ const client = await store.client();
292
+
293
+ expect(client).toMatchObject({ family: "solana", address: phantomAccount.address });
294
+ expect(store.getState().client).toBe(client);
295
+ expect(await store.client()).toBe(client);
296
+ expect(sol.client).toHaveBeenCalledTimes(2);
297
+ sol.client.mockImplementation(real);
298
+ });
299
+
300
+ it("is null with nothing connected, and rejects with the driver's error", async () => {
301
+ const { store, sol } = setup();
302
+ expect(await store.client()).toBeNull();
303
+ sol.client.mockImplementation(() => Promise.reject(new Error("wallet busy")) as never);
304
+ await store.connect("sol", "phantom");
305
+ await expect(store.client()).rejects.toThrow(/wallet busy/);
306
+ });
307
+ });
308
+
309
+ describe("a silent connect", () => {
310
+ it("takes a connection the wallet already granted through reconnect, with no prompt", async () => {
311
+ const storage = memoryStorage();
312
+ const { store, eth, sol, seen } = setup(storage);
313
+ await store.connect("eth", "metaMask");
314
+ const state = await store.connect("sol", "phantom", { silent: true });
315
+ expect(sol.reconnect).toHaveBeenCalledWith("phantom");
316
+ expect(sol.connect).not.toHaveBeenCalled();
317
+ expect(eth.disconnect).toHaveBeenCalledTimes(1);
318
+ expect(state).toMatchObject({
319
+ status: "connected",
320
+ family: "sol",
321
+ address: phantomAccount.address,
322
+ });
323
+ expect(seen.map((entry) => entry.status)).toContain("connecting");
324
+ expect(JSON.parse(storage.map.get(defaultConnectionStorageKey) ?? "")).toEqual({
325
+ family: "sol",
326
+ connectorId: "phantom",
327
+ });
328
+ });
329
+
330
+ it("rejects and stays disconnected when the wallet has not granted it, remembering nothing", async () => {
331
+ const storage = memoryStorage();
332
+ const { store, sol } = setup(storage);
333
+ sol.reconnect.mockResolvedValueOnce(null);
334
+ await expect(store.connect("sol", "phantom", { silent: true })).rejects.toThrow(
335
+ /phantom.*not authorised/,
336
+ );
337
+ expect(sol.connect).not.toHaveBeenCalled();
338
+ expect(store.getState().status).toBe("disconnected");
339
+ expect(storage.map.size).toBe(0);
340
+ });
341
+
342
+ it("a refused one closes nothing: what the driver holds stays with whoever opened it", async () => {
343
+ const { store, sol } = setup();
344
+ sol.emit({ status: "connected", connectorId: "phantom", account: phantomAccount });
345
+ sol.reconnect.mockRejectedValueOnce(new Error("no such connector"));
346
+ await expect(store.connect("sol", "phantom", { silent: true })).rejects.toThrow(
347
+ /no such connector/,
348
+ );
349
+ sol.reconnect.mockResolvedValueOnce(null);
350
+ await expect(store.connect("sol", "phantom", { silent: true })).rejects.toThrow(
351
+ /not authorised/,
352
+ );
353
+ expect(sol.disconnect).not.toHaveBeenCalled();
354
+ expect(sol.getState().status).toBe("connected");
355
+ });
356
+
357
+ it("never hands the silent flag to the driver", async () => {
358
+ const { store, eth } = setup();
359
+ const onDisplayUri = vi.fn();
360
+ await store.connect("eth", "metaMask", { onDisplayUri, silent: false });
361
+ expect(eth.connect).toHaveBeenCalledWith("metaMask", { onDisplayUri });
362
+ });
363
+ });
364
+
282
365
  it("refuses a connectionless family and an unregistered one", async () => {
283
366
  const { store } = setup();
284
367
  await expect(store.connect("gpg", "key")).rejects.toThrow(/connectionless/);