@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
@@ -1,23 +1,30 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { BridgeHost } from "./BridgeHost";
3
- import { buildInjectScript, createNativeBridge } from "./nativeHost";
3
+ import { NativeBridgeErrorCode, buildInjectScript, createNativeBridge } from "./nativeHost";
4
4
  import { createPostMessageTransport } from "./postMessageTransport";
5
- import { BRIDGE_PROTOCOL_VERSION } from "./protocol";
5
+ import { BRIDGE_PROTOCOL_VERSION, BridgeRequestError } from "./protocol";
6
+
7
+ const pageUrl = "https://wallet.example.com/webview.html";
8
+ const foreign = "https://evil.example/";
6
9
 
7
10
  /**
8
11
  * A fake page: `inject` runs the native side's script against a fake window
9
12
  * whose `__bridgeReceive` feeds a BridgeHost, and the host's replies come back
10
13
  * through `native.receive` with the page's URL.
11
14
  */
12
- function setup(pageUrl = "https://wallet.example.com/webview.html") {
15
+ function setup(url = pageUrl) {
13
16
  const injected: string[] = [];
17
+ let pageLost = 0;
14
18
  const win: { location: { origin: string }; __bridgeReceive?: (raw: string) => void } = {
15
- location: { origin: new URL(pageUrl).origin },
19
+ location: { origin: new URL(url).origin },
16
20
  };
17
- let postedFrom = pageUrl;
21
+ let postedFrom = url;
18
22
  const native = createNativeBridge({
19
- pageUrl,
23
+ pageUrl: url,
20
24
  allowDevHosts: true,
25
+ onPageLost() {
26
+ pageLost += 1;
27
+ },
21
28
  inject(script) {
22
29
  injected.push(script);
23
30
  new Function("window", script)(win);
@@ -31,12 +38,25 @@ function setup(pageUrl = "https://wallet.example.com/webview.html") {
31
38
  host,
32
39
  injected,
33
40
  win,
34
- postFrom(url: string) {
35
- postedFrom = url;
41
+ get pageLost() {
42
+ return pageLost;
43
+ },
44
+ postFrom(from: string) {
45
+ postedFrom = from;
36
46
  },
37
47
  };
38
48
  }
39
49
 
50
+ /** Spend the remount budget: every remount lands (the page starts loading) and the page never says ready. */
51
+ function strand(native: ReturnType<typeof createNativeBridge>) {
52
+ expect(native.navigated(foreign)).toBe(true);
53
+ expect(native.navigated(pageUrl)).toBe(false);
54
+ expect(native.navigated(foreign)).toBe(true);
55
+ expect(native.navigated(pageUrl)).toBe(false);
56
+ expect(native.navigated(foreign)).toBe(false);
57
+ expect(native.stranded).toBe(true);
58
+ }
59
+
40
60
  describe("createNativeBridge", () => {
41
61
  it("refuses a page that is not hosted", () => {
42
62
  expect(() =>
@@ -104,7 +124,10 @@ describe("createNativeBridge", () => {
104
124
  expect(native.navigated("about:blank")).toBe(false);
105
125
  expect(native.peer).not.toBeNull();
106
126
  expect(native.navigated("https://evil.example/form")).toBe(true);
107
- await expect(lost).rejects.toThrow(/went away/);
127
+ await expect(lost).rejects.toMatchObject({
128
+ code: NativeBridgeErrorCode.pageGone,
129
+ message: expect.stringMatching(/went away/),
130
+ });
108
131
  expect(native.peer).toBeNull();
109
132
  const before = injected.length;
110
133
  const next = native.client.request("evm", "eth_chainId");
@@ -119,7 +142,10 @@ describe("createNativeBridge", () => {
119
142
  host.ready();
120
143
  const lost = native.client.request("evm", "eth_requestAccounts");
121
144
  host.ready();
122
- await expect(lost).rejects.toThrow(/reloaded/);
145
+ await expect(lost).rejects.toMatchObject({
146
+ code: NativeBridgeErrorCode.pageGone,
147
+ message: expect.stringMatching(/reloaded/),
148
+ });
123
149
  });
124
150
 
125
151
  it("pageGone fails what is in flight and queues until the next ready", async () => {
@@ -130,7 +156,7 @@ describe("createNativeBridge", () => {
130
156
  host.ready();
131
157
  const lost = native.client.request("evm", "eth_requestAccounts");
132
158
  native.pageGone();
133
- await expect(lost).rejects.toThrow(/went away/);
159
+ await expect(lost).rejects.toMatchObject({ code: NativeBridgeErrorCode.pageGone });
134
160
  const before = injected.length;
135
161
  const next = native.client.request("evm", "eth_chainId");
136
162
  expect(injected).toHaveLength(before);
@@ -141,11 +167,109 @@ describe("createNativeBridge", () => {
141
167
  it("asks for the page back twice at most until it announces itself again", () => {
142
168
  const { native, host } = setup();
143
169
  host.ready();
144
- expect(native.navigated("https://evil.example/")).toBe(true);
145
- expect(native.navigated("https://evil.example/")).toBe(true);
146
- expect(native.navigated("https://evil.example/")).toBe(false);
170
+ strand(native);
171
+ host.ready();
172
+ expect(native.stranded).toBe(false);
173
+ expect(native.navigated(foreign)).toBe(true);
174
+ });
175
+
176
+ it("a foreign pushState or client redirect before the remount lands costs one remount, not two", () => {
177
+ const { native, host } = setup();
178
+ host.ready();
179
+ expect(native.navigated(foreign)).toBe(true);
180
+ // Android's doUpdateVisitedHistory reports the foreign document again.
181
+ expect(native.navigated(`${foreign}next`)).toBe(false);
182
+ expect(native.navigated(pageUrl)).toBe(false);
183
+ expect(native.navigated(foreign)).toBe(true);
184
+ expect(native.navigated(foreign)).toBe(false);
185
+ expect(native.stranded).toBe(false);
186
+ });
187
+
188
+ it("past the remount cap, fails what is in flight and every new request at once, naming the page", async () => {
189
+ const { native, host, injected } = setup();
190
+ host.register("evm", () => "0x1");
147
191
  host.ready();
148
- expect(native.navigated("https://evil.example/")).toBe(true);
192
+ expect(native.navigated(foreign)).toBe(true);
193
+ expect(native.navigated(pageUrl)).toBe(false);
194
+ expect(native.navigated(foreign)).toBe(true);
195
+ expect(native.navigated(pageUrl)).toBe(false);
196
+ const queued = native.client.request("evm", "eth_chainId");
197
+ expect(native.navigated(foreign)).toBe(false);
198
+ const stranded = {
199
+ name: "BridgeRequestError",
200
+ code: NativeBridgeErrorCode.pageStranded,
201
+ message: expect.stringContaining("https://wallet.example.com"),
202
+ data: { pageOrigin: "https://wallet.example.com" },
203
+ };
204
+ await expect(queued).rejects.toMatchObject(stranded);
205
+ const before = injected.length;
206
+ // Far longer than the test's own timeout: only an immediate rejection passes.
207
+ const next = native.client.request("evm", "eth_chainId", undefined, { timeoutMs: 600_000 });
208
+ await expect(next).rejects.toBeInstanceOf(BridgeRequestError);
209
+ await expect(next).rejects.toMatchObject(stranded);
210
+ expect(injected).toHaveLength(before);
211
+ expect(native.navigated(foreign)).toBe(false);
212
+ });
213
+
214
+ it("a page that comes back by itself clears the stranded state", async () => {
215
+ const { native, host } = setup();
216
+ host.register("evm", () => "0x1");
217
+ host.ready();
218
+ strand(native);
219
+ expect(native.navigated(pageUrl)).toBe(false);
220
+ host.ready();
221
+ expect(native.stranded).toBe(false);
222
+ await expect(native.client.request("evm", "eth_chainId")).resolves.toBe("0x1");
223
+ });
224
+
225
+ it("recover gives a stranded bridge a fresh budget and asks for the page back", async () => {
226
+ const { native, host } = setup();
227
+ host.register("evm", () => "0x1");
228
+ host.ready();
229
+ expect(native.recover()).toBe(false);
230
+ strand(native);
231
+ expect(native.recover()).toBe(true);
232
+ expect(native.stranded).toBe(false);
233
+ const next = native.client.request("evm", "eth_chainId");
234
+ // The stranded document may still report itself before the remount lands.
235
+ expect(native.navigated(foreign)).toBe(false);
236
+ expect(native.navigated(pageUrl)).toBe(false);
237
+ host.ready();
238
+ await expect(next).resolves.toBe("0x1");
239
+ expect(native.recover()).toBe(false);
240
+ });
241
+
242
+ it("recover also restarts a remount whose own load never showed up", () => {
243
+ const { native, host } = setup();
244
+ host.ready();
245
+ expect(native.navigated(foreign)).toBe(true);
246
+ // The remounted WebView's first report is foreign (the page URL redirected away).
247
+ expect(native.navigated(foreign)).toBe(false);
248
+ expect(native.stranded).toBe(false);
249
+ expect(native.recover()).toBe(true);
250
+ expect(native.navigated(pageUrl)).toBe(false);
251
+ expect(native.recover()).toBe(false);
252
+ });
253
+
254
+ it("reports every loss of the page so the host can release its sheet", () => {
255
+ const setupA = setup();
256
+ setupA.host.ready();
257
+ expect(setupA.pageLost).toBe(0);
258
+ expect(setupA.native.navigated(pageUrl)).toBe(false);
259
+ expect(setupA.pageLost).toBe(0);
260
+ setupA.native.navigated(foreign);
261
+ expect(setupA.pageLost).toBe(1);
262
+ setupA.native.navigated(pageUrl);
263
+ setupA.native.navigated(foreign);
264
+ setupA.native.navigated(pageUrl);
265
+ setupA.native.navigated(foreign);
266
+ expect(setupA.native.stranded).toBe(true);
267
+ expect(setupA.pageLost).toBe(3);
268
+
269
+ const setupB = setup();
270
+ setupB.host.ready();
271
+ setupB.native.pageGone();
272
+ expect(setupB.pageLost).toBe(1);
149
273
  });
150
274
 
151
275
  it("exposes the page origin", () => {
@@ -1,7 +1,21 @@
1
1
  import { BridgeClient } from "./BridgeClient";
2
2
  import { hostedPageOrigin, parseOrigin } from "./hosting";
3
3
  import { createPostMessageTransport } from "./postMessageTransport";
4
- import { BRIDGE_PROTOCOL_VERSION, type BridgeReady } from "./protocol";
4
+ import { BRIDGE_PROTOCOL_VERSION, BridgeRequestError, type BridgeReady } from "./protocol";
5
+
6
+ /**
7
+ * Codes the native end raises itself when the page cannot answer. They never
8
+ * cross the wire, and sit outside JSON-RPC's reserved band so a wallet error
9
+ * passed through `evm` is unlikely to share one.
10
+ */
11
+ export const NativeBridgeErrorCode = {
12
+ /** The page went away (reload, crash, a foreign document) before it answered. */
13
+ pageGone: -33001,
14
+ /** The host stopped loading the page back: requests fail at once until `recover()`. */
15
+ pageStranded: -33002,
16
+ } as const;
17
+
18
+ const MAX_REMOUNTS = 2;
5
19
 
6
20
  export interface NativeBridgeOptions {
7
21
  /** The hosted wallet page. Must pass `isHostedPageUrl`. */
@@ -14,6 +28,11 @@ export interface NativeBridgeOptions {
14
28
  timeoutMs?: number;
15
29
  /** Called once the page reports `sys.ready`. */
16
30
  onReady?(ready: BridgeReady): void;
31
+ /**
32
+ * Called when the page goes away or strands (not on a reload that sends
33
+ * `sys.ready` again): close anything showing it, it no longer holds that state.
34
+ */
35
+ onPageLost?(): void;
17
36
  }
18
37
 
19
38
  export interface NativeBridge {
@@ -22,22 +41,36 @@ export interface NativeBridge {
22
41
  readonly pageOrigin: string;
23
42
  /** What the page announced in `sys.ready`, or null before it has. */
24
43
  readonly peer: BridgeReady | null;
44
+ /** True once the page was lost past the remount cap; see `navigated`. */
45
+ readonly stranded: boolean;
25
46
  /**
26
47
  * Feed a WebView message in: `receive(e.nativeEvent.data, e.nativeEvent.url)`.
27
48
  * A message whose `fromUrl` is missing or on another origin is dropped.
28
49
  */
29
50
  receive(data: string, fromUrl: string): void;
30
51
  /**
31
- * The top frame started loading `url` (react-native-webview's `onLoadStart`).
52
+ * The top frame is on `url` (react-native-webview's `onLoadStart`, which
53
+ * Android fires when history updates, after the document commits).
32
54
  * A document on another origin is not the page: what is in flight fails,
33
55
  * nothing more is delivered until the page announces itself again, and the
34
- * answer is true so the host loads `pageUrl` back. Twice at most between two
35
- * `sys.ready`s: a page that never comes back stays down instead of looping.
56
+ * answer is true so the host loads `pageUrl` back. Another foreign report
57
+ * before that load starts costs nothing: Android reports a foreign
58
+ * pushState or client redirect too. Twice at most between two `sys.ready`s;
59
+ * past that the bridge is stranded and fails every request at once with
60
+ * `pageStranded` instead of looping, until the page announces itself or
61
+ * the host calls `recover()`.
36
62
  */
37
63
  navigated(url: string): boolean;
64
+ /**
65
+ * On a user action (the app returning to the foreground): leave the
66
+ * stranded state, or a remount whose own page load never showed up, with a
67
+ * fresh remount budget. True when the host should now load `pageUrl` back.
68
+ */
69
+ recover(): boolean;
38
70
  /**
39
71
  * The page died (WebView content process gone) or is being reloaded: fail
40
- * the requests in flight and queue new ones until the next `sys.ready`.
72
+ * the requests in flight and queue new ones until the next `sys.ready`
73
+ * (while stranded they fail at once instead).
41
74
  */
42
75
  pageGone(): void;
43
76
  dispose(): void;
@@ -66,17 +99,32 @@ export function createNativeBridge(options: NativeBridgeOptions): NativeBridge {
66
99
  const pageOrigin = hostedPageOrigin(options.pageUrl, { allowDevHosts: options.allowDevHosts });
67
100
  const queue: string[] = [];
68
101
  let peer: BridgeReady | null = null;
69
- let reloads = 0;
102
+ let remounts = 0;
103
+ let remountPending = false;
104
+ let stranded = false;
105
+
106
+ const pageGoneError = (message: string) =>
107
+ new BridgeRequestError(NativeBridgeErrorCode.pageGone, message, { pageOrigin });
108
+ const strandedError = () =>
109
+ new BridgeRequestError(
110
+ NativeBridgeErrorCode.pageStranded,
111
+ `The wallet page ${pageOrigin} is gone and is no longer loaded back`,
112
+ { pageOrigin },
113
+ );
70
114
 
71
115
  const transport = createPostMessageTransport((raw) => {
72
- if (peer) options.inject(buildInjectScript(raw, pageOrigin));
116
+ // The request is already pending in the client, so this rejects it at once.
117
+ if (stranded) client.rejectPending(strandedError());
118
+ else if (peer) options.inject(buildInjectScript(raw, pageOrigin));
73
119
  else queue.push(raw);
74
120
  });
75
121
  const offReady = transport.subscribe((message) => {
76
122
  if (message.ns !== "sys" || message.kind !== "event" || message.method !== "ready") return;
77
123
  // A second ready is a new document: whatever the old one was answering is lost.
78
- if (peer) client.rejectPending(new Error("The wallet page reloaded"));
79
- reloads = 0;
124
+ if (peer) client.rejectPending(pageGoneError("The wallet page reloaded"));
125
+ remounts = 0;
126
+ remountPending = false;
127
+ stranded = false;
80
128
  const params = message.params as Partial<BridgeReady> | undefined;
81
129
  peer = {
82
130
  protocol: typeof params?.protocol === "number" ? params.protocol : BRIDGE_PROTOCOL_VERSION,
@@ -87,11 +135,13 @@ export function createNativeBridge(options: NativeBridgeOptions): NativeBridge {
87
135
  });
88
136
  const client = new BridgeClient(transport, { timeoutMs: options.timeoutMs });
89
137
 
90
- const pageGone = () => {
138
+ const lose = (error: Error) => {
91
139
  peer = null;
92
140
  queue.length = 0;
93
- client.rejectPending(new Error("The wallet page went away"));
141
+ client.rejectPending(error);
142
+ options.onPageLost?.();
94
143
  };
144
+ const pageGone = () => lose(pageGoneError("The wallet page went away"));
95
145
 
96
146
  return {
97
147
  client,
@@ -99,16 +149,36 @@ export function createNativeBridge(options: NativeBridgeOptions): NativeBridge {
99
149
  get peer() {
100
150
  return peer;
101
151
  },
152
+ get stranded() {
153
+ return stranded;
154
+ },
102
155
  receive(data, fromUrl) {
103
156
  if (!fromUrl || parseOrigin(fromUrl)?.origin !== pageOrigin) return;
104
157
  transport.receive(data);
105
158
  },
106
159
  navigated(url) {
107
160
  if (url.trim().toLowerCase() === "about:blank") return false;
108
- if (parseOrigin(url)?.origin === pageOrigin) return false;
161
+ if (parseOrigin(url)?.origin === pageOrigin) {
162
+ remountPending = false;
163
+ return false;
164
+ }
165
+ if (stranded || remountPending) return false;
166
+ if (remounts >= MAX_REMOUNTS) {
167
+ stranded = true;
168
+ lose(strandedError());
169
+ return false;
170
+ }
109
171
  pageGone();
110
- reloads += 1;
111
- return reloads <= 2;
172
+ remounts += 1;
173
+ remountPending = true;
174
+ return true;
175
+ },
176
+ recover() {
177
+ if (!stranded && !(remountPending && !peer)) return false;
178
+ stranded = false;
179
+ remounts = 0;
180
+ remountPending = true;
181
+ return true;
112
182
  },
113
183
  pageGone,
114
184
  dispose() {
@@ -330,6 +330,9 @@ describe("the bundler plugins", () => {
330
330
  optimizeDeps: {
331
331
  include: ["@metamask/connect-evm"],
332
332
  noDiscovery: true,
333
+ // optimizeDeps() scans the root's html entries whatever noDiscovery says,
334
+ // and that scan fails on workspace packages whose dist is not built yet.
335
+ entries: [],
333
336
  rolldownOptions: { plugins: extra },
334
337
  },
335
338
  plugins: [metaMaskConnectTimeouts()],
@@ -1,7 +1,11 @@
1
1
  import type { Ecosystem } from "@multiplatform.one/connectkit";
2
2
  import type { WalletAdapter } from "../connectkit/adapters/types";
3
3
 
4
- /** The wallet adapter a non-EVM shim connector carries (see walletAdapterConnector), or null. */
4
+ /**
5
+ * The wallet adapter a non-EVM shim connector carries (see walletAdapterConnector), or null.
6
+ *
7
+ * @deprecated The wagmi shim for Solana, Sui and Bitcoin wallets, which goes in 8.0.0 when the connect modal reads the connection store (MPO-385). Use the `sol()`, `sui()` and `btc()` families and `useConnection()`.
8
+ */
5
9
  export function connectorAdapter(
6
10
  connector: unknown,
7
11
  ecosystem?: Exclude<Ecosystem, "evm">,
@@ -16,6 +16,8 @@ export type NonEvmClient = SolanaMessageClient | SuiClient | BitcoinClient;
16
16
  * The signing client for a connected non-EVM wallet, built over the adapter
17
17
  * its shim connector carries. Sign-in uses it, so it stays free of
18
18
  * @solana/kit. Null for an EVM connector or one that is not connected.
19
+ *
20
+ * @deprecated The wagmi shim for Solana, Sui and Bitcoin wallets, which goes in 8.0.0 when the connect modal reads the connection store (MPO-385). Use the `sol()`, `sui()` and `btc()` families and `useConnection()`.
19
21
  */
20
22
  export function clientForConnector(
21
23
  connector: unknown,
@@ -319,6 +319,14 @@ describe("evmClient", () => {
319
319
  await expect(client.erc20.balanceOf(token)).resolves.toBe(5n * 10n ** 18n);
320
320
  await expect(client.erc20.allowance(token, spender)).resolves.toBe(4n);
321
321
  await expect(client.erc20.decimals(token)).resolves.toBe(18);
322
+ await expect(
323
+ client.readContract({
324
+ address: token,
325
+ abi: erc20Abi,
326
+ functionName: "allowance",
327
+ args: [account, spender],
328
+ }),
329
+ ).resolves.toBe(4n);
322
330
  });
323
331
 
324
332
  it("skips the approval when the allowance already covers the amount", async () => {
@@ -284,6 +284,8 @@ export interface EvmClient extends ChainClient<"evm"> {
284
284
  readonly walletClient: EvmWalletClient;
285
285
  /** Reads, simulation and receipts. */
286
286
  readonly publicClient: PublicClient;
287
+ /** publicClient.readContract, so a read works on this client and on evmReadClient's alike. */
288
+ readonly readContract: PublicClient["readContract"];
287
289
  /** personal_sign; returns the 0x signature. */
288
290
  signMessage(message: string): Promise<Hex>;
289
291
  sendTransaction(parameters: EvmSendTransactionParameters): Promise<Hash>;
@@ -695,6 +697,7 @@ export function evmClient(config: EvmClientConfig): EvmClient {
695
697
  capabilities,
696
698
  walletClient,
697
699
  publicClient,
700
+ readContract: publicClient.readContract,
698
701
  signMessage: (message) => walletClient.signMessage({ account, message }),
699
702
  sendTransaction: (parameters) =>
700
703
  walletClient.sendTransaction({
@@ -0,0 +1,180 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import {
3
+ createPublicClient,
4
+ custom,
5
+ decodeFunctionData,
6
+ encodeAbiParameters,
7
+ erc20Abi,
8
+ type Address,
9
+ type Chain,
10
+ type Hex,
11
+ type PublicClient,
12
+ } from "viem";
13
+ import { hardhat, mainnet, polygon, sepolia } from "viem/chains";
14
+ import { classifyTxError } from "./evm";
15
+ import { evmReadClient, evmReadClients } from "./evmRead";
16
+ import { ReadOnlyClientError, UnsupportedClientMethodError } from "./types";
17
+
18
+ const token = "0x2222222222222222222222222222222222222222" as Address;
19
+ const owner = "0x1111111111111111111111111111111111111111" as Address;
20
+ const spender = "0x3333333333333333333333333333333333333333" as Address;
21
+
22
+ /** A node that answers eth_call for balanceOf, allowance and decimals, and records every method. */
23
+ function node(chainId = 1) {
24
+ const methods: string[] = [];
25
+ const request = async ({ method, params }: { method: string; params?: unknown }) => {
26
+ methods.push(method);
27
+ if (method === "eth_chainId") return `0x${chainId.toString(16)}`;
28
+ if (method !== "eth_call") throw new Error(`unexpected ${method}`);
29
+ const [{ data }] = params as [{ data: Hex }];
30
+ const call = decodeFunctionData({ abi: erc20Abi, data });
31
+ if (call.functionName === "balanceOf") return encodeAbiParameters([{ type: "uint256" }], [42n]);
32
+ if (call.functionName === "allowance") return encodeAbiParameters([{ type: "uint256" }], [7n]);
33
+ if (call.functionName === "decimals") return encodeAbiParameters([{ type: "uint8" }], [6]);
34
+ throw new Error(`unexpected call ${call.functionName}`);
35
+ };
36
+ return { methods, request };
37
+ }
38
+
39
+ /** fetch stubbed as a JSON-RPC node, recording the URL of every request. */
40
+ function stubFetch() {
41
+ const urls: string[] = [];
42
+ vi.stubGlobal("fetch", async (input: RequestInfo | URL, init?: RequestInit) => {
43
+ urls.push(new URL(input instanceof Request ? input.url : String(input)).href);
44
+ const { id } = JSON.parse(String(init?.body)) as { id: number };
45
+ const result = encodeAbiParameters([{ type: "uint256" }], [5n]);
46
+ return new Response(JSON.stringify({ jsonrpc: "2.0", id, result }), {
47
+ headers: { "content-type": "application/json" },
48
+ });
49
+ });
50
+ return urls;
51
+ }
52
+
53
+ afterEach(() => {
54
+ vi.unstubAllGlobals();
55
+ });
56
+
57
+ describe("evmReadClient", () => {
58
+ const client = (chain: Chain = mainnet) => {
59
+ const rpc = node(chain.id);
60
+ const publicClient = createPublicClient({ chain, transport: custom(rpc) }) as PublicClient;
61
+ return { rpc, publicClient, client: evmReadClient({ chain, publicClient }) };
62
+ };
63
+
64
+ it("is an EVM client with no address and no signing capabilities", () => {
65
+ const { client: reader, publicClient } = client();
66
+ expect(reader.family).toBe("evm");
67
+ expect(reader.address).toBeNull();
68
+ expect(reader.chainId).toBe(1);
69
+ expect(reader.chain).toBe(mainnet);
70
+ expect(reader.capabilities).toEqual([]);
71
+ expect(reader.publicClient).toBe(publicClient);
72
+ });
73
+
74
+ it("reads a contract and ERC-20 state with no provider and no account", async () => {
75
+ const { client: reader, rpc } = client();
76
+ await expect(
77
+ reader.readContract({
78
+ address: token,
79
+ abi: erc20Abi,
80
+ functionName: "balanceOf",
81
+ args: [owner],
82
+ }),
83
+ ).resolves.toBe(42n);
84
+ await expect(reader.erc20.balanceOf(token, owner)).resolves.toBe(42n);
85
+ await expect(reader.erc20.allowance(token, spender, owner)).resolves.toBe(7n);
86
+ await expect(reader.erc20.decimals(token)).resolves.toBe(6);
87
+ expect(new Set(rpc.methods)).toEqual(new Set(["eth_call"]));
88
+ });
89
+
90
+ it.each(["signMessage", "sendTransaction", "writeContract"] as const)(
91
+ "rejects %s with ReadOnlyClientError before any request",
92
+ async (method) => {
93
+ const { client: reader, rpc } = client();
94
+ const call =
95
+ method === "signMessage"
96
+ ? reader.signMessage("hello")
97
+ : method === "sendTransaction"
98
+ ? reader.sendTransaction({ to: owner, value: 1n })
99
+ : reader.writeContract({
100
+ address: token,
101
+ abi: erc20Abi,
102
+ functionName: "transfer",
103
+ args: [owner, 1n],
104
+ });
105
+ const error = await call.then(
106
+ () => undefined,
107
+ (e: unknown) => e,
108
+ );
109
+ expect(error).toBeInstanceOf(ReadOnlyClientError);
110
+ expect(error).toBeInstanceOf(UnsupportedClientMethodError);
111
+ expect(error).toMatchObject({ name: "ReadOnlyClientError", family: "evm", method });
112
+ expect(classifyTxError(error)).toBe("failed");
113
+ expect(rpc.methods).toEqual([]);
114
+ },
115
+ );
116
+
117
+ it("links a transaction on the chain's explorer", () => {
118
+ const hash = `0x${"ab".repeat(32)}` as Hex;
119
+ expect(client().client.explorerTxUrl(hash)).toBe(`https://etherscan.io/tx/${hash}`);
120
+ expect(client(hardhat).client.explorerTxUrl(hash)).toBeUndefined();
121
+ });
122
+
123
+ it("refuses a public client on another chain", () => {
124
+ const publicClient = createPublicClient({
125
+ chain: polygon,
126
+ transport: custom(node(polygon.id)),
127
+ }) as PublicClient;
128
+ expect(() => evmReadClient({ chain: mainnet, publicClient })).toThrow(
129
+ "reads chain 137, not chain 1",
130
+ );
131
+ });
132
+
133
+ it("reads over rpcUrl, else the chain's default RPC", async () => {
134
+ const urls = stubFetch();
135
+ await evmReadClient({ chain: mainnet, rpcUrl: "https://rpc.example.com/eth" }).erc20.balanceOf(
136
+ token,
137
+ owner,
138
+ );
139
+ await evmReadClient({ chain: mainnet }).erc20.balanceOf(token, owner);
140
+ expect(urls).toEqual([
141
+ "https://rpc.example.com/eth",
142
+ new URL(mainnet.rpcUrls.default.http[0]).href,
143
+ ]);
144
+ });
145
+ });
146
+
147
+ describe("evmReadClients", () => {
148
+ it("offers the chains WalletProvider would, default first", () => {
149
+ const readers = evmReadClients({ chains: [mainnet, polygon, sepolia] });
150
+ expect(readers.chains.map((chain) => chain.id)).toEqual([mainnet.id, polygon.id]);
151
+ expect(readers.get().chainId).toBe(mainnet.id);
152
+ expect(readers.get(polygon.id).chainId).toBe(polygon.id);
153
+ expect(
154
+ evmReadClients({ chains: [mainnet, sepolia], enableTestnets: true }).chains.map((c) => c.id),
155
+ ).toEqual([mainnet.id, sepolia.id]);
156
+ });
157
+
158
+ it("keeps one client per chain", () => {
159
+ const readers = evmReadClients({ chains: [mainnet, polygon] });
160
+ expect(readers.get(polygon.id)).toBe(readers.get(polygon.id));
161
+ expect(readers.get()).toBe(readers.get(mainnet.id));
162
+ });
163
+
164
+ it("refuses a chain the config does not offer, naming the ones it does", () => {
165
+ const readers = evmReadClients({ chains: [mainnet, sepolia] });
166
+ expect(() => readers.get(sepolia.id)).toThrow(/11155111.*\[1\]/);
167
+ });
168
+
169
+ it("reads the localnet chain over localnetRpcUrl, as WalletProvider does", async () => {
170
+ const urls = stubFetch();
171
+ const readers = evmReadClients({
172
+ chains: [mainnet],
173
+ localnet: true,
174
+ localnetRpcUrl: "http://10.0.2.2:8545",
175
+ });
176
+ expect(readers.get().chainId).toBe(hardhat.id);
177
+ await expect(readers.get().erc20.balanceOf(token, owner)).resolves.toBe(5n);
178
+ expect(urls).toEqual(["http://10.0.2.2:8545/"]);
179
+ });
180
+ });