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,1296 @@
1
+ import { AbiFunction, Hex, Value } from 'ox'
2
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
3
+ import { getCode, readContract, waitForCallsStatus } from 'viem/actions'
4
+ import { describe, expect, test } from 'vitest'
5
+ import * as TestActions from '../../../test/src/actions.js'
6
+ import * as Anvil from '../../../test/src/anvil.js'
7
+ import * as TestConfig from '../../../test/src/config.js'
8
+ import * as Key from '../Key.js'
9
+ import { sendCalls } from '../RelayActions.js'
10
+ import {
11
+ addFaucetFunds,
12
+ getAssets,
13
+ getAuthorization,
14
+ getCallsStatus,
15
+ getCapabilities,
16
+ getKeys,
17
+ health,
18
+ prepareCalls,
19
+ prepareUpgradeAccount,
20
+ sendPreparedCalls,
21
+ upgradeAccount,
22
+ verifySignature,
23
+ } from './relayActions.js'
24
+
25
+ const porto = TestConfig.getPorto()
26
+ const client = TestConfig.getRelayClient(porto)
27
+ const contracts = await TestConfig.getContracts(porto)
28
+
29
+ describe('addFaucetFunds', () => {
30
+ test('default', async () => {
31
+ const alice = Hex.random(20)
32
+
33
+ const result = await addFaucetFunds(client, {
34
+ address: alice,
35
+ tokenAddress: contracts.exp1.address,
36
+ value: Value.fromEther('10'),
37
+ })
38
+
39
+ expect(result).toBeDefined()
40
+ expect(result.transactionHash).toBeDefined()
41
+
42
+ // Wait for funds to be added
43
+ await new Promise((resolve) => setTimeout(resolve, 2_000))
44
+
45
+ const balance = await readContract(client, {
46
+ abi: contracts.exp1.abi,
47
+ address: contracts.exp1.address,
48
+ args: [alice],
49
+ functionName: 'balanceOf',
50
+ })
51
+ expect(balance).toBe(Value.fromEther('10'))
52
+ })
53
+
54
+ test('behavior: unsupported chain', async () => {
55
+ await expect(() =>
56
+ addFaucetFunds(client, {
57
+ address: Hex.random(20),
58
+ chain: { id: 999999 },
59
+ tokenAddress: contracts.exp1.address,
60
+ value: Value.fromEther('1'),
61
+ }),
62
+ ).rejects.toThrow()
63
+ })
64
+ })
65
+
66
+ describe('health', () => {
67
+ test('default', async () => {
68
+ const version = await health(client)
69
+ expect(version).toBeDefined()
70
+ })
71
+ })
72
+
73
+ describe('getAuthorization', () => {
74
+ test('default', async () => {
75
+ const key = Key.createHeadlessWebAuthnP256()
76
+ const account = await TestActions.createAccount(client, {
77
+ keys: [key],
78
+ })
79
+
80
+ const result = await getAuthorization(client, {
81
+ address: account.address,
82
+ })
83
+
84
+ expect(result).toBeDefined()
85
+ expect(result.authorization).toBeDefined()
86
+ expect(result.data).toBeDefined()
87
+ expect(result.to).toBeDefined()
88
+ })
89
+
90
+ test('behavior: undelegated', async () => {
91
+ await expect(
92
+ getAuthorization(client, {
93
+ address: Hex.random(20),
94
+ }),
95
+ ).rejects.toThrow('does not exist in storage')
96
+ })
97
+ })
98
+
99
+ describe('getAssets', () => {
100
+ test('default', async () => {
101
+ const key = Key.createHeadlessWebAuthnP256()
102
+ const account = await TestActions.createAccount(client, {
103
+ keys: [key],
104
+ })
105
+
106
+ const result = await getAssets(client, {
107
+ account: account.address,
108
+ })
109
+
110
+ expect(result).toBeDefined()
111
+ expect(Object.keys(result).length).toBeGreaterThanOrEqual(1)
112
+
113
+ expect(result[client.chain.id]).toBeDefined()
114
+ expect(Array.isArray(result[client.chain.id])).toBe(true)
115
+ })
116
+
117
+ test('behavior: with native balance', async () => {
118
+ const key = Key.createHeadlessWebAuthnP256()
119
+ const account = await TestActions.createAccount(client, {
120
+ keys: [key],
121
+ })
122
+
123
+ await TestActions.setBalance(client, {
124
+ address: account.address,
125
+ value: Value.fromEther('10'),
126
+ })
127
+
128
+ const result = await getAssets(client, {
129
+ account: account.address,
130
+ })
131
+
132
+ const chainAssets = result[client.chain.id]!
133
+
134
+ const nativeAsset = chainAssets.find((asset) => BigInt(asset.balance) > 0n)
135
+ expect(nativeAsset).toBeDefined()
136
+ expect(nativeAsset!.type).toBeOneOf(['native', 'erc20'])
137
+ expect(BigInt(nativeAsset!.balance)).toBeGreaterThan(0n)
138
+ })
139
+
140
+ test('behavior: with ERC20 tokens', async () => {
141
+ const key = Key.createHeadlessWebAuthnP256()
142
+ const account = await TestActions.createAccount(client, {
143
+ keys: [key],
144
+ })
145
+
146
+ await sendCalls(client, {
147
+ account,
148
+ calls: [
149
+ {
150
+ abi: contracts.exp1.abi,
151
+ args: [account.address, Value.fromEther('1000')],
152
+ functionName: 'mint',
153
+ to: contracts.exp1.address,
154
+ },
155
+ ],
156
+ })
157
+
158
+ const result = await getAssets(client, {
159
+ account: account.address,
160
+ })
161
+
162
+ const chainAssets = result[client.chain.id]!
163
+
164
+ // Find ERC20 asset
165
+ const erc20Asset = chainAssets.find(
166
+ (asset) =>
167
+ asset.address?.toLowerCase() === contracts.exp1.address.toLowerCase(),
168
+ )
169
+ expect(erc20Asset).toBeDefined()
170
+ expect(erc20Asset!.type).toBe('erc20')
171
+ expect(BigInt(erc20Asset!.balance)).toBeGreaterThan(0n)
172
+ expect(erc20Asset!.metadata).toBeDefined()
173
+ expect(erc20Asset!.metadata!.symbol).toBe('EXP')
174
+ })
175
+
176
+ test('behavior: with assetFilter', async () => {
177
+ const key = Key.createHeadlessWebAuthnP256()
178
+ const account = await TestActions.createAccount(client, {
179
+ keys: [key],
180
+ })
181
+
182
+ const chainId = Hex.fromNumber(client.chain.id)
183
+
184
+ await sendCalls(client, {
185
+ account,
186
+ calls: [
187
+ {
188
+ abi: contracts.exp1.abi,
189
+ args: [account.address, Value.fromEther('1000')],
190
+ functionName: 'mint',
191
+ to: contracts.exp1.address,
192
+ },
193
+ ],
194
+ })
195
+
196
+ const result = await getAssets(client, {
197
+ account: account.address,
198
+ assetFilter: {
199
+ [chainId]: [
200
+ {
201
+ address: contracts.exp1.address,
202
+ type: 'erc20',
203
+ },
204
+ ],
205
+ },
206
+ })
207
+
208
+ expect(result[client.chain.id]).toBeDefined()
209
+ expect(Array.isArray(result[client.chain.id])).toBe(true)
210
+
211
+ // Should only return erc20 asset
212
+ const chainAssets = result[client.chain.id]!
213
+ expect(chainAssets.every((asset) => asset.type === 'erc20')).toBe(true)
214
+ })
215
+
216
+ test('behavior: with assetTypeFilter', async () => {
217
+ const key = Key.createHeadlessWebAuthnP256()
218
+ const account = await TestActions.createAccount(client, {
219
+ keys: [key],
220
+ })
221
+
222
+ // Set native balance and mint tokens
223
+ await TestActions.setBalance(client, {
224
+ address: account.address,
225
+ value: Value.fromEther('10'),
226
+ })
227
+
228
+ await sendCalls(client, {
229
+ account,
230
+ calls: [
231
+ {
232
+ abi: contracts.exp1.abi,
233
+ args: [account.address, Value.fromEther('1000')],
234
+ functionName: 'mint',
235
+ to: contracts.exp1.address,
236
+ },
237
+ ],
238
+ })
239
+
240
+ const result = await getAssets(client, {
241
+ account: account.address,
242
+ assetTypeFilter: ['erc20'],
243
+ })
244
+
245
+ const chainAssets = result[client.chain.id]!
246
+
247
+ expect(chainAssets.every((asset) => asset.type === 'erc20')).toBe(true)
248
+ expect(chainAssets.find((asset) => asset.type === 'native')).toBeUndefined()
249
+ })
250
+
251
+ test('behavior: with chainFilter', async () => {
252
+ const key = Key.createHeadlessWebAuthnP256()
253
+ const account = await TestActions.createAccount(client, {
254
+ keys: [key],
255
+ })
256
+
257
+ const result = await getAssets(client, {
258
+ account: account.address,
259
+ chainFilter: [client.chain.id],
260
+ })
261
+
262
+ expect(Object.keys(result)).toEqual(['0', client.chain.id.toString()])
263
+ expect(result[client.chain.id]).toBeDefined()
264
+ })
265
+
266
+ test('behavior: multiple chains; one unsupported', async () => {
267
+ const key = Key.createHeadlessWebAuthnP256()
268
+ const account = await TestActions.createAccount(client, {
269
+ keys: [key],
270
+ })
271
+
272
+ await expect(
273
+ getAssets(client, {
274
+ account: account.address,
275
+ chainFilter: [client.chain.id, 999999],
276
+ }),
277
+ ).rejects.toThrow('unsupported chain 999999')
278
+ })
279
+ })
280
+
281
+ describe('getCapabilities', () => {
282
+ test('default', async () => {
283
+ const result = await getCapabilities(client)
284
+ expect(result.contracts.accountImplementation).toBeDefined()
285
+ expect(result.contracts.accountProxy).toBeDefined()
286
+ expect(result.contracts.orchestrator).toBeDefined()
287
+ expect(result.contracts.simulator).toBeDefined()
288
+ expect(result.fees.quoteConfig).toBeDefined()
289
+ expect(result.fees.recipient).toBeDefined()
290
+ expect(result.fees.tokens).toBeDefined()
291
+ })
292
+
293
+ test('behavior: chainId', async () => {
294
+ const result = await getCapabilities(client, {
295
+ chainId: client.chain.id,
296
+ })
297
+
298
+ expect(result.contracts.accountImplementation).toBeDefined()
299
+ expect(result.contracts.accountProxy).toBeDefined()
300
+ expect(result.contracts.orchestrator).toBeDefined()
301
+ expect(result.contracts.simulator).toBeDefined()
302
+ expect(result.fees.quoteConfig).toBeDefined()
303
+ expect(result.fees.recipient).toBeDefined()
304
+ expect(result.fees.tokens).toBeDefined()
305
+ })
306
+
307
+ test('behavior: chainIds', async () => {
308
+ const result = await getCapabilities(client, {
309
+ chainIds: [client.chain.id],
310
+ })
311
+
312
+ const keys = Object.keys(result)
313
+ expect(keys.length).toBeGreaterThan(0)
314
+
315
+ for (const key of keys) {
316
+ const capabilities = (result as any)[key]
317
+ expect(capabilities.contracts.accountImplementation).toBeDefined()
318
+ expect(capabilities.contracts.accountProxy).toBeDefined()
319
+ expect(capabilities.contracts.orchestrator).toBeDefined()
320
+ expect(capabilities.contracts.simulator).toBeDefined()
321
+ expect(capabilities.fees.quoteConfig).toBeDefined()
322
+ expect(capabilities.fees.recipient).toBeDefined()
323
+ expect(capabilities.fees.tokens).toBeDefined()
324
+ }
325
+ })
326
+
327
+ test('behavior: chainIds (all)', async () => {
328
+ const result = await getCapabilities(client, {
329
+ chainIds: 'all',
330
+ })
331
+
332
+ const keys = Object.keys(result)
333
+ expect(keys.length).toBeGreaterThan(0)
334
+
335
+ for (const key of keys) {
336
+ const capabilities = (result as any)[key]
337
+ expect(capabilities.contracts.accountImplementation).toBeDefined()
338
+ expect(capabilities.contracts.accountProxy).toBeDefined()
339
+ expect(capabilities.contracts.orchestrator).toBeDefined()
340
+ expect(capabilities.contracts.simulator).toBeDefined()
341
+ expect(capabilities.fees.quoteConfig).toBeDefined()
342
+ expect(capabilities.fees.recipient).toBeDefined()
343
+ expect(capabilities.fees.tokens).toBeDefined()
344
+ }
345
+ })
346
+ })
347
+
348
+ describe('getCallsStatus', () => {
349
+ test('default', async () => {
350
+ const key = Key.createHeadlessWebAuthnP256()
351
+ const account = await TestActions.createAccount(client, {
352
+ keys: [key],
353
+ })
354
+
355
+ const request = await prepareCalls(client, {
356
+ address: account.address,
357
+ calls: [
358
+ {
359
+ to: '0x0000000000000000000000000000000000000000',
360
+ value: 0n,
361
+ },
362
+ ],
363
+ key: {
364
+ prehash: false,
365
+ publicKey: key.publicKey,
366
+ type: 'webauthnp256',
367
+ },
368
+ })
369
+
370
+ const signature = await Key.sign(key, {
371
+ address: null,
372
+ payload: request.digest,
373
+ wrap: false,
374
+ })
375
+
376
+ const { id } = await sendPreparedCalls(client, {
377
+ context: request.context,
378
+ key: request.key!,
379
+ signature,
380
+ })
381
+
382
+ const result = await getCallsStatus(client, {
383
+ id,
384
+ })
385
+
386
+ expect(result.id).toBeDefined()
387
+ })
388
+ })
389
+
390
+ describe('getKeys', () => {
391
+ test('default', async () => {
392
+ const key = Key.createHeadlessWebAuthnP256()
393
+ const account = await TestActions.createAccount(client, {
394
+ keys: [key],
395
+ })
396
+
397
+ await sendCalls(client, {
398
+ account,
399
+ calls: [],
400
+ })
401
+
402
+ const result = await getKeys(client, {
403
+ address: account.address,
404
+ }).then((result) => result[Hex.fromNumber(client.chain.id)]!)
405
+
406
+ expect(result[0]?.hash).toBe(key.hash)
407
+ expect(result[0]?.publicKey).toBe(key.publicKey)
408
+ expect(result[0]?.role).toBe(key.role)
409
+ expect(result[0]?.type).toBe('webauthnp256')
410
+ })
411
+
412
+ test('behavior: multiple keys', async () => {
413
+ const key = Key.createHeadlessWebAuthnP256()
414
+ const key_2 = Key.createSecp256k1()
415
+ const account = await TestActions.createAccount(client, {
416
+ keys: [key, key_2],
417
+ })
418
+
419
+ const result = await getKeys(client, {
420
+ address: account.address,
421
+ }).then((result) => result[Hex.fromNumber(client.chain.id)]!)
422
+
423
+ expect(result[0]?.hash).toBe(key.hash)
424
+ expect(result[0]?.publicKey).toBe(key.publicKey)
425
+ expect(result[0]?.role).toBe(key.role)
426
+ expect(result[0]?.type).toBe('webauthnp256')
427
+ expect(result[1]?.hash).toBe(key_2.hash)
428
+ expect(result[1]?.publicKey).toBe(Hex.padLeft(key_2.publicKey, 32))
429
+ expect(result[1]?.role).toBe(key_2.role)
430
+ expect(result[1]?.type).toBe(key_2.type)
431
+ })
432
+
433
+ test('behavior: deployed account', async () => {
434
+ const key = Key.createHeadlessWebAuthnP256()
435
+ const account = await TestActions.createAccount(client, {
436
+ keys: [key],
437
+ })
438
+
439
+ await sendCalls(client, {
440
+ account,
441
+ calls: [],
442
+ })
443
+
444
+ const result = await getKeys(client, {
445
+ address: account.address,
446
+ }).then((result) => result[Hex.fromNumber(client.chain.id)]!)
447
+
448
+ expect(result[0]?.hash).toBe(key.hash)
449
+ expect(result[0]?.publicKey).toBe(key.publicKey)
450
+ expect(result[0]?.role).toBe(key.role)
451
+ expect(result[0]?.type).toBe('webauthnp256')
452
+ })
453
+
454
+ test('behavior: deployed account; multiple keys', async () => {
455
+ const key = Key.createHeadlessWebAuthnP256()
456
+ const key_2 = Key.createSecp256k1()
457
+ const key_3 = Key.createP256({
458
+ permissions: {
459
+ calls: [
460
+ {
461
+ to: contracts.exp1.address,
462
+ },
463
+ ],
464
+ spend: [
465
+ {
466
+ limit: Value.fromEther('100'),
467
+ period: 'minute',
468
+ token: contracts.exp1.address,
469
+ },
470
+ ],
471
+ },
472
+ role: 'session',
473
+ })
474
+ const account = await TestActions.createAccount(client, {
475
+ keys: [key, key_2],
476
+ })
477
+
478
+ const { id } = await sendCalls(client, {
479
+ account,
480
+ authorizeKeys: [key_3],
481
+ calls: [],
482
+ })
483
+ await waitForCallsStatus(client, {
484
+ id,
485
+ })
486
+
487
+ const result = await getKeys(client, {
488
+ address: account.address,
489
+ }).then((result) => result[Hex.fromNumber(client.chain.id)]!)
490
+
491
+ expect(result[0]?.hash).toBe(key.hash)
492
+ expect(result[0]?.publicKey).toBe(key.publicKey)
493
+ expect(result[0]?.role).toBe(key.role)
494
+ expect(result[0]?.type).toBe('webauthnp256')
495
+ expect(result[1]?.hash).toBe(key_2.hash)
496
+ expect(result[1]?.publicKey).toBe(Hex.padLeft(key_2.publicKey, 32))
497
+ expect(result[1]?.role).toBe(key_2.role)
498
+ expect(result[1]?.type).toBe(key_2.type)
499
+ expect(result[2]?.hash).toBe(key_3.hash)
500
+ expect(result[2]?.publicKey).toBe(key_3.publicKey)
501
+ expect(result[2]?.role).toBe('normal')
502
+ expect(result[2]?.type).toBe(key_3.type)
503
+ })
504
+ })
505
+
506
+ describe('prepareCalls + sendPreparedCalls', () => {
507
+ test('default', async () => {
508
+ const key = Key.createHeadlessWebAuthnP256()
509
+ const account = await TestActions.createAccount(client, {
510
+ keys: [key],
511
+ })
512
+
513
+ const request = await prepareCalls(client, {
514
+ address: account.address,
515
+ calls: [
516
+ {
517
+ to: '0x0000000000000000000000000000000000000000',
518
+ value: 0n,
519
+ },
520
+ ],
521
+ key: {
522
+ prehash: false,
523
+ publicKey: key.publicKey,
524
+ type: 'webauthnp256',
525
+ },
526
+ })
527
+
528
+ const signature = await Key.sign(key, {
529
+ address: null,
530
+ payload: request.digest,
531
+ wrap: false,
532
+ })
533
+
534
+ await sendPreparedCalls(client, {
535
+ context: request.context,
536
+ key: request.key!,
537
+ signature,
538
+ })
539
+ })
540
+
541
+ test('behavior: fee payer', async () => {
542
+ const userKey = Key.createHeadlessWebAuthnP256()
543
+ const userAccount = await TestActions.createAccount(client, {
544
+ keys: [userKey],
545
+ })
546
+
547
+ const merchantKey = Key.createSecp256k1()
548
+ const merchantAccount = await TestActions.createAccount(client, {
549
+ deploy: true,
550
+ keys: [merchantKey],
551
+ })
552
+
553
+ const userBalance_pre = await readContract(client, {
554
+ abi: contracts.exp1.abi,
555
+ address: contracts.exp1.address,
556
+ args: [userAccount.address],
557
+ functionName: 'balanceOf',
558
+ })
559
+ const merchantBalance_pre = await readContract(client, {
560
+ abi: contracts.exp1.abi,
561
+ address: contracts.exp1.address,
562
+ args: [merchantAccount.address],
563
+ functionName: 'balanceOf',
564
+ })
565
+
566
+ const request = await prepareCalls(client, {
567
+ address: userAccount.address,
568
+ calls: [
569
+ {
570
+ abi: contracts.exp1.abi,
571
+ args: [userAccount.address, Value.fromEther('1')],
572
+ functionName: 'mint',
573
+ to: contracts.exp1.address,
574
+ },
575
+ ],
576
+ capabilities: {
577
+ meta: {
578
+ feePayer: merchantAccount.address,
579
+ },
580
+ },
581
+ key: {
582
+ prehash: false,
583
+ publicKey: userKey.publicKey,
584
+ type: 'webauthnp256',
585
+ },
586
+ })
587
+
588
+ const signature = await Key.sign(userKey, {
589
+ address: null,
590
+ payload: request.digest,
591
+ wrap: false,
592
+ })
593
+ const merchantSignature = await Key.sign(merchantKey, {
594
+ address: null,
595
+ payload: request.capabilities.feePayerDigest!,
596
+ })
597
+
598
+ const result = await sendPreparedCalls(client, {
599
+ capabilities: {
600
+ feeSignature: merchantSignature,
601
+ },
602
+ context: request.context,
603
+ key: request.key!,
604
+ signature,
605
+ })
606
+
607
+ await waitForCallsStatus(client, {
608
+ id: result.id,
609
+ })
610
+
611
+ const userBalance_post = await readContract(client, {
612
+ abi: contracts.exp1.abi,
613
+ address: contracts.exp1.address,
614
+ args: [userAccount.address],
615
+ functionName: 'balanceOf',
616
+ })
617
+ const merchantBalance_post = await readContract(client, {
618
+ abi: contracts.exp1.abi,
619
+ address: contracts.exp1.address,
620
+ args: [merchantAccount.address],
621
+ functionName: 'balanceOf',
622
+ })
623
+
624
+ // Check if user was credited with 1 EXP.
625
+ expect(userBalance_post).toBe(userBalance_pre + Value.fromEther('1'))
626
+
627
+ // Check if merchant was debited the fee payment.
628
+ expect(merchantBalance_post).toBeLessThan(merchantBalance_pre)
629
+ })
630
+
631
+ // TODO: enable interop on anvil
632
+ test.runIf(!Anvil.enabled)(
633
+ 'behavior: required funds (prefunded on all chains)',
634
+ async () => {
635
+ const key = Key.createHeadlessWebAuthnP256()
636
+ const account = await TestActions.createAccount(client, {
637
+ keys: [key],
638
+ })
639
+
640
+ const chain_dest = TestConfig.chains[1]
641
+
642
+ // fund account on destination chain
643
+ const client_dest = TestConfig.getRelayClient(porto, {
644
+ chainId: chain_dest!.id,
645
+ })
646
+ await TestActions.setBalance(client_dest, {
647
+ address: account.address,
648
+ value: Value.fromEther('2'),
649
+ })
650
+
651
+ const balance_pre_source = await readContract(client, {
652
+ abi: contracts.exp1.abi,
653
+ address: contracts.exp1.address,
654
+ args: [account.address],
655
+ functionName: 'balanceOf',
656
+ })
657
+
658
+ const request = await prepareCalls(client, {
659
+ address: account.address,
660
+ calls: [
661
+ {
662
+ abi: contracts.exp1.abi,
663
+ args: [account.address, Value.fromEther('5')],
664
+ functionName: 'transfer',
665
+ to: contracts.exp1.address,
666
+ },
667
+ ],
668
+ capabilities: {
669
+ meta: {},
670
+ requiredFunds: [
671
+ {
672
+ address: contracts.exp1.address,
673
+ value: Value.fromEther('6'),
674
+ },
675
+ ],
676
+ },
677
+ chain: chain_dest,
678
+ key: {
679
+ prehash: false,
680
+ publicKey: key.publicKey,
681
+ type: 'webauthnp256',
682
+ },
683
+ })
684
+
685
+ const signature = await Key.sign(key, {
686
+ address: null,
687
+ payload: request.digest,
688
+ wrap: false,
689
+ })
690
+
691
+ const { id } = await sendPreparedCalls(client, {
692
+ context: request.context,
693
+ key: request.key!,
694
+ signature,
695
+ })
696
+
697
+ const { status } = await waitForCallsStatus(client, {
698
+ id,
699
+ })
700
+ expect(status).toBe('success')
701
+
702
+ const balance_post_source = await readContract(client, {
703
+ abi: contracts.exp1.abi,
704
+ address: contracts.exp1.address,
705
+ args: [account.address],
706
+ functionName: 'balanceOf',
707
+ })
708
+ expect(balance_post_source).toBeLessThan(balance_pre_source)
709
+
710
+ const contracts_dest = await TestConfig.getContracts(porto, {
711
+ chainId: chain_dest!.id,
712
+ })
713
+ const balance_post_destination = await readContract(client_dest, {
714
+ abi: contracts_dest.exp1.abi,
715
+ address: contracts_dest.exp1.address,
716
+ args: [account.address],
717
+ functionName: 'balanceOf',
718
+ })
719
+ expect(balance_post_destination).toBeGreaterThan(Value.fromEther('5.9'))
720
+ expect(balance_post_destination).toBeLessThan(Value.fromEther('6.1'))
721
+ },
722
+ )
723
+
724
+ // TODO: enable interop on anvil
725
+ test.runIf(!Anvil.enabled)(
726
+ 'behavior: required funds (not prefunded on destination chain)',
727
+ async () => {
728
+ const key = Key.createHeadlessWebAuthnP256()
729
+ const account = await TestActions.createAccount(client, {
730
+ keys: [key],
731
+ })
732
+
733
+ const balance_pre = await readContract(client, {
734
+ abi: contracts.exp1.abi,
735
+ address: contracts.exp1.address,
736
+ args: [account.address],
737
+ functionName: 'balanceOf',
738
+ })
739
+
740
+ const alice = Hex.random(20)
741
+ const chain_dest = TestConfig.chains[1]
742
+
743
+ const request = await prepareCalls(client, {
744
+ address: account.address,
745
+ calls: [
746
+ {
747
+ abi: contracts.exp1.abi,
748
+ args: [alice, Value.fromEther('50')],
749
+ functionName: 'transfer',
750
+ to: contracts.exp1.address,
751
+ },
752
+ ],
753
+ capabilities: {
754
+ meta: {
755
+ // TODO: allow `requiredFunds` to be set without `feeToken`
756
+ feeToken: contracts.exp1.address,
757
+ },
758
+ requiredFunds: [
759
+ {
760
+ address: contracts.exp1.address,
761
+ value: Value.fromEther('50'),
762
+ },
763
+ ],
764
+ },
765
+ chain: chain_dest,
766
+ key: {
767
+ prehash: false,
768
+ publicKey: key.publicKey,
769
+ type: 'webauthnp256',
770
+ },
771
+ })
772
+
773
+ const signature = await Key.sign(key, {
774
+ address: null,
775
+ payload: request.digest,
776
+ wrap: false,
777
+ })
778
+
779
+ const { id } = await sendPreparedCalls(client, {
780
+ context: request.context,
781
+ key: request.key!,
782
+ signature,
783
+ })
784
+
785
+ const { status } = await waitForCallsStatus(client, {
786
+ id,
787
+ })
788
+ expect(status).toBe('success')
789
+
790
+ const client_dest = TestConfig.getRelayClient(porto, {
791
+ chainId: chain_dest!.id,
792
+ })
793
+
794
+ const balance_post = await readContract(client, {
795
+ abi: contracts.exp1.abi,
796
+ address: contracts.exp1.address,
797
+ args: [account.address],
798
+ functionName: 'balanceOf',
799
+ })
800
+ expect(balance_post).toBeLessThan(balance_pre)
801
+
802
+ const balance_dest = await readContract(client_dest, {
803
+ abi: contracts.exp1.abi,
804
+ address: contracts.exp1.address,
805
+ args: [alice],
806
+ functionName: 'balanceOf',
807
+ })
808
+ expect(balance_dest).toBeGreaterThanOrEqual(Value.fromEther('50'))
809
+ expect(balance_dest).toBeLessThan(Value.fromEther('50.0005'))
810
+ },
811
+ )
812
+
813
+ test('behavior: contract calls', async () => {
814
+ const key = Key.createHeadlessWebAuthnP256()
815
+ const account = await TestActions.createAccount(client, {
816
+ keys: [key],
817
+ })
818
+
819
+ const request = await prepareCalls(client, {
820
+ address: account.address,
821
+ calls: [
822
+ {
823
+ abi: contracts.exp1.abi,
824
+ args: [account.address, Value.fromEther('1')],
825
+ functionName: 'mint',
826
+ to: contracts.exp1.address,
827
+ },
828
+ ],
829
+ key: {
830
+ prehash: false,
831
+ publicKey: key.publicKey,
832
+ type: 'webauthnp256',
833
+ },
834
+ })
835
+
836
+ const signature = await Key.sign(key, {
837
+ address: null,
838
+ payload: request.digest,
839
+ wrap: false,
840
+ })
841
+
842
+ await sendPreparedCalls(client, {
843
+ context: request.context,
844
+ key: request.key!,
845
+ signature,
846
+ })
847
+ })
848
+
849
+ test('error: schema encoding', async () => {
850
+ const key = Key.createHeadlessWebAuthnP256()
851
+ const account = await TestActions.createAccount(client, {
852
+ keys: [key],
853
+ })
854
+
855
+ await expect(() =>
856
+ prepareCalls(client, {
857
+ address: account.address,
858
+ calls: [],
859
+ capabilities: {
860
+ meta: {},
861
+ },
862
+ key: {
863
+ prehash: false,
864
+ // @ts-expect-error
865
+ publicKey: 'cheese',
866
+ type: 'webauthnp256',
867
+ },
868
+ }),
869
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
870
+ `
871
+ [Schema.ValidationError: Validation failed with 1 error:
872
+
873
+ - at \`key.publicKey\`: Must match pattern: ^0x[\\s\\S]{0,}$]
874
+ `,
875
+ )
876
+ })
877
+
878
+ test('error: schema encoding', async () => {
879
+ const key = Key.createHeadlessWebAuthnP256()
880
+ const account = await TestActions.createAccount(client, {
881
+ keys: [key],
882
+ })
883
+
884
+ await expect(() =>
885
+ prepareCalls(client, {
886
+ address: account.address,
887
+ calls: [
888
+ {
889
+ to: '0x0000000000000000000000000000000000000000',
890
+ value: 0n,
891
+ },
892
+ ],
893
+ capabilities: {
894
+ meta: {},
895
+ },
896
+ key: {
897
+ prehash: false,
898
+ publicKey:
899
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
900
+ // @ts-expect-error
901
+ type: 'falcon',
902
+ },
903
+ }),
904
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
905
+ `
906
+ [Schema.ValidationError: Validation failed with 1 error:
907
+
908
+ - at \`key.type\`: Invalid union value.
909
+ - Expected "p256"
910
+ - Expected "secp256k1"
911
+ - Expected "webauthnp256"]
912
+ `,
913
+ )
914
+ })
915
+ })
916
+
917
+ describe('prepareUpgradeAccount + upgradeAccount', () => {
918
+ test('default', async () => {
919
+ const eoa = privateKeyToAccount(generatePrivateKey())
920
+ const adminKey = {
921
+ expiry: 0,
922
+ permissions: [],
923
+ prehash: false,
924
+ publicKey: Hex.padLeft(eoa.address, 32),
925
+ role: 'admin',
926
+ type: 'secp256k1',
927
+ } as const
928
+
929
+ await TestActions.setBalance(client, {
930
+ address: eoa.address,
931
+ })
932
+
933
+ const request = await prepareUpgradeAccount(client, {
934
+ address: eoa.address,
935
+ authorizeKeys: [adminKey],
936
+ delegation: contracts.accountProxy.address,
937
+ })
938
+
939
+ const { digests } = request
940
+ const signatures = {
941
+ auth: await eoa.sign({ hash: digests.auth }),
942
+ exec: await eoa.sign({ hash: digests.exec }),
943
+ }
944
+
945
+ await upgradeAccount(client, {
946
+ ...request,
947
+ signatures,
948
+ })
949
+
950
+ {
951
+ // Account won't be upgraded onchain just yet.
952
+ const code = await getCode(client, {
953
+ address: eoa.address,
954
+ })
955
+ expect(code).toBeUndefined()
956
+ }
957
+
958
+ // Relay should have registered the keys.
959
+ const keys = await getKeys(client, {
960
+ address: eoa.address,
961
+ }).then((result) => result[Hex.fromNumber(client.chain.id)]!)
962
+ expect(keys.length).toBe(1)
963
+
964
+ // Perform a call to deploy the account.
965
+ const req = await prepareCalls(client, {
966
+ address: eoa.address,
967
+ calls: [],
968
+ key: adminKey,
969
+ })
970
+ const signature = await eoa.sign({ hash: req.digest })
971
+ const { id } = await sendPreparedCalls(client, {
972
+ ...req,
973
+ key: req.key!,
974
+ signature,
975
+ })
976
+
977
+ await waitForCallsStatus(client, {
978
+ id,
979
+ })
980
+
981
+ {
982
+ // Account will be upgraded now.
983
+ const code = await getCode(client, {
984
+ address: eoa.address,
985
+ })
986
+ expect(code).toBeDefined()
987
+ }
988
+ })
989
+
990
+ test('behavior: with multiple keys', async () => {
991
+ const eoa = privateKeyToAccount(generatePrivateKey())
992
+ const adminKey = {
993
+ expiry: 0,
994
+ permissions: [],
995
+ prehash: false,
996
+ publicKey: Hex.padLeft(eoa.address, 32),
997
+ role: 'admin',
998
+ type: 'secp256k1',
999
+ } as const
1000
+ const adminKey_2 = {
1001
+ expiry: 0,
1002
+ permissions: [],
1003
+ prehash: false,
1004
+ publicKey: Hex.random(32),
1005
+ role: 'admin',
1006
+ type: 'webauthnp256',
1007
+ } as const
1008
+
1009
+ await TestActions.setBalance(client, {
1010
+ address: eoa.address,
1011
+ })
1012
+
1013
+ const request = await prepareUpgradeAccount(client, {
1014
+ address: eoa.address,
1015
+ authorizeKeys: [adminKey, adminKey_2],
1016
+ delegation: contracts.accountProxy.address,
1017
+ })
1018
+
1019
+ const { digests } = request
1020
+ const signatures = {
1021
+ auth: await eoa.sign({ hash: digests.auth }),
1022
+ exec: await eoa.sign({ hash: digests.exec }),
1023
+ }
1024
+
1025
+ await upgradeAccount(client, {
1026
+ ...request,
1027
+ signatures,
1028
+ })
1029
+
1030
+ {
1031
+ // Account won't be upgraded onchain just yet.
1032
+ const code = await getCode(client, {
1033
+ address: eoa.address,
1034
+ })
1035
+ expect(code).toBeUndefined()
1036
+ }
1037
+
1038
+ // Relay should have registered the keys.
1039
+ const keys = await getKeys(client, {
1040
+ address: eoa.address,
1041
+ }).then((result) => result[Hex.fromNumber(client.chain.id)]!)
1042
+ expect(keys.length).toBe(2)
1043
+
1044
+ // Perform a call to deploy the account.
1045
+ const req = await prepareCalls(client, {
1046
+ address: eoa.address,
1047
+ calls: [],
1048
+ key: adminKey,
1049
+ })
1050
+ const signature = await eoa.sign({ hash: req.digest })
1051
+ const { id } = await sendPreparedCalls(client, {
1052
+ ...req,
1053
+ key: req.key!,
1054
+ signature,
1055
+ })
1056
+
1057
+ await waitForCallsStatus(client, {
1058
+ id,
1059
+ })
1060
+
1061
+ {
1062
+ // Account will be upgraded onchain now.
1063
+ const code = await getCode(client, {
1064
+ address: eoa.address,
1065
+ })
1066
+ expect(code).toBeDefined()
1067
+ }
1068
+ })
1069
+
1070
+ test('behavior: with session key', async () => {
1071
+ const eoa = privateKeyToAccount(generatePrivateKey())
1072
+ const adminKey = {
1073
+ expiry: 0,
1074
+ permissions: [],
1075
+ prehash: false,
1076
+ publicKey: Hex.padLeft(eoa.address, 32),
1077
+ role: 'admin',
1078
+ type: 'secp256k1',
1079
+ } as const
1080
+ const sessionKey = {
1081
+ expiry: 999999999,
1082
+ permissions: [
1083
+ {
1084
+ selector: AbiFunction.getSelector(
1085
+ AbiFunction.fromAbi(contracts.exp1.abi, 'mint'),
1086
+ ),
1087
+ to: contracts.exp1.address,
1088
+ type: 'call',
1089
+ },
1090
+ {
1091
+ selector: AbiFunction.getSelector(
1092
+ AbiFunction.fromAbi(contracts.exp1.abi, 'transfer'),
1093
+ ),
1094
+ to: contracts.exp1.address,
1095
+ type: 'call',
1096
+ },
1097
+ {
1098
+ limit: Value.fromEther('100'),
1099
+ period: 'minute',
1100
+ token: contracts.exp1.address,
1101
+ type: 'spend',
1102
+ },
1103
+ ],
1104
+ prehash: false,
1105
+ publicKey: Hex.random(32),
1106
+ role: 'normal',
1107
+ type: 'webauthnp256',
1108
+ } as const
1109
+
1110
+ await TestActions.setBalance(client, {
1111
+ address: eoa.address,
1112
+ })
1113
+
1114
+ const request = await prepareUpgradeAccount(client, {
1115
+ address: eoa.address,
1116
+ authorizeKeys: [adminKey, sessionKey],
1117
+ delegation: contracts.accountProxy.address,
1118
+ })
1119
+
1120
+ const { digests } = request
1121
+ const signatures = {
1122
+ auth: await eoa.sign({ hash: digests.auth }),
1123
+ exec: await eoa.sign({ hash: digests.exec }),
1124
+ }
1125
+
1126
+ await upgradeAccount(client, {
1127
+ ...request,
1128
+ signatures,
1129
+ })
1130
+
1131
+ {
1132
+ // Account won't be upgraded onchain just yet.
1133
+ const code = await getCode(client, {
1134
+ address: eoa.address,
1135
+ })
1136
+ expect(code).toBeUndefined()
1137
+ }
1138
+
1139
+ // Relay should have registered the keys.
1140
+ const keys = await getKeys(client, {
1141
+ address: eoa.address,
1142
+ }).then((result) => result[Hex.fromNumber(client.chain.id)]!)
1143
+ expect(keys.length).toBe(2)
1144
+
1145
+ // Perform a call to deploy the account.
1146
+ const req = await prepareCalls(client, {
1147
+ address: eoa.address,
1148
+ calls: [],
1149
+ key: adminKey,
1150
+ })
1151
+ const signature = await eoa.sign({ hash: req.digest })
1152
+ const { id } = await sendPreparedCalls(client, {
1153
+ ...req,
1154
+ key: req.key!,
1155
+ signature,
1156
+ })
1157
+
1158
+ await waitForCallsStatus(client, {
1159
+ id,
1160
+ })
1161
+
1162
+ {
1163
+ // Account will be upgraded onchain now.
1164
+ const code = await getCode(client, {
1165
+ address: eoa.address,
1166
+ })
1167
+ expect(code).toBeDefined()
1168
+ }
1169
+ })
1170
+
1171
+ test('error: schema encoding', async () => {
1172
+ await expect(() =>
1173
+ prepareUpgradeAccount(client, {
1174
+ address: '0x0000000000000000000000000000000000000000',
1175
+ authorizeKeys: [
1176
+ {
1177
+ expiry: 0,
1178
+ permissions: [],
1179
+ prehash: false,
1180
+ // @ts-expect-error
1181
+ publicKey: 'INVALID!',
1182
+ role: 'admin',
1183
+ type: 'secp256k1',
1184
+ },
1185
+ ],
1186
+ delegation: contracts.accountProxy.address,
1187
+ }),
1188
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
1189
+ `
1190
+ [Schema.ValidationError: Validation failed with 1 error:
1191
+
1192
+ - at \`capabilities.authorizeKeys[0].publicKey\`: Must match pattern: ^0x[\\s\\S]{0,}$]
1193
+ `,
1194
+ )
1195
+
1196
+ await expect(() =>
1197
+ prepareUpgradeAccount(client, {
1198
+ address: '0x0000000000000000000000000000000000000000',
1199
+ authorizeKeys: [
1200
+ {
1201
+ expiry: 0,
1202
+ permissions: [],
1203
+ prehash: false,
1204
+ // @ts-expect-error
1205
+ publicKey: 'INVALID!',
1206
+ role: 'admin',
1207
+ type: 'secp256k1',
1208
+ },
1209
+ ],
1210
+ delegation: contracts.accountProxy.address,
1211
+ }),
1212
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
1213
+ `
1214
+ [Schema.ValidationError: Validation failed with 1 error:
1215
+
1216
+ - at \`capabilities.authorizeKeys[0].publicKey\`: Must match pattern: ^0x[\\s\\S]{0,}$]
1217
+ `,
1218
+ )
1219
+ })
1220
+ })
1221
+
1222
+ describe.runIf(!Anvil.enabled)('verifySignature', () => {
1223
+ test('default', async () => {
1224
+ const key1 = Key.createHeadlessWebAuthnP256()
1225
+ const key2 = Key.createSecp256k1()
1226
+ const account = await TestActions.createAccount(client, {
1227
+ keys: [key1, key2],
1228
+ })
1229
+
1230
+ const digest = Hex.random(32)
1231
+
1232
+ {
1233
+ const signature = await Key.sign(key1, {
1234
+ address: account.address,
1235
+ payload: digest,
1236
+ wrap: false,
1237
+ })
1238
+
1239
+ const result = await verifySignature(client, {
1240
+ address: account.address,
1241
+ digest,
1242
+ signature,
1243
+ })
1244
+
1245
+ expect(result.valid).toBe(true)
1246
+ }
1247
+
1248
+ {
1249
+ const signature = await Key.sign(key2, {
1250
+ address: account.address,
1251
+ payload: digest,
1252
+ wrap: false,
1253
+ })
1254
+
1255
+ const result = await verifySignature(client, {
1256
+ address: account.address,
1257
+ digest,
1258
+ signature,
1259
+ })
1260
+
1261
+ expect(result.valid).toBe(true)
1262
+ }
1263
+ })
1264
+
1265
+ test('behavior: invalid', async () => {
1266
+ const key = Key.createHeadlessWebAuthnP256()
1267
+ const account = await TestActions.createAccount(client, {
1268
+ keys: [key],
1269
+ })
1270
+
1271
+ const digest = Hex.random(32)
1272
+ const signature = await Key.sign(key, {
1273
+ address: account.address,
1274
+ payload: digest,
1275
+ wrap: false,
1276
+ })
1277
+
1278
+ const result = await verifySignature(client, {
1279
+ address: account.address,
1280
+ digest:
1281
+ '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
1282
+ signature,
1283
+ })
1284
+
1285
+ expect(result.valid).toBe(false)
1286
+ })
1287
+ })
1288
+
1289
+ describe.todo('onrampStatus')
1290
+ describe.todo('getOnrampContactInfo')
1291
+
1292
+ // TODO: Figure out way to get `code` from server
1293
+ describe.todo('setPhone + verifyPhone')
1294
+
1295
+ // TODO: Figure out way to get `token` from server (e.g. email link from inbox)
1296
+ describe.todo('setEmail + verifyEmail')