@multiplatform.one/web3 7.24.0 → 7.26.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 (363) hide show
  1. package/README.md +33 -0
  2. package/dist/cjs/bridge/AuthBridge.cjs +124 -0
  3. package/dist/cjs/bridge/AuthBridge.native.js +186 -0
  4. package/dist/cjs/bridge/AuthBridge.native.js.map +1 -0
  5. package/dist/cjs/bridge/BridgeClient.cjs +12 -9
  6. package/dist/cjs/bridge/BridgeClient.native.js +17 -12
  7. package/dist/cjs/bridge/BridgeClient.native.js.map +1 -1
  8. package/dist/cjs/bridge/BridgeHost.cjs +11 -3
  9. package/dist/cjs/bridge/BridgeHost.native.js +11 -3
  10. package/dist/cjs/bridge/BridgeHost.native.js.map +1 -1
  11. package/dist/cjs/bridge/GpgBridge.cjs +61 -0
  12. package/dist/cjs/bridge/GpgBridge.native.js +111 -0
  13. package/dist/cjs/bridge/GpgBridge.native.js.map +1 -0
  14. package/dist/cjs/bridge/SuiBridge.cjs +51 -0
  15. package/dist/cjs/bridge/SuiBridge.native.js +99 -0
  16. package/dist/cjs/bridge/SuiBridge.native.js.map +1 -0
  17. package/dist/cjs/bridge/authTypes.cjs +28 -0
  18. package/dist/cjs/bridge/authTypes.native.js +31 -0
  19. package/dist/cjs/bridge/authTypes.native.js.map +1 -0
  20. package/dist/cjs/bridge/core.cjs +65 -0
  21. package/dist/cjs/bridge/core.native.js +68 -0
  22. package/dist/cjs/bridge/core.native.js.map +1 -0
  23. package/dist/cjs/bridge/hosting.cjs +91 -0
  24. package/dist/cjs/bridge/hosting.native.js +117 -0
  25. package/dist/cjs/bridge/hosting.native.js.map +1 -0
  26. package/dist/cjs/bridge/index.cjs +3 -17
  27. package/dist/cjs/bridge/index.native.js +2 -16
  28. package/dist/cjs/bridge/index.native.js.map +1 -1
  29. package/dist/cjs/bridge/nativeHost.cjs +91 -0
  30. package/dist/cjs/bridge/nativeHost.native.js +118 -0
  31. package/dist/cjs/bridge/nativeHost.native.js.map +1 -0
  32. package/dist/cjs/bridge/protocol.cjs +30 -1
  33. package/dist/cjs/bridge/protocol.native.js +147 -1
  34. package/dist/cjs/bridge/protocol.native.js.map +1 -1
  35. package/dist/cjs/core/family.cjs +88 -0
  36. package/dist/cjs/core/family.native.js +115 -0
  37. package/dist/cjs/core/family.native.js.map +1 -0
  38. package/dist/cjs/core/index.cjs +41 -0
  39. package/dist/cjs/core/index.native.js +44 -0
  40. package/dist/cjs/core/index.native.js.map +1 -0
  41. package/dist/cjs/core/message.cjs +89 -0
  42. package/dist/cjs/core/message.native.js +104 -0
  43. package/dist/cjs/core/message.native.js.map +1 -0
  44. package/dist/cjs/core/names.cjs +51 -0
  45. package/dist/cjs/core/names.native.js +95 -0
  46. package/dist/cjs/core/names.native.js.map +1 -0
  47. package/dist/cjs/core/react.cjs +48 -0
  48. package/dist/cjs/core/react.native.js +52 -0
  49. package/dist/cjs/core/react.native.js.map +1 -0
  50. package/dist/cjs/core/store.cjs +450 -0
  51. package/dist/cjs/core/store.native.js +637 -0
  52. package/dist/cjs/core/store.native.js.map +1 -0
  53. package/dist/cjs/core/types.cjs +18 -0
  54. package/dist/cjs/core/types.native.js +21 -0
  55. package/dist/cjs/core/types.native.js.map +1 -0
  56. package/dist/cjs/index.cjs +3 -1
  57. package/dist/cjs/index.native.js +2 -0
  58. package/dist/cjs/index.native.js.map +1 -1
  59. package/dist/cjs/providers/WalletProvider.cjs +2 -0
  60. package/dist/cjs/providers/WalletProvider.native.js +123 -90
  61. package/dist/cjs/providers/WalletProvider.native.js.map +1 -1
  62. package/dist/cjs/providers/index.cjs +1 -0
  63. package/dist/cjs/providers/index.native.js +1 -0
  64. package/dist/cjs/providers/index.native.js.map +1 -1
  65. package/dist/cjs/providers/native/deepLink.cjs +40 -23
  66. package/dist/cjs/providers/native/deepLink.native.js +43 -25
  67. package/dist/cjs/providers/native/deepLink.native.js.map +1 -1
  68. package/dist/cjs/providers/native/inject.cjs +2 -4
  69. package/dist/cjs/providers/native/inject.native.js +2 -4
  70. package/dist/cjs/providers/native/inject.native.js.map +1 -1
  71. package/dist/cjs/providers/walletBridge.cjs +35 -0
  72. package/dist/cjs/providers/walletBridge.native.js +38 -0
  73. package/dist/cjs/providers/walletBridge.native.js.map +1 -0
  74. package/dist/cjs/providers/walletConfig.native.js.map +1 -1
  75. package/dist/esm/bridge/AuthBridge.mjs +99 -0
  76. package/dist/esm/bridge/AuthBridge.mjs.map +1 -0
  77. package/dist/esm/bridge/AuthBridge.native.js +158 -0
  78. package/dist/esm/bridge/AuthBridge.native.js.map +1 -0
  79. package/dist/esm/bridge/BridgeClient.mjs +13 -10
  80. package/dist/esm/bridge/BridgeClient.mjs.map +1 -1
  81. package/dist/esm/bridge/BridgeClient.native.js +18 -13
  82. package/dist/esm/bridge/BridgeClient.native.js.map +1 -1
  83. package/dist/esm/bridge/BridgeHost.mjs +12 -4
  84. package/dist/esm/bridge/BridgeHost.mjs.map +1 -1
  85. package/dist/esm/bridge/BridgeHost.native.js +12 -4
  86. package/dist/esm/bridge/BridgeHost.native.js.map +1 -1
  87. package/dist/esm/bridge/GpgBridge.mjs +36 -0
  88. package/dist/esm/bridge/GpgBridge.mjs.map +1 -0
  89. package/dist/esm/bridge/GpgBridge.native.js +83 -0
  90. package/dist/esm/bridge/GpgBridge.native.js.map +1 -0
  91. package/dist/esm/bridge/SuiBridge.mjs +26 -0
  92. package/dist/esm/bridge/SuiBridge.mjs.map +1 -0
  93. package/dist/esm/bridge/SuiBridge.native.js +71 -0
  94. package/dist/esm/bridge/SuiBridge.native.js.map +1 -0
  95. package/dist/esm/bridge/authTypes.mjs +3 -0
  96. package/dist/esm/bridge/authTypes.mjs.map +1 -0
  97. package/dist/esm/bridge/authTypes.native.js +3 -0
  98. package/dist/esm/bridge/authTypes.native.js.map +1 -0
  99. package/dist/esm/bridge/core.mjs +17 -0
  100. package/dist/esm/bridge/core.mjs.map +1 -0
  101. package/dist/esm/bridge/core.native.js +17 -0
  102. package/dist/esm/bridge/core.native.js.map +1 -0
  103. package/dist/esm/bridge/hosting.mjs +62 -0
  104. package/dist/esm/bridge/hosting.mjs.map +1 -0
  105. package/dist/esm/bridge/hosting.native.js +85 -0
  106. package/dist/esm/bridge/hosting.native.js.map +1 -0
  107. package/dist/esm/bridge/index.mjs +2 -9
  108. package/dist/esm/bridge/index.mjs.map +1 -1
  109. package/dist/esm/bridge/index.native.js +2 -9
  110. package/dist/esm/bridge/index.native.js.map +1 -1
  111. package/dist/esm/bridge/nativeHost.mjs +65 -0
  112. package/dist/esm/bridge/nativeHost.mjs.map +1 -0
  113. package/dist/esm/bridge/nativeHost.native.js +89 -0
  114. package/dist/esm/bridge/nativeHost.native.js.map +1 -0
  115. package/dist/esm/bridge/protocol.mjs +28 -2
  116. package/dist/esm/bridge/protocol.mjs.map +1 -1
  117. package/dist/esm/bridge/protocol.native.js +145 -2
  118. package/dist/esm/bridge/protocol.native.js.map +1 -1
  119. package/dist/esm/core/family.mjs +62 -0
  120. package/dist/esm/core/family.mjs.map +1 -0
  121. package/dist/esm/core/family.native.js +86 -0
  122. package/dist/esm/core/family.native.js.map +1 -0
  123. package/dist/esm/core/index.mjs +7 -0
  124. package/dist/esm/core/index.mjs.map +1 -0
  125. package/dist/esm/core/index.native.js +7 -0
  126. package/dist/esm/core/index.native.js.map +1 -0
  127. package/dist/esm/core/message.mjs +63 -0
  128. package/dist/esm/core/message.mjs.map +1 -0
  129. package/dist/esm/core/message.native.js +75 -0
  130. package/dist/esm/core/message.native.js.map +1 -0
  131. package/dist/esm/core/names.mjs +25 -0
  132. package/dist/esm/core/names.mjs.map +1 -0
  133. package/dist/esm/core/names.native.js +66 -0
  134. package/dist/esm/core/names.native.js.map +1 -0
  135. package/dist/esm/core/react.mjs +21 -0
  136. package/dist/esm/core/react.mjs.map +1 -0
  137. package/dist/esm/core/react.native.js +22 -0
  138. package/dist/esm/core/react.native.js.map +1 -0
  139. package/dist/esm/core/store.mjs +424 -0
  140. package/dist/esm/core/store.mjs.map +1 -0
  141. package/dist/esm/core/store.native.js +608 -0
  142. package/dist/esm/core/store.native.js.map +1 -0
  143. package/dist/esm/core/types.mjs +2 -0
  144. package/dist/esm/core/types.mjs.map +1 -0
  145. package/dist/esm/core/types.native.js +2 -0
  146. package/dist/esm/core/types.native.js.map +1 -0
  147. package/dist/esm/index.mjs +3 -2
  148. package/dist/esm/index.mjs.map +1 -1
  149. package/dist/esm/index.native.js +3 -2
  150. package/dist/esm/index.native.js.map +1 -1
  151. package/dist/esm/providers/WalletProvider.mjs +2 -1
  152. package/dist/esm/providers/WalletProvider.mjs.map +1 -1
  153. package/dist/esm/providers/WalletProvider.native.js +125 -93
  154. package/dist/esm/providers/WalletProvider.native.js.map +1 -1
  155. package/dist/esm/providers/index.mjs +2 -2
  156. package/dist/esm/providers/index.mjs.map +1 -1
  157. package/dist/esm/providers/index.native.js +2 -2
  158. package/dist/esm/providers/index.native.js.map +1 -1
  159. package/dist/esm/providers/native/deepLink.mjs +36 -24
  160. package/dist/esm/providers/native/deepLink.mjs.map +1 -1
  161. package/dist/esm/providers/native/deepLink.native.js +39 -26
  162. package/dist/esm/providers/native/deepLink.native.js.map +1 -1
  163. package/dist/esm/providers/native/inject.mjs +1 -3
  164. package/dist/esm/providers/native/inject.mjs.map +1 -1
  165. package/dist/esm/providers/native/inject.native.js +1 -3
  166. package/dist/esm/providers/native/inject.native.js.map +1 -1
  167. package/dist/esm/providers/walletBridge.mjs +9 -0
  168. package/dist/esm/providers/walletBridge.mjs.map +1 -0
  169. package/dist/esm/providers/walletBridge.native.js +9 -0
  170. package/dist/esm/providers/walletBridge.native.js.map +1 -0
  171. package/dist/esm/providers/walletConfig.mjs.map +1 -1
  172. package/dist/esm/providers/walletConfig.native.js.map +1 -1
  173. package/dist/jsx/bridge/AuthBridge.mjs +99 -0
  174. package/dist/jsx/bridge/AuthBridge.mjs.map +1 -0
  175. package/dist/jsx/bridge/AuthBridge.native.js +186 -0
  176. package/dist/jsx/bridge/AuthBridge.native.js.map +1 -0
  177. package/dist/jsx/bridge/BridgeClient.mjs +13 -10
  178. package/dist/jsx/bridge/BridgeClient.mjs.map +1 -1
  179. package/dist/jsx/bridge/BridgeClient.native.js +17 -12
  180. package/dist/jsx/bridge/BridgeClient.native.js.map +1 -1
  181. package/dist/jsx/bridge/BridgeHost.mjs +12 -4
  182. package/dist/jsx/bridge/BridgeHost.mjs.map +1 -1
  183. package/dist/jsx/bridge/BridgeHost.native.js +11 -3
  184. package/dist/jsx/bridge/BridgeHost.native.js.map +1 -1
  185. package/dist/jsx/bridge/GpgBridge.mjs +36 -0
  186. package/dist/jsx/bridge/GpgBridge.mjs.map +1 -0
  187. package/dist/jsx/bridge/GpgBridge.native.js +111 -0
  188. package/dist/jsx/bridge/GpgBridge.native.js.map +1 -0
  189. package/dist/jsx/bridge/SuiBridge.mjs +26 -0
  190. package/dist/jsx/bridge/SuiBridge.mjs.map +1 -0
  191. package/dist/jsx/bridge/SuiBridge.native.js +99 -0
  192. package/dist/jsx/bridge/SuiBridge.native.js.map +1 -0
  193. package/dist/jsx/bridge/authTypes.mjs +3 -0
  194. package/dist/jsx/bridge/authTypes.mjs.map +1 -0
  195. package/dist/jsx/bridge/authTypes.native.js +31 -0
  196. package/dist/jsx/bridge/authTypes.native.js.map +1 -0
  197. package/dist/jsx/bridge/core.mjs +17 -0
  198. package/dist/jsx/bridge/core.mjs.map +1 -0
  199. package/dist/jsx/bridge/core.native.js +68 -0
  200. package/dist/jsx/bridge/core.native.js.map +1 -0
  201. package/dist/jsx/bridge/hosting.mjs +62 -0
  202. package/dist/jsx/bridge/hosting.mjs.map +1 -0
  203. package/dist/jsx/bridge/hosting.native.js +117 -0
  204. package/dist/jsx/bridge/hosting.native.js.map +1 -0
  205. package/dist/jsx/bridge/index.mjs +2 -9
  206. package/dist/jsx/bridge/index.mjs.map +1 -1
  207. package/dist/jsx/bridge/index.native.js +2 -16
  208. package/dist/jsx/bridge/index.native.js.map +1 -1
  209. package/dist/jsx/bridge/nativeHost.mjs +65 -0
  210. package/dist/jsx/bridge/nativeHost.mjs.map +1 -0
  211. package/dist/jsx/bridge/nativeHost.native.js +118 -0
  212. package/dist/jsx/bridge/nativeHost.native.js.map +1 -0
  213. package/dist/jsx/bridge/protocol.mjs +28 -2
  214. package/dist/jsx/bridge/protocol.mjs.map +1 -1
  215. package/dist/jsx/bridge/protocol.native.js +147 -1
  216. package/dist/jsx/bridge/protocol.native.js.map +1 -1
  217. package/dist/jsx/core/family.mjs +62 -0
  218. package/dist/jsx/core/family.mjs.map +1 -0
  219. package/dist/jsx/core/family.native.js +115 -0
  220. package/dist/jsx/core/family.native.js.map +1 -0
  221. package/dist/jsx/core/index.mjs +7 -0
  222. package/dist/jsx/core/index.mjs.map +1 -0
  223. package/dist/jsx/core/index.native.js +44 -0
  224. package/dist/jsx/core/index.native.js.map +1 -0
  225. package/dist/jsx/core/message.mjs +63 -0
  226. package/dist/jsx/core/message.mjs.map +1 -0
  227. package/dist/jsx/core/message.native.js +104 -0
  228. package/dist/jsx/core/message.native.js.map +1 -0
  229. package/dist/jsx/core/names.mjs +25 -0
  230. package/dist/jsx/core/names.mjs.map +1 -0
  231. package/dist/jsx/core/names.native.js +95 -0
  232. package/dist/jsx/core/names.native.js.map +1 -0
  233. package/dist/jsx/core/react.mjs +21 -0
  234. package/dist/jsx/core/react.mjs.map +1 -0
  235. package/dist/jsx/core/react.native.js +52 -0
  236. package/dist/jsx/core/react.native.js.map +1 -0
  237. package/dist/jsx/core/store.mjs +424 -0
  238. package/dist/jsx/core/store.mjs.map +1 -0
  239. package/dist/jsx/core/store.native.js +637 -0
  240. package/dist/jsx/core/store.native.js.map +1 -0
  241. package/dist/jsx/core/types.mjs +2 -0
  242. package/dist/jsx/core/types.mjs.map +1 -0
  243. package/dist/jsx/core/types.native.js +21 -0
  244. package/dist/jsx/core/types.native.js.map +1 -0
  245. package/dist/jsx/index.js +3 -2
  246. package/dist/jsx/index.js.map +1 -1
  247. package/dist/jsx/index.mjs +3 -2
  248. package/dist/jsx/index.mjs.map +1 -1
  249. package/dist/jsx/index.native.js +2 -0
  250. package/dist/jsx/index.native.js.map +1 -1
  251. package/dist/jsx/providers/WalletProvider.mjs +2 -1
  252. package/dist/jsx/providers/WalletProvider.mjs.map +1 -1
  253. package/dist/jsx/providers/WalletProvider.native.js +123 -90
  254. package/dist/jsx/providers/WalletProvider.native.js.map +1 -1
  255. package/dist/jsx/providers/index.mjs +2 -2
  256. package/dist/jsx/providers/index.mjs.map +1 -1
  257. package/dist/jsx/providers/index.native.js +1 -0
  258. package/dist/jsx/providers/index.native.js.map +1 -1
  259. package/dist/jsx/providers/native/deepLink.mjs +36 -24
  260. package/dist/jsx/providers/native/deepLink.mjs.map +1 -1
  261. package/dist/jsx/providers/native/deepLink.native.js +43 -25
  262. package/dist/jsx/providers/native/deepLink.native.js.map +1 -1
  263. package/dist/jsx/providers/native/inject.mjs +1 -3
  264. package/dist/jsx/providers/native/inject.mjs.map +1 -1
  265. package/dist/jsx/providers/native/inject.native.js +2 -4
  266. package/dist/jsx/providers/native/inject.native.js.map +1 -1
  267. package/dist/jsx/providers/walletBridge.mjs +9 -0
  268. package/dist/jsx/providers/walletBridge.mjs.map +1 -0
  269. package/dist/jsx/providers/walletBridge.native.js +38 -0
  270. package/dist/jsx/providers/walletBridge.native.js.map +1 -0
  271. package/dist/jsx/providers/walletConfig.mjs.map +1 -1
  272. package/dist/jsx/providers/walletConfig.native.js.map +1 -1
  273. package/docs/bridge-protocol.md +485 -0
  274. package/package.json +14 -6
  275. package/src/bridge/AuthBridge.ts +146 -0
  276. package/src/bridge/BridgeClient.spec.ts +12 -0
  277. package/src/bridge/BridgeClient.ts +15 -10
  278. package/src/bridge/BridgeHost.spec.ts +20 -4
  279. package/src/bridge/BridgeHost.ts +16 -5
  280. package/src/bridge/GpgBridge.ts +49 -0
  281. package/src/bridge/SuiBridge.ts +34 -0
  282. package/src/bridge/authTypes.ts +76 -0
  283. package/src/bridge/core.ts +42 -0
  284. package/src/bridge/hosting.spec.ts +98 -0
  285. package/src/bridge/hosting.ts +99 -0
  286. package/src/bridge/index.ts +1 -8
  287. package/src/bridge/nativeHost.spec.ts +165 -0
  288. package/src/bridge/nativeHost.ts +120 -0
  289. package/src/bridge/protocol.spec.ts +24 -1
  290. package/src/bridge/protocol.ts +44 -1
  291. package/src/core/family.spec.ts +117 -0
  292. package/src/core/family.ts +103 -0
  293. package/src/core/imports.spec.ts +82 -0
  294. package/src/core/index.ts +47 -0
  295. package/src/core/message.spec.ts +178 -0
  296. package/src/core/message.ts +119 -0
  297. package/src/core/names.ts +29 -0
  298. package/src/core/react.spec.tsx +75 -0
  299. package/src/core/react.ts +34 -0
  300. package/src/core/store.spec.ts +890 -0
  301. package/src/core/store.ts +558 -0
  302. package/src/core/types.ts +96 -0
  303. package/src/index.ts +6 -0
  304. package/src/providers/WalletProvider.native.tsx +139 -85
  305. package/src/providers/WalletProvider.tsx +1 -1
  306. package/src/providers/index.ts +2 -0
  307. package/src/providers/native/deepLink.spec.ts +73 -1
  308. package/src/providers/native/deepLink.ts +76 -28
  309. package/src/providers/native/inject.ts +1 -9
  310. package/src/providers/walletBridge.ts +24 -0
  311. package/src/providers/walletConfig.ts +15 -1
  312. package/types/bridge/AuthBridge.d.ts +58 -0
  313. package/types/bridge/AuthBridge.d.ts.map +1 -0
  314. package/types/bridge/BridgeClient.d.ts +3 -1
  315. package/types/bridge/BridgeClient.d.ts.map +1 -1
  316. package/types/bridge/BridgeHost.d.ts +1 -1
  317. package/types/bridge/BridgeHost.d.ts.map +1 -1
  318. package/types/bridge/GpgBridge.d.ts +23 -0
  319. package/types/bridge/GpgBridge.d.ts.map +1 -0
  320. package/types/bridge/SuiBridge.d.ts +18 -0
  321. package/types/bridge/SuiBridge.d.ts.map +1 -0
  322. package/types/bridge/authTypes.d.ts +71 -0
  323. package/types/bridge/authTypes.d.ts.map +1 -0
  324. package/types/bridge/core.d.ts +16 -0
  325. package/types/bridge/core.d.ts.map +1 -0
  326. package/types/bridge/hosting.d.ts +34 -0
  327. package/types/bridge/hosting.d.ts.map +1 -0
  328. package/types/bridge/index.d.ts +1 -8
  329. package/types/bridge/index.d.ts.map +1 -1
  330. package/types/bridge/nativeHost.d.ts +55 -0
  331. package/types/bridge/nativeHost.d.ts.map +1 -0
  332. package/types/bridge/protocol.d.ts +34 -1
  333. package/types/bridge/protocol.d.ts.map +1 -1
  334. package/types/core/family.d.ts +44 -0
  335. package/types/core/family.d.ts.map +1 -0
  336. package/types/core/index.d.ts +7 -0
  337. package/types/core/index.d.ts.map +1 -0
  338. package/types/core/message.d.ts +44 -0
  339. package/types/core/message.d.ts.map +1 -0
  340. package/types/core/names.d.ts +7 -0
  341. package/types/core/names.d.ts.map +1 -0
  342. package/types/core/react.d.ts +14 -0
  343. package/types/core/react.d.ts.map +1 -0
  344. package/types/core/store.d.ts +64 -0
  345. package/types/core/store.d.ts.map +1 -0
  346. package/types/core/types.d.ts +88 -0
  347. package/types/core/types.d.ts.map +1 -0
  348. package/types/index.d.ts +2 -1
  349. package/types/index.d.ts.map +1 -1
  350. package/types/providers/WalletProvider.d.ts +1 -0
  351. package/types/providers/WalletProvider.d.ts.map +1 -1
  352. package/types/providers/WalletProvider.native.d.ts +2 -1
  353. package/types/providers/WalletProvider.native.d.ts.map +1 -1
  354. package/types/providers/index.d.ts +1 -1
  355. package/types/providers/index.d.ts.map +1 -1
  356. package/types/providers/native/deepLink.d.ts +29 -4
  357. package/types/providers/native/deepLink.d.ts.map +1 -1
  358. package/types/providers/native/inject.d.ts +1 -7
  359. package/types/providers/native/inject.d.ts.map +1 -1
  360. package/types/providers/walletBridge.d.ts +17 -0
  361. package/types/providers/walletBridge.d.ts.map +1 -0
  362. package/types/providers/walletConfig.d.ts +18 -1
  363. package/types/providers/walletConfig.d.ts.map +1 -1
@@ -71,6 +71,18 @@ describe("BridgeClient events", () => {
71
71
  ]);
72
72
  });
73
73
 
74
+ it("rejectPending() fails in-flight requests and keeps the client working", async () => {
75
+ const { a, b } = createMemoryTransportPair();
76
+ const client = new BridgeClient(a);
77
+ const lost = client.request("evm", "eth_requestAccounts");
78
+ client.rejectPending(new Error("page reloaded"));
79
+ await expect(lost).rejects.toThrow("page reloaded");
80
+ b.subscribe((m) => {
81
+ if (m.kind === "req") b.post({ id: m.id, ns: m.ns, kind: "res", result: "0x1" });
82
+ });
83
+ await expect(client.request("evm", "eth_chainId")).resolves.toBe("0x1");
84
+ });
85
+
74
86
  it("dispose() rejects in-flight requests and stops events", async () => {
75
87
  const { a, b } = createMemoryTransportPair();
76
88
  const client = new BridgeClient(a);
@@ -1,4 +1,5 @@
1
1
  import {
2
+ BridgeRequestError,
2
3
  isBridgeMessage,
3
4
  newRequestId,
4
5
  type BridgeError,
@@ -79,15 +80,21 @@ export class BridgeClient {
79
80
  };
80
81
  }
81
82
 
82
- /** Reject all in-flight requests — call on WebView reload/crash. */
83
+ /** Fail every request in flight and keep the client usable: the page they went to is gone. */
84
+ rejectPending(reason: Error): void {
85
+ const pending = Array.from(this.pending.values());
86
+ this.pending.clear();
87
+ for (const p of pending) {
88
+ p.cleanup();
89
+ p.reject(reason);
90
+ }
91
+ }
92
+
93
+ /** Reject all in-flight requests and stop listening. */
83
94
  dispose(): void {
84
95
  this.disposed = true;
85
96
  this.unsubscribe();
86
- for (const [, p] of this.pending) {
87
- p.cleanup();
88
- p.reject(new Error("Bridge disposed"));
89
- }
90
- this.pending.clear();
97
+ this.rejectPending(new Error("Bridge disposed"));
91
98
  this.listeners.clear();
92
99
  }
93
100
 
@@ -119,8 +126,6 @@ export class BridgeClient {
119
126
  };
120
127
  }
121
128
 
122
- function toError(e: BridgeError): Error {
123
- const err = new Error(e.message) as Error & { code?: number };
124
- err.code = e.code;
125
- return err;
129
+ function toError(e: BridgeError): BridgeRequestError {
130
+ return new BridgeRequestError(e.code, e.message, e.data);
126
131
  }
@@ -1,6 +1,7 @@
1
1
  import { describe, expect, it, vi } from "vitest";
2
2
  import { BridgeClient } from "./BridgeClient";
3
3
  import { BridgeHost } from "./BridgeHost";
4
+ import { BridgeRequestError } from "./protocol";
4
5
  import { createMemoryTransportPair } from "./transport";
5
6
 
6
7
  /** Pair a native client (a) with a webview host (b) over the in-memory transport. */
@@ -60,13 +61,28 @@ describe("BridgeHost", () => {
60
61
  expect(seen).toEqual([["evm", "accountsChanged", ["0xabc"]]]);
61
62
  });
62
63
 
63
- it("ready() emits a sys ready event", () => {
64
+ it("ready() emits a sys ready event with the protocol version and namespaces", () => {
64
65
  const { client, host } = pair();
65
66
  const onReady = vi.fn();
66
- client.on((ns, method) => {
67
- if (ns === "sys" && method === "ready") onReady();
67
+ client.on((ns, method, params) => {
68
+ if (ns === "sys" && method === "ready") onReady(params);
68
69
  });
70
+ host.register("evm", () => null);
71
+ host.register("auth", () => null);
69
72
  host.ready();
70
- expect(onReady).toHaveBeenCalledOnce();
73
+ expect(onReady).toHaveBeenCalledExactlyOnceWith({
74
+ protocol: 1,
75
+ namespaces: ["evm", "auth", "sys"],
76
+ });
77
+ });
78
+
79
+ it("carries an error's data to the client", async () => {
80
+ const { client, host } = pair();
81
+ host.register("auth", () => {
82
+ throw new BridgeRequestError(-32002, "Invalid user credentials", { status: 401 });
83
+ });
84
+ const error = await client.request("auth", "signIn").catch((e: unknown) => e);
85
+ expect(error).toBeInstanceOf(BridgeRequestError);
86
+ expect(error).toMatchObject({ code: -32002, data: { status: 401 } });
71
87
  });
72
88
  });
@@ -1,4 +1,11 @@
1
- import { isBridgeMessage, type BridgeError, type BridgeMessage, type Namespace } from "./protocol";
1
+ import {
2
+ BRIDGE_PROTOCOL_VERSION,
3
+ isBridgeMessage,
4
+ type BridgeError,
5
+ type BridgeMessage,
6
+ type BridgeReady,
7
+ type Namespace,
8
+ } from "./protocol";
2
9
  import type { Transport } from "./transport";
3
10
 
4
11
  /**
@@ -31,9 +38,11 @@ export class BridgeHost {
31
38
  this.transport.post({ ns, kind: "event", method, params });
32
39
  }
33
40
 
34
- /** Tell native the host is initialized. */
41
+ /** Tell native the host is initialized, which protocol it speaks and what it serves. */
35
42
  ready(): void {
36
- this.transport.post({ ns: "sys", kind: "event", method: "ready" });
43
+ const namespaces = Array.from(new Set<Namespace>([...this.handlers.keys(), "sys"]));
44
+ const params: BridgeReady = { protocol: BRIDGE_PROTOCOL_VERSION, namespaces };
45
+ this.transport.post({ ns: "sys", kind: "event", method: "ready", params });
37
46
  }
38
47
 
39
48
  dispose(): void {
@@ -63,11 +72,13 @@ export class BridgeHost {
63
72
 
64
73
  function toBridgeError(e: unknown): BridgeError {
65
74
  if (e && typeof e === "object") {
66
- const o = e as { code?: unknown; message?: unknown };
67
- return {
75
+ const o = e as { code?: unknown; message?: unknown; data?: unknown };
76
+ const error: BridgeError = {
68
77
  code: typeof o.code === "number" ? o.code : -32000,
69
78
  message: typeof o.message === "string" ? o.message : String(e),
70
79
  };
80
+ if (o.data !== undefined) error.data = o.data;
81
+ return error;
71
82
  }
72
83
  return { code: -32000, message: String(e) };
73
84
  }
@@ -0,0 +1,49 @@
1
+ import type { BridgeClient, RequestOptions } from "./BridgeClient";
2
+
3
+ /** A signature the WebView is waiting for: the message and the terminal command that signs it. */
4
+ export interface GpgPendingRequest {
5
+ message: string;
6
+ command: string;
7
+ }
8
+
9
+ // The user signs in a terminal and pastes the output back, which takes longer
10
+ // than a wallet tap.
11
+ const GPG_TIMEOUT_MS = 15 * 60_000;
12
+
13
+ /**
14
+ * Native-side proxy for the WebView's copy/paste GPG signer. `signMessage`
15
+ * parks a request in the page, which shows the command and a paste box; a
16
+ * native host that draws its own paste box calls `submit` instead.
17
+ */
18
+ export class GpgBridge {
19
+ constructor(private readonly bridge: BridgeClient) {}
20
+
21
+ /** Resolves with the armored signature followed by the armored public key. */
22
+ async signMessage(message: string, options: RequestOptions = {}): Promise<string> {
23
+ const res = (await this.bridge.request(
24
+ "gpg",
25
+ "signMessage",
26
+ { message },
27
+ { timeoutMs: GPG_TIMEOUT_MS, ...options },
28
+ )) as { signature: string };
29
+ return res.signature;
30
+ }
31
+
32
+ /** Hand pasted terminal output to the pending request. Rejects when it does not cover its message. */
33
+ async submit(signature: string): Promise<void> {
34
+ await this.bridge.request("gpg", "submit", { signature });
35
+ }
36
+
37
+ async cancel(): Promise<void> {
38
+ await this.bridge.request("gpg", "cancel");
39
+ }
40
+
41
+ /** Called with the pending request whenever one is parked, and with null when it settles. */
42
+ onPendingChanged(handler: (request: GpgPendingRequest | null) => void): () => void {
43
+ return this.bridge.on((ns, method, params) => {
44
+ if (ns === "gpg" && method === "pendingChanged") {
45
+ handler((params as { request: GpgPendingRequest | null } | undefined)?.request ?? null);
46
+ }
47
+ });
48
+ }
49
+ }
@@ -0,0 +1,34 @@
1
+ import type { BridgeClient, RequestOptions } from "./BridgeClient";
2
+
3
+ /**
4
+ * Native-side proxy for the WebView's Sui wallet. Messages are UTF-8 text; the
5
+ * signature is Sui's serialized signature (flag || signature || public key),
6
+ * base64, which is what the Keycloak Sui verifier takes as the login username.
7
+ */
8
+ export class SuiBridge {
9
+ constructor(private readonly bridge: BridgeClient) {}
10
+
11
+ async connect(options?: RequestOptions): Promise<{ address: string }> {
12
+ return (await this.bridge.request("sui", "connect", undefined, options)) as {
13
+ address: string;
14
+ };
15
+ }
16
+
17
+ async disconnect(): Promise<void> {
18
+ await this.bridge.request("sui", "disconnect");
19
+ }
20
+
21
+ async signMessage(message: string, options?: RequestOptions): Promise<string> {
22
+ const res = (await this.bridge.request("sui", "signMessage", { message }, options)) as {
23
+ signature: string;
24
+ };
25
+ return res.signature;
26
+ }
27
+
28
+ /** Subscribe to sui events (`accountChanged`). */
29
+ on(handler: (event: string, params: unknown) => void): () => void {
30
+ return this.bridge.on((ns, method, params) => {
31
+ if (ns === "sui") handler(method, params);
32
+ });
33
+ }
34
+ }
@@ -0,0 +1,76 @@
1
+ /** Who signs an `auth.signIn`: the message families the Keycloak wallet SPIs verify. */
2
+ export type AuthFamily = "eth" | "sol" | "sui" | "gpg";
3
+
4
+ export const AUTH_FAMILIES: readonly AuthFamily[] = ["eth", "sol", "sui", "gpg"];
5
+
6
+ export interface AuthKeycloakConfig {
7
+ /** e.g. `https://account.example.com`, or `http://localhost:8080/auth` in dev. */
8
+ baseUrl: string;
9
+ realm: string;
10
+ /** The wallet SPI's REST resource: `siww` on the SHC Keycloak (default), `wallet` on mpo's. */
11
+ resource?: "siww" | "wallet";
12
+ /** A public client with direct access grants enabled. */
13
+ clientId: string;
14
+ /** Default `openid`. */
15
+ scope?: string | string[];
16
+ }
17
+
18
+ /**
19
+ * The client Keycloak's own browser login runs under when the account still
20
+ * has required actions: standard flow on, `redirectUri` registered exactly.
21
+ */
22
+ export interface AuthOnboardingConfig {
23
+ clientId: string;
24
+ /** Where Keycloak sends the system browser back, usually the app's deep link. */
25
+ redirectUri: string;
26
+ scope?: string | string[];
27
+ }
28
+
29
+ export interface AuthTokens {
30
+ accessToken: string;
31
+ refreshToken?: string;
32
+ idToken?: string;
33
+ tokenType: string;
34
+ scope?: string;
35
+ /** Epoch ms. */
36
+ expiresAt: number;
37
+ /** Epoch ms; absent for offline or non-expiring refresh tokens. */
38
+ refreshExpiresAt?: number;
39
+ }
40
+
41
+ export interface AuthSignInParams {
42
+ /** Default `eth`. */
43
+ family?: AuthFamily;
44
+ keycloak: AuthKeycloakConfig;
45
+ onboarding?: AuthOnboardingConfig;
46
+ }
47
+
48
+ /** Keycloak's authorization-code login with a fresh `state` and PKCE S256 verifier. */
49
+ export interface AuthBrowserLogin {
50
+ url: string;
51
+ state: string;
52
+ codeVerifier: string;
53
+ }
54
+
55
+ export type AuthSignInResult =
56
+ | { status: "signed-in"; family: AuthFamily; address: string | null; tokens: AuthTokens }
57
+ | {
58
+ status: "profile-incomplete";
59
+ family: AuthFamily;
60
+ address: string | null;
61
+ browserLogin: AuthBrowserLogin;
62
+ };
63
+
64
+ export interface AuthSessionParams {
65
+ keycloak: AuthKeycloakConfig;
66
+ /** Defaults to the refresh token of the page's last sign-in for this realm and client. */
67
+ refreshToken?: string;
68
+ }
69
+
70
+ /** `auth.tokensChanged` event params. */
71
+ export interface AuthTokensChanged {
72
+ baseUrl: string;
73
+ realm: string;
74
+ clientId: string;
75
+ tokens: AuthTokens | null;
76
+ }
@@ -0,0 +1,42 @@
1
+ // The Hermes-safe bridge surface, without the wagmi connector: what a React
2
+ // Native host needs to drive the hosted wallet page (`@multiplatform.one/web3/bridge`).
3
+ export * from "./protocol";
4
+ export * from "./transport";
5
+ export * from "./authTypes";
6
+ export { createPostMessageTransport, type PostMessageTransport } from "./postMessageTransport";
7
+ export { BridgeClient, type EventHandler, type RequestOptions } from "./BridgeClient";
8
+ export { BridgeHost, type RequestHandler } from "./BridgeHost";
9
+ export { createBridgeProvider, type BridgeProvider, type Eip1193RequestArgs } from "./eip1193";
10
+ export { bytesToBase64, base64ToBytes } from "./base64";
11
+ export { SolanaBridge } from "./SolanaBridge";
12
+ export { SuiBridge } from "./SuiBridge";
13
+ export { GpgBridge, type GpgPendingRequest } from "./GpgBridge";
14
+ export {
15
+ AuthBridge,
16
+ type AuthBridgeOptions,
17
+ type AuthSignInOptions,
18
+ type AuthSignInOutcome,
19
+ } from "./AuthBridge";
20
+ export {
21
+ DEV_HOSTNAMES,
22
+ hostedPageOrigin,
23
+ isHostedPageUrl,
24
+ parseOrigin,
25
+ queryParams,
26
+ type ParsedOrigin,
27
+ } from "./hosting";
28
+ export {
29
+ buildInjectScript,
30
+ createNativeBridge,
31
+ type NativeBridge,
32
+ type NativeBridgeOptions,
33
+ } from "./nativeHost";
34
+ export {
35
+ decideNavigation,
36
+ decideNewWindow,
37
+ parseWalletReturn,
38
+ shouldOpenExternally,
39
+ WALLET_SCHEMES,
40
+ WALLET_UNIVERSAL_HOSTS,
41
+ type NavigationDecision,
42
+ } from "../providers/native/deepLink";
@@ -0,0 +1,98 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { hostedPageOrigin, isHostedPageUrl, parseOrigin, queryParams } from "./hosting";
3
+
4
+ describe("parseOrigin", () => {
5
+ it("lowercases and drops the default port", () => {
6
+ expect(parseOrigin("HTTPS://Wallet.Example.com:443/webview.html?x=1")).toEqual({
7
+ scheme: "https",
8
+ host: "wallet.example.com",
9
+ hostname: "wallet.example.com",
10
+ origin: "https://wallet.example.com",
11
+ });
12
+ });
13
+
14
+ it("keeps a non-default port, strips userinfo and handles IPv6", () => {
15
+ expect(parseOrigin("http://user:pw@localhost:8099/webview.html")?.origin).toBe(
16
+ "http://localhost:8099",
17
+ );
18
+ expect(parseOrigin("http://[::1]:8099/")?.hostname).toBe("[::1]");
19
+ });
20
+
21
+ it("ends the authority at a backslash, as browsers do", () => {
22
+ expect(parseOrigin("http://evil.com\\@localhost:8099/")?.origin).toBe("http://evil.com");
23
+ expect(isHostedPageUrl("http://evil.com\\@localhost:8099/", { allowDevHosts: true })).toBe(
24
+ false,
25
+ );
26
+ });
27
+
28
+ it("gives schemes without an authority an empty host", () => {
29
+ expect(parseOrigin("about:blank")).toEqual({
30
+ scheme: "about",
31
+ host: "",
32
+ hostname: "",
33
+ origin: "about:",
34
+ });
35
+ expect(parseOrigin("metamask://connect")?.hostname).toBe("connect");
36
+ });
37
+
38
+ it("returns null for text that is not a URL", () => {
39
+ expect(parseOrigin("not a url")).toBeNull();
40
+ expect(parseOrigin("")).toBeNull();
41
+ });
42
+ });
43
+
44
+ describe("isHostedPageUrl", () => {
45
+ it("accepts https pages", () => {
46
+ expect(isHostedPageUrl("https://wallet.example.com/webview.html")).toBe(true);
47
+ });
48
+
49
+ it("accepts plain http only on development hosts, and only when asked to", () => {
50
+ const dev = { allowDevHosts: true };
51
+ expect(isHostedPageUrl("http://localhost:8099/webview.html", dev)).toBe(true);
52
+ expect(isHostedPageUrl("http://127.0.0.1:8099/webview.html", dev)).toBe(true);
53
+ expect(isHostedPageUrl("http://10.0.2.2:8099/webview.html", dev)).toBe(true);
54
+ expect(isHostedPageUrl("http://wallet.example.com/webview.html", dev)).toBe(false);
55
+ expect(isHostedPageUrl("http://192.168.1.20:8099/webview.html", dev)).toBe(false);
56
+ expect(isHostedPageUrl("http://localhost:8099/webview.html")).toBe(false);
57
+ expect(isHostedPageUrl("http://10.0.2.2:8099/webview.html")).toBe(false);
58
+ });
59
+
60
+ it("refuses pages with no host", () => {
61
+ expect(isHostedPageUrl("file:///android_asset/webview.html")).toBe(false);
62
+ expect(isHostedPageUrl("data:text/html,<p>hi</p>")).toBe(false);
63
+ expect(isHostedPageUrl("about:blank")).toBe(false);
64
+ });
65
+ });
66
+
67
+ describe("hostedPageOrigin", () => {
68
+ it("returns the origin of a hosted page", () => {
69
+ expect(hostedPageOrigin("https://wallet.example.com/a/webview.html")).toBe(
70
+ "https://wallet.example.com",
71
+ );
72
+ });
73
+
74
+ it("throws naming the allowlist for anything else", () => {
75
+ expect(() => hostedPageOrigin("file:///webview.html")).toThrow(/siww\.allowedDomains/);
76
+ expect(() => hostedPageOrigin("http://localhost:8099/webview.html")).toThrow(
77
+ /only in development builds/,
78
+ );
79
+ expect(hostedPageOrigin("http://localhost:8099/webview.html", { allowDevHosts: true })).toBe(
80
+ "http://localhost:8099",
81
+ );
82
+ });
83
+ });
84
+
85
+ describe("queryParams", () => {
86
+ it("decodes keys and values and keeps the first of a repeated name", () => {
87
+ expect(queryParams("app://cb?state=a%2Fb&code=x+y&state=later#frag")).toEqual({
88
+ state: "a/b",
89
+ code: "x y",
90
+ });
91
+ });
92
+
93
+ it("does not let a key reach the prototype", () => {
94
+ const params = queryParams("app://cb?__proto__=x&constructor=y");
95
+ expect(Object.getPrototypeOf(params)).toBe(Object.prototype);
96
+ expect(params.constructor).toBe("y");
97
+ });
98
+ });
@@ -0,0 +1,99 @@
1
+ // URL handling without the URL global: React Native's own URL throws on
2
+ // `hostname` and `searchParams` outside Expo, and native hosts run this code.
3
+
4
+ export interface ParsedOrigin {
5
+ /** Lowercased, without the colon. */
6
+ scheme: string;
7
+ /** Lowercased hostname with a non-default port, e.g. `example.com:8443`; empty for `about:`. */
8
+ host: string;
9
+ /** Lowercased hostname, IPv6 in brackets. */
10
+ hostname: string;
11
+ /** `scheme://host`, or `scheme:` for a URL without an authority. */
12
+ origin: string;
13
+ }
14
+
15
+ // A backslash ends the authority, as browsers read http(s) URLs:
16
+ // `http://evil.com\@localhost/` is evil.com, not localhost.
17
+ const schemeAndAuthority = /^([a-z][a-z0-9+.-]*):(?:\/\/([^/?#\\]*))?/i;
18
+ const hostAndPort = /^(\[[^\]]*\]|[^:]*)(?::(\d*))?$/;
19
+ const defaultPorts: Record<string, string> = { http: "80", https: "443" };
20
+
21
+ export function parseOrigin(url: string): ParsedOrigin | null {
22
+ const match = url.trim().match(schemeAndAuthority);
23
+ if (!match) return null;
24
+ const scheme = match[1].toLowerCase();
25
+ if (match[2] === undefined) return { scheme, host: "", hostname: "", origin: `${scheme}:` };
26
+ const authority = match[2].slice(match[2].lastIndexOf("@") + 1).toLowerCase();
27
+ const hostPort = authority.match(hostAndPort);
28
+ if (!hostPort) return null;
29
+ const hostname = hostPort[1];
30
+ const port = hostPort[2] && hostPort[2] !== defaultPorts[scheme] ? hostPort[2] : "";
31
+ const host = port ? `${hostname}:${port}` : hostname;
32
+ return { scheme, host, hostname, origin: `${scheme}://${host}` };
33
+ }
34
+
35
+ /** The query parameters of `url`, decoded; a repeated name keeps its first value. */
36
+ export function queryParams(url: string): Record<string, string> {
37
+ const params = new Map<string, string>();
38
+ const query = url.match(/\?([^#]*)/)?.[1] ?? "";
39
+ for (const pair of query.split("&")) {
40
+ if (!pair) continue;
41
+ const eq = pair.indexOf("=");
42
+ const key = safeDecode(eq === -1 ? pair : pair.slice(0, eq));
43
+ if (!params.has(key)) params.set(key, eq === -1 ? "" : safeDecode(pair.slice(eq + 1)));
44
+ }
45
+ return Object.fromEntries(params);
46
+ }
47
+
48
+ function safeDecode(value: string): string {
49
+ try {
50
+ return decodeURIComponent(value.replace(/\+/g, " "));
51
+ } catch {
52
+ return value;
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Plain http is allowed only where the device itself is the server: loopback,
58
+ * reached from an emulator through `adb reverse`, and 10.0.2.2, the Android
59
+ * emulator's alias for the host machine. Development builds only: on a phone
60
+ * any app can bind a loopback port, and 10.0.2.2 is a LAN address there.
61
+ */
62
+ export const DEV_HOSTNAMES: readonly string[] = ["localhost", "127.0.0.1", "[::1]", "10.0.2.2"];
63
+
64
+ export interface HostedPageOptions {
65
+ /** Accept plain http on `DEV_HOSTNAMES`. Default false; a React Native host passes `__DEV__`. */
66
+ allowDevHosts?: boolean;
67
+ }
68
+
69
+ /**
70
+ * True when a page at `url` can run the wallet bridge: https, or http on a
71
+ * development host. The sign-in message's domain is the page's host and the
72
+ * Keycloak nonce cookie is set for it, so a `file:`, `data:` or inline page,
73
+ * whose host is empty, can never sign in.
74
+ */
75
+ export function isHostedPageUrl(url: string, options: HostedPageOptions = {}): boolean {
76
+ const parsed = parseOrigin(url);
77
+ if (!parsed || !parsed.hostname) return false;
78
+ if (parsed.scheme === "https") return true;
79
+ return (
80
+ options.allowDevHosts === true &&
81
+ parsed.scheme === "http" &&
82
+ DEV_HOSTNAMES.includes(parsed.hostname)
83
+ );
84
+ }
85
+
86
+ /** The origin of a hosted wallet page, or a thrown error naming what is wrong with `url`. */
87
+ export function hostedPageOrigin(url: string, options: HostedPageOptions = {}): string {
88
+ if (!isHostedPageUrl(url, options)) {
89
+ throw new Error(
90
+ `The wallet WebView page must be served over https (got ${JSON.stringify(url)}). ` +
91
+ "Serve @multiplatform.one/web3/assets/webview.html from a host listed in the realm's " +
92
+ "siww.allowedDomains / wallet.allowedDomains; " +
93
+ (options.allowDevHosts
94
+ ? `plain http is accepted only on ${DEV_HOSTNAMES.join(", ")} for development.`
95
+ : "plain http is accepted only in development builds."),
96
+ );
97
+ }
98
+ return (parseOrigin(url) as ParsedOrigin).origin;
99
+ }
@@ -1,9 +1,2 @@
1
- export * from "./protocol";
2
- export * from "./transport";
3
- export { createPostMessageTransport, type PostMessageTransport } from "./postMessageTransport";
4
- export { BridgeClient, type EventHandler, type RequestOptions } from "./BridgeClient";
5
- export { BridgeHost, type RequestHandler } from "./BridgeHost";
6
- export { createBridgeProvider, type BridgeProvider, type Eip1193RequestArgs } from "./eip1193";
1
+ export * from "./core";
7
2
  export { createBridgeConnector } from "./bridgeConnector";
8
- export { bytesToBase64, base64ToBytes } from "./base64";
9
- export { SolanaBridge } from "./SolanaBridge";