@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
@@ -3,7 +3,11 @@ import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/re
3
3
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
4
  import { createConfig, createStorage, http } from "wagmi";
5
5
  import { mainnet } from "wagmi/chains";
6
+ import { connect } from "wagmi/actions";
6
7
  import { mock } from "wagmi/connectors";
8
+ import { verifyMessage } from "viem";
9
+ import { resetConnectIntentPage, setConnectIntent } from "../connectkit/siwe/connectIntent";
10
+ import { createMockConnector } from "../providers/mockConnector";
7
11
  import { KeycloakWalletLogin, type KeycloakWalletLoginProps } from "./KeycloakWalletLogin";
8
12
 
9
13
  const ANDROID_UA =
@@ -26,15 +30,25 @@ function memoryStorage() {
26
30
  getItem: (key: string) => map.get(key) ?? null,
27
31
  setItem: (key: string, value: string) => void map.set(key, value),
28
32
  removeItem: (key: string) => void map.delete(key),
33
+ clear: () => map.clear(),
34
+ entries: () => [...map],
29
35
  };
30
36
  }
31
37
 
32
- function makeConfig() {
38
+ /** `defaultConnected` stands for a wallet whose earlier connect this page reloads into. */
39
+ function makeConfig(storage = memoryStorage(), defaultConnected = false) {
33
40
  return createConfig({
34
41
  chains: [mainnet],
35
- connectors: [mock({ accounts: [ACCOUNT], features: {} })],
42
+ connectors: [mock({ accounts: [ACCOUNT], features: { reconnect: true, defaultConnected } })],
36
43
  transports: { [mainnet.id]: http() },
37
- storage: createStorage({ storage: memoryStorage() }),
44
+ storage: createStorage({ storage }),
45
+ });
46
+ }
47
+
48
+ function setUserActivation(isActive: boolean | undefined) {
49
+ Object.defineProperty(window.navigator, "userActivation", {
50
+ value: isActive === undefined ? undefined : { isActive },
51
+ configurable: true,
38
52
  });
39
53
  }
40
54
 
@@ -55,17 +69,24 @@ function renderLogin(props: KeycloakWalletLoginProps = {}) {
55
69
  }
56
70
 
57
71
  const nonceRequests: string[] = [];
72
+ const rpcBodies: string[] = [];
58
73
 
59
74
  beforeEach(() => {
60
75
  nonceRequests.length = 0;
76
+ rpcBodies.length = 0;
77
+ // Node 25 ships a localStorage global without methods; the page has a real one.
78
+ vi.stubGlobal("localStorage", memoryStorage());
61
79
  vi.stubGlobal(
62
80
  "fetch",
63
- vi.fn(async (input: RequestInfo | URL) => {
81
+ vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => {
64
82
  const url = String(input);
65
83
  if (url.endsWith("/nonce")) {
66
84
  nonceRequests.push(url);
67
85
  return new Response("nonce123abc");
68
86
  }
87
+ // The mock connector sends what it does not answer itself, a signature among them.
88
+ const body = init?.body ?? (input instanceof Request ? await input.clone().text() : "");
89
+ if (body) rpcBodies.push(String(body));
69
90
  return new Response("not found", { status: 404 });
70
91
  }),
71
92
  );
@@ -76,8 +97,10 @@ afterEach(() => {
76
97
  vi.unstubAllGlobals();
77
98
  vi.restoreAllMocks();
78
99
  window.sessionStorage.clear();
100
+ resetConnectIntentPage();
79
101
  document.querySelectorAll("form").forEach((form) => form.remove());
80
102
  setUserAgent(DESKTOP_UA);
103
+ setUserActivation(undefined);
81
104
  });
82
105
 
83
106
  describe("KeycloakWalletLogin mobile.preferredConnector", () => {
@@ -142,6 +165,46 @@ describe("KeycloakWalletLogin gpg", () => {
142
165
  });
143
166
  });
144
167
 
168
+ describe("KeycloakWalletLogin wallet sign-in", () => {
169
+ it("a picked wallet signs and the credential posts to the login action", async () => {
170
+ setUserAgent(DESKTOP_UA);
171
+ const submit = vi
172
+ .spyOn(HTMLFormElement.prototype, "submit")
173
+ .mockImplementation(function (this: HTMLFormElement) {});
174
+ const config = createConfig({
175
+ chains: [mainnet],
176
+ connectors: [createMockConnector()],
177
+ transports: { [mainnet.id]: http() },
178
+ storage: createStorage({ storage: memoryStorage() }),
179
+ });
180
+ renderLogin({
181
+ wagmiConfig: config,
182
+ target: { action: LOGIN_ACTION },
183
+ domain: "kc.example.com",
184
+ });
185
+
186
+ fireEvent.click(document.getElementById("mpo-wallet-login") as HTMLButtonElement);
187
+ fireEvent.click(await screen.findByText("Mock Wallet (E2E)"));
188
+
189
+ await waitFor(() => expect(submit).toHaveBeenCalledTimes(1));
190
+ const form = submit.mock.contexts[0] as HTMLFormElement;
191
+ expect(form.action).toBe(LOGIN_ACTION);
192
+ const field = (name: string) =>
193
+ (form.querySelector(`input[name="${name}"]`) as HTMLInputElement | null)?.value ?? "";
194
+ const message = atob(field("password"));
195
+ const address = config.state.connections.get(config.state.current!)!.accounts[0];
196
+ expect(message.split("\n").slice(0, 2)).toEqual([
197
+ "kc.example.com wants you to sign in with your Ethereum account:",
198
+ address,
199
+ ]);
200
+ expect(message).toContain("Nonce: nonce123abc");
201
+ expect(
202
+ await verifyMessage({ address, message, signature: field("username") as `0x${string}` }),
203
+ ).toBe(true);
204
+ expect(nonceRequests).toEqual(["https://kc.example.com/realms/main/wallet/nonce"]);
205
+ });
206
+ });
207
+
145
208
  describe("KeycloakWalletLogin target", () => {
146
209
  it("{ action } posts the credential to a keycloakify page's login action", async () => {
147
210
  const submit = vi
@@ -166,3 +229,147 @@ describe("KeycloakWalletLogin target", () => {
166
229
  expect(nonceRequests).toEqual(["https://kc.example.com/realms/main/wallet/nonce"]);
167
230
  });
168
231
  });
232
+
233
+ describe("KeycloakWalletLogin after the page reloads during the wallet trip", () => {
234
+ const signInStep = () => screen.queryByText("Sign In With Wallet");
235
+ const signRequests = () =>
236
+ rpcBodies.filter((body) => /"method":"(eth_sign|personal_sign)"/.test(body)).length;
237
+
238
+ /**
239
+ * The next document in the tab: Android Chrome restores a tab it killed as
240
+ * back_forward. A killed tab runs no unmount, so localStorage stays as it was.
241
+ */
242
+ function nextPage(type: "back_forward" | "navigate") {
243
+ const local = localStorage as unknown as ReturnType<typeof memoryStorage>;
244
+ const kept = local.entries();
245
+ cleanup();
246
+ local.clear();
247
+ for (const [key, value] of kept) local.setItem(key, value);
248
+ window.sessionStorage.clear();
249
+ resetConnectIntentPage();
250
+ vi.spyOn(performance, "getEntriesByType").mockReturnValue([{ type }] as never);
251
+ }
252
+
253
+ async function connectOnPhoneThenLoseThePage() {
254
+ setUserAgent(ANDROID_UA);
255
+ setUserActivation(false);
256
+ const wagmiStorage = memoryStorage();
257
+ const first = renderLogin({
258
+ mobile: { preferredConnector: "mock" },
259
+ wagmiConfig: makeConfig(wagmiStorage),
260
+ });
261
+ fireEvent.click(first.walletButton);
262
+ await waitFor(() => expect(first.config.state.status).toBe("connected"));
263
+ await waitFor(() => expect(signInStep()).not.toBeNull());
264
+ // Chrome kills the tab (or the whole browser) while MetaMask is in front.
265
+ nextPage("back_forward");
266
+ return wagmiStorage;
267
+ }
268
+
269
+ async function comeBackConnected() {
270
+ const wagmiStorage = await connectOnPhoneThenLoseThePage();
271
+ const again = renderLogin({
272
+ mobile: { preferredConnector: "mock" },
273
+ wagmiConfig: makeConfig(wagmiStorage, true),
274
+ });
275
+ await waitFor(() => expect(again.config.state.status).toBe("connected"));
276
+ await waitFor(() => expect(signInStep()).not.toBeNull());
277
+ }
278
+
279
+ it("on the same page, the sign-in step's tap sends one signature request", async () => {
280
+ setUserAgent(ANDROID_UA);
281
+ setUserActivation(false);
282
+ const { walletButton } = renderLogin({ mobile: { preferredConnector: "mock" } });
283
+ fireEvent.click(walletButton);
284
+ await waitFor(() => expect(signInStep()).not.toBeNull());
285
+ setUserActivation(true);
286
+
287
+ fireEvent.click(screen.getByText("Sign In"));
288
+
289
+ await waitFor(() => expect(signRequests()).toBe(1));
290
+ await new Promise((resolve) => setTimeout(resolve, 500));
291
+ expect(signRequests()).toBe(1);
292
+ expect(signInStep()).not.toBeNull();
293
+ });
294
+
295
+ it("a phone that comes back connected lands on the sign-in step, not the bare page", async () => {
296
+ await comeBackConnected();
297
+
298
+ expect(screen.getByText("Sign In")).not.toBeNull();
299
+ expect(signRequests()).toBe(0);
300
+ });
301
+
302
+ it("the sign-in step's tap sends one signature request and keeps the step open", async () => {
303
+ await comeBackConnected();
304
+ setUserActivation(true);
305
+
306
+ fireEvent.click(screen.getByText("Sign In"));
307
+
308
+ await waitFor(() => expect(signRequests()).toBe(1));
309
+ await new Promise((resolve) => setTimeout(resolve, 500));
310
+ expect(signRequests()).toBe(1);
311
+ expect(signInStep()).not.toBeNull();
312
+ });
313
+
314
+ it("closing the sign-in step sends no signature and ends the intent", async () => {
315
+ await comeBackConnected();
316
+ setUserActivation(true);
317
+
318
+ fireEvent.click(screen.getByLabelText("Close"));
319
+
320
+ await waitFor(() => expect(localStorage.getItem("wallet:connect-intent")).toBeNull());
321
+ await new Promise((resolve) => setTimeout(resolve, 500));
322
+ expect(signRequests()).toBe(0);
323
+ });
324
+
325
+ it("a phone that comes back without the connect's answer gets the wallet list", async () => {
326
+ const wagmiStorage = await connectOnPhoneThenLoseThePage();
327
+
328
+ // The stored connection reconnects and fails: reconnecting, then disconnected.
329
+ const again = makeConfig(wagmiStorage);
330
+ await new Promise((resolve) => setTimeout(resolve, 0));
331
+ renderLogin({ mobile: { preferredConnector: "mock" }, wagmiConfig: again });
332
+
333
+ await screen.findByText("Mock Connector", undefined, { timeout: 3000 });
334
+ expect(signInStep()).toBeNull();
335
+ });
336
+
337
+ it("a phone whose tab died before the connect answered gets the wallet list", async () => {
338
+ setUserAgent(ANDROID_UA);
339
+ // The tap set the intent; Chrome killed the tab before wagmi stored a connection.
340
+ setConnectIntent();
341
+ nextPage("back_forward");
342
+
343
+ renderLogin({ mobile: { preferredConnector: "mock" } });
344
+
345
+ await screen.findByText("Mock Connector", undefined, { timeout: 3000 });
346
+ expect(signInStep()).toBeNull();
347
+ });
348
+
349
+ it("a new page, not a restored one, leaves an unfinished connect alone", async () => {
350
+ setUserAgent(ANDROID_UA);
351
+ setConnectIntent();
352
+ nextPage("navigate");
353
+
354
+ renderLogin({ mobile: { preferredConnector: "mock" } });
355
+
356
+ await new Promise((resolve) => setTimeout(resolve, 1_200));
357
+ expect(screen.queryByText("Mock Connector")).toBeNull();
358
+ expect(signInStep()).toBeNull();
359
+ });
360
+
361
+ it("a cold visit with a wallet still connected and no login started shows no modal", async () => {
362
+ setUserAgent(ANDROID_UA);
363
+ setUserActivation(false);
364
+ const wagmiStorage = memoryStorage();
365
+ const first = renderLogin({ wagmiConfig: makeConfig(wagmiStorage) });
366
+ await connect(first.config, { connector: first.config.connectors[0] });
367
+ nextPage("back_forward");
368
+
369
+ const again = renderLogin({ wagmiConfig: makeConfig(wagmiStorage, true) });
370
+ await waitFor(() => expect(again.config.state.status).toBe("connected"));
371
+ await new Promise((resolve) => setTimeout(resolve, 1_200));
372
+ expect(signInStep()).toBeNull();
373
+ expect(screen.queryByText("Mock Connector")).toBeNull();
374
+ });
375
+ });
@@ -1,5 +1,15 @@
1
- import { describe, expect, it } from "vitest";
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import {
3
+ BITCOIN_CHAIN_ID,
4
+ SOLANA_CHAIN_ID,
5
+ SUI_CHAIN_ID,
6
+ } from "../connectkit/connectors/syntheticChains";
7
+ import type { ClientFamily } from "../clients/types";
8
+ import { signInWithConnection } from "../core/signIn";
9
+ import { createConnectionStore } from "../core/store";
10
+ import { btc, eth, gpg, sol, sui } from "../families";
2
11
  import { buildWalletMessage } from "../message";
12
+ import { testDriver } from "../../tests/core/testDriver";
3
13
  import {
4
14
  deriveKeycloakFromLocation,
5
15
  keycloakWallet,
@@ -192,6 +202,76 @@ describe("keycloakWallet", () => {
192
202
  });
193
203
  });
194
204
 
205
+ describe("keycloakWallet signInConfig", () => {
206
+ afterEach(() => {
207
+ vi.useRealTimers();
208
+ });
209
+
210
+ const cases: [string, ClientFamily, string, number | string, number][] = [
211
+ ["eth", "evm", "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", 137, 137],
212
+ [
213
+ "sol",
214
+ "solana",
215
+ "7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV",
216
+ "solana:mainnet",
217
+ SOLANA_CHAIN_ID,
218
+ ],
219
+ ["sui", "sui", `0x${"ab".repeat(32)}`, "sui:mainnet", SUI_CHAIN_ID],
220
+ ["btc", "bitcoin", "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", "bitcoin", BITCOIN_CHAIN_ID],
221
+ ];
222
+
223
+ it.each(cases)(
224
+ "%s: the store's sign-in signs the bytes the SIWE path signed",
225
+ async (id, clientFamily, address, chainId, syntheticChainId) => {
226
+ vi.useFakeTimers({ toFake: ["Date"] });
227
+ vi.setSystemTime(new Date("2026-09-28T12:00:00.000Z"));
228
+ const server = nonceServer();
229
+ const kc = keycloakWallet({
230
+ baseUrl: "https://kc",
231
+ realm: "main",
232
+ domain: "app.example.com",
233
+ uri: "https://app.example.com",
234
+ fetch: server.fetch,
235
+ });
236
+ const driver = testDriver(clientFamily, [{ id: "w", name: "Wallet" }], {
237
+ w: { address, chainId },
238
+ });
239
+ const family = { eth, sol, sui, btc }[id as "eth" | "sol" | "sui" | "btc"]();
240
+ const store = createConnectionStore({
241
+ storage: null,
242
+ families: [{ ...family, driver: () => driver }, gpg()],
243
+ });
244
+ await store.connect(id, "w");
245
+ const onSign = vi.fn(async () => true);
246
+
247
+ const credential = await signInWithConnection(store, kc.signInConfig(onSign));
248
+
249
+ const siwe = await kc.siweConfig(onSign).createMessage({
250
+ nonce: "nonce-1",
251
+ address: address as `0x${string}`,
252
+ chainId: syntheticChainId,
253
+ });
254
+ expect(credential.message).toBe(siwe);
255
+ expect(credential).toEqual(
256
+ toCredentials({ signature: `${clientFamily}:${siwe}`, message: siwe }),
257
+ );
258
+ expect(onSign).toHaveBeenCalledExactlyOnceWith(credential);
259
+ },
260
+ );
261
+
262
+ it("hands the provider the shared nonce and the given onSign, and no domain it was not given", async () => {
263
+ const server = nonceServer();
264
+ const kc = keycloakWallet({ baseUrl: "https://kc", realm: "main", fetch: server.fetch });
265
+ const onSign = async () => true;
266
+ const config = kc.signInConfig(onSign);
267
+ expect(config.onSign).toBe(onSign);
268
+ expect(config.subscribeNonceReset).toBe(kc.subscribeNonceReset);
269
+ expect(await config.getNonce()).toBe(await kc.gpgConfig(onSign).getNonce());
270
+ expect(server.requests).toHaveLength(1);
271
+ expect("domain" in config || "uri" in config).toBe(false);
272
+ });
273
+ });
274
+
195
275
  describe("toCredentials", () => {
196
276
  it("base64s the UTF-8 message without btoa", () => {
197
277
  const message = "héllo ✓";
@@ -2,6 +2,7 @@ import { sha256, type Address } from "viem";
2
2
  import { bytesToBase64 } from "../bridge/base64";
3
3
  import { createWalletMessage } from "../connectkit/connectors/createWalletMessage";
4
4
  import type { SIWEConfig } from "../connectkit/siwe/SIWEContext";
5
+ import type { SignInConfig } from "../core/signIn";
5
6
  import { buildWalletMessage } from "../message";
6
7
  import { browserFlow, type BrowserFlowOptions } from "./browserFlow";
7
8
  import { createDirectGrant, type DirectGrant, type DirectGrantOptions } from "./directGrant";
@@ -71,11 +72,23 @@ export interface KeycloakWallet {
71
72
  * second sign-in never signs a nonce the server has already dropped.
72
73
  */
73
74
  subscribeNonceReset(listener: () => void): () => void;
74
- /** `SIWEConfig.createMessage`, with this wallet's domain and uri. */
75
+ /**
76
+ * `SIWEConfig.createMessage`, with this wallet's domain and uri.
77
+ * @deprecated Goes in 8.0.0 with SIWEProvider; `signInConfig` builds the connected family's message.
78
+ */
75
79
  createMessage(args: { nonce: string; address: string; chainId: number }): string;
76
80
  /** `GpgConfig.buildMessage`, with this wallet's domain and uri. */
77
81
  gpgMessage(args: { nonce: string }): string;
78
- /** Props for `<SIWEProvider>` that sign through `onSign` (a browser flow, direct grant or registration). */
82
+ /**
83
+ * Props for `<SignInProvider>` that sign through `onSign` (a browser flow,
84
+ * direct grant or registration): the connected family's own message, with
85
+ * this wallet's domain and uri, signed by the connection store's client.
86
+ */
87
+ signInConfig(onSign: OnSign): SignInConfig;
88
+ /**
89
+ * Props for `<SIWEProvider>` that sign through `onSign`.
90
+ * @deprecated SIWEProvider goes in 8.0.0; mount `<SignInProvider {...kc.signInConfig(onSign)}>`.
91
+ */
79
92
  siweConfig(onSign: OnSign): SIWEConfig;
80
93
  /** Props for `<GpgProvider>` that sign through `onSign`. */
81
94
  gpgConfig(onSign: OnSign): {
@@ -206,6 +219,15 @@ export function keycloakWallet(options: KeycloakWalletOptions): KeycloakWallet {
206
219
  gpgMessage({ nonce: value }) {
207
220
  return buildWalletMessage("gpg", { nonce: value, domain: options.domain, uri: options.uri });
208
221
  },
222
+ signInConfig(onSign) {
223
+ return {
224
+ getNonce: () => kc.getNonce(),
225
+ onSign,
226
+ subscribeNonceReset: kc.subscribeNonceReset,
227
+ ...(options.domain === undefined ? {} : { domain: options.domain }),
228
+ ...(options.uri === undefined ? {} : { uri: options.uri }),
229
+ };
230
+ },
209
231
  siweConfig(onSign) {
210
232
  return {
211
233
  getNonce: () => kc.getNonce(),
@@ -1,9 +1,14 @@
1
1
  // @vitest-environment jsdom
2
2
  import { act, renderHook } from "@testing-library/react";
3
3
  import type { ReactNode } from "react";
4
- import { describe, expect, it } from "vitest";
4
+ import { describe, expect, it, vi } from "vitest";
5
+ import { testDriver } from "../../tests/core/testDriver";
5
6
  import { fakeKeycloak, json } from "../../tests/fakeKeycloak";
6
7
  import { SIWEContext, StatusState, type SIWEContextValue } from "../connectkit/siwe/SIWEContext";
8
+ import { ConnectionProvider } from "../core/react";
9
+ import { SignInProvider } from "../core/signIn";
10
+ import { createConnectionStore } from "../core/store";
11
+ import { eth } from "../families";
7
12
  import { keycloakWallet } from "./keycloakWallet";
8
13
  import { ProfileIncompleteError, type OnSign } from "./types";
9
14
  import { useDirectLogin } from "./useDirectLogin";
@@ -18,7 +23,12 @@ function setup(tokenStatus = 200) {
18
23
  ? json({ error: "invalid_grant", error_description: "Account is not fully set up" }, 400)
19
24
  : json({ error: "invalid_grant", error_description: "Invalid user credentials" }, 401),
20
25
  });
21
- const kc = keycloakWallet({ baseUrl: "https://kc", realm: "main", fetch: server.fetch });
26
+ const kc = keycloakWallet({
27
+ baseUrl: "https://kc",
28
+ realm: "main",
29
+ domain: "app.example.com",
30
+ fetch: server.fetch,
31
+ });
22
32
  const grant = kc.directGrant({ clientId: "app" });
23
33
  const siwe = (onSign: OnSign, signIn?: () => Promise<unknown>) =>
24
34
  ({
@@ -40,7 +50,24 @@ function setup(tokenStatus = 200) {
40
50
  ({ children }: { children: ReactNode }) => (
41
51
  <SIWEContext.Provider value={value}>{children}</SIWEContext.Provider>
42
52
  );
43
- return { kc, grant, siwe, wrapper };
53
+ const driver = testDriver("evm", [{ id: "mm", name: "MetaMask" }], {
54
+ mm: { address: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", chainId: 1 },
55
+ });
56
+ const store = createConnectionStore({
57
+ storage: null,
58
+ families: [{ ...eth(), driver: () => driver }],
59
+ });
60
+ const onStore =
61
+ (onSign: OnSign, legacy?: SIWEContextValue) =>
62
+ ({ children }: { children: ReactNode }) => {
63
+ const tree = (
64
+ <ConnectionProvider store={store}>
65
+ <SignInProvider {...kc.signInConfig(onSign)}>{children}</SignInProvider>
66
+ </ConnectionProvider>
67
+ );
68
+ return legacy ? <SIWEContext.Provider value={legacy}>{tree}</SIWEContext.Provider> : tree;
69
+ };
70
+ return { server, kc, grant, siwe, wrapper, store, onStore };
44
71
  }
45
72
 
46
73
  describe("useDirectLogin", () => {
@@ -104,9 +131,55 @@ describe("useDirectLogin", () => {
104
131
  await expect(result.current.signIn()).rejects.toThrow(/not this grant's/);
105
132
  });
106
133
 
134
+ it("signs on the connection store under a SignInProvider, ahead of a SIWEProvider", async () => {
135
+ const { server, grant, siwe, store, onStore } = setup();
136
+ await store.connect("eth", "mm");
137
+ const legacy = vi.fn(async () => false);
138
+ const { result } = renderHook(() => useDirectLogin(grant), {
139
+ wrapper: onStore(grant.onSign, siwe(grant.onSign, legacy)),
140
+ });
141
+ let tokens: unknown;
142
+ await act(async () => {
143
+ tokens = await result.current.signIn();
144
+ });
145
+ expect(legacy).not.toHaveBeenCalled();
146
+ expect(tokens).toMatchObject({ accessToken: "at" });
147
+ expect(result.current.status).toBe("signed-in");
148
+ const body = new URLSearchParams(server.requests.find((r) => r.url.endsWith("/token"))?.body);
149
+ const message = Buffer.from(body.get("password") ?? "", "base64").toString("utf8");
150
+ expect(message.split("\n")[0]).toBe(
151
+ "app.example.com wants you to sign in with your Ethereum account:",
152
+ );
153
+ expect(body.get("username")).toBe(`evm:${message}`);
154
+ });
155
+
156
+ it("signs through the SIWEProvider wired to the grant under a SignInProvider wired to another flow", async () => {
157
+ const { grant, siwe, onStore } = setup();
158
+ const legacy = vi.fn(async () => undefined);
159
+ const { result } = renderHook(() => useDirectLogin(grant), {
160
+ wrapper: onStore(async () => true, siwe(grant.onSign, legacy)),
161
+ });
162
+ await act(async () => {
163
+ await result.current.signIn();
164
+ });
165
+ expect(legacy).toHaveBeenCalledTimes(1);
166
+ });
167
+
168
+ it("refuses a SignInProvider wired to some other onSign", async () => {
169
+ const { grant, onStore } = setup();
170
+ const { result } = renderHook(() => useDirectLogin(grant), {
171
+ wrapper: onStore(async () => true),
172
+ });
173
+ await expect(result.current.signIn()).rejects.toThrow(
174
+ /SignInProvider's onSign is not this grant's/,
175
+ );
176
+ });
177
+
107
178
  it("needs a SIWEProvider", async () => {
108
179
  const { grant } = setup();
109
180
  const { result } = renderHook(() => useDirectLogin(grant));
110
- await expect(result.current.signIn()).rejects.toThrow(/inside a SIWEProvider/);
181
+ await expect(result.current.signIn()).rejects.toThrow(
182
+ /inside a SignInProvider or SIWEProvider/,
183
+ );
111
184
  });
112
185
  });
@@ -1,5 +1,6 @@
1
1
  import { useCallback, useContext, useState, useSyncExternalStore } from "react";
2
2
  import { SIWEContext } from "../connectkit/siwe/SIWEContext";
3
+ import { useOptionalSignIn } from "../core/signIn";
3
4
  import type { DirectGrant } from "./directGrant";
4
5
  import { ProfileIncompleteError, type KeycloakTokens } from "./types";
5
6
 
@@ -16,8 +17,9 @@ export interface UseDirectLoginResult {
16
17
  tokens: KeycloakTokens | null;
17
18
  error: Error | null;
18
19
  /**
19
- * Sign in with the connected wallet through SIWEProvider and exchange the
20
- * signature for tokens. Resolves null when the wallet or Keycloak refused.
20
+ * Sign in with the connected wallet through the SignInProvider (or a
21
+ * deprecated SIWEProvider) and exchange the signature for tokens. Resolves
22
+ * null when the wallet or Keycloak refused.
21
23
  */
22
24
  signIn(): Promise<KeycloakTokens | null>;
23
25
  refresh(): Promise<KeycloakTokens>;
@@ -25,12 +27,17 @@ export interface UseDirectLoginResult {
25
27
  }
26
28
 
27
29
  /**
28
- * Direct (browserless) wallet login: SIWEProvider signs, the grant trades the
29
- * signature for Keycloak tokens. Mount it under
30
- * `<SIWEProvider {...kc.siweConfig(grant.onSign)}>`; every login attempt resets
31
- * the kc nonce, which refetches it in SIWEProvider and GpgProvider alike.
30
+ * Direct (browserless) wallet login: the connection store's wallet signs, the
31
+ * grant trades the signature for Keycloak tokens. Mount it under
32
+ * `<SignInProvider {...kc.signInConfig(grant.onSign)}>`; under the deprecated
33
+ * `<SIWEProvider {...kc.siweConfig(grant.onSign)}>` it signs through that.
34
+ * With both, it signs through the one wired to this grant's onSign, the
35
+ * SignInProvider when both are.
36
+ * Every login attempt resets the kc nonce, which refetches it in SIWEProvider
37
+ * and GpgProvider alike.
32
38
  */
33
39
  export function useDirectLogin(grant: DirectGrant): UseDirectLoginResult {
40
+ const storeSignIn = useOptionalSignIn();
34
41
  const siwe = useContext(SIWEContext);
35
42
  const state = useSyncExternalStore(
36
43
  grant.subscribe,
@@ -40,18 +47,23 @@ export function useDirectLogin(grant: DirectGrant): UseDirectLoginResult {
40
47
  const [signing, setSigning] = useState(false);
41
48
 
42
49
  const signIn = useCallback(async () => {
43
- if (!siwe) throw new Error("useDirectLogin must be used inside a SIWEProvider");
44
- if (siwe.onSign !== grant.onSign) {
45
- throw new Error("useDirectLogin: the SIWEProvider's onSign is not this grant's");
50
+ if (!storeSignIn && !siwe) {
51
+ throw new Error("useDirectLogin must be used inside a SignInProvider or SIWEProvider");
52
+ }
53
+ const signer = [storeSignIn, siwe].find((candidate) => candidate?.onSign === grant.onSign);
54
+ if (!signer) {
55
+ throw new Error(
56
+ `useDirectLogin: the ${storeSignIn ? "SignInProvider" : "SIWEProvider"}'s onSign is not this grant's`,
57
+ );
46
58
  }
47
59
  setSigning(true);
48
60
  try {
49
- const result = await siwe.signIn();
61
+ const result = await signer.signIn();
50
62
  return result === false ? null : grant.tokens;
51
63
  } finally {
52
64
  setSigning(false);
53
65
  }
54
- }, [siwe, grant]);
66
+ }, [storeSignIn, siwe, grant]);
55
67
 
56
68
  const status: DirectLoginStatus = signing
57
69
  ? "signing"
@@ -0,0 +1,52 @@
1
+ // @vitest-environment happy-dom
2
+ import { act, cleanup, render, waitFor } from "@testing-library/react";
3
+ import { verifyMessage, type Address } from "viem";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+ import { useConnection } from "../core/react";
6
+ import type { SignInCredential } from "../core/signIn";
7
+ import { Web3Provider } from "../providers/WalletProvider";
8
+ import { useWalletLogin, type UseWalletLoginResult } from "./useWalletLogin";
9
+
10
+ afterEach(() => {
11
+ cleanup();
12
+ window.sessionStorage.clear();
13
+ });
14
+
15
+ describe("useWalletLogin under a SignInProvider", () => {
16
+ it("reads the store's connection and signs through the SignInProvider, not wagmi's SIWE", async () => {
17
+ const onSign = vi.fn<(credential: SignInCredential) => boolean>(() => true);
18
+ const live: { login?: UseWalletLoginResult; address?: string | null } = {};
19
+ function Probe() {
20
+ live.login = useWalletLogin();
21
+ live.address = useConnection().address;
22
+ return null;
23
+ }
24
+ render(
25
+ <Web3Provider
26
+ config={{ appName: "wallet login on the store", families: ["eth"], mockWallet: true }}
27
+ signIn={{ getNonce: async () => "nonce-9", onSign, domain: "app.example.com" }}
28
+ >
29
+ <Probe />
30
+ </Web3Provider>,
31
+ );
32
+ // The mock wallet is always authorised, so wagmi restores it and the store takes it.
33
+ await waitFor(() => expect(live.login?.isConnected).toBe(true));
34
+ expect(live.login?.address).toBe(live.address);
35
+
36
+ await act(async () => {
37
+ await live.login!.login();
38
+ });
39
+
40
+ expect(onSign).toHaveBeenCalledTimes(1);
41
+ const [{ username, message }] = onSign.mock.calls[0];
42
+ expect(message).toContain("Nonce: nonce-9");
43
+ expect(
44
+ await verifyMessage({
45
+ address: live.address as Address,
46
+ message,
47
+ signature: username as `0x${string}`,
48
+ }),
49
+ ).toBe(true);
50
+ expect(live.login?.status).toBe("success");
51
+ });
52
+ });