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,924 @@
1
+ import * as AbiFunction from 'ox/AbiFunction';
2
+ import * as AbiParameters from 'ox/AbiParameters';
3
+ import * as Address from 'ox/Address';
4
+ import * as Bytes from 'ox/Bytes';
5
+ import * as Hash from 'ox/Hash';
6
+ import * as Hex from 'ox/Hex';
7
+ import * as Json from 'ox/Json';
8
+ import * as P256 from 'ox/P256';
9
+ import * as PublicKey from 'ox/PublicKey';
10
+ import * as Secp256k1 from 'ox/Secp256k1';
11
+ import * as Signature from 'ox/Signature';
12
+ import * as TypedData from 'ox/TypedData';
13
+ import * as Value from 'ox/Value';
14
+ import * as WebAuthnP256 from 'ox/WebAuthnP256';
15
+ import * as WebCryptoP256 from 'ox/WebCryptoP256';
16
+ import { zeroAddress } from 'viem';
17
+ import * as Call from "../core/internal/call.js";
18
+ /** Relay key type to key type mapping. */
19
+ export const fromRelayKeyType = {
20
+ p256: 'p256',
21
+ secp256k1: 'secp256k1',
22
+ webauthnp256: 'webauthn-p256',
23
+ };
24
+ /** Relay key role to key role mapping. */
25
+ export const fromRelayKeyRole = {
26
+ admin: 'admin',
27
+ normal: 'session',
28
+ };
29
+ /** Serialized (contract-compatible) key type to key type mapping. */
30
+ export const fromSerializedKeyType = {
31
+ 0: 'p256',
32
+ 1: 'webauthn-p256',
33
+ 2: 'secp256k1',
34
+ };
35
+ /** Serialized (contract-compatible) spend period to period mapping. */
36
+ export const fromSerializedSpendPeriod = {
37
+ 0: 'minute',
38
+ 1: 'hour',
39
+ 2: 'day',
40
+ 3: 'week',
41
+ 4: 'month',
42
+ 5: 'year',
43
+ };
44
+ /** Key type to Relay key type mapping. */
45
+ export const toRelayKeyType = {
46
+ address: 'secp256k1',
47
+ p256: 'p256',
48
+ secp256k1: 'secp256k1',
49
+ 'webauthn-p256': 'webauthnp256',
50
+ };
51
+ /** Key role to Relay key role mapping. */
52
+ export const toRelayKeyRole = {
53
+ admin: 'admin',
54
+ session: 'normal',
55
+ };
56
+ /** Key type to serialized (contract-compatible) key type mapping. */
57
+ export const toSerializedKeyType = {
58
+ address: 2,
59
+ p256: 0,
60
+ secp256k1: 2,
61
+ 'webauthn-p256': 1,
62
+ };
63
+ /** Period to serialized (contract-compatible) spend period mapping. */
64
+ export const toSerializedSpendPeriod = {
65
+ day: 2,
66
+ hour: 1,
67
+ minute: 0,
68
+ month: 4,
69
+ week: 3,
70
+ year: 5,
71
+ };
72
+ /**
73
+ * Creates a random P256 key.
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * import * as Key from './key.js'
78
+ *
79
+ * // Admin Key
80
+ * const key = Key.createP256()
81
+ *
82
+ * // Session Key
83
+ * const key = Key.createP256({
84
+ * expiry: 1714857600,
85
+ * role: 'session',
86
+ * })
87
+ * ```
88
+ *
89
+ * @param parameters - Key parameters.
90
+ * @returns P256 key.
91
+ */
92
+ export function createP256(parameters = {}) {
93
+ const privateKey = P256.randomPrivateKey();
94
+ return fromP256({
95
+ ...parameters,
96
+ privateKey,
97
+ });
98
+ }
99
+ /**
100
+ * Creates a random Secp256k1 key.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * import * as Key from './key.js'
105
+ *
106
+ * // Admin Key
107
+ * const key = Key.createSecp256k1()
108
+ *
109
+ * // Session Key
110
+ * const key = Key.createSecp256k1({
111
+ * expiry: 1714857600,
112
+ * role: 'session',
113
+ * })
114
+ * ```
115
+ *
116
+ * @param parameters - Key parameters.
117
+ * @returns Secp256k1 key.
118
+ */
119
+ export function createSecp256k1(parameters = {}) {
120
+ const privateKey = Secp256k1.randomPrivateKey();
121
+ return fromSecp256k1({
122
+ ...parameters,
123
+ privateKey,
124
+ });
125
+ }
126
+ /**
127
+ * Creates a WebAuthnP256 key.
128
+ *
129
+ * @example
130
+ * ```ts
131
+ * import { Bytes } from 'ox'
132
+ * import * as Key from './key.js'
133
+ *
134
+ * // Admin Key
135
+ * const key = Key.createWebAuthnP256({
136
+ * label: 'My Key',
137
+ * userId: Bytes.from('0x0000000000000000000000000000000000000000'),
138
+ * })
139
+ *
140
+ * // Session Key
141
+ * const key = Key.createWebAuthnP256({
142
+ * expiry: 1714857600,
143
+ * label: 'My Key',
144
+ * role: 'session',
145
+ * userId: Bytes.from('0x0000000000000000000000000000000000000000'),
146
+ * })
147
+ * ```
148
+ *
149
+ * @param parameters - Key parameters.
150
+ * @returns WebAuthnP256 key.
151
+ */
152
+ export async function createWebAuthnP256(parameters) {
153
+ const { createFn, label, rpId, userId } = parameters;
154
+ const credential = await WebAuthnP256.createCredential({
155
+ authenticatorSelection: {
156
+ requireResidentKey: true,
157
+ residentKey: 'required',
158
+ userVerification: 'required',
159
+ },
160
+ createFn,
161
+ extensions: {
162
+ credProps: true,
163
+ },
164
+ rp: rpId
165
+ ? {
166
+ id: rpId,
167
+ name: rpId,
168
+ }
169
+ : undefined,
170
+ user: {
171
+ displayName: label,
172
+ id: new Uint8Array(userId ?? Bytes.fromString(label)),
173
+ name: label,
174
+ },
175
+ });
176
+ return fromWebAuthnP256({
177
+ ...parameters,
178
+ credential: {
179
+ id: credential.id,
180
+ publicKey: credential.publicKey,
181
+ },
182
+ id: userId
183
+ ? Bytes.toHex(userId)
184
+ : PublicKey.toHex(credential.publicKey, {
185
+ includePrefix: false,
186
+ }),
187
+ });
188
+ }
189
+ /**
190
+ * Creates a random WebAuthn-wrapped P256 key.
191
+ *
192
+ * @example
193
+ * ```ts
194
+ * import * as Key from './key.js'
195
+ *
196
+ * // Admin Key
197
+ * const key = Key.createHeadlessWebAuthnP256()
198
+ *
199
+ * // Session Key
200
+ * const key = Key.createHeadlessWebAuthnP256({
201
+ * expiry: 1714857600,
202
+ * role: 'session',
203
+ * })
204
+ * ```
205
+ *
206
+ * @param parameters - Key parameters.
207
+ * @returns P256 key.
208
+ */
209
+ export function createHeadlessWebAuthnP256(parameters = {}) {
210
+ const privateKey = P256.randomPrivateKey();
211
+ return fromHeadlessWebAuthnP256({
212
+ ...parameters,
213
+ privateKey,
214
+ });
215
+ }
216
+ /**
217
+ * Creates a random WebCryptoP256 key.
218
+ *
219
+ * @example
220
+ * ```ts
221
+ * import * as Key from './key.js'
222
+ *
223
+ * // Admin Key
224
+ * const key = Key.createWebCryptoP256()
225
+ *
226
+ * // Session Key
227
+ * const key = Key.createWebCryptoP256({
228
+ * expiry: 1714857600,
229
+ * role: 'session',
230
+ * })
231
+ * ```
232
+ *
233
+ * @param parameters - Key parameters.
234
+ * @returns WebCryptoP256 key.
235
+ */
236
+ export async function createWebCryptoP256(parameters = {}) {
237
+ const keyPair = await WebCryptoP256.createKeyPair();
238
+ return fromWebCryptoP256({
239
+ ...parameters,
240
+ keyPair,
241
+ });
242
+ }
243
+ /**
244
+ * Deserializes a key from its serialized format.
245
+ *
246
+ * @example
247
+ * ```ts
248
+ * import * as Key from './key.js'
249
+ *
250
+ * const key = Key.deserialize({
251
+ * expiry: 0,
252
+ * isSuperAdmin: false,
253
+ * keyType: 0,
254
+ * publicKey: '0x04ec0effa5f2f378cbf7fd2fa7ca1e8dc51cf777c129fa1c00a0e9a9205f2e511ff3f20b34a4e0b50587d055c0e0fad33d32cf1147d3bb2538fbab0d15d8e65008',
255
+ * })
256
+ * ```
257
+ *
258
+ * @param serialized - Serialized key.
259
+ * @returns Key.
260
+ */
261
+ export function deserialize(serialized, options = {}) {
262
+ const { chainId } = options;
263
+ const publicKey = serialized.publicKey;
264
+ const type = fromSerializedKeyType[serialized.keyType];
265
+ return from({
266
+ chainId,
267
+ expiry: serialized.expiry,
268
+ publicKey,
269
+ role: serialized.isSuperAdmin ? 'admin' : 'session',
270
+ type,
271
+ });
272
+ }
273
+ /**
274
+ * Instantiates a key from its parameters.
275
+ *
276
+ * @example
277
+ * ```ts
278
+ * import { P256 } from 'ox'
279
+ * import * as Key from './key.js'
280
+ *
281
+ * const privateKey = P256.randomPrivateKey()
282
+ * const publicKey = P256.getPublicKey({ privateKey })
283
+ *
284
+ * const key = Key.from({
285
+ * expiry: 0,
286
+ * publicKey,
287
+ * async sign({ payload }) {
288
+ * return P256.sign({ payload, privateKey })
289
+ * },
290
+ * type: 'p256',
291
+ * })
292
+ * ```
293
+ *
294
+ * @param key - Key.
295
+ * @returns Key.
296
+ */
297
+ export function from(key, options = {}) {
298
+ const { chainId = key.chainId } = options;
299
+ const { expiry = 0, id, prehash = false, role = 'admin', type } = key;
300
+ const publicKey = (() => {
301
+ const publicKey = key.publicKey;
302
+ if (publicKey === '0x')
303
+ return publicKey;
304
+ if (type === 'secp256k1' || type === 'address') {
305
+ const isAddress = Hex.size(publicKey) === 20 ||
306
+ Hex.toBigInt(Hex.slice(publicKey, 0, 12)) === 0n;
307
+ const address = isAddress
308
+ ? Hex.slice(publicKey, -20)
309
+ : Address.fromPublicKey(PublicKey.fromHex(publicKey));
310
+ return address;
311
+ }
312
+ return publicKey;
313
+ })();
314
+ return {
315
+ ...key,
316
+ chainId,
317
+ expiry,
318
+ hash: hash({
319
+ publicKey,
320
+ type,
321
+ }),
322
+ id: (id ?? publicKey).toLowerCase(),
323
+ prehash,
324
+ publicKey: publicKey.toLowerCase(),
325
+ role,
326
+ type,
327
+ };
328
+ }
329
+ /**
330
+ * Instantiates a P256 key from its parameters.
331
+ *
332
+ * @example
333
+ * ```ts
334
+ * import { P256 } from 'ox'
335
+ * import * as Key from './key.js'
336
+ *
337
+ * // Admin Key
338
+ * const key = Key.fromP256({
339
+ * privateKey: P256.randomPrivateKey(),
340
+ * })
341
+ *
342
+ * // Session Key
343
+ * const key = Key.fromP256({
344
+ * expiry: 1714857600,
345
+ * privateKey: P256.randomPrivateKey(),
346
+ * role: 'session',
347
+ * })
348
+ * ```
349
+ *
350
+ * @param parameters - Key parameters.
351
+ * @returns P256 key.
352
+ */
353
+ export function fromP256(parameters) {
354
+ const { chainId, expiry, feeToken, permissions, privateKey, role } = parameters;
355
+ const publicKey = PublicKey.toHex(P256.getPublicKey({ privateKey }), {
356
+ includePrefix: false,
357
+ });
358
+ return from({
359
+ chainId,
360
+ expiry,
361
+ feeToken,
362
+ permissions,
363
+ privateKey() {
364
+ return privateKey;
365
+ },
366
+ publicKey,
367
+ role,
368
+ type: 'p256',
369
+ });
370
+ }
371
+ /**
372
+ * Converts a Relay-formatted key to a key.
373
+ *
374
+ * @example
375
+ * TODO
376
+ *
377
+ * @param relayKey - Relay key.
378
+ * @returns Key.
379
+ */
380
+ export function fromRelay(relayKey, options) {
381
+ const { chainId } = options;
382
+ const { publicKey } = relayKey;
383
+ const isAddress = Hex.size(publicKey) === 20 ||
384
+ Hex.toBigInt(Hex.slice(publicKey, 0, 12)) === 0n;
385
+ const permissions = {};
386
+ for (const permission of relayKey.permissions) {
387
+ if (permission.type === 'call') {
388
+ permissions.calls ??= [];
389
+ permissions.calls.push({
390
+ signature: permission.selector,
391
+ to: permission.to === Call.anyTarget ? undefined : permission.to,
392
+ });
393
+ }
394
+ if (permission.type === 'spend') {
395
+ permissions.spend ??= [];
396
+ permissions.spend.push({
397
+ limit: permission.limit,
398
+ period: permission.period,
399
+ token: permission.token,
400
+ });
401
+ }
402
+ }
403
+ return from({
404
+ chainId,
405
+ expiry: relayKey.expiry,
406
+ permissions: permissions,
407
+ publicKey: relayKey.publicKey,
408
+ role: fromRelayKeyRole[relayKey.role],
409
+ type: isAddress ? 'address' : fromRelayKeyType[relayKey.type],
410
+ });
411
+ }
412
+ /**
413
+ * Instantiates a Secp256k1 key from its parameters.
414
+ *
415
+ * @example
416
+ * ```ts
417
+ * import { Secp256k1 } from 'ox'
418
+ * import * as Key from './key.js'
419
+ *
420
+ * // Admin Key
421
+ * const key = Key.fromSecp256k1({
422
+ * privateKey: Secp256k1.randomPrivateKey(),
423
+ * })
424
+ *
425
+ * // Session Key
426
+ * const key = Key.fromSecp256k1({
427
+ * expiry: 1714857600,
428
+ * privateKey: Secp256k1.randomPrivateKey(),
429
+ * role: 'session',
430
+ * })
431
+ * ```
432
+ *
433
+ * @param parameters - Key parameters.
434
+ * @returns Secp256k1 key.
435
+ */
436
+ export function fromSecp256k1(parameters) {
437
+ const { privateKey, role } = parameters;
438
+ const publicKey = (() => {
439
+ if (parameters.publicKey)
440
+ return parameters.publicKey;
441
+ if (privateKey)
442
+ return Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey }));
443
+ return parameters.address.toLowerCase();
444
+ })();
445
+ return from({
446
+ expiry: parameters.expiry ?? 0,
447
+ feeToken: parameters.feeToken,
448
+ permissions: parameters.permissions,
449
+ privateKey: privateKey ? () => privateKey : undefined,
450
+ publicKey,
451
+ role,
452
+ type: 'secp256k1',
453
+ });
454
+ }
455
+ /**
456
+ * Instantiates a WebAuthnP256 key from its parameters.
457
+ *
458
+ * @example
459
+ * ```ts
460
+ * import { WebAuthnP256 } from 'ox'
461
+ * import * as Key from './key.js'
462
+ *
463
+ * const credential = await WebAuthnP256.createCredential({ name: 'My Key' })
464
+ *
465
+ * // Admin Key
466
+ * const key = Key.fromWebAuthnP256({
467
+ * credential,
468
+ * })
469
+ *
470
+ * // Session Key
471
+ * const key = Key.fromWebAuthnP256({
472
+ * expiry: 1714857600,
473
+ * credential,
474
+ * role: 'session',
475
+ * })
476
+ * ```
477
+ *
478
+ * @param parameters - Key parameters.
479
+ * @returns WebAuthnP256 key.
480
+ */
481
+ export function fromWebAuthnP256(parameters) {
482
+ const { credential, id, rpId } = parameters;
483
+ const publicKey = PublicKey.toHex(credential.publicKey, {
484
+ includePrefix: false,
485
+ });
486
+ return from({
487
+ chainId: parameters.chainId,
488
+ expiry: parameters.expiry ?? 0,
489
+ feeToken: parameters.feeToken,
490
+ id,
491
+ permissions: parameters.permissions,
492
+ privateKey: {
493
+ credential,
494
+ rpId,
495
+ },
496
+ publicKey,
497
+ role: parameters.role,
498
+ type: 'webauthn-p256',
499
+ });
500
+ }
501
+ /**
502
+ * Instantiates a WebAuthn-wrapped P256 key from its parameters.
503
+ *
504
+ * @example
505
+ * ```ts
506
+ * import { P256 } from 'ox'
507
+ * import * as Key from './key.js'
508
+ *
509
+ * const privateKey = P256.randomPrivateKey()
510
+ *
511
+ * // Admin Key
512
+ * const key = Key.fromHeadlessWebAuthnP256({
513
+ * privateKey,
514
+ * })
515
+ *
516
+ * // Session Key
517
+ * const key = Key.fromHeadlessWebAuthnP256({
518
+ * expiry: 1714857600,
519
+ * privateKey,
520
+ * role: 'session',
521
+ * })
522
+ * ```
523
+ *
524
+ * @param parameters - Key parameters.
525
+ * @returns WebAuthn-wrapped P256 key.
526
+ */
527
+ export function fromHeadlessWebAuthnP256(parameters) {
528
+ const { privateKey } = parameters;
529
+ const publicKey = PublicKey.toHex(P256.getPublicKey({ privateKey }), {
530
+ includePrefix: false,
531
+ });
532
+ return from({
533
+ chainId: parameters.chainId,
534
+ expiry: parameters.expiry ?? 0,
535
+ feeToken: parameters.feeToken,
536
+ permissions: parameters.permissions,
537
+ privateKey: {
538
+ privateKey() {
539
+ return privateKey;
540
+ },
541
+ },
542
+ publicKey,
543
+ role: parameters.role,
544
+ type: 'webauthn-p256',
545
+ });
546
+ }
547
+ /**
548
+ * Instantiates a WebCryptoP256 key from its parameters.
549
+ *
550
+ * @example
551
+ * ```ts
552
+ * import { WebCryptoP256 } from 'ox'
553
+ * import * as Key from './key.js'
554
+ *
555
+ * const keyPair = await WebCryptoP256.createKeyPair()
556
+ *
557
+ * // Admin Key
558
+ * const key = Key.fromWebCryptoP256({
559
+ * keyPair,
560
+ * })
561
+ *
562
+ * // Session Key
563
+ * const key = Key.fromWebCryptoP256({
564
+ * expiry: 1714857600,
565
+ * keyPair,
566
+ * role: 'session',
567
+ * })
568
+ * ```
569
+ *
570
+ * @param parameters - Key parameters.
571
+ * @returns WebCryptoP256 key.
572
+ */
573
+ export function fromWebCryptoP256(parameters) {
574
+ const { chainId, expiry, feeToken, keyPair, permissions, role } = parameters;
575
+ const { privateKey } = keyPair;
576
+ const publicKey = PublicKey.toHex(keyPair.publicKey, {
577
+ includePrefix: false,
578
+ });
579
+ return from({
580
+ chainId,
581
+ expiry,
582
+ feeToken,
583
+ permissions,
584
+ prehash: true,
585
+ privateKey,
586
+ publicKey,
587
+ role,
588
+ type: 'p256',
589
+ });
590
+ }
591
+ /**
592
+ * Hashes a key.
593
+ *
594
+ * @example
595
+ * ```ts
596
+ * import * as Key from './key.js'
597
+ *
598
+ * const key = Key.createP256()
599
+ *
600
+ * const hash = Key.hash(key)
601
+ * ```
602
+ *
603
+ * @param key - Key.
604
+ * @returns Hashed key.
605
+ */
606
+ export function hash(key) {
607
+ const { type } = key;
608
+ const publicKey = serializePublicKey(key.publicKey);
609
+ return Hash.keccak256(AbiParameters.encode([{ type: 'uint8' }, { type: 'bytes32' }], [toSerializedKeyType[type], Hash.keccak256(publicKey)]));
610
+ }
611
+ /**
612
+ * Serializes a public key.
613
+ *
614
+ * @param publicKey - Public key.
615
+ * @returns Serialized public key.
616
+ */
617
+ export function serializePublicKey(publicKey) {
618
+ return Hex.size(publicKey) < 32 ? Hex.padLeft(publicKey, 32) : publicKey;
619
+ }
620
+ /**
621
+ * Serializes a key to a contract-compatible format.
622
+ *
623
+ * @example
624
+ * ```ts
625
+ * import * as Key from './key.js'
626
+ *
627
+ * const key = Key.createP256()
628
+ *
629
+ * const serialized = Key.serialize(key)
630
+ * ```
631
+ *
632
+ * @param key - Key.
633
+ * @returns Serialized key.
634
+ */
635
+ export function serialize(key) {
636
+ const { expiry = 0, publicKey, role, type } = key;
637
+ return {
638
+ expiry,
639
+ isSuperAdmin: role === 'admin',
640
+ keyType: toSerializedKeyType[type],
641
+ publicKey: serializePublicKey(publicKey),
642
+ };
643
+ }
644
+ export async function sign(key, parameters) {
645
+ const { address, storage, webAuthn, wrap = true } = parameters;
646
+ const { privateKey, publicKey, type: keyType } = key;
647
+ if (!privateKey)
648
+ throw new Error('Key does not have a private key to sign with.\n\nKey:\n' +
649
+ Json.stringify(key, null, 2));
650
+ const payload = (() => {
651
+ if (!address)
652
+ return parameters.payload;
653
+ return TypedData.getSignPayload({
654
+ domain: { verifyingContract: address },
655
+ message: {
656
+ digest: parameters.payload,
657
+ },
658
+ primaryType: 'ERC1271Sign',
659
+ types: {
660
+ ERC1271Sign: [{ name: 'digest', type: 'bytes32' }],
661
+ },
662
+ });
663
+ })();
664
+ const [signature, prehash] = await (async () => {
665
+ if (keyType === 'p256') {
666
+ const { privateKey } = key;
667
+ if (typeof privateKey === 'function')
668
+ return [
669
+ Signature.toHex(P256.sign({ payload, privateKey: privateKey() })),
670
+ false,
671
+ ];
672
+ if (privateKey instanceof CryptoKey) {
673
+ const signature = Signature.toHex(await WebCryptoP256.sign({ payload, privateKey }));
674
+ return [signature, true];
675
+ }
676
+ }
677
+ if (keyType === 'secp256k1') {
678
+ return [
679
+ Signature.toHex(Secp256k1.sign({ payload, privateKey: privateKey() })),
680
+ false,
681
+ ];
682
+ }
683
+ if (keyType === 'webauthn-p256') {
684
+ if (privateKey.privateKey) {
685
+ const { payload: wrapped, metadata } = WebAuthnP256.getSignPayload({
686
+ challenge: payload,
687
+ origin: 'https://ithaca.xyz',
688
+ rpId: 'ithaca.xyz',
689
+ });
690
+ const { r, s } = P256.sign({
691
+ hash: true,
692
+ payload: wrapped,
693
+ privateKey: privateKey.privateKey(),
694
+ });
695
+ const signature = serializeWebAuthnSignature({
696
+ metadata,
697
+ signature: { r, s },
698
+ });
699
+ return [signature, false];
700
+ }
701
+ const { credential, rpId } = privateKey;
702
+ const cacheKey = `porto.webauthnVerified.${key.hash}`;
703
+ const now = Date.now();
704
+ const verificationTimeout = 10 * 60 * 1_000; // 10 minutes in milliseconds
705
+ let requireVerification = true;
706
+ if (storage) {
707
+ const lastVerified = await storage.getItem(cacheKey);
708
+ requireVerification =
709
+ !lastVerified || now - lastVerified > verificationTimeout;
710
+ }
711
+ const { signature: { r, s }, raw, metadata, } = await WebAuthnP256.sign({
712
+ challenge: payload,
713
+ credentialId: credential.id,
714
+ getFn: webAuthn?.getFn,
715
+ rpId,
716
+ userVerification: requireVerification ? 'required' : 'preferred',
717
+ });
718
+ const response = raw.response;
719
+ if (!response?.userHandle)
720
+ throw new Error('No user handle in response', {
721
+ cause: { response },
722
+ });
723
+ const id = Bytes.toHex(new Uint8Array(response.userHandle));
724
+ if (key.id && Address.validate(key.id) && !Address.isEqual(key.id, id))
725
+ throw new Error(`supplied webauthn key "${key.id}" does not match signature webauthn key "${id}"`, { cause: { id, key } });
726
+ if (requireVerification && storage)
727
+ await storage.setItem(cacheKey, now);
728
+ const signature = serializeWebAuthnSignature({
729
+ metadata,
730
+ signature: { r, s },
731
+ });
732
+ return [signature, false];
733
+ }
734
+ throw new Error(`Key type "${keyType}" is not supported.\n\nKey:\n` +
735
+ Json.stringify(key, null, 2));
736
+ })();
737
+ if (wrap)
738
+ return wrapSignature(signature, {
739
+ keyType,
740
+ prehash,
741
+ publicKey,
742
+ });
743
+ return signature;
744
+ }
745
+ /**
746
+ * Converts a key to a Relay-compatible format.
747
+ *
748
+ * @example
749
+ * TODO
750
+ *
751
+ * @param key - Key.
752
+ * @returns Relay key.
753
+ */
754
+ export function toRelay(key, options = {}) {
755
+ const { expiry = 0, prehash = false, publicKey, role = 'admin', type } = key;
756
+ const { feeTokens, orchestrator } = options;
757
+ // biome-ignore lint/complexity/useFlatMap: i know
758
+ const permissions = Object.entries(resolvePermissions(key, {
759
+ feeTokens,
760
+ }))
761
+ // biome-ignore lint/suspicious/useIterableCallbackReturn: _
762
+ .map(([key, v]) => {
763
+ if (key === 'calls') {
764
+ const calls = v;
765
+ return calls.map(({ signature, to }) => {
766
+ const selector = (() => {
767
+ if (!signature)
768
+ return Call.anySelector;
769
+ if (Hex.validate(signature))
770
+ return signature;
771
+ return AbiFunction.getSelector(signature);
772
+ })();
773
+ return {
774
+ selector,
775
+ to: to ?? Call.anyTarget,
776
+ type: 'call',
777
+ };
778
+ });
779
+ }
780
+ if (key === 'feeToken')
781
+ return;
782
+ if (key === 'spend') {
783
+ const value = v;
784
+ return value.map(({ limit, period, token }) => {
785
+ return {
786
+ limit,
787
+ period,
788
+ token,
789
+ type: 'spend',
790
+ };
791
+ });
792
+ }
793
+ throw new Error(`Invalid permission type "${key}".`);
794
+ })
795
+ .flat()
796
+ .filter(Boolean);
797
+ if (key.role === 'session' && orchestrator)
798
+ permissions.push({
799
+ selector: Call.anySelector,
800
+ to: orchestrator,
801
+ type: 'call',
802
+ });
803
+ return {
804
+ expiry,
805
+ permissions: permissions ?? [],
806
+ prehash,
807
+ publicKey: serializePublicKey(publicKey),
808
+ role: toRelayKeyRole[role],
809
+ type: toRelayKeyType[type],
810
+ };
811
+ }
812
+ /**
813
+ * Resolves the permissions for the permissions request, and if needed, adds
814
+ * the fee limit to the spend permissions.
815
+ *
816
+ * @param request - Permissions request.
817
+ * @param options - Options.
818
+ * @returns Resolved permissions.
819
+ */
820
+ export function resolvePermissions(key, options) {
821
+ const { permissions } = key;
822
+ const calls = permissions?.calls ? [...permissions.calls] : [];
823
+ const spend = permissions?.spend ? [...permissions.spend] : [];
824
+ const feeTokens = options.feeTokens?.filter((token) => token.feeToken);
825
+ if (feeTokens && feeTokens.length > 0) {
826
+ const feeToken = getFeeToken(key, {
827
+ feeTokens,
828
+ });
829
+ if (feeToken) {
830
+ let index = -1;
831
+ let minPeriod = toSerializedSpendPeriod.year;
832
+ for (let i = 0; i < spend.length; i++) {
833
+ const s = spend[i];
834
+ if (s.token && Address.isEqual(feeToken.address, s.token)) {
835
+ index = i;
836
+ break;
837
+ }
838
+ if (!s.token && feeToken.address === zeroAddress) {
839
+ index = i;
840
+ break;
841
+ }
842
+ const period = toSerializedSpendPeriod[s.period];
843
+ if (period < minPeriod)
844
+ minPeriod = period;
845
+ }
846
+ // If there is a token assigned to a spend permission and the fee token
847
+ // is the same, update the limit to account for the fee.
848
+ if (index !== -1) {
849
+ spend[index] = {
850
+ ...spend[index],
851
+ limit: spend[index].limit + feeToken.value,
852
+ };
853
+ // Assign this as the first spend permission, as it will be used
854
+ // as the fee token for call bundles that use this key.
855
+ spend.unshift(spend.splice(index, 1)[0]);
856
+ }
857
+ // Update the spend permissions to account for the fee token.
858
+ // The fee token permission must be assigned as the first spend
859
+ // permission as it will be used as the fee token for call bundles
860
+ // that use this key.
861
+ else if (typeof minPeriod === 'number')
862
+ spend.unshift({
863
+ limit: feeToken.value,
864
+ period: fromSerializedSpendPeriod[minPeriod],
865
+ token: feeToken.address,
866
+ });
867
+ }
868
+ }
869
+ return { ...permissions, calls, spend };
870
+ }
871
+ /**
872
+ * Gets the fee limit (in units of the fee token) to be used for the
873
+ * authorized permissions.
874
+ *
875
+ * @param request - The permissions request to get the fee limit for.
876
+ * @param options - Options.
877
+ * @returns Fee limit (in units of the fee token).
878
+ */
879
+ export function getFeeToken(key, options) {
880
+ const { feeTokens } = options;
881
+ if (!key.feeToken)
882
+ return undefined;
883
+ const feeToken = feeTokens.find((token) => {
884
+ if (key.feeToken.symbol === token.symbol)
885
+ return true;
886
+ if (!key.feeToken.symbol)
887
+ return token.address === zeroAddress;
888
+ if (key.feeToken.symbol === 'native')
889
+ return token.address === zeroAddress;
890
+ return false;
891
+ });
892
+ if (!feeToken)
893
+ return undefined;
894
+ const value = Value.from(key.feeToken.limit, feeToken.decimals);
895
+ return {
896
+ ...feeToken,
897
+ value,
898
+ };
899
+ }
900
+ ///////////////////////////////////////////////////////////////////////////
901
+ // Internal
902
+ ///////////////////////////////////////////////////////////////////////////
903
+ export function serializeWebAuthnSignature(options) {
904
+ const { metadata, signature } = options;
905
+ return AbiParameters.encode(AbiParameters.from([
906
+ 'struct WebAuthnAuth { bytes authenticatorData; string clientDataJSON; uint256 challengeIndex; uint256 typeIndex; bytes32 r; bytes32 s; }',
907
+ 'WebAuthnAuth auth',
908
+ ]), [
909
+ {
910
+ authenticatorData: metadata.authenticatorData,
911
+ challengeIndex: BigInt(metadata.challengeIndex),
912
+ clientDataJSON: metadata.clientDataJSON,
913
+ r: Hex.fromNumber(signature.r, { size: 32 }),
914
+ s: Hex.fromNumber(signature.s, { size: 32 }),
915
+ typeIndex: BigInt(metadata.typeIndex),
916
+ },
917
+ ]);
918
+ }
919
+ export function wrapSignature(signature, options) {
920
+ const { keyType: type, prehash = false, publicKey } = options;
921
+ const keyHash = hash({ publicKey, type });
922
+ return AbiParameters.encodePacked(['bytes', 'bytes32', 'bool'], [signature, keyHash, prehash]);
923
+ }
924
+ //# sourceMappingURL=Key.js.map