rise-wallet 0.1.4-beta.1 → 0.2.28

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 (486) hide show
  1. package/README.md +64 -34
  2. package/dist/cli/Dialog.d.ts +34 -0
  3. package/dist/cli/Dialog.js +60 -0
  4. package/dist/cli/Dialog.js.map +1 -0
  5. package/dist/cli/Messenger.d.ts +7 -0
  6. package/dist/cli/Messenger.js +123 -0
  7. package/dist/cli/Messenger.js.map +1 -0
  8. package/dist/cli/bin/commands-D7N5ucUu.js +50 -0
  9. package/dist/cli/bin/index.js +9 -0
  10. package/dist/cli/index.d.ts +2 -0
  11. package/dist/cli/index.js +3 -0
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/cli/internal/http.d.ts +6 -0
  14. package/dist/cli/internal/http.js +17 -0
  15. package/dist/cli/internal/http.js.map +1 -0
  16. package/dist/cli/tsdown.config.d.ts +2 -0
  17. package/dist/cli/tsdown.config.js +28 -0
  18. package/dist/cli/tsdown.config.js.map +1 -0
  19. package/dist/core/Chains.d.ts +210 -0
  20. package/dist/core/Chains.js +20 -0
  21. package/dist/core/Chains.js.map +1 -0
  22. package/dist/core/Dialog.d.ts +307 -0
  23. package/dist/core/Dialog.js +809 -0
  24. package/dist/core/Dialog.js.map +1 -0
  25. package/dist/core/Messenger.d.ts +164 -0
  26. package/dist/core/Messenger.js +207 -0
  27. package/dist/core/Messenger.js.map +1 -0
  28. package/dist/core/Mode.d.ts +4 -0
  29. package/dist/core/Mode.js +5 -0
  30. package/dist/core/Mode.js.map +1 -0
  31. package/dist/core/Porto.d.ts +1608 -0
  32. package/dist/core/Porto.js +105 -0
  33. package/dist/core/Porto.js.map +1 -0
  34. package/dist/core/RpcSchema.d.ts +81 -0
  35. package/dist/core/RpcSchema.js +2 -0
  36. package/dist/core/RpcSchema.js.map +1 -0
  37. package/dist/core/Storage.d.ts +14 -0
  38. package/dist/core/Storage.js +109 -0
  39. package/dist/core/Storage.js.map +1 -0
  40. package/dist/core/Transport.d.ts +22 -0
  41. package/dist/core/Transport.js +37 -0
  42. package/dist/core/Transport.js.map +1 -0
  43. package/dist/core/internal/_generated/chains.d.ts +1 -0
  44. package/dist/core/internal/_generated/chains.js +3 -0
  45. package/dist/core/internal/_generated/chains.js.map +1 -0
  46. package/dist/core/internal/_generated/contracts/IthacaAccount.d.ts +1120 -0
  47. package/dist/core/internal/_generated/contracts/IthacaAccount.js +1453 -0
  48. package/dist/core/internal/_generated/contracts/IthacaAccount.js.map +1 -0
  49. package/dist/core/internal/call.d.ts +163 -0
  50. package/dist/core/internal/call.js +115 -0
  51. package/dist/core/internal/call.js.map +1 -0
  52. package/dist/core/internal/erc8010.d.ts +17 -0
  53. package/dist/core/internal/erc8010.js +29 -0
  54. package/dist/core/internal/erc8010.js.map +1 -0
  55. package/dist/core/internal/intersectionObserver.d.ts +1 -0
  56. package/dist/core/internal/intersectionObserver.js +5 -0
  57. package/dist/core/internal/intersectionObserver.js.map +1 -0
  58. package/dist/core/internal/logger.d.ts +21 -0
  59. package/dist/core/internal/logger.js +24 -0
  60. package/dist/core/internal/logger.js.map +1 -0
  61. package/dist/core/internal/mode.d.ts +344 -0
  62. package/dist/core/internal/mode.js +110 -0
  63. package/dist/core/internal/mode.js.map +1 -0
  64. package/dist/core/internal/modes/dialog.d.ts +799 -0
  65. package/dist/core/internal/modes/dialog.js +760 -0
  66. package/dist/core/internal/modes/dialog.js.map +1 -0
  67. package/dist/core/internal/modes/reactNative.d.ts +1401 -0
  68. package/dist/core/internal/modes/reactNative.js +19 -0
  69. package/dist/core/internal/modes/reactNative.js.map +1 -0
  70. package/dist/core/internal/modes/relay.d.ts +684 -0
  71. package/dist/core/internal/modes/relay.js +708 -0
  72. package/dist/core/internal/modes/relay.js.map +1 -0
  73. package/dist/core/internal/permissions.d.ts +59 -0
  74. package/dist/core/internal/permissions.js +30 -0
  75. package/dist/core/internal/permissions.js.map +1 -0
  76. package/dist/core/internal/permissionsRequest.d.ts +71 -0
  77. package/dist/core/internal/permissionsRequest.js +58 -0
  78. package/dist/core/internal/permissionsRequest.js.map +1 -0
  79. package/dist/core/internal/porto.d.ts +13 -0
  80. package/dist/core/internal/porto.js +2 -0
  81. package/dist/core/internal/porto.js.map +1 -0
  82. package/dist/core/internal/promise.d.ts +8 -0
  83. package/dist/core/internal/promise.js +11 -0
  84. package/dist/core/internal/promise.js.map +1 -0
  85. package/dist/core/internal/provider.d.ts +29 -0
  86. package/dist/core/internal/provider.js +941 -0
  87. package/dist/core/internal/provider.js.map +1 -0
  88. package/dist/core/internal/relay/rpcSchema.d.ts +75 -0
  89. package/dist/core/internal/relay/rpcSchema.js +7 -0
  90. package/dist/core/internal/relay/rpcSchema.js.map +1 -0
  91. package/dist/core/internal/relay/schema/capabilities.d.ts +164 -0
  92. package/dist/core/internal/relay/schema/capabilities.js +112 -0
  93. package/dist/core/internal/relay/schema/capabilities.js.map +1 -0
  94. package/dist/core/internal/relay/schema/intent.d.ts +167 -0
  95. package/dist/core/internal/relay/schema/intent.js +170 -0
  96. package/dist/core/internal/relay/schema/intent.js.map +1 -0
  97. package/dist/core/internal/relay/schema/key.d.ts +43 -0
  98. package/dist/core/internal/relay/schema/key.js +30 -0
  99. package/dist/core/internal/relay/schema/key.js.map +1 -0
  100. package/dist/core/internal/relay/schema/permission.d.ts +39 -0
  101. package/dist/core/internal/relay/schema/permission.js +29 -0
  102. package/dist/core/internal/relay/schema/permission.js.map +1 -0
  103. package/dist/core/internal/relay/schema/preCall.d.ts +62 -0
  104. package/dist/core/internal/relay/schema/preCall.js +36 -0
  105. package/dist/core/internal/relay/schema/preCall.js.map +1 -0
  106. package/dist/core/internal/relay/schema/quotes.d.ts +369 -0
  107. package/dist/core/internal/relay/schema/quotes.js +89 -0
  108. package/dist/core/internal/relay/schema/quotes.js.map +1 -0
  109. package/dist/core/internal/relay/schema/rpc.d.ts +1528 -0
  110. package/dist/core/internal/relay/schema/rpc.js +638 -0
  111. package/dist/core/internal/relay/schema/rpc.js.map +1 -0
  112. package/dist/core/internal/relay/schema/token.d.ts +13 -0
  113. package/dist/core/internal/relay/schema/token.js +13 -0
  114. package/dist/core/internal/relay/schema/token.js.map +1 -0
  115. package/dist/core/internal/requiredFunds.d.ts +18 -0
  116. package/dist/core/internal/requiredFunds.js +25 -0
  117. package/dist/core/internal/requiredFunds.js.map +1 -0
  118. package/dist/core/internal/schema/capabilities.d.ts +313 -0
  119. package/dist/core/internal/schema/capabilities.js +133 -0
  120. package/dist/core/internal/schema/capabilities.js.map +1 -0
  121. package/dist/core/internal/schema/key.d.ts +164 -0
  122. package/dist/core/internal/schema/key.js +75 -0
  123. package/dist/core/internal/schema/key.js.map +1 -0
  124. package/dist/core/internal/schema/permissions.d.ts +102 -0
  125. package/dist/core/internal/schema/permissions.js +28 -0
  126. package/dist/core/internal/schema/permissions.js.map +1 -0
  127. package/dist/core/internal/schema/request.d.ts +937 -0
  128. package/dist/core/internal/schema/request.js +57 -0
  129. package/dist/core/internal/schema/request.js.map +1 -0
  130. package/dist/core/internal/schema/rpc.d.ts +3314 -0
  131. package/dist/core/internal/schema/rpc.js +599 -0
  132. package/dist/core/internal/schema/rpc.js.map +1 -0
  133. package/dist/core/internal/schema/token.d.ts +1 -0
  134. package/dist/core/internal/schema/token.js +2 -0
  135. package/dist/core/internal/schema/token.js.map +1 -0
  136. package/dist/core/internal/schema/utils.d.ts +18 -0
  137. package/dist/core/internal/schema/utils.js +213 -0
  138. package/dist/core/internal/schema/utils.js.map +1 -0
  139. package/dist/core/internal/siwe.d.ts +32 -0
  140. package/dist/core/internal/siwe.js +92 -0
  141. package/dist/core/internal/siwe.js.map +1 -0
  142. package/dist/core/internal/store.d.ts +2 -0
  143. package/dist/core/internal/store.js +9 -0
  144. package/dist/core/internal/store.js.map +1 -0
  145. package/dist/core/internal/tokens.d.ts +57 -0
  146. package/dist/core/internal/tokens.js +69 -0
  147. package/dist/core/internal/tokens.js.map +1 -0
  148. package/dist/core/internal/types.d.ts +298 -0
  149. package/dist/core/internal/types.js +2 -0
  150. package/dist/core/internal/types.js.map +1 -0
  151. package/dist/core/internal/urlString.d.ts +1 -0
  152. package/dist/core/internal/urlString.js +8 -0
  153. package/dist/core/internal/urlString.js.map +1 -0
  154. package/dist/core/internal/userAgent.d.ts +10 -0
  155. package/dist/core/internal/userAgent.js +19 -0
  156. package/dist/core/internal/userAgent.js.map +1 -0
  157. package/dist/core/internal/utils.d.ts +24 -0
  158. package/dist/core/internal/utils.js +62 -0
  159. package/dist/core/internal/utils.js.map +1 -0
  160. package/dist/core/react-native/Porto.d.ts +1480 -0
  161. package/dist/core/react-native/Porto.js +17 -0
  162. package/dist/core/react-native/Porto.js.map +1 -0
  163. package/dist/core/react-native/configure.d.ts +9 -0
  164. package/dist/core/react-native/configure.js +24 -0
  165. package/dist/core/react-native/configure.js.map +1 -0
  166. package/dist/core/react-native/environment.d.ts +26 -0
  167. package/dist/core/react-native/environment.js +13 -0
  168. package/dist/core/react-native/environment.js.map +1 -0
  169. package/dist/core/react-native/index.d.ts +4 -0
  170. package/dist/core/react-native/index.js +5 -0
  171. package/dist/core/react-native/index.js.map +1 -0
  172. package/dist/core/react-native/utils.d.ts +1 -0
  173. package/dist/core/react-native/utils.js +12 -0
  174. package/dist/core/react-native/utils.js.map +1 -0
  175. package/dist/index.d.ts +16 -2
  176. package/dist/index.js +15 -2
  177. package/dist/index.js.map +1 -0
  178. package/dist/internal/index.d.ts +3 -0
  179. package/dist/internal/index.js +4 -0
  180. package/dist/internal/index.js.map +1 -0
  181. package/dist/react-native/crypto.d.ts +1 -0
  182. package/dist/react-native/crypto.js +12 -0
  183. package/dist/react-native/crypto.js.map +1 -0
  184. package/dist/react-native/index.d.ts +7 -0
  185. package/dist/react-native/index.js +12 -0
  186. package/dist/react-native/index.js.map +1 -0
  187. package/dist/react-native/register.d.ts +2 -0
  188. package/dist/react-native/register.js +15 -0
  189. package/dist/react-native/register.js.map +1 -0
  190. package/dist/register/index.d.ts +14 -0
  191. package/dist/register/index.js +2 -0
  192. package/dist/register/index.js.map +1 -0
  193. package/dist/remote/Actions.d.ts +33 -0
  194. package/dist/remote/Actions.js +76 -0
  195. package/dist/remote/Actions.js.map +1 -0
  196. package/dist/remote/Events.d.ts +46 -0
  197. package/dist/remote/Events.js +132 -0
  198. package/dist/remote/Events.js.map +1 -0
  199. package/dist/remote/Hooks.d.ts +3800 -0
  200. package/dist/remote/Hooks.js +106 -0
  201. package/dist/remote/Hooks.js.map +1 -0
  202. package/dist/remote/Porto.d.ts +857 -0
  203. package/dist/remote/Porto.js +66 -0
  204. package/dist/remote/Porto.js.map +1 -0
  205. package/dist/remote/index.d.ts +4 -0
  206. package/dist/remote/index.js +5 -0
  207. package/dist/remote/index.js.map +1 -0
  208. package/dist/remote/internal/methodPolicies.d.ts +96 -0
  209. package/dist/remote/internal/methodPolicies.js +102 -0
  210. package/dist/remote/internal/methodPolicies.js.map +1 -0
  211. package/dist/server/Route.d.ts +87 -0
  212. package/dist/server/Route.js +189 -0
  213. package/dist/server/Route.js.map +1 -0
  214. package/dist/server/Router.d.ts +23 -0
  215. package/dist/server/Router.js +29 -0
  216. package/dist/server/Router.js.map +1 -0
  217. package/dist/server/index.d.ts +2 -0
  218. package/dist/server/index.js +3 -0
  219. package/dist/server/index.js.map +1 -0
  220. package/dist/server/internal/merchantSchema.d.ts +64 -0
  221. package/dist/server/internal/merchantSchema.js +7 -0
  222. package/dist/server/internal/merchantSchema.js.map +1 -0
  223. package/dist/server/internal/requestListener.d.ts +123 -0
  224. package/dist/server/internal/requestListener.js +172 -0
  225. package/dist/server/internal/requestListener.js.map +1 -0
  226. package/dist/theme/Theme.d.ts +121 -0
  227. package/dist/theme/Theme.js +18 -0
  228. package/dist/theme/Theme.js.map +1 -0
  229. package/dist/theme/index.d.ts +2 -0
  230. package/dist/theme/index.js +2 -0
  231. package/dist/theme/index.js.map +1 -0
  232. package/dist/trusted-hosts.d.ts +1 -0
  233. package/dist/trusted-hosts.js +41 -0
  234. package/dist/trusted-hosts.js.map +1 -0
  235. package/dist/viem/Account.d.ts +110 -0
  236. package/dist/viem/Account.js +132 -0
  237. package/dist/viem/Account.js.map +1 -0
  238. package/dist/viem/AccountActions.d.ts +10 -0
  239. package/dist/viem/AccountActions.js +14 -0
  240. package/dist/viem/AccountActions.js.map +1 -0
  241. package/dist/viem/CapabilitiesSchema.d.ts +14 -0
  242. package/dist/viem/CapabilitiesSchema.js +2 -0
  243. package/dist/viem/CapabilitiesSchema.js.map +1 -0
  244. package/dist/viem/ContractActions.d.ts +208 -0
  245. package/dist/viem/ContractActions.js +350 -0
  246. package/dist/viem/ContractActions.js.map +1 -0
  247. package/dist/viem/Key.d.ts +1155 -0
  248. package/dist/viem/Key.js +924 -0
  249. package/dist/viem/Key.js.map +1 -0
  250. package/dist/viem/RelayActions.d.ts +435 -0
  251. package/dist/viem/RelayActions.js +385 -0
  252. package/dist/viem/RelayActions.js.map +1 -0
  253. package/dist/viem/RelayClient.d.ts +26 -0
  254. package/dist/viem/RelayClient.js +44 -0
  255. package/dist/viem/RelayClient.js.map +1 -0
  256. package/dist/viem/RpcSchema.d.ts +22 -0
  257. package/dist/viem/RpcSchema.js +2 -0
  258. package/dist/viem/RpcSchema.js.map +1 -0
  259. package/dist/viem/WalletActions.d.ts +86 -0
  260. package/dist/viem/WalletActions.js +220 -0
  261. package/dist/viem/WalletActions.js.map +1 -0
  262. package/dist/viem/WalletClient.d.ts +20 -0
  263. package/dist/viem/WalletClient.js +23 -0
  264. package/dist/viem/WalletClient.js.map +1 -0
  265. package/dist/viem/index.d.ts +13 -0
  266. package/dist/viem/index.js +12 -0
  267. package/dist/viem/index.js.map +1 -0
  268. package/dist/viem/internal/relayActions.d.ts +364 -0
  269. package/dist/viem/internal/relayActions.js +783 -0
  270. package/dist/viem/internal/relayActions.js.map +1 -0
  271. package/dist/viem/internal/utils.d.ts +15 -0
  272. package/dist/viem/internal/utils.js +2 -0
  273. package/dist/viem/internal/utils.js.map +1 -0
  274. package/dist/wagmi/Actions.d.ts +1 -0
  275. package/dist/wagmi/Actions.js +2 -0
  276. package/dist/wagmi/Actions.js.map +1 -0
  277. package/dist/wagmi/Connector.d.ts +26 -0
  278. package/dist/wagmi/Connector.js +238 -0
  279. package/dist/wagmi/Connector.js.map +1 -0
  280. package/dist/wagmi/Hooks.d.ts +1 -0
  281. package/dist/wagmi/Hooks.js +2 -0
  282. package/dist/wagmi/Hooks.js.map +1 -0
  283. package/dist/wagmi/Query.d.ts +1 -0
  284. package/dist/wagmi/Query.js +2 -0
  285. package/dist/wagmi/Query.js.map +1 -0
  286. package/dist/wagmi/index.d.ts +4 -0
  287. package/dist/wagmi/index.js +5 -0
  288. package/dist/wagmi/index.js.map +1 -0
  289. package/dist/wagmi/internal/core.d.ts +83 -0
  290. package/dist/wagmi/internal/core.js +229 -0
  291. package/dist/wagmi/internal/core.js.map +1 -0
  292. package/dist/wagmi/internal/query.d.ts +32 -0
  293. package/dist/wagmi/internal/query.js +23 -0
  294. package/dist/wagmi/internal/query.js.map +1 -0
  295. package/dist/wagmi/internal/react.d.ts +90 -0
  296. package/dist/wagmi/internal/react.js +256 -0
  297. package/dist/wagmi/internal/react.js.map +1 -0
  298. package/dist/wagmi/internal/types.d.ts +10 -0
  299. package/dist/wagmi/internal/types.js +2 -0
  300. package/dist/wagmi/internal/types.js.map +1 -0
  301. package/dist/wagmi/internal/utils.d.ts +1 -0
  302. package/dist/wagmi/internal/utils.js +18 -0
  303. package/dist/wagmi/internal/utils.js.map +1 -0
  304. package/package.json +286 -34
  305. package/src/cli/Dialog.ts +75 -0
  306. package/src/cli/Messenger.ts +148 -0
  307. package/src/cli/bin/index.ts +37 -0
  308. package/src/cli/bin/tsconfig.json +8 -0
  309. package/src/cli/index.ts +2 -0
  310. package/src/cli/internal/commands.ts +212 -0
  311. package/src/cli/internal/context.ts +56 -0
  312. package/src/cli/internal/http.ts +28 -0
  313. package/src/cli/internal/utils.ts +28 -0
  314. package/src/cli/tsdown.config.ts +37 -0
  315. package/src/core/Chains.ts +25 -0
  316. package/src/core/Dialog.ts +1059 -0
  317. package/src/core/Messenger.ts +394 -0
  318. package/src/core/Mode.ts +4 -0
  319. package/src/core/Porto.ts +287 -0
  320. package/src/core/RpcSchema.ts +124 -0
  321. package/src/core/Storage.ts +122 -0
  322. package/src/core/Transport.ts +45 -0
  323. package/src/core/internal/_generated/chains.ts +2 -0
  324. package/src/core/internal/_generated/contracts/EIP7702Proxy.ts +25 -0
  325. package/src/core/internal/_generated/contracts/Escrow.ts +330 -0
  326. package/src/core/internal/_generated/contracts/ExperimentERC20.ts +569 -0
  327. package/src/core/internal/_generated/contracts/ExperimentERC721.ts +588 -0
  328. package/src/core/internal/_generated/contracts/GuardedExecutor.ts +623 -0
  329. package/src/core/internal/_generated/contracts/ICallChecker.ts +34 -0
  330. package/src/core/internal/_generated/contracts/ICommon.ts +4 -0
  331. package/src/core/internal/_generated/contracts/IEscrow.ts +114 -0
  332. package/src/core/internal/_generated/contracts/IFunder.ts +80 -0
  333. package/src/core/internal/_generated/contracts/IFunderV4.ts +45 -0
  334. package/src/core/internal/_generated/contracts/IIthacaAccount.ts +107 -0
  335. package/src/core/internal/_generated/contracts/IOAppCore.ts +142 -0
  336. package/src/core/internal/_generated/contracts/IOAppMsgInspector.ts +45 -0
  337. package/src/core/internal/_generated/contracts/IOAppReceiver.ts +161 -0
  338. package/src/core/internal/_generated/contracts/IOrchestrator.ts +95 -0
  339. package/src/core/internal/_generated/contracts/ISettler.ts +52 -0
  340. package/src/core/internal/_generated/contracts/ISigner.ts +34 -0
  341. package/src/core/internal/_generated/contracts/IthacaAccount.ts +1454 -0
  342. package/src/core/internal/_generated/contracts/IthacaAccountNew.ts +1454 -0
  343. package/src/core/internal/_generated/contracts/IthacaAccountOld.ts +1454 -0
  344. package/src/core/internal/_generated/contracts/LayerZeroSettler.ts +811 -0
  345. package/src/core/internal/_generated/contracts/LibNonce.ts +15 -0
  346. package/src/core/internal/_generated/contracts/LibTStack.ts +4 -0
  347. package/src/core/internal/_generated/contracts/MultiSigSigner.ts +203 -0
  348. package/src/core/internal/_generated/contracts/OApp.ts +412 -0
  349. package/src/core/internal/_generated/contracts/OAppCore.ts +229 -0
  350. package/src/core/internal/_generated/contracts/OAppReceiver.ts +396 -0
  351. package/src/core/internal/_generated/contracts/OAppSender.ts +245 -0
  352. package/src/core/internal/_generated/contracts/Orchestrator.ts +390 -0
  353. package/src/core/internal/_generated/contracts/SimpleFunder.ts +534 -0
  354. package/src/core/internal/_generated/contracts/SimpleSettler.ts +360 -0
  355. package/src/core/internal/_generated/contracts/Simulator.ts +170 -0
  356. package/src/core/internal/_generated/contracts/TokenTransferLib.ts +4 -0
  357. package/src/core/internal/_snapshots/provider.browser.test.ts.snap +119 -0
  358. package/src/core/internal/_snapshots/provider.test.ts.snap +1103 -0
  359. package/src/core/internal/call.test.ts +116 -0
  360. package/src/core/internal/call.ts +245 -0
  361. package/src/core/internal/erc8010.test.ts +74 -0
  362. package/src/core/internal/erc8010.ts +44 -0
  363. package/src/core/internal/intersectionObserver.ts +5 -0
  364. package/src/core/internal/logger.ts +42 -0
  365. package/src/core/internal/mode.ts +498 -0
  366. package/src/core/internal/modes/dialog.ts +1051 -0
  367. package/src/core/internal/modes/reactNative.ts +29 -0
  368. package/src/core/internal/modes/relay.ts +893 -0
  369. package/src/core/internal/permissions.ts +43 -0
  370. package/src/core/internal/permissionsRequest.ts +88 -0
  371. package/src/core/internal/porto.ts +16 -0
  372. package/src/core/internal/promise.ts +19 -0
  373. package/src/core/internal/provider.browser.test.ts +311 -0
  374. package/src/core/internal/provider.test.ts +3552 -0
  375. package/src/core/internal/provider.ts +1277 -0
  376. package/src/core/internal/relay/rpcSchema.ts +101 -0
  377. package/src/core/internal/relay/schema/capabilities.test.ts +663 -0
  378. package/src/core/internal/relay/schema/capabilities.ts +156 -0
  379. package/src/core/internal/relay/schema/intent.test.ts +433 -0
  380. package/src/core/internal/relay/schema/intent.ts +174 -0
  381. package/src/core/internal/relay/schema/key.test.ts +424 -0
  382. package/src/core/internal/relay/schema/key.ts +34 -0
  383. package/src/core/internal/relay/schema/permission.test.ts +499 -0
  384. package/src/core/internal/relay/schema/permission.ts +34 -0
  385. package/src/core/internal/relay/schema/preCall.ts +39 -0
  386. package/src/core/internal/relay/schema/quotes.test.ts +901 -0
  387. package/src/core/internal/relay/schema/quotes.ts +98 -0
  388. package/src/core/internal/relay/schema/rpc.ts +822 -0
  389. package/src/core/internal/relay/schema/token.ts +16 -0
  390. package/src/core/internal/requiredFunds.test.ts +141 -0
  391. package/src/core/internal/requiredFunds.ts +45 -0
  392. package/src/core/internal/schema/capabilities.test.ts +1334 -0
  393. package/src/core/internal/schema/capabilities.ts +162 -0
  394. package/src/core/internal/schema/key.test.ts +570 -0
  395. package/src/core/internal/schema/key.ts +98 -0
  396. package/src/core/internal/schema/permissions.test.ts +948 -0
  397. package/src/core/internal/schema/permissions.ts +31 -0
  398. package/src/core/internal/schema/request.bench.ts +35 -0
  399. package/src/core/internal/schema/request.ts +90 -0
  400. package/src/core/internal/schema/rpc.ts +821 -0
  401. package/src/core/internal/schema/token.ts +1 -0
  402. package/src/core/internal/schema/utils.test.ts +572 -0
  403. package/src/core/internal/schema/utils.ts +236 -0
  404. package/src/core/internal/siwe.test.ts +473 -0
  405. package/src/core/internal/siwe.ts +144 -0
  406. package/src/core/internal/store.ts +9 -0
  407. package/src/core/internal/tokens.test.ts +317 -0
  408. package/src/core/internal/tokens.ts +125 -0
  409. package/src/core/internal/types.ts +448 -0
  410. package/src/core/internal/urlString.ts +5 -0
  411. package/src/core/internal/userAgent.ts +35 -0
  412. package/src/core/internal/utils.test.ts +35 -0
  413. package/src/core/internal/utils.ts +67 -0
  414. package/src/core/react-native/Porto.ts +22 -0
  415. package/src/core/react-native/configure.ts +31 -0
  416. package/src/core/react-native/environment.ts +43 -0
  417. package/src/core/react-native/index.ts +4 -0
  418. package/src/core/react-native/utils.ts +18 -0
  419. package/src/index.ts +17 -0
  420. package/src/internal/index.ts +3 -0
  421. package/src/react-native/crypto.ts +19 -0
  422. package/src/react-native/index.ts +15 -0
  423. package/src/react-native/register.ts +24 -0
  424. package/src/register/index.ts +17 -0
  425. package/src/remote/Actions.ts +115 -0
  426. package/src/remote/Events.ts +193 -0
  427. package/src/remote/Hooks.ts +194 -0
  428. package/src/remote/Porto.ts +144 -0
  429. package/src/remote/index.ts +4 -0
  430. package/src/remote/internal/methodPolicies.ts +124 -0
  431. package/src/server/Route.test.ts +347 -0
  432. package/src/server/Route.ts +259 -0
  433. package/src/server/Router.test.ts +32 -0
  434. package/src/server/Router.ts +59 -0
  435. package/src/server/index.ts +2 -0
  436. package/src/server/internal/merchantSchema.ts +11 -0
  437. package/src/server/internal/requestListener.ts +284 -0
  438. package/src/theme/Theme.ts +163 -0
  439. package/src/theme/index.ts +2 -0
  440. package/src/trusted-hosts.ts +40 -0
  441. package/src/tsconfig.build.tsbuildinfo +1 -0
  442. package/src/tsconfig.json +15 -0
  443. package/src/viem/Account.test.ts +270 -0
  444. package/src/viem/Account.ts +278 -0
  445. package/src/viem/AccountActions.test.ts +3 -0
  446. package/src/viem/AccountActions.ts +30 -0
  447. package/src/viem/CapabilitiesSchema.ts +18 -0
  448. package/src/viem/ContractActions.test.ts +980 -0
  449. package/src/viem/ContractActions.ts +624 -0
  450. package/src/viem/Key.test.ts +1420 -0
  451. package/src/viem/Key.ts +1318 -0
  452. package/src/viem/RelayActions.test.ts +1730 -0
  453. package/src/viem/RelayActions.ts +1082 -0
  454. package/src/viem/RelayClient.test.ts +127 -0
  455. package/src/viem/RelayClient.ts +87 -0
  456. package/src/viem/RpcSchema.ts +27 -0
  457. package/src/viem/WalletActions.test.ts +646 -0
  458. package/src/viem/WalletActions.ts +476 -0
  459. package/src/viem/WalletClient.test.ts +36 -0
  460. package/src/viem/WalletClient.ts +74 -0
  461. package/src/viem/index.ts +13 -0
  462. package/src/viem/internal/relayActions.test.ts +1296 -0
  463. package/src/viem/internal/relayActions.ts +1222 -0
  464. package/src/viem/internal/utils.ts +27 -0
  465. package/src/wagmi/Actions.ts +13 -0
  466. package/src/wagmi/Connector.ts +304 -0
  467. package/src/wagmi/Hooks.ts +14 -0
  468. package/src/wagmi/Query.ts +5 -0
  469. package/src/wagmi/index.ts +4 -0
  470. package/src/wagmi/internal/core.test.ts +12 -0
  471. package/src/wagmi/internal/core.ts +468 -0
  472. package/src/wagmi/internal/query.ts +52 -0
  473. package/src/wagmi/internal/react.test.ts +12 -0
  474. package/src/wagmi/internal/react.ts +705 -0
  475. package/src/wagmi/internal/types.ts +21 -0
  476. package/src/wagmi/internal/utils.ts +25 -0
  477. package/dist/chain.cjs +0 -17
  478. package/dist/chain.d.cts +0 -41
  479. package/dist/chain.d.ts +0 -41
  480. package/dist/chain.js +0 -13
  481. package/dist/config.cjs +0 -19
  482. package/dist/config.d.cts +0 -3
  483. package/dist/config.d.ts +0 -3
  484. package/dist/config.js +0 -16
  485. package/dist/index.cjs +0 -18
  486. package/dist/index.d.cts +0 -2
@@ -0,0 +1,1059 @@
1
+ import type { RpcRequest, RpcResponse } from 'ox'
2
+ import * as Json from 'ox/Json'
3
+ import * as Provider from 'ox/Provider'
4
+ import type { ThemeFragment } from '../theme/Theme.js'
5
+ import * as IO from './internal/intersectionObserver.js'
6
+ import { logger } from './internal/logger.js'
7
+ import type { Internal } from './internal/porto.js'
8
+ import * as UserAgent from './internal/userAgent.js'
9
+ import * as Messenger from './Messenger.js'
10
+ import type { QueuedRequest, Store } from './Porto.js'
11
+ import * as ReactNativeEnvironment from './react-native/environment.js'
12
+ import { isReactNative } from './react-native/utils.js'
13
+
14
+ const AuthSessionStatus = {
15
+ cancel: 'cancel',
16
+ error: 'error',
17
+ success: 'success',
18
+ unknown: 'unknown',
19
+ } as const
20
+
21
+ type AuthSessionStatus =
22
+ (typeof AuthSessionStatus)[keyof typeof AuthSessionStatus]
23
+
24
+ export const hostUrls = {
25
+ local: 'http://localhost:5175/dialog/',
26
+ prod: 'https://id.porto.sh/dialog',
27
+ stg: 'https://stg.id.porto.sh/dialog',
28
+ } as const
29
+
30
+ /** Dialog interface. */
31
+ export type Dialog = {
32
+ name: string
33
+ setup: (parameters: {
34
+ host: string
35
+ internal: Internal
36
+ theme?: ThemeFragment | undefined
37
+ themeController?: ThemeController | undefined
38
+ }) => {
39
+ close: () => void
40
+ destroy: () => void
41
+ open: (parameters: any) => void
42
+ secure: () => Promise<{
43
+ frame: boolean
44
+ host: boolean
45
+ protocol: boolean
46
+ }>
47
+ syncRequests: (requests: readonly QueuedRequest[]) => Promise<void>
48
+ }
49
+ supportsHeadless: boolean
50
+ }
51
+
52
+ /**
53
+ * Instantiates a dialog.
54
+ *
55
+ * @param dialog - Dialog.
56
+ * @returns Instantiated dialog.
57
+ */
58
+ export function from<const dialog extends Dialog>(dialog: dialog): dialog {
59
+ return dialog
60
+ }
61
+
62
+ /**
63
+ * Instantiates an iframe dialog.
64
+ *
65
+ * @returns iframe dialog.
66
+ */
67
+ export function iframe(options: iframe.Options = {}) {
68
+ const { skipProtocolCheck, skipUnsupported } = options
69
+
70
+ // Safari does not support WebAuthn credential creation in iframes.
71
+ // Fall back to popup dialog.
72
+ // Tracking: https://github.com/WebKit/standards-positions/issues/304
73
+ const includesUnsupported = (
74
+ requests: readonly RpcRequest.RpcRequest[] | undefined,
75
+ ) =>
76
+ !skipUnsupported &&
77
+ UserAgent.isSafari() &&
78
+ requests?.some((x) =>
79
+ ['wallet_connect', 'eth_requestAccounts'].includes(x.method),
80
+ )
81
+
82
+ if (typeof window === 'undefined') return noop()
83
+ return from({
84
+ name: 'iframe',
85
+ setup(parameters) {
86
+ const { host, internal, theme, themeController } = parameters
87
+ const { store } = internal
88
+
89
+ const fallback = popup().setup(parameters)
90
+
91
+ let open = false
92
+
93
+ const hostUrl = new URL(host)
94
+
95
+ const root = document.createElement('dialog')
96
+ root.dataset.porto = ''
97
+
98
+ root.setAttribute('role', 'dialog')
99
+ root.setAttribute('aria-closed', 'true')
100
+ root.setAttribute('aria-label', 'Porto Wallet')
101
+ root.setAttribute('hidden', 'until-found')
102
+
103
+ Object.assign(root.style, {
104
+ background: 'transparent',
105
+ border: '0',
106
+ outline: '0',
107
+ padding: '0',
108
+ position: 'fixed',
109
+ })
110
+
111
+ document.body.appendChild(root)
112
+
113
+ const iframe = document.createElement('iframe')
114
+ iframe.setAttribute('data-testid', 'porto')
115
+ const iframeAllow = [
116
+ 'payment',
117
+ `publickey-credentials-get ${hostUrl.origin}`,
118
+ `publickey-credentials-create ${hostUrl.origin}`,
119
+ ]
120
+
121
+ if (!UserAgent.isFirefox()) iframeAllow.push('clipboard-write')
122
+
123
+ iframe.setAttribute('allow', iframeAllow.join('; '))
124
+ iframe.setAttribute('tabindex', '0')
125
+ iframe.setAttribute(
126
+ 'sandbox',
127
+ 'allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox',
128
+ )
129
+ iframe.setAttribute('src', getDialogUrl(host))
130
+ iframe.setAttribute('title', 'Porto')
131
+ Object.assign(iframe.style, {
132
+ backgroundColor: 'transparent',
133
+ border: '0',
134
+ colorScheme: 'light dark',
135
+ height: '100%',
136
+ left: '0',
137
+ position: 'fixed',
138
+ top: '0',
139
+ width: '100%',
140
+ })
141
+
142
+ const style = document.createElement('style')
143
+ style.innerHTML = `
144
+ dialog[data-porto]::backdrop {
145
+ background: transparent!important;
146
+ }
147
+ `
148
+
149
+ root.appendChild(style)
150
+ root.appendChild(iframe)
151
+
152
+ const messenger = Messenger.bridge({
153
+ from: Messenger.fromWindow(window, { targetOrigin: hostUrl.origin }),
154
+ to: Messenger.fromWindow(iframe.contentWindow!, {
155
+ targetOrigin: hostUrl.origin,
156
+ }),
157
+ waitForReady: true,
158
+ })
159
+
160
+ themeController?._setup(messenger, true)
161
+
162
+ const drawerModeQuery = window.matchMedia('(max-width: 460px)')
163
+ const onDrawerModeChange = () => {
164
+ messenger.send('__internal', {
165
+ type: 'resize',
166
+ // 460 = drawer mode, 461 = floating mode
167
+ width: drawerModeQuery.matches ? 460 : 461,
168
+ })
169
+ }
170
+ drawerModeQuery.addEventListener('change', onDrawerModeChange)
171
+
172
+ messenger.on('ready', (options) => {
173
+ const chainIds = parameters.internal.store.getState().chainIds
174
+
175
+ // Derive the compatible chain IDs between the dialog and the application.
176
+ let compatibleChainIds = chainIds.filter((id) =>
177
+ options.chainIds.includes(id),
178
+ )
179
+
180
+ // If the consumer has no compatible chain IDs with the dialog,
181
+ // fall back to the dialog's chain IDs.
182
+ if (compatibleChainIds.length === 0)
183
+ compatibleChainIds = options.chainIds as [number, ...number[]]
184
+
185
+ store.setState((x) => ({
186
+ ...x,
187
+ chainIds: compatibleChainIds as [number, ...number[]],
188
+ }))
189
+
190
+ messenger.send('__internal', {
191
+ chainIds: compatibleChainIds,
192
+ mode: 'iframe',
193
+ referrer: getReferrer(),
194
+ theme,
195
+ type: 'init',
196
+ })
197
+
198
+ onDrawerModeChange()
199
+ })
200
+
201
+ messenger.on('rpc-response', (response) => {
202
+ if (includesUnsupported([response._request])) {
203
+ // reload iframe to rehydrate storage state if an
204
+ // unsupported request routed via another renderer.
205
+ const src = iframe.src
206
+ iframe.src = src
207
+ }
208
+ handleResponse(store, response)
209
+ })
210
+ messenger.on('__internal', (payload) => {
211
+ if (payload.type === 'switch' && payload.mode === 'popup') {
212
+ fallback.open()
213
+ fallback.syncRequests(store.getState().requestQueue)
214
+ }
215
+ })
216
+
217
+ let bodyStyle: CSSStyleDeclaration | null = null
218
+
219
+ // store the opening element to restore the focus
220
+ let opener: HTMLElement | null = null
221
+
222
+ const onBlur = () => handleBlur(store)
223
+ const onEscape = (event: KeyboardEvent) => {
224
+ if (event.key === 'Escape') handleBlur(store)
225
+ }
226
+
227
+ // 1password extension adds `inert` attribute to `dialog` and inserts
228
+ // itself (`<com-1password-notification />`) there rendering itself unusable:
229
+ // watch for `inert` on `dialog` and remove it
230
+ const inertObserver = new MutationObserver((mutations) => {
231
+ for (const mutation of mutations) {
232
+ if (mutation.type !== 'attributes') continue
233
+ const name = mutation.attributeName
234
+ if (!name) continue
235
+ if (name !== 'inert') continue
236
+ root.removeAttribute(name)
237
+ }
238
+ })
239
+ inertObserver.observe(root, {
240
+ attributeOldValue: true,
241
+ attributes: true,
242
+ })
243
+
244
+ // dialog/page interactivity (no visibility change)
245
+ let dialogActive = false
246
+ const activatePage = () => {
247
+ if (!dialogActive) return
248
+ dialogActive = false
249
+
250
+ root.removeEventListener('click', onBlur)
251
+ document.removeEventListener('keydown', onEscape)
252
+ root.style.pointerEvents = 'none'
253
+ opener?.focus()
254
+ opener = null
255
+
256
+ Object.assign(document.body.style, bodyStyle ?? '')
257
+ // firefox: explicitly restore/clear `overflow` directly
258
+ document.body.style.overflow = bodyStyle?.overflow ?? ''
259
+ }
260
+ const activateDialog = () => {
261
+ if (dialogActive) return
262
+ dialogActive = true
263
+
264
+ root.addEventListener('click', onBlur)
265
+ document.addEventListener('keydown', onEscape)
266
+ iframe.focus()
267
+ root.style.pointerEvents = 'auto'
268
+
269
+ bodyStyle = Object.assign({}, document.body.style)
270
+ document.body.style.overflow = 'hidden'
271
+ }
272
+
273
+ // dialog visibility
274
+ let visible = false
275
+ const showDialog = () => {
276
+ if (visible) return
277
+ visible = true
278
+
279
+ if (document.activeElement instanceof HTMLElement)
280
+ opener = document.activeElement
281
+
282
+ root.removeAttribute('hidden')
283
+ root.removeAttribute('aria-closed')
284
+ root.showModal()
285
+ }
286
+ const hideDialog = () => {
287
+ if (!visible) return
288
+ visible = false
289
+ root.setAttribute('hidden', 'true')
290
+ root.setAttribute('aria-closed', 'true')
291
+ root.close()
292
+
293
+ // 1password extension sometimes adds `inert` attribute to `dialog`
294
+ // siblings and does not clean up remove when `dialog` closes
295
+ // (after `<com-1password-notification />` closes)
296
+ for (const sibling of root.parentNode
297
+ ? Array.from(root.parentNode.children)
298
+ : []) {
299
+ if (sibling === root) continue
300
+ if (!sibling.hasAttribute('inert')) continue
301
+ sibling.removeAttribute('inert')
302
+ }
303
+ }
304
+
305
+ return {
306
+ close() {
307
+ fallback.close()
308
+ open = false
309
+
310
+ messenger.send('__internal', {
311
+ mode: 'iframe',
312
+ referrer: getReferrer(),
313
+ type: 'init',
314
+ })
315
+
316
+ hideDialog()
317
+ activatePage()
318
+ },
319
+ destroy() {
320
+ fallback.close()
321
+ open = false
322
+
323
+ activatePage()
324
+ hideDialog()
325
+
326
+ fallback.destroy()
327
+ messenger.destroy()
328
+ root.remove()
329
+ inertObserver.disconnect()
330
+
331
+ drawerModeQuery.removeEventListener('change', onDrawerModeChange)
332
+ },
333
+ open() {
334
+ if (open) return
335
+ open = true
336
+
337
+ showDialog()
338
+ activateDialog()
339
+
340
+ messenger.send('__internal', {
341
+ mode: 'iframe',
342
+ referrer: getReferrer(),
343
+ type: 'init',
344
+ })
345
+ },
346
+ async secure() {
347
+ const { trustedHosts } = await messenger.waitForReady()
348
+
349
+ const secureProtocol = (() => {
350
+ if (skipProtocolCheck) return true
351
+ const secure = window.location.protocol.startsWith('https')
352
+ if (!secure)
353
+ logger.warnOnce(
354
+ 'Detected insecure protocol (HTTP).',
355
+ `\n\nThe Porto iframe is not supported on HTTP origins (${window.location.origin})`,
356
+ 'due to lack of WebAuthn support.',
357
+ 'See https://porto.sh/sdk#secure-origins-https for more information.',
358
+ )
359
+ return secure
360
+ })()
361
+ const intersectionObserverSupported = IO.supported()
362
+ const trustedHost = Boolean(
363
+ trustedHosts?.includes(window.location.hostname),
364
+ )
365
+
366
+ const secureFrame = Boolean(
367
+ intersectionObserverSupported || trustedHost,
368
+ )
369
+
370
+ if (!secureFrame)
371
+ logger.warnOnce(
372
+ [
373
+ `Warning: Browser does not support IntersectionObserver v2 or host "${hostUrl.hostname}" is not trusted by Porto.`,
374
+ 'This may result in the dialog falling back to a popup.',
375
+ '',
376
+ `Add "${hostUrl.hostname}" to the trusted hosts list to enable iframe dialog: https://github.com/ithacaxyz/porto/edit/main/src/trusted-hosts.ts`,
377
+ ].join('\n'),
378
+ )
379
+
380
+ return {
381
+ frame: secureFrame,
382
+ host: trustedHost,
383
+ protocol: secureProtocol,
384
+ }
385
+ },
386
+ async syncRequests(requests) {
387
+ const { methodPolicies } = await messenger.waitForReady()
388
+ const secure = await this.secure()
389
+
390
+ const headless = requests?.every(
391
+ (request) =>
392
+ methodPolicies?.find(
393
+ (policy) => policy.method === request.request.method,
394
+ )?.modes?.headless === true,
395
+ )
396
+
397
+ const unsupported = includesUnsupported(
398
+ requests.map((x) => x.request),
399
+ )
400
+
401
+ if (!headless && (unsupported || !secure.protocol || !secure.frame))
402
+ fallback.syncRequests(requests)
403
+ else {
404
+ const requiresConfirm = requests.some((x) =>
405
+ requiresConfirmation(x.request, {
406
+ methodPolicies,
407
+ targetOrigin: hostUrl.origin,
408
+ }),
409
+ )
410
+ if (!open && requiresConfirm) this.open()
411
+ messenger.send('rpc-requests', requests)
412
+ }
413
+ },
414
+ }
415
+ },
416
+ supportsHeadless: true,
417
+ })
418
+ }
419
+
420
+ export declare namespace iframe {
421
+ export type Options = {
422
+ size?: { width: number; height?: number | undefined } | undefined
423
+ /**
424
+ * Skips check for insecure protocol (HTTP).
425
+ * @default false
426
+ */
427
+ skipProtocolCheck?: boolean | undefined
428
+ /**
429
+ * Skips check for unsupported iframe requests that result
430
+ * to a popup.
431
+ * @default false
432
+ */
433
+ skipUnsupported?: boolean | undefined
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Instantiates a popup dialog.
439
+ *
440
+ * @returns Popup dialog.
441
+ */
442
+ export function popup(options: popup.Options = {}) {
443
+ if (typeof window === 'undefined') return noop()
444
+ const { type = 'auto', size = defaultSize } = options
445
+ return from({
446
+ name: 'popup',
447
+ setup(parameters) {
448
+ const { host, internal, themeController } = parameters
449
+ const { store } = internal
450
+
451
+ const hostUrl = new URL(host)
452
+
453
+ let popup: Window | null = null
454
+
455
+ const resolvedType =
456
+ type === 'page' || (type === 'auto' && UserAgent.isMobile())
457
+ ? 'page'
458
+ : 'popup'
459
+
460
+ function onBlur() {
461
+ if (popup) handleBlur(store)
462
+ }
463
+
464
+ const offDetectClosed = (() => {
465
+ const timer = setInterval(() => {
466
+ if (popup?.closed) handleBlur(store)
467
+ }, 100)
468
+ return () => clearInterval(timer)
469
+ })()
470
+
471
+ let messenger: Messenger.Bridge | undefined
472
+
473
+ themeController?._setup(null, true)
474
+
475
+ return {
476
+ close() {
477
+ if (!popup) return
478
+ popup.close()
479
+ popup = null
480
+ },
481
+ destroy() {
482
+ this.close()
483
+ window.removeEventListener('focus', onBlur)
484
+ messenger?.destroy()
485
+ offDetectClosed()
486
+ },
487
+ open() {
488
+ if (resolvedType === 'popup') {
489
+ const left = (window.innerWidth - size.width) / 2 + window.screenX
490
+ const top = window.screenY + 100
491
+
492
+ popup = window.open(
493
+ getDialogUrl(host),
494
+ '_blank',
495
+ `width=${size.width},height=${size.height},left=${left},top=${top}`,
496
+ )
497
+ } else {
498
+ popup = window.open(getDialogUrl(host), '_blank')
499
+ }
500
+
501
+ if (!popup) throw new Error('Failed to open popup')
502
+
503
+ messenger = Messenger.bridge({
504
+ from: Messenger.fromWindow(window, {
505
+ targetOrigin: hostUrl.origin,
506
+ }),
507
+ to: Messenger.fromWindow(popup, {
508
+ targetOrigin: hostUrl.origin,
509
+ }),
510
+ waitForReady: true,
511
+ })
512
+
513
+ themeController?._setup(messenger, false)
514
+
515
+ messenger.send('__internal', {
516
+ mode: resolvedType === 'page' ? 'page' : 'popup',
517
+ referrer: getReferrer(),
518
+ theme: themeController?.getTheme() ?? parameters.theme,
519
+ type: 'init',
520
+ })
521
+
522
+ messenger.on('rpc-response', (response) =>
523
+ handleResponse(store, response),
524
+ )
525
+
526
+ window.removeEventListener('focus', onBlur)
527
+ window.addEventListener('focus', onBlur)
528
+ },
529
+ async secure() {
530
+ return {
531
+ frame: true,
532
+ host: true,
533
+ protocol: true,
534
+ }
535
+ },
536
+ async syncRequests(requests) {
537
+ const requiresConfirm = requests.some((x) =>
538
+ requiresConfirmation(x.request),
539
+ )
540
+ if (requiresConfirm) {
541
+ if (!popup || popup.closed) this.open()
542
+ popup?.focus()
543
+ }
544
+ messenger?.send('rpc-requests', requests)
545
+ },
546
+ }
547
+ },
548
+ supportsHeadless: false,
549
+ })
550
+ }
551
+
552
+ export declare namespace popup {
553
+ export type Options = {
554
+ /**
555
+ * The type of popup window to create.
556
+ * - 'auto': Automatically decide based on context (default)
557
+ * - 'popup': Popup window with controlled height
558
+ * - 'page': Full page/tab
559
+ * @default 'auto'
560
+ */
561
+ type?: 'auto' | 'popup' | 'page' | undefined
562
+ /**
563
+ * Initial size of the popup window when type is 'popup' or 'auto' resolves to popup.
564
+ * @default { width: 360, height: 282 }
565
+ */
566
+ size?: { width: number; height: number } | undefined
567
+ }
568
+ }
569
+
570
+ /**
571
+ * Instantiates a authSession dialog for React Native.
572
+ * @param options - Options.
573
+ */
574
+ export function authSession(options: authSession.Options = {}) {
575
+ if (!isReactNative()) return noop()
576
+
577
+ const { requestOptions = { showTitle: true } } = options
578
+
579
+ return from({
580
+ name: 'authSession',
581
+ setup(parameters) {
582
+ const { host, internal } = parameters
583
+ const { store } = internal
584
+
585
+ const environment = ReactNativeEnvironment.reactNative.environment
586
+ environment.maybeCompleteAuthSession?.()
587
+
588
+ let processing = false
589
+ let inFlightId: number | null = null
590
+
591
+ async function handle(request: QueuedRequest) {
592
+ const { request: rpcRequest } = request
593
+ const reactNativePaths = {
594
+ account_verifyEmail: 'account_verifyEmail',
595
+ eth_requestAccounts: 'eth_requestAccounts',
596
+ eth_sendTransaction: 'eth_sendTransaction',
597
+ eth_signTypedData_v4: 'eth_signTypedData_v4',
598
+ personal_sign: 'personal_sign',
599
+ wallet_addFunds: 'wallet_addFunds',
600
+ wallet_connect: 'wallet_connect',
601
+ wallet_getAccountVersion: 'wallet_getAccountVersion',
602
+ wallet_getAssets: 'wallet_getAssets',
603
+ wallet_getCallsStatus: 'wallet_getCallsStatus',
604
+ wallet_getCapabilities: 'wallet_getCapabilities',
605
+ wallet_getKeys: 'wallet_getKeys',
606
+ wallet_getPermissions: 'wallet_getPermissions',
607
+ wallet_grantAdmin: 'wallet_grantAdmin',
608
+ wallet_grantPermissions: 'wallet_grantPermissions',
609
+ wallet_prepareCalls: 'wallet_prepareCalls',
610
+ wallet_prepareUpgradeAccount: 'wallet_prepareUpgradeAccount',
611
+ wallet_revokeAdmin: 'wallet_revokeAdmin',
612
+ wallet_revokePermissions: 'wallet_revokePermissions',
613
+ wallet_sendCalls: 'wallet_sendCalls',
614
+ wallet_sendPreparedCalls: 'wallet_sendPreparedCalls',
615
+ wallet_switchEthereumChain: 'wallet_switchEthereumChain',
616
+ wallet_verifySignature: 'wallet_verifySignature',
617
+ } as const satisfies Record<string, string>
618
+
619
+ const rpcMethod =
620
+ reactNativePaths[rpcRequest.method as keyof typeof reactNativePaths]
621
+ if (!rpcMethod)
622
+ throw new Provider.UnsupportedMethodError({
623
+ message: `Method not supported in Mode.reactNative(): ${rpcRequest.method}`,
624
+ })
625
+ const redirectUri = environment.makeRedirectUri({
626
+ ...(options.redirectUri
627
+ ? { scheme: options.redirectUri.scheme }
628
+ : {}),
629
+ path: options.redirectUri?.path ?? '/',
630
+ preferLocalhost: typeof __DEV__ === 'boolean' && __DEV__,
631
+ })
632
+
633
+ const url = new URL(host)
634
+ url.pathname = `${url.pathname.replace(/\/$/, '')}/${rpcMethod}`
635
+
636
+ const searchParams = new URLSearchParams({
637
+ id: String(rpcRequest.id),
638
+ jsonrpc: '2.0',
639
+ method: rpcRequest.method,
640
+ redirectUri,
641
+ })
642
+
643
+ const params = (rpcRequest.params ?? []) as readonly unknown[]
644
+ if (params.length > 0)
645
+ searchParams.set('params', Json.stringify(params))
646
+
647
+ const decodedParams = (rpcRequest as any)._decoded?.params
648
+ if (decodedParams)
649
+ searchParams.set('_decoded', Json.stringify(decodedParams))
650
+
651
+ url.search = searchParams.toString()
652
+
653
+ const result = await environment.openAuthSessionAsync(
654
+ url.toString(),
655
+ redirectUri,
656
+ requestOptions,
657
+ )
658
+
659
+ const response = (() => {
660
+ if (result.type === 'success' && result.url) {
661
+ const resolved = new URL(result.url)
662
+ const status =
663
+ resolved.searchParams.get('status') ?? AuthSessionStatus.unknown
664
+ const message = resolved.searchParams.get('message') ?? undefined
665
+ const payload = resolved.searchParams.get('payload') ?? undefined
666
+ if (status === AuthSessionStatus.success)
667
+ try {
668
+ return {
669
+ id: rpcRequest.id,
670
+ jsonrpc: '2.0',
671
+ result: payload ? Json.parse(payload) : undefined,
672
+ } satisfies RpcResponse.RpcResponse
673
+ } catch (error) {
674
+ return {
675
+ error: {
676
+ code: -32603,
677
+ message:
678
+ error instanceof Error
679
+ ? error.message
680
+ : 'Failed to parse redirect payload',
681
+ },
682
+ id: rpcRequest.id,
683
+ jsonrpc: '2.0',
684
+ } satisfies RpcResponse.RpcResponse
685
+ }
686
+
687
+ const error =
688
+ status === AuthSessionStatus.cancel
689
+ ? new Provider.UserRejectedRequestError({
690
+ message: message ?? 'User rejected request',
691
+ })
692
+ : new Provider.ProviderRpcError(
693
+ -32603,
694
+ message ?? status ?? 'Request failed',
695
+ )
696
+ return {
697
+ error: {
698
+ code: error.code,
699
+ message: error.message,
700
+ },
701
+ id: rpcRequest.id,
702
+ jsonrpc: '2.0',
703
+ } satisfies RpcResponse.RpcResponse
704
+ }
705
+ if (result.type === 'cancel' || result.type === 'dismiss')
706
+ return {
707
+ error: {
708
+ code: Provider.UserRejectedRequestError.code,
709
+ message: 'User rejected request',
710
+ },
711
+ id: rpcRequest.id,
712
+ jsonrpc: '2.0',
713
+ } satisfies RpcResponse.RpcResponse
714
+
715
+ return {
716
+ error: {
717
+ code: -32603,
718
+ message: (result as any).error ?? 'Request failed',
719
+ },
720
+ id: rpcRequest.id,
721
+ jsonrpc: '2.0',
722
+ } satisfies RpcResponse.RpcResponse
723
+ })()
724
+
725
+ handleResponse(store, response)
726
+ environment.dismissAuthSession?.()
727
+ }
728
+
729
+ return {
730
+ close() {
731
+ environment.dismissAuthSession?.()
732
+ },
733
+ destroy() {
734
+ environment.dismissAuthSession?.()
735
+ },
736
+ open() {
737
+ void 0
738
+ },
739
+ async secure() {
740
+ return {
741
+ frame: false,
742
+ host: true,
743
+ protocol: true,
744
+ }
745
+ },
746
+ async syncRequests(requests) {
747
+ if (processing) return
748
+ const [request] = requests
749
+ if (!request) return
750
+ if (inFlightId === request.request.id) return
751
+
752
+ inFlightId = request.request.id
753
+ processing = true
754
+ try {
755
+ await handle(request)
756
+ } catch (error) {
757
+ handleResponse(store, {
758
+ error: {
759
+ code: -32603,
760
+ message:
761
+ error instanceof Error ? error.message : 'Request failed',
762
+ },
763
+ id: request.request.id,
764
+ jsonrpc: '2.0',
765
+ })
766
+ environment.dismissAuthSession?.()
767
+ } finally {
768
+ inFlightId = null
769
+ processing = false
770
+ }
771
+ },
772
+ }
773
+ },
774
+ supportsHeadless: false,
775
+ })
776
+ }
777
+
778
+ export declare namespace authSession {
779
+ export type Options = {
780
+ /**
781
+ * where to redirect the user after operations are completed
782
+ */
783
+ redirectUri?:
784
+ | ReactNativeEnvironment.ReactNativeEnvironment['redirectUri']
785
+ | undefined
786
+ requestOptions?: ReactNativeEnvironment.AuthSessionOpenOptions | undefined
787
+ }
788
+ }
789
+
790
+ /**
791
+ * Instantiates a noop dialog.
792
+ *
793
+ * @returns Noop dialog.
794
+ */
795
+ export function noop() {
796
+ return from({
797
+ name: 'noop',
798
+ setup() {
799
+ return {
800
+ close() {},
801
+ destroy() {},
802
+ open() {},
803
+ async secure() {
804
+ return {
805
+ frame: true,
806
+ host: true,
807
+ protocol: true,
808
+ }
809
+ },
810
+ async syncRequests() {},
811
+ }
812
+ },
813
+ supportsHeadless: true,
814
+ })
815
+ }
816
+
817
+ /**
818
+ * Instantiates an inline iframe dialog rendered on a provided `element`.
819
+ *
820
+ * @param options - Options.
821
+ * @returns Inline iframe dialog.
822
+ */
823
+ export function experimental_inline(options: inline.Options) {
824
+ const { element } = options
825
+ if (typeof window === 'undefined') return noop()
826
+ return from({
827
+ name: 'inline',
828
+ setup(parameters) {
829
+ const { host, internal, theme, themeController } = parameters
830
+ const { store } = internal
831
+
832
+ let open = false
833
+
834
+ const hostUrl = new URL(host)
835
+
836
+ const root = document.createElement('div')
837
+ root.dataset.porto = ''
838
+ root.style.height = '100%'
839
+ element().appendChild(root)
840
+
841
+ const iframe = document.createElement('iframe')
842
+ iframe.setAttribute(
843
+ 'allow',
844
+ `payment; publickey-credentials-get ${hostUrl.origin}; publickey-credentials-create ${hostUrl.origin}`,
845
+ )
846
+ iframe.setAttribute('aria-label', 'Porto Wallet')
847
+ iframe.setAttribute('tabindex', '0')
848
+ iframe.setAttribute(
849
+ 'sandbox',
850
+ 'allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox',
851
+ )
852
+
853
+ iframe.setAttribute('src', getDialogUrl(host))
854
+ iframe.setAttribute('title', 'Porto')
855
+ Object.assign(iframe.style, {
856
+ border: '0',
857
+ height: '100%',
858
+ width: '100%',
859
+ })
860
+
861
+ root.appendChild(iframe)
862
+
863
+ const messenger = Messenger.bridge({
864
+ from: Messenger.fromWindow(window, { targetOrigin: hostUrl.origin }),
865
+ to: Messenger.fromWindow(iframe.contentWindow!, {
866
+ targetOrigin: hostUrl.origin,
867
+ }),
868
+ waitForReady: true,
869
+ })
870
+
871
+ themeController?._setup(messenger, true)
872
+
873
+ messenger.on('ready', () => {
874
+ messenger.send('__internal', {
875
+ mode: 'inline-iframe',
876
+ referrer: getReferrer(),
877
+ theme,
878
+ type: 'init',
879
+ })
880
+ })
881
+
882
+ messenger.on('rpc-response', (response) =>
883
+ handleResponse(store, response),
884
+ )
885
+
886
+ return {
887
+ close() {},
888
+ destroy() {
889
+ messenger.destroy()
890
+ root.remove()
891
+ },
892
+ open() {
893
+ if (open) return
894
+ open = true
895
+
896
+ messenger.send('__internal', {
897
+ mode: 'iframe',
898
+ referrer: getReferrer(),
899
+ type: 'init',
900
+ })
901
+ },
902
+ async secure() {
903
+ return {
904
+ frame: true,
905
+ host: true,
906
+ protocol: true,
907
+ }
908
+ },
909
+ async syncRequests(requests) {
910
+ messenger.send('rpc-requests', requests)
911
+ },
912
+ }
913
+ },
914
+ supportsHeadless: true,
915
+ })
916
+ }
917
+
918
+ export namespace inline {
919
+ export type Options = {
920
+ element: () => HTMLElement
921
+ }
922
+ }
923
+
924
+ export type ThemeController = {
925
+ /**
926
+ * Used internally to setup the controller.
927
+ * @deprecated
928
+ */
929
+ _setup: (messenger: Messenger.Messenger | null, resetTheme?: boolean) => void
930
+ /**
931
+ * Update the dialog theme.
932
+ * @param theme - The theme to set.
933
+ */
934
+ setTheme: (theme: ThemeFragment) => void
935
+ /**
936
+ * Get the latest theme set since the controller was initialized.
937
+ * @returns The latest theme or `null` if no theme was set.
938
+ */
939
+ getTheme: () => ThemeFragment | null
940
+ }
941
+
942
+ /**
943
+ * A controller to update the dialog theme.
944
+ */
945
+ export function createThemeController(): ThemeController {
946
+ let lastTheme: ThemeFragment | null = null
947
+ let messenger: Messenger.Messenger | null = null
948
+ const controller: ThemeController = {
949
+ _setup(messenger_: Messenger.Messenger | null, resetTheme = false) {
950
+ if (resetTheme) lastTheme = null
951
+ messenger = messenger_
952
+ },
953
+ getTheme() {
954
+ return lastTheme
955
+ },
956
+ setTheme(theme) {
957
+ lastTheme = theme
958
+ messenger
959
+ ?.send('__internal', {
960
+ theme,
961
+ type: 'set-theme',
962
+ })
963
+ .catch(() => {})
964
+ },
965
+ }
966
+ return controller
967
+ }
968
+
969
+ export const defaultSize = { height: 282, width: 360 }
970
+
971
+ export function requiresConfirmation(
972
+ request: RpcRequest.RpcRequest,
973
+ options: {
974
+ methodPolicies?: Messenger.ReadyOptions['methodPolicies'] | undefined
975
+ targetOrigin?: string | undefined
976
+ } = {},
977
+ ) {
978
+ const { methodPolicies, targetOrigin } = options
979
+ const policy = methodPolicies?.find((x) => x.method === request.method)
980
+ if (!policy) return true
981
+ if (policy.modes?.headless) {
982
+ if (
983
+ typeof policy.modes.headless === 'object' &&
984
+ policy.modes.headless.sameOrigin &&
985
+ targetOrigin !== window.location.origin
986
+ )
987
+ return true
988
+ return false
989
+ }
990
+ return true
991
+ }
992
+
993
+ export function getReferrer() {
994
+ const icon = (() => {
995
+ const dark = document.querySelector(
996
+ 'link[rel="icon"][media="(prefers-color-scheme: dark)"]',
997
+ )?.href
998
+ const light =
999
+ document.querySelector(
1000
+ 'link[rel="icon"][media="(prefers-color-scheme: light)"]',
1001
+ )?.href ?? document.querySelector('link[rel="icon"]')?.href
1002
+ if (dark && light && dark !== light) return { dark, light }
1003
+ const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches
1004
+ if (isDark) return dark
1005
+ return light
1006
+ })()
1007
+ return {
1008
+ icon,
1009
+ title: document.title,
1010
+ }
1011
+ }
1012
+
1013
+ export function handleBlur(store: Store) {
1014
+ store.setState((x) => ({
1015
+ ...x,
1016
+ requestQueue: x.requestQueue.map((x) => ({
1017
+ account: x.account,
1018
+ error: new Provider.UserRejectedRequestError(),
1019
+ request: x.request,
1020
+ status: 'error',
1021
+ })),
1022
+ }))
1023
+ }
1024
+
1025
+ export function handleResponse(
1026
+ store: Store,
1027
+ response: RpcResponse.RpcResponse,
1028
+ ) {
1029
+ store.setState((x) => ({
1030
+ ...x,
1031
+ requestQueue: x.requestQueue.map((queued) => {
1032
+ if (queued.request.id !== response.id) return queued
1033
+ if (response.error)
1034
+ return {
1035
+ account: queued.account,
1036
+ error: response.error,
1037
+ request: queued.request,
1038
+ status: 'error',
1039
+ } satisfies QueuedRequest
1040
+ return {
1041
+ account: queued.account,
1042
+ request: queued.request,
1043
+ result: response.result,
1044
+ status: 'success',
1045
+ } satisfies QueuedRequest
1046
+ }),
1047
+ }))
1048
+ }
1049
+
1050
+ export function getDialogUrl(host: string) {
1051
+ const url = new URL(host)
1052
+ const parentParams = new URLSearchParams(window.location.search)
1053
+ const prefix = 'porto.'
1054
+ for (const [key, value] of parentParams.entries()) {
1055
+ if (key.startsWith(prefix))
1056
+ url.searchParams.set(key.slice(prefix.length), value)
1057
+ }
1058
+ return url.toString()
1059
+ }