@unionlabs/payments 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/Abi/package.json +6 -0
  2. package/Attestor/package.json +6 -0
  3. package/Constants/package.json +6 -0
  4. package/Domain/package.json +6 -0
  5. package/Error/package.json +6 -0
  6. package/EvmPublicClient/package.json +6 -0
  7. package/EvmWalletClient/package.json +6 -0
  8. package/Payment/package.json +6 -0
  9. package/PaymentError/package.json +6 -0
  10. package/Prover/package.json +6 -0
  11. package/PublicClient/package.json +6 -0
  12. package/README.md +1 -0
  13. package/Schema/package.json +6 -0
  14. package/Utils/package.json +6 -0
  15. package/WalletClient/package.json +6 -0
  16. package/attestation/package.json +6 -0
  17. package/cli/commands/balance/package.json +6 -0
  18. package/cli/commands/deposit/package.json +6 -0
  19. package/cli/commands/export-verifier/package.json +6 -0
  20. package/cli/commands/generate/package.json +6 -0
  21. package/cli/commands/history/package.json +6 -0
  22. package/cli/commands/prove/package.json +6 -0
  23. package/cli/commands/redeem/package.json +6 -0
  24. package/cli/commands/update-client/package.json +6 -0
  25. package/cli/config/package.json +6 -0
  26. package/cli/package.json +6 -0
  27. package/cli/utils/package.json +6 -0
  28. package/constants/ibc-core-registry/package.json +6 -0
  29. package/constants/services/package.json +6 -0
  30. package/constants/z-asset-registry/package.json +6 -0
  31. package/dist/cjs/Abi.js +270 -0
  32. package/dist/cjs/Abi.js.map +1 -0
  33. package/dist/cjs/Attestor.js +76 -0
  34. package/dist/cjs/Attestor.js.map +1 -0
  35. package/dist/cjs/Constants.js +8 -0
  36. package/dist/cjs/Constants.js.map +1 -0
  37. package/dist/cjs/Domain.js +24 -0
  38. package/dist/cjs/Domain.js.map +1 -0
  39. package/dist/cjs/Error.js +100 -0
  40. package/dist/cjs/Error.js.map +1 -0
  41. package/dist/cjs/EvmPublicClient.js +301 -0
  42. package/dist/cjs/EvmPublicClient.js.map +1 -0
  43. package/dist/cjs/EvmWalletClient.js +670 -0
  44. package/dist/cjs/EvmWalletClient.js.map +1 -0
  45. package/dist/cjs/Payment.js +333 -0
  46. package/dist/cjs/Payment.js.map +1 -0
  47. package/dist/cjs/PaymentError.js +32 -0
  48. package/dist/cjs/PaymentError.js.map +1 -0
  49. package/dist/cjs/Prover.js +153 -0
  50. package/dist/cjs/Prover.js.map +1 -0
  51. package/dist/cjs/PublicClient.js +39 -0
  52. package/dist/cjs/PublicClient.js.map +1 -0
  53. package/dist/cjs/Schema.js +38 -0
  54. package/dist/cjs/Schema.js.map +1 -0
  55. package/dist/cjs/Utils.js +33 -0
  56. package/dist/cjs/Utils.js.map +1 -0
  57. package/dist/cjs/WalletClient.js +39 -0
  58. package/dist/cjs/WalletClient.js.map +1 -0
  59. package/dist/cjs/attestation.js +49 -0
  60. package/dist/cjs/attestation.js.map +1 -0
  61. package/dist/cjs/cli/commands/balance.js +60 -0
  62. package/dist/cjs/cli/commands/balance.js.map +1 -0
  63. package/dist/cjs/cli/commands/deposit.js +58 -0
  64. package/dist/cjs/cli/commands/deposit.js.map +1 -0
  65. package/dist/cjs/cli/commands/export-verifier.js +27 -0
  66. package/dist/cjs/cli/commands/export-verifier.js.map +1 -0
  67. package/dist/cjs/cli/commands/generate.js +41 -0
  68. package/dist/cjs/cli/commands/generate.js.map +1 -0
  69. package/dist/cjs/cli/commands/history.js +59 -0
  70. package/dist/cjs/cli/commands/history.js.map +1 -0
  71. package/dist/cjs/cli/commands/prove.js +82 -0
  72. package/dist/cjs/cli/commands/prove.js.map +1 -0
  73. package/dist/cjs/cli/commands/redeem.js +152 -0
  74. package/dist/cjs/cli/commands/redeem.js.map +1 -0
  75. package/dist/cjs/cli/commands/update-client.js +62 -0
  76. package/dist/cjs/cli/commands/update-client.js.map +1 -0
  77. package/dist/cjs/cli/config.js +32 -0
  78. package/dist/cjs/cli/config.js.map +1 -0
  79. package/dist/cjs/cli/utils.js +108 -0
  80. package/dist/cjs/cli/utils.js.map +1 -0
  81. package/dist/cjs/cli.js +24 -0
  82. package/dist/cjs/cli.js.map +1 -0
  83. package/dist/cjs/constants/ibc-core-registry.js +30 -0
  84. package/dist/cjs/constants/ibc-core-registry.js.map +1 -0
  85. package/dist/cjs/constants/services.js +9 -0
  86. package/dist/cjs/constants/services.js.map +1 -0
  87. package/dist/cjs/constants/z-asset-registry.js +32 -0
  88. package/dist/cjs/constants/z-asset-registry.js.map +1 -0
  89. package/dist/cjs/gen/prover_pb.js +81 -0
  90. package/dist/cjs/gen/prover_pb.js.map +1 -0
  91. package/dist/cjs/index.js +32 -0
  92. package/dist/cjs/index.js.map +1 -0
  93. package/dist/cjs/internal/evm.js +191 -0
  94. package/dist/cjs/internal/evm.js.map +1 -0
  95. package/dist/cjs/internal/evmWalletClient.js +6 -0
  96. package/dist/cjs/internal/evmWalletClient.js.map +1 -0
  97. package/dist/cjs/internal/publicClient.js +49 -0
  98. package/dist/cjs/internal/publicClient.js.map +1 -0
  99. package/dist/cjs/internal/walletClient.js +43 -0
  100. package/dist/cjs/internal/walletClient.js.map +1 -0
  101. package/dist/cjs/legacy/client.js +1222 -0
  102. package/dist/cjs/legacy/client.js.map +1 -0
  103. package/dist/cjs/legacy/prover.js +112 -0
  104. package/dist/cjs/legacy/prover.js.map +1 -0
  105. package/dist/cjs/poseidon2.js +226 -0
  106. package/dist/cjs/poseidon2.js.map +1 -0
  107. package/dist/cjs/promises/Attestor.js +23 -0
  108. package/dist/cjs/promises/Attestor.js.map +1 -0
  109. package/dist/cjs/promises/EvmPublicClient.js +34 -0
  110. package/dist/cjs/promises/EvmPublicClient.js.map +1 -0
  111. package/dist/cjs/promises/EvmWalletClient.js +51 -0
  112. package/dist/cjs/promises/EvmWalletClient.js.map +1 -0
  113. package/dist/cjs/promises/Payment.js +22 -0
  114. package/dist/cjs/promises/Payment.js.map +1 -0
  115. package/dist/cjs/promises/Prover.js +26 -0
  116. package/dist/cjs/promises/Prover.js.map +1 -0
  117. package/dist/cjs/promises/PublicClient.js +53 -0
  118. package/dist/cjs/promises/PublicClient.js.map +1 -0
  119. package/dist/cjs/promises/WalletClient.js +44 -0
  120. package/dist/cjs/promises/WalletClient.js.map +1 -0
  121. package/dist/cjs/promises/index.js +22 -0
  122. package/dist/cjs/promises/index.js.map +1 -0
  123. package/dist/cjs/rpc.js +867 -0
  124. package/dist/cjs/rpc.js.map +1 -0
  125. package/dist/cjs/types.js +6 -0
  126. package/dist/cjs/types.js.map +1 -0
  127. package/dist/dts/Abi.d.ts +220 -0
  128. package/dist/dts/Abi.d.ts.map +1 -0
  129. package/dist/dts/Attestor.d.ts +42 -0
  130. package/dist/dts/Attestor.d.ts.map +1 -0
  131. package/dist/dts/Constants.d.ts +3 -0
  132. package/dist/dts/Constants.d.ts.map +1 -0
  133. package/dist/dts/Domain.d.ts +141 -0
  134. package/dist/dts/Domain.d.ts.map +1 -0
  135. package/dist/dts/Error.d.ts +102 -0
  136. package/dist/dts/Error.d.ts.map +1 -0
  137. package/dist/dts/EvmPublicClient.d.ts +61 -0
  138. package/dist/dts/EvmPublicClient.d.ts.map +1 -0
  139. package/dist/dts/EvmWalletClient.d.ts +67 -0
  140. package/dist/dts/EvmWalletClient.d.ts.map +1 -0
  141. package/dist/dts/Payment.d.ts +128 -0
  142. package/dist/dts/Payment.d.ts.map +1 -0
  143. package/dist/dts/PaymentError.d.ts +21 -0
  144. package/dist/dts/PaymentError.d.ts.map +1 -0
  145. package/dist/dts/Prover.d.ts +87 -0
  146. package/dist/dts/Prover.d.ts.map +1 -0
  147. package/dist/dts/PublicClient.d.ts +146 -0
  148. package/dist/dts/PublicClient.d.ts.map +1 -0
  149. package/dist/dts/Schema.d.ts +16 -0
  150. package/dist/dts/Schema.d.ts.map +1 -0
  151. package/dist/dts/Utils.d.ts +11 -0
  152. package/dist/dts/Utils.d.ts.map +1 -0
  153. package/dist/dts/WalletClient.d.ts +123 -0
  154. package/dist/dts/WalletClient.d.ts.map +1 -0
  155. package/dist/dts/attestation.d.ts +13 -0
  156. package/dist/dts/attestation.d.ts.map +1 -0
  157. package/dist/dts/cli/commands/balance.d.ts +3 -0
  158. package/dist/dts/cli/commands/balance.d.ts.map +1 -0
  159. package/dist/dts/cli/commands/deposit.d.ts +3 -0
  160. package/dist/dts/cli/commands/deposit.d.ts.map +1 -0
  161. package/dist/dts/cli/commands/export-verifier.d.ts +3 -0
  162. package/dist/dts/cli/commands/export-verifier.d.ts.map +1 -0
  163. package/dist/dts/cli/commands/generate.d.ts +3 -0
  164. package/dist/dts/cli/commands/generate.d.ts.map +1 -0
  165. package/dist/dts/cli/commands/history.d.ts +3 -0
  166. package/dist/dts/cli/commands/history.d.ts.map +1 -0
  167. package/dist/dts/cli/commands/prove.d.ts +3 -0
  168. package/dist/dts/cli/commands/prove.d.ts.map +1 -0
  169. package/dist/dts/cli/commands/redeem.d.ts +3 -0
  170. package/dist/dts/cli/commands/redeem.d.ts.map +1 -0
  171. package/dist/dts/cli/commands/update-client.d.ts +3 -0
  172. package/dist/dts/cli/commands/update-client.d.ts.map +1 -0
  173. package/dist/dts/cli/config.d.ts +14 -0
  174. package/dist/dts/cli/config.d.ts.map +1 -0
  175. package/dist/dts/cli/utils.d.ts +11 -0
  176. package/dist/dts/cli/utils.d.ts.map +1 -0
  177. package/dist/dts/cli.d.ts +3 -0
  178. package/dist/dts/cli.d.ts.map +1 -0
  179. package/dist/dts/constants/ibc-core-registry.d.ts +11 -0
  180. package/dist/dts/constants/ibc-core-registry.d.ts.map +1 -0
  181. package/dist/dts/constants/services.d.ts +3 -0
  182. package/dist/dts/constants/services.d.ts.map +1 -0
  183. package/dist/dts/constants/z-asset-registry.d.ts +13 -0
  184. package/dist/dts/constants/z-asset-registry.d.ts.map +1 -0
  185. package/dist/dts/gen/prover_pb.d.ts +300 -0
  186. package/dist/dts/gen/prover_pb.d.ts.map +1 -0
  187. package/dist/dts/index.d.ts +21 -0
  188. package/dist/dts/index.d.ts.map +1 -0
  189. package/dist/dts/internal/evm.d.ts +250 -0
  190. package/dist/dts/internal/evm.d.ts.map +1 -0
  191. package/dist/dts/internal/evmWalletClient.d.ts +2 -0
  192. package/dist/dts/internal/evmWalletClient.d.ts.map +1 -0
  193. package/dist/dts/internal/publicClient.d.ts +2 -0
  194. package/dist/dts/internal/publicClient.d.ts.map +1 -0
  195. package/dist/dts/internal/walletClient.d.ts +2 -0
  196. package/dist/dts/internal/walletClient.d.ts.map +1 -0
  197. package/dist/dts/legacy/client.d.ts +313 -0
  198. package/dist/dts/legacy/client.d.ts.map +1 -0
  199. package/dist/dts/legacy/prover.d.ts +30 -0
  200. package/dist/dts/legacy/prover.d.ts.map +1 -0
  201. package/dist/dts/poseidon2.d.ts +18 -0
  202. package/dist/dts/poseidon2.d.ts.map +1 -0
  203. package/dist/dts/promises/Attestor.d.ts +17 -0
  204. package/dist/dts/promises/Attestor.d.ts.map +1 -0
  205. package/dist/dts/promises/EvmPublicClient.d.ts +3709 -0
  206. package/dist/dts/promises/EvmPublicClient.d.ts.map +1 -0
  207. package/dist/dts/promises/EvmWalletClient.d.ts +4502 -0
  208. package/dist/dts/promises/EvmWalletClient.d.ts.map +1 -0
  209. package/dist/dts/promises/Payment.d.ts +33 -0
  210. package/dist/dts/promises/Payment.d.ts.map +1 -0
  211. package/dist/dts/promises/Prover.d.ts +14 -0
  212. package/dist/dts/promises/Prover.d.ts.map +1 -0
  213. package/dist/dts/promises/PublicClient.d.ts +23 -0
  214. package/dist/dts/promises/PublicClient.d.ts.map +1 -0
  215. package/dist/dts/promises/WalletClient.d.ts +57 -0
  216. package/dist/dts/promises/WalletClient.d.ts.map +1 -0
  217. package/dist/dts/promises/index.d.ts +8 -0
  218. package/dist/dts/promises/index.d.ts.map +1 -0
  219. package/dist/dts/rpc.d.ts +148 -0
  220. package/dist/dts/rpc.d.ts.map +1 -0
  221. package/dist/dts/types.d.ts +263 -0
  222. package/dist/dts/types.d.ts.map +1 -0
  223. package/dist/esm/Abi.js +264 -0
  224. package/dist/esm/Abi.js.map +1 -0
  225. package/dist/esm/Attestor.js +68 -0
  226. package/dist/esm/Attestor.js.map +1 -0
  227. package/dist/esm/Constants.js +2 -0
  228. package/dist/esm/Constants.js.map +1 -0
  229. package/dist/esm/Domain.js +17 -0
  230. package/dist/esm/Domain.js.map +1 -0
  231. package/dist/esm/Error.js +89 -0
  232. package/dist/esm/Error.js.map +1 -0
  233. package/dist/esm/EvmPublicClient.js +292 -0
  234. package/dist/esm/EvmPublicClient.js.map +1 -0
  235. package/dist/esm/EvmWalletClient.js +659 -0
  236. package/dist/esm/EvmWalletClient.js.map +1 -0
  237. package/dist/esm/Payment.js +323 -0
  238. package/dist/esm/Payment.js.map +1 -0
  239. package/dist/esm/PaymentError.js +24 -0
  240. package/dist/esm/PaymentError.js.map +1 -0
  241. package/dist/esm/Prover.js +142 -0
  242. package/dist/esm/Prover.js.map +1 -0
  243. package/dist/esm/PublicClient.js +30 -0
  244. package/dist/esm/PublicClient.js.map +1 -0
  245. package/dist/esm/Schema.js +31 -0
  246. package/dist/esm/Schema.js.map +1 -0
  247. package/dist/esm/Utils.js +27 -0
  248. package/dist/esm/Utils.js.map +1 -0
  249. package/dist/esm/WalletClient.js +30 -0
  250. package/dist/esm/WalletClient.js.map +1 -0
  251. package/dist/esm/attestation.js +42 -0
  252. package/dist/esm/attestation.js.map +1 -0
  253. package/dist/esm/cli/commands/balance.js +54 -0
  254. package/dist/esm/cli/commands/balance.js.map +1 -0
  255. package/dist/esm/cli/commands/deposit.js +52 -0
  256. package/dist/esm/cli/commands/deposit.js.map +1 -0
  257. package/dist/esm/cli/commands/export-verifier.js +21 -0
  258. package/dist/esm/cli/commands/export-verifier.js.map +1 -0
  259. package/dist/esm/cli/commands/generate.js +35 -0
  260. package/dist/esm/cli/commands/generate.js.map +1 -0
  261. package/dist/esm/cli/commands/history.js +53 -0
  262. package/dist/esm/cli/commands/history.js.map +1 -0
  263. package/dist/esm/cli/commands/prove.js +76 -0
  264. package/dist/esm/cli/commands/prove.js.map +1 -0
  265. package/dist/esm/cli/commands/redeem.js +146 -0
  266. package/dist/esm/cli/commands/redeem.js.map +1 -0
  267. package/dist/esm/cli/commands/update-client.js +56 -0
  268. package/dist/esm/cli/commands/update-client.js.map +1 -0
  269. package/dist/esm/cli/config.js +26 -0
  270. package/dist/esm/cli/config.js.map +1 -0
  271. package/dist/esm/cli/utils.js +94 -0
  272. package/dist/esm/cli/utils.js.map +1 -0
  273. package/dist/esm/cli.js +22 -0
  274. package/dist/esm/cli.js.map +1 -0
  275. package/dist/esm/constants/ibc-core-registry.js +21 -0
  276. package/dist/esm/constants/ibc-core-registry.js.map +1 -0
  277. package/dist/esm/constants/services.js +3 -0
  278. package/dist/esm/constants/services.js.map +1 -0
  279. package/dist/esm/constants/z-asset-registry.js +23 -0
  280. package/dist/esm/constants/z-asset-registry.js.map +1 -0
  281. package/dist/esm/gen/prover_pb.js +74 -0
  282. package/dist/esm/gen/prover_pb.js.map +1 -0
  283. package/dist/esm/index.js +22 -0
  284. package/dist/esm/index.js.map +1 -0
  285. package/dist/esm/internal/evm.js +169 -0
  286. package/dist/esm/internal/evm.js.map +1 -0
  287. package/dist/esm/internal/evmWalletClient.js +2 -0
  288. package/dist/esm/internal/evmWalletClient.js.map +1 -0
  289. package/dist/esm/internal/publicClient.js +41 -0
  290. package/dist/esm/internal/publicClient.js.map +1 -0
  291. package/dist/esm/internal/walletClient.js +35 -0
  292. package/dist/esm/internal/walletClient.js.map +1 -0
  293. package/dist/esm/legacy/client.js +1212 -0
  294. package/dist/esm/legacy/client.js.map +1 -0
  295. package/dist/esm/legacy/prover.js +105 -0
  296. package/dist/esm/legacy/prover.js.map +1 -0
  297. package/dist/esm/package.json +4 -0
  298. package/dist/esm/poseidon2.js +218 -0
  299. package/dist/esm/poseidon2.js.map +1 -0
  300. package/dist/esm/promises/Attestor.js +14 -0
  301. package/dist/esm/promises/Attestor.js.map +1 -0
  302. package/dist/esm/promises/EvmPublicClient.js +26 -0
  303. package/dist/esm/promises/EvmPublicClient.js.map +1 -0
  304. package/dist/esm/promises/EvmWalletClient.js +43 -0
  305. package/dist/esm/promises/EvmWalletClient.js.map +1 -0
  306. package/dist/esm/promises/Payment.js +13 -0
  307. package/dist/esm/promises/Payment.js.map +1 -0
  308. package/dist/esm/promises/Prover.js +17 -0
  309. package/dist/esm/promises/Prover.js.map +1 -0
  310. package/dist/esm/promises/PublicClient.js +45 -0
  311. package/dist/esm/promises/PublicClient.js.map +1 -0
  312. package/dist/esm/promises/WalletClient.js +36 -0
  313. package/dist/esm/promises/WalletClient.js.map +1 -0
  314. package/dist/esm/promises/index.js +8 -0
  315. package/dist/esm/promises/index.js.map +1 -0
  316. package/dist/esm/rpc.js +850 -0
  317. package/dist/esm/rpc.js.map +1 -0
  318. package/dist/esm/types.js +2 -0
  319. package/dist/esm/types.js.map +1 -0
  320. package/gen/prover_pb/package.json +6 -0
  321. package/index/package.json +6 -0
  322. package/legacy/client/package.json +6 -0
  323. package/legacy/prover/package.json +6 -0
  324. package/package.json +397 -44
  325. package/poseidon2/package.json +6 -0
  326. package/promises/Attestor/package.json +6 -0
  327. package/promises/EvmPublicClient/package.json +6 -0
  328. package/promises/EvmWalletClient/package.json +6 -0
  329. package/promises/Payment/package.json +6 -0
  330. package/promises/Prover/package.json +6 -0
  331. package/promises/PublicClient/package.json +6 -0
  332. package/promises/WalletClient/package.json +6 -0
  333. package/promises/index/package.json +6 -0
  334. package/promises/package.json +6 -0
  335. package/rpc/package.json +6 -0
  336. package/src/Abi.ts +195 -0
  337. package/src/Attestor.ts +113 -0
  338. package/src/Constants.ts +4 -0
  339. package/src/Domain.ts +52 -0
  340. package/src/Error.ts +163 -0
  341. package/src/EvmPublicClient.ts +549 -0
  342. package/src/EvmWalletClient.ts +1034 -0
  343. package/src/Payment.ts +523 -0
  344. package/src/PaymentError.ts +39 -0
  345. package/src/Prover.ts +240 -0
  346. package/src/PublicClient.ts +196 -0
  347. package/src/Schema.ts +36 -0
  348. package/src/Utils.ts +43 -0
  349. package/src/WalletClient.ts +172 -0
  350. package/src/attestation.ts +69 -0
  351. package/src/cli/commands/balance.ts +88 -0
  352. package/src/cli/commands/deposit.ts +104 -0
  353. package/src/cli/commands/export-verifier.ts +28 -0
  354. package/src/cli/commands/generate.ts +86 -0
  355. package/src/cli/commands/history.ts +91 -0
  356. package/src/cli/commands/prove.ts +133 -0
  357. package/src/cli/commands/redeem.ts +277 -0
  358. package/src/cli/commands/update-client.ts +96 -0
  359. package/src/cli/config.ts +55 -0
  360. package/src/cli/utils.ts +136 -0
  361. package/src/cli.ts +31 -0
  362. package/src/constants/ibc-core-registry.ts +44 -0
  363. package/src/constants/services.ts +4 -0
  364. package/src/constants/z-asset-registry.ts +47 -0
  365. package/src/gen/prover_pb.ts +375 -0
  366. package/src/index.ts +23 -0
  367. package/src/internal/evm.ts +361 -0
  368. package/src/internal/evmWalletClient.ts +0 -0
  369. package/src/internal/publicClient.ts +57 -0
  370. package/src/internal/walletClient.ts +50 -0
  371. package/src/legacy/client.ts +1652 -0
  372. package/src/legacy/prover.ts +135 -0
  373. package/src/poseidon2.ts +246 -0
  374. package/src/promises/Attestor.ts +25 -0
  375. package/src/promises/EvmPublicClient.ts +39 -0
  376. package/src/promises/EvmWalletClient.ts +63 -0
  377. package/src/promises/Payment.ts +86 -0
  378. package/src/promises/Prover.ts +26 -0
  379. package/src/promises/PublicClient.ts +47 -0
  380. package/src/promises/WalletClient.ts +38 -0
  381. package/src/promises/index.ts +7 -0
  382. package/src/rpc.ts +994 -0
  383. package/src/types.ts +281 -0
  384. package/types/package.json +6 -0
  385. package/dist/LICENSE +0 -1
  386. package/dist/chunk-37PNLRA6.js +0 -2418
  387. package/dist/cli.cjs +0 -3031
  388. package/dist/cli.js +0 -675
  389. package/dist/index.cjs +0 -2451
  390. package/dist/index.js +0 -1
  391. package/dist/package.json +0 -18
  392. package/dist/payments.d.ts +0 -835
  393. /package/{dist → src}/tsdoc-metadata.json +0 -0
@@ -0,0 +1,1034 @@
1
+ import * as A from "effect/Array";
2
+ import * as Brand from "effect/Brand";
3
+ import * as Context from "effect/Context";
4
+ import * as Effect from "effect/Effect";
5
+ // import type * as ThirdwebAdaptersViem from "thirdweb/adapters/viem"
6
+ import { pipe } from "effect/Function";
7
+ import * as Layer from "effect/Layer";
8
+ import * as Number from "effect/Number";
9
+ import type * as P from "effect/Predicate";
10
+ import * as Ref from "effect/Ref";
11
+ import type * as Scope from "effect/Scope";
12
+ import type * as Mipd from "mipd";
13
+ import type * as Viem from "viem";
14
+ import type { Hex } from "viem";
15
+ import * as Abi from "./Abi.js";
16
+ import * as ZAssetRegistry from "./constants/z-asset-registry.js";
17
+ import * as Domain from "./Domain.js";
18
+ import * as Error from "./Error.js";
19
+ import * as EvmPublicClient from "./EvmPublicClient.js";
20
+ import * as Client from "./WalletClient.js";
21
+
22
+ /**
23
+ * @category type ids
24
+ * @since 1.0.0
25
+ */
26
+ export const TypeId: TypeId = "@unionlabs/payments/EvmWalletClient";
27
+
28
+ /**
29
+ * @category type ids
30
+ * @since 1.0.0
31
+ */
32
+ export type TypeId = "@unionlabs/payments/EvmWalletClient";
33
+
34
+ /**
35
+ * @category models
36
+ * @since 1.0.0
37
+ */
38
+ export interface EvmWalletClient extends Client.WalletClient {
39
+ readonly [TypeId]: TypeId;
40
+ readonly prepareBatchTransactionRequest: (
41
+ calls: Array<{
42
+ to: `0x${string}`;
43
+ data: `0x${string}`;
44
+ value?: bigint;
45
+ }>,
46
+ ) => Effect.Effect<Array<any>, Error.SdkError, never>;
47
+ }
48
+
49
+ /**
50
+ * @category tags
51
+ * @since 1.0.0
52
+ */
53
+ export const EvmWalletClient = Context.GenericTag<EvmWalletClient>(
54
+ "@unionlabs/payments/EvmWalletClient",
55
+ );
56
+
57
+ /**
58
+ * @category constructors
59
+ * @since 1.0.0
60
+ */
61
+ export type EvmWalletClientConfig = {};
62
+
63
+ /**
64
+ * A type-safe wrapper around viem's writeContract that handles error cases
65
+ * and returns an Effect with proper type inference. Extracts all error info
66
+ *
67
+ * @param client - The viem WalletClient to use for the contract transaction
68
+ * @param params - The parameters for the contract transaction
69
+ * @returns An Effect that resolves to the transaction hash
70
+ *
71
+ * @category utils
72
+ * @since 0.0.0
73
+ */
74
+ export const makeViem = <
75
+ transport extends Viem.Transport = Viem.Transport,
76
+ chain extends Viem.Chain | undefined = Viem.Chain | undefined,
77
+ account extends Viem.Account | undefined = Viem.Account | undefined,
78
+ rpcSchema extends Viem.RpcSchema | undefined = undefined,
79
+ >(
80
+ wallet: Viem.WalletClient<transport, chain, account, rpcSchema>,
81
+ ): Effect.Effect<EvmWalletClient, Error.SdkError, Scope.Scope> =>
82
+ Effect.gen(function* () {
83
+ const Viem = yield* Effect.tryPromise({
84
+ try: () => import("viem").then((x) => x),
85
+ catch: (cause) =>
86
+ new Error.SystemError({
87
+ reason: "DynamicImport",
88
+ method: "makeViem",
89
+ module: "EvmWalletClient",
90
+ cause,
91
+ description: "could not import viem",
92
+ }),
93
+ });
94
+
95
+ const ViemActions = yield* Effect.tryPromise({
96
+ try: () => import("viem/actions").then((x) => x),
97
+ catch: (cause) =>
98
+ new Error.SystemError({
99
+ reason: "DynamicImport",
100
+ method: "makeViemActions",
101
+ module: "EvmWalletClient",
102
+ cause,
103
+ description: "could not import viem/actions",
104
+ }),
105
+ });
106
+
107
+ const publicClient = yield* pipe(
108
+ Effect.try({
109
+ try: () =>
110
+ Viem.createPublicClient({
111
+ chain: wallet.chain,
112
+ transport: Viem.custom(wallet),
113
+ }),
114
+ catch: (cause) =>
115
+ new Error.SystemError({
116
+ reason: "DynamicImport",
117
+ method: "make",
118
+ module: "EvmWalletClient",
119
+ cause,
120
+ description: "could derive public client from wallet client",
121
+ }),
122
+ }),
123
+ Effect.flatMap((x) => EvmPublicClient.makeViem(x as unknown as any)),
124
+ );
125
+
126
+ // Use "latest" to avoid stale pending txs in mempool
127
+ const transactionCount = yield* pipe(
128
+ Effect.tryPromise({
129
+ try: () =>
130
+ ViemActions.getTransactionCount(wallet, {
131
+ address: wallet.account?.address!,
132
+ blockTag: "latest",
133
+ }),
134
+ catch: (cause) =>
135
+ new Error.SystemError({
136
+ reason: "InvalidData",
137
+ method: "encodeFunctionData",
138
+ module: "EvmWalletClient",
139
+ cause,
140
+ }),
141
+ }),
142
+ Effect.flatMap(Ref.make),
143
+ );
144
+
145
+ const encodeFunctionData = Effect.fn("encodeFunctionData")(
146
+ //<
147
+ // const abi extends Viem.Abi | readonly unknown[],
148
+ // functionName extends Viem.ContractFunctionName<abi> | undefined = undefined,
149
+ //>(
150
+ (parameters: Viem.EncodeFunctionDataParameters) =>
151
+ Effect.try({
152
+ try: () => Viem.encodeFunctionData(parameters),
153
+ catch: (cause) =>
154
+ new Error.SystemError({
155
+ reason: "InvalidData",
156
+ method: "encodeFunctionData",
157
+ module: "EvmWalletClient",
158
+ cause,
159
+ }),
160
+ }),
161
+ );
162
+
163
+ const writeContract = Effect.fn("writeContract")(
164
+ <
165
+ const abi extends Viem.Abi | readonly unknown[],
166
+ functionName extends Viem.ContractFunctionName<
167
+ abi,
168
+ "payable" | "nonpayable"
169
+ >,
170
+ args extends Viem.ContractFunctionArgs<
171
+ abi,
172
+ "payable" | "nonpayable",
173
+ functionName
174
+ >,
175
+ >(
176
+ params: Viem.WriteContractParameters<abi, functionName, args>,
177
+ ) =>
178
+ pipe(
179
+ Effect.tryPromise({
180
+ try: () => wallet.writeContract(params),
181
+ catch: (cause) =>
182
+ new Error.SystemError({
183
+ method: "writeContract",
184
+ module: "EvmWalletClient",
185
+ reason: "InvalidData",
186
+ cause,
187
+ }),
188
+ }),
189
+ Effect.map((hash) =>
190
+ Domain.SubmissionResult.viemWriteContract({
191
+ hash: Brand.nominal<Domain.TxHash>()(hash),
192
+ }),
193
+ ),
194
+ ),
195
+ );
196
+
197
+ const prepareTransactionRequest = Effect.fn("prepareTransactionRequest")(
198
+ (params: Viem.PrepareTransactionRequestParameters<chain, account>) =>
199
+ pipe(
200
+ Ref.get(transactionCount),
201
+ Effect.flatMap((nonce) =>
202
+ Effect.tryPromise({
203
+ try: () =>
204
+ wallet.prepareTransactionRequest({
205
+ ...params,
206
+ nonce,
207
+ } as unknown as any),
208
+ catch: (cause) =>
209
+ new Error.SystemError({
210
+ method: "prepareTransactionRequest",
211
+ module: "EvmWalletClient",
212
+ reason: "InvalidData",
213
+ cause,
214
+ }),
215
+ }),
216
+ ),
217
+ Effect.tap(() => Ref.update(transactionCount, Number.increment)),
218
+ ),
219
+ );
220
+
221
+ const prepareBatchTransactionRequest = Effect.fn(
222
+ "prepareBatchTransactionRequest",
223
+ )(
224
+ (
225
+ calls: Array<{
226
+ to: `0x${string}`;
227
+ data: `0x${string}`;
228
+ value?: bigint;
229
+ }>,
230
+ ) =>
231
+ Effect.gen(function* () {
232
+ // Refresh nonce from chain before batch to ensure we're in sync
233
+ const chainNonce = yield* Effect.tryPromise({
234
+ try: () =>
235
+ ViemActions.getTransactionCount(wallet, {
236
+ address: wallet.account?.address!,
237
+ blockTag: "latest",
238
+ }),
239
+ catch: (cause) =>
240
+ new Error.SystemError({
241
+ reason: "InvalidData",
242
+ method: "prepareBatchTransactionRequest",
243
+ module: "EvmWalletClient",
244
+ cause,
245
+ }),
246
+ });
247
+ yield* Ref.set(transactionCount, chainNonce);
248
+ yield* Effect.log("[prepareBatchTransactionRequest] Synced nonce", {
249
+ chainNonce,
250
+ });
251
+
252
+ const simulationResult = yield* publicClient.simulateCalls({
253
+ calls: calls.map((call) => ({
254
+ to: call.to,
255
+ data: call.data,
256
+ value: call.value,
257
+ })),
258
+ account: wallet.account?.address!,
259
+ });
260
+
261
+ yield* Effect.log(
262
+ "[prepareBatchTransactionRequest] Simulation results",
263
+ {
264
+ results: simulationResult.results,
265
+ },
266
+ );
267
+
268
+ // Extract gas estimates with 20% buffer for safety
269
+ const gasEstimates: Array<bigint | undefined> =
270
+ simulationResult.results?.map(
271
+ (r: { gasUsed?: bigint | number | string }) =>
272
+ r?.gasUsed ? (BigInt(r.gasUsed) * 120n) / 100n : undefined,
273
+ ) ?? [];
274
+
275
+ yield* Effect.log("[prepareBatchTransactionRequest] Gas estimates", {
276
+ gasEstimates,
277
+ });
278
+
279
+ // Prepare each transaction with gas
280
+ const prepared: Array<any> = [];
281
+ for (let i = 0; i < calls.length; i++) {
282
+ const call = calls[i];
283
+ const gas = gasEstimates[i];
284
+ const nonce = yield* Ref.get(transactionCount);
285
+
286
+ const request = yield* Effect.tryPromise({
287
+ try: () =>
288
+ wallet.prepareTransactionRequest({
289
+ to: call.to,
290
+ data: call.data,
291
+ ...(call.value !== undefined && { value: call.value }),
292
+ ...(gas !== undefined && { gas }),
293
+ nonce,
294
+ chain: wallet.chain,
295
+ } as unknown as any),
296
+ catch: (cause) =>
297
+ new Error.SystemError({
298
+ method: "prepareBatchTransactionRequest",
299
+ module: "EvmWalletClient",
300
+ reason: "InvalidData",
301
+ cause,
302
+ }),
303
+ });
304
+
305
+ yield* Ref.update(transactionCount, Number.increment);
306
+ prepared.push(request);
307
+ }
308
+
309
+ return prepared;
310
+ }),
311
+ );
312
+
313
+ const signTransaction = Effect.fn("signTransaction")(
314
+ (params: Viem.SignTransactionParameters<chain, account>) =>
315
+ Effect.tryPromise({
316
+ try: () => wallet.signTransaction(params),
317
+ catch: (cause) =>
318
+ new Error.SystemError({
319
+ method: "signTransaction",
320
+ module: "EvmWalletClient",
321
+ reason: "InvalidData",
322
+ cause,
323
+ }),
324
+ }),
325
+ );
326
+
327
+ const sendRawTransaction = Effect.fn("sendRawTransaction")(
328
+ (params: Viem.SendRawTransactionParameters) =>
329
+ Effect.tryPromise({
330
+ try: () => wallet.sendRawTransaction(params),
331
+ catch: (cause) =>
332
+ new Error.SystemError({
333
+ method: "sendRawTransaction",
334
+ module: "EvmWalletClient",
335
+ reason: "InvalidData",
336
+ cause,
337
+ }),
338
+ }),
339
+ );
340
+
341
+ const sign = Effect.fn("sign")((request: Domain.PreparedRequest) =>
342
+ pipe(
343
+ request,
344
+ Effect.liftPredicate(
345
+ Domain.PreparedRequest.$is("viem"),
346
+ (cause) =>
347
+ new Error.SystemError({
348
+ method: "sign",
349
+ module: "EvmWalletClient",
350
+ reason: "InvalidData",
351
+ cause,
352
+ }),
353
+ ),
354
+ Effect.map((x) => x.request),
355
+ Effect.flatMap((value) =>
356
+ signTransaction({
357
+ ...value,
358
+ account: wallet.account!,
359
+ chain: wallet.chain!,
360
+ }),
361
+ ),
362
+ Effect.map((value) =>
363
+ Domain.SignedRequest.viem({ value: value as unknown as any }),
364
+ ),
365
+ ),
366
+ );
367
+
368
+ const submit = Effect.fn("submit")((request: Domain.SignedRequest) =>
369
+ pipe(
370
+ request,
371
+ Effect.liftPredicate(
372
+ Domain.SignedRequest.$is("viem"),
373
+ (cause) =>
374
+ new Error.SystemError({
375
+ method: "submit",
376
+ module: "EvmWalletClient",
377
+ reason: "InvalidData",
378
+ cause,
379
+ }),
380
+ ),
381
+ Effect.map((x) => x.value),
382
+ Effect.flatMap((serializedTransaction) =>
383
+ sendRawTransaction({ serializedTransaction }),
384
+ ),
385
+ Effect.map((hash) =>
386
+ Domain.SubmissionResult.viemWriteContract({
387
+ hash: Brand.nominal<Domain.TxHash>()(hash),
388
+ }),
389
+ ),
390
+ ),
391
+ );
392
+
393
+ const signAndSubmit = Effect.fn("signAndSubmit")(
394
+ (request: Domain.PreparedRequest) =>
395
+ pipe(
396
+ request,
397
+ Effect.liftPredicate(
398
+ Domain.PreparedRequest.$is("viem"),
399
+ (cause) =>
400
+ new Error.SystemError({
401
+ method: "signAndSubmit",
402
+ module: "EvmWalletClient",
403
+ reason: "InvalidData",
404
+ cause,
405
+ }),
406
+ ),
407
+ Effect.flatMap((prepared) =>
408
+ Effect.tryPromise({
409
+ try: () =>
410
+ ViemActions.sendTransaction(wallet, {
411
+ to: prepared.request.to,
412
+ data: prepared.request.data,
413
+ value: prepared.request.value,
414
+ gas: prepared.request.gas,
415
+ nonce: prepared.request.nonce,
416
+ account: wallet.account!,
417
+ chain: wallet.chain!,
418
+ } as unknown as any),
419
+ catch: (cause) =>
420
+ new Error.SystemError({
421
+ method: "signAndSubmit",
422
+ module: "EvmWalletClient",
423
+ reason: "InvalidData",
424
+ cause,
425
+ }),
426
+ }),
427
+ ),
428
+ Effect.map((hash) =>
429
+ Domain.SubmissionResult.viemWriteContract({
430
+ hash: Brand.nominal<Domain.TxHash>()(hash),
431
+ }),
432
+ ),
433
+ ),
434
+ );
435
+
436
+ // TODO: check if required
437
+ const approveZAssetToSpendErc20 = Effect.fn("approveZAssetToSpendErc20")(
438
+ function* (args: Client.WalletClient.ApproveZAssetToSpendErc20) {
439
+ return yield* pipe(
440
+ // XXX: fix hardcoded chainid
441
+ ZAssetRegistry.getZAsset(8453n, args.srcErc20Address),
442
+ Effect.mapError(
443
+ (cause) =>
444
+ new Error.SystemError({
445
+ method: "approveZAssetToSpendErc20",
446
+ module: "EvmWalletClient",
447
+ reason: "InvalidData",
448
+ cause,
449
+ }),
450
+ ),
451
+ Effect.flatMap((zAsset) =>
452
+ encodeFunctionData({
453
+ abi: Abi.ERC20_ABI,
454
+ functionName: "approve",
455
+ args: [zAsset, args.amount],
456
+ }),
457
+ ),
458
+ Effect.flatMap((data) =>
459
+ prepareTransactionRequest({
460
+ to: args.srcErc20Address,
461
+ data,
462
+ chain: wallet.chain,
463
+ }),
464
+ ),
465
+ Effect.map((request) =>
466
+ Domain.PreparedRequest.viem({
467
+ request: request as unknown as any,
468
+ kind: "approval",
469
+ }),
470
+ ),
471
+ );
472
+ },
473
+ );
474
+
475
+ // TODO: check if required
476
+ const updateLoopbackClient = Effect.fn("updateLoopbackClient")(function* ({
477
+ clientId,
478
+ height,
479
+ ibcHandlerAddress,
480
+ }: Client.WalletClient.UpdateLoopbackClient) {
481
+ // const publicClient = Viem.createPublicClient({
482
+ // transport: Viem.http(wallet.transport.rpcUrl),
483
+ // });
484
+
485
+ const publicClient = wallet.extend(Viem.publicActions);
486
+
487
+ const blockNumber = height;
488
+
489
+ const block = yield* Effect.tryPromise({
490
+ try: () => publicClient.getBlock({ blockNumber }),
491
+ catch: (cause) =>
492
+ new Error.SystemError({
493
+ module: "EvmWalletClient",
494
+ method: "updateLoopbackClient",
495
+ reason: "InvalidData",
496
+ description: "Cannot getBlockNumber",
497
+ cause,
498
+ }),
499
+ });
500
+
501
+ // if (!block.number) {
502
+ // throw new Error("Block number is null");
503
+ // }
504
+
505
+ // Helper to convert bigint/number to minimal RLP hex encoding
506
+ const toRlpHex = (value: bigint | number | null | undefined): Hex => {
507
+ if (
508
+ value === undefined ||
509
+ value === null ||
510
+ value === 0n ||
511
+ value === 0
512
+ ) {
513
+ return "0x" as Hex;
514
+ }
515
+ let hex =
516
+ typeof value === "bigint" ? value.toString(16) : value.toString(16);
517
+ if (hex.length % 2 !== 0) {
518
+ hex = "0" + hex;
519
+ }
520
+ return `0x${hex}` as Hex;
521
+ };
522
+
523
+ // Build header fields in order (pre-merge + post-merge fields)
524
+ const headerFields: (Hex | Hex[])[] = [
525
+ block.parentHash,
526
+ block.sha3Uncles,
527
+ block.miner,
528
+ block.stateRoot,
529
+ block.transactionsRoot,
530
+ block.receiptsRoot,
531
+ block.logsBloom ?? (("0x" + "00".repeat(256)) as Hex),
532
+ toRlpHex(block.difficulty),
533
+ toRlpHex(block.number),
534
+ toRlpHex(block.gasLimit),
535
+ toRlpHex(block.gasUsed),
536
+ toRlpHex(block.timestamp),
537
+ block.extraData,
538
+ block.mixHash ??
539
+ ("0x0000000000000000000000000000000000000000000000000000000000000000" as Hex),
540
+ block.nonce ?? ("0x0000000000000000" as Hex),
541
+ ];
542
+
543
+ // Post-merge fields
544
+ if (block.baseFeePerGas !== undefined && block.baseFeePerGas !== null) {
545
+ headerFields.push(toRlpHex(block.baseFeePerGas));
546
+ }
547
+ if (block.withdrawalsRoot) {
548
+ headerFields.push(block.withdrawalsRoot);
549
+ }
550
+ if (block.blobGasUsed !== undefined && block.blobGasUsed !== null) {
551
+ headerFields.push(toRlpHex(block.blobGasUsed));
552
+ }
553
+ if (block.excessBlobGas !== undefined && block.excessBlobGas !== null) {
554
+ headerFields.push(toRlpHex(block.excessBlobGas));
555
+ }
556
+ if (block.parentBeaconBlockRoot) {
557
+ headerFields.push(block.parentBeaconBlockRoot);
558
+ }
559
+ const blockAny = block as Record<string, unknown>;
560
+ if (blockAny.requestsHash) {
561
+ headerFields.push(blockAny.requestsHash as Hex);
562
+ }
563
+
564
+ const rlpEncoded = Viem.toRlp(headerFields);
565
+
566
+ // Verify the encoding produces the correct block hash
567
+ const computedHash = Viem.keccak256(rlpEncoded);
568
+ if (computedHash !== block.hash) {
569
+ return yield* new Error.SystemError({
570
+ module: "EvmWalletClient",
571
+ method: "updateLooopbackClient",
572
+ reason: "InvalidData",
573
+ description: `RLP encoding mismatch: computed hash ${computedHash} does not match block hash ${block.hash}`,
574
+ });
575
+ }
576
+
577
+ // Encode the Header struct: (uint64 height, bytes encodedHeader)
578
+ const clientMessage = Viem.encodeAbiParameters(
579
+ [
580
+ { type: "uint64", name: "height" },
581
+ { type: "bytes", name: "encodedHeader" },
582
+ ],
583
+ [block.number, rlpEncoded],
584
+ );
585
+
586
+ const LIGHTCLIENT_ABI = [
587
+ {
588
+ inputs: [
589
+ { name: "caller", type: "address" },
590
+ { name: "clientId", type: "uint32" },
591
+ { name: "clientMessage", type: "bytes" },
592
+ { name: "relayer", type: "address" },
593
+ ],
594
+ name: "updateClient",
595
+ outputs: [],
596
+ stateMutability: "nonpayable",
597
+ type: "function",
598
+ },
599
+ ] as const;
600
+
601
+ // Wait for the next block so the fetched block's hash is verifiable on-chain
602
+ let currentBlock = yield* Effect.tryPromise({
603
+ try: () => publicClient.getBlockNumber(),
604
+ catch: (cause) =>
605
+ new Error.SystemError({
606
+ module: "EvmWalletClient",
607
+ method: "updateLoopbackClient",
608
+ reason: "InvalidData",
609
+ description: "Cannot getBlockNumber",
610
+ cause,
611
+ }),
612
+ });
613
+
614
+ while (currentBlock <= blockNumber) {
615
+ yield* Effect.sleep("1 second");
616
+ currentBlock = yield* Effect.tryPromise({
617
+ try: () => publicClient.getBlockNumber(),
618
+ catch: (cause) =>
619
+ new Error.SystemError({
620
+ module: "EvmWalletClient",
621
+ method: "updateLoopbackClient",
622
+ reason: "InvalidData",
623
+ description: "Cannot getBlockNumber",
624
+ cause,
625
+ }),
626
+ });
627
+ }
628
+
629
+ const loopbackClient = yield* Effect.tryPromise({
630
+ try: () =>
631
+ publicClient.readContract({
632
+ address: ibcHandlerAddress,
633
+ abi: Abi.IBC_STORE_ABI,
634
+ functionName: "getClient",
635
+ args: [clientId],
636
+ }),
637
+ catch: (cause) =>
638
+ new Error.SystemError({
639
+ module: "EvmWalletClient",
640
+ method: "updateLoopbackClient",
641
+ reason: "InvalidData",
642
+ description: "cannot get client given ibc handler address",
643
+ cause,
644
+ }),
645
+ });
646
+
647
+ return yield* pipe(
648
+ encodeFunctionData({
649
+ abi: LIGHTCLIENT_ABI,
650
+ functionName: "updateClient",
651
+ args: [
652
+ wallet.account!.address,
653
+ clientId,
654
+ clientMessage,
655
+ wallet.account!.address,
656
+ ],
657
+ }),
658
+ Effect.flatMap((data) =>
659
+ prepareTransactionRequest({
660
+ to: loopbackClient,
661
+ data,
662
+ chain: wallet.chain,
663
+ }),
664
+ ),
665
+ Effect.map((request) =>
666
+ Domain.PreparedRequest.viem({
667
+ request: request as unknown as any,
668
+ kind: "transfer",
669
+ }),
670
+ ),
671
+ );
672
+ });
673
+
674
+ const depositUnderlyingZAsset = Effect.fn("depositUnderlyingZAsset")(
675
+ function* (args: Client.WalletClient.DepositUnderlyingZAsset) {
676
+ const zAssetAddr = yield* ZAssetRegistry.getZAsset(
677
+ 8453n,
678
+ args.srcErc20Address,
679
+ ).pipe(
680
+ Effect.mapError(
681
+ (cause) =>
682
+ new Error.SystemError({
683
+ method: "depositUnderlyingZAsset",
684
+ module: "EvmWalletClient",
685
+ reason: "InvalidData",
686
+ cause,
687
+ }),
688
+ ),
689
+ );
690
+
691
+ return yield* pipe(
692
+ encodeFunctionData({
693
+ abi: Abi.ZASSET_ABI,
694
+ functionName: "deposit",
695
+ args: [args.amount],
696
+ }),
697
+ Effect.flatMap((data) =>
698
+ prepareTransactionRequest({
699
+ to: zAssetAddr,
700
+ data,
701
+ chain: wallet.chain,
702
+ }),
703
+ ),
704
+ Effect.map((request) =>
705
+ Domain.PreparedRequest.viem({
706
+ request: request as unknown as any,
707
+ kind: "deposit",
708
+ }),
709
+ ),
710
+ );
711
+ },
712
+ );
713
+
714
+ const transferZAsset = Effect.fn("transferZAsset")(function* (
715
+ args: Client.WalletClient.TransferZAsset,
716
+ ) {
717
+ const zAssetAddr = yield* ZAssetRegistry.getZAsset(
718
+ 8453n,
719
+ args.srcErc20Address,
720
+ ).pipe(
721
+ Effect.mapError(
722
+ (cause) =>
723
+ new Error.SystemError({
724
+ method: "transferZAsset",
725
+ module: "EvmWalletClient",
726
+ reason: "InvalidData",
727
+ cause,
728
+ }),
729
+ ),
730
+ );
731
+
732
+ return yield* pipe(
733
+ encodeFunctionData({
734
+ abi: Abi.ZASSET_ABI,
735
+ functionName: "transfer",
736
+ args: [args.depositAddress, args.amount],
737
+ }),
738
+ Effect.flatMap((data) =>
739
+ prepareTransactionRequest({
740
+ to: zAssetAddr,
741
+ data,
742
+ chain: wallet.chain,
743
+ }),
744
+ ),
745
+ Effect.map((request) =>
746
+ Domain.PreparedRequest.viem({
747
+ request: request as unknown as any,
748
+ kind: "transfer",
749
+ }),
750
+ ),
751
+ );
752
+ });
753
+
754
+ const prepareDeposit = Effect.fn("prepareDeposit")(function* (
755
+ args: Client.WalletClient.Deposit,
756
+ ) {
757
+ const zAssetAddress =
758
+ ZAssetRegistry.Z_ASSET_REGISTRY[`${args.sourceChainId}`][
759
+ args.srcErc20Address
760
+ ];
761
+
762
+ if (!zAssetAddress) {
763
+ return yield* new Error.SystemError({
764
+ method: "deposit",
765
+ module: "PaymentClient",
766
+ reason: "InvalidData",
767
+ description: `No zAsset found for ${args.srcErc20Address} on chain ${args.sourceChainId}`,
768
+ });
769
+ }
770
+
771
+ const [approvalData, depositData, transferData] = yield* Effect.all(
772
+ [
773
+ encodeFunctionData({
774
+ abi: Abi.ERC20_ABI,
775
+ functionName: "approve",
776
+ args: [zAssetAddress, args.amount],
777
+ }),
778
+ encodeFunctionData({
779
+ abi: Abi.ZASSET_ABI,
780
+ functionName: "deposit",
781
+ args: [args.amount],
782
+ }),
783
+ encodeFunctionData({
784
+ abi: Abi.ZASSET_ABI,
785
+ functionName: "transfer",
786
+ args: [args.depositAddress, args.amount],
787
+ }),
788
+ ] as const,
789
+ { concurrency: "unbounded" },
790
+ );
791
+
792
+ const preparedTxs = yield* prepareBatchTransactionRequest([
793
+ { to: args.srcErc20Address, data: approvalData },
794
+ { to: zAssetAddress, data: depositData },
795
+ { to: zAssetAddress, data: transferData },
796
+ ]);
797
+
798
+ const approval = Domain.PreparedRequest.viem({
799
+ request: preparedTxs[0],
800
+ kind: "approval",
801
+ });
802
+ const deposit = Domain.PreparedRequest.viem({
803
+ request: preparedTxs[1],
804
+ kind: "deposit",
805
+ });
806
+ const transfer = Domain.PreparedRequest.viem({
807
+ request: preparedTxs[2],
808
+ kind: "transfer",
809
+ });
810
+
811
+ yield* Effect.log("[deposit]", { approval, deposit, transfer });
812
+
813
+ return <Domain.PreparedRequests>[approval, deposit, transfer];
814
+ });
815
+
816
+ const prepareRedemption = Effect.fn("prepareRedemption")(function* (
817
+ args: Client.WalletClient.Redeem,
818
+ ) {
819
+ const zAssetAddr = yield* ZAssetRegistry.getZAsset(
820
+ 8453n,
821
+ args.dstErc20Address,
822
+ ).pipe(
823
+ Effect.mapError(
824
+ (cause) =>
825
+ new Error.SystemError({
826
+ method: "transferZAsset",
827
+ module: "EvmWalletClient",
828
+ reason: "InvalidData",
829
+ cause,
830
+ }),
831
+ ),
832
+ );
833
+ return yield* pipe(
834
+ encodeFunctionData({
835
+ abi: Abi.ZASSET_ABI,
836
+ functionName: "redeem",
837
+ args: [
838
+ args.proof,
839
+ args.commitments,
840
+ args.commitmentPok,
841
+ args.lightClients,
842
+ args.nullifier,
843
+ args.value,
844
+ args.beneficiary,
845
+ args.attestedMessage,
846
+ args.signature,
847
+ args.unwrap ?? true,
848
+ ],
849
+ }),
850
+ Effect.flatMap((data) =>
851
+ prepareTransactionRequest({
852
+ to: zAssetAddr,
853
+ data,
854
+ chain: wallet.chain,
855
+ }),
856
+ ),
857
+ Effect.map((request) =>
858
+ Domain.PreparedRequest.viem({
859
+ request: request as unknown as any,
860
+ kind: "approval",
861
+ }),
862
+ ),
863
+ );
864
+ });
865
+
866
+ return Object.assign(
867
+ yield* Client.make({
868
+ sign,
869
+ submit,
870
+ approveZAssetToSpendErc20,
871
+ updateLoopbackClient,
872
+ depositUnderlyingZAsset,
873
+ transferZAsset,
874
+ prepareDeposit,
875
+ prepareRedemption,
876
+ signAndSubmit,
877
+ }),
878
+ {
879
+ [TypeId]: TypeId as TypeId,
880
+ signTransaction,
881
+ sendRawTransaction,
882
+ writeContract,
883
+ prepareBatchTransactionRequest,
884
+ },
885
+ );
886
+ });
887
+
888
+ /**
889
+ * @category layers
890
+ * @since 1.0.0
891
+ */
892
+ export const layerFromViem = (
893
+ config: Viem.WalletClient,
894
+ ): Layer.Layer<EvmWalletClient | Client.WalletClient, Error.SdkError> =>
895
+ Layer.scopedContext(
896
+ Effect.map(makeViem(config), (client) =>
897
+ Context.make(EvmWalletClient, client).pipe(
898
+ Context.add(Client.WalletClient, client),
899
+ ),
900
+ ),
901
+ );
902
+
903
+ const makeBrowser = Effect.fn(function* (options: {
904
+ providerPredicate: P.Predicate<Mipd.EIP6963ProviderDetail>;
905
+ accountPredicate: P.Predicate<`0x${string}`>;
906
+ }) {
907
+ const Mipd = yield* Effect.tryPromise({
908
+ try: () => import("mipd").then((x) => x),
909
+ catch: (cause) =>
910
+ new Error.SystemError({
911
+ reason: "DynamicImport",
912
+ method: "makeBrowser",
913
+ module: "EvmWalletClient",
914
+ cause,
915
+ description: "could not import mipd",
916
+ }),
917
+ });
918
+
919
+ const store = Mipd.createStore();
920
+ yield* Effect.log({ store });
921
+
922
+ const providers = store.getProviders();
923
+ yield* Effect.log({ providers });
924
+
925
+ const selected = yield* pipe(
926
+ A.findFirst(providers, options.providerPredicate),
927
+ Effect.mapError(
928
+ (cause) =>
929
+ new Error.SystemError({
930
+ reason: "DynamicImport",
931
+ method: "makeBrowser",
932
+ module: "EvmWalletClient",
933
+ cause,
934
+ description: "could not find provider",
935
+ }),
936
+ ),
937
+ );
938
+ yield* Effect.log({ selected });
939
+
940
+ const account = yield* pipe(
941
+ Effect.tryPromise({
942
+ try: () => selected.provider.request({ method: "eth_requestAccounts" }),
943
+ catch: (cause) =>
944
+ new Error.SystemError({
945
+ reason: "DynamicImport",
946
+ method: "makeBrowser",
947
+ module: "EvmWalletClient",
948
+ cause,
949
+ description: "could not request accounts",
950
+ }),
951
+ }),
952
+ Effect.flatMap(A.findFirst(options.accountPredicate)),
953
+ Effect.catchTag(
954
+ "NoSuchElementException",
955
+ (cause) =>
956
+ new Error.SystemError({
957
+ reason: "DynamicImport",
958
+ method: "makeBrowser",
959
+ module: "EvmWalletClient",
960
+ cause,
961
+ description: "could not match account by predicate",
962
+ }),
963
+ ),
964
+ );
965
+
966
+ const Viem = yield* Effect.tryPromise({
967
+ try: () => import("viem").then((x) => x),
968
+ catch: (cause) =>
969
+ new Error.SystemError({
970
+ reason: "DynamicImport",
971
+ method: "makeViem",
972
+ module: "EvmWalletClient",
973
+ cause,
974
+ description: "could not import viem",
975
+ }),
976
+ });
977
+
978
+ const ViemChains = yield* Effect.tryPromise({
979
+ try: () => import("viem/chains").then((x) => x),
980
+ catch: (cause) =>
981
+ new Error.SystemError({
982
+ reason: "DynamicImport",
983
+ method: "makeViem",
984
+ module: "EvmWalletClient",
985
+ cause,
986
+ description: "could not import viem/chains",
987
+ }),
988
+ });
989
+
990
+ const wallet = yield* Effect.try({
991
+ try: () =>
992
+ Viem.createWalletClient({
993
+ account: account,
994
+ chain: ViemChains.base,
995
+ transport: Viem.custom(selected.provider),
996
+ }),
997
+ catch: (cause) =>
998
+ new Error.SystemError({
999
+ reason: "DynamicImport",
1000
+ method: "makeViem",
1001
+ module: "EvmWalletClient",
1002
+ cause,
1003
+ description: "could not import viem/chains",
1004
+ }),
1005
+ });
1006
+
1007
+ return layerFromViem(wallet);
1008
+ });
1009
+
1010
+ // export const makeThirdweb = Effect.fn(function* (...options: Parameters<typeof ThirdwebAdaptersViem['viemAdapter']['wallet']['toViem']>) {
1011
+ // const { viemAdapter } = yield* Effect.tryPromise({
1012
+ // try: () => import("thirdweb/adapters/viem"),
1013
+ // catch: (cause) => new Error.SystemError({
1014
+ // method: "makeThirdweb",
1015
+ // module: "EvmWalletClient",
1016
+ // reason: "DynamicImport",
1017
+ // cause,
1018
+ // })
1019
+ // })
1020
+
1021
+ // const wallet = viemAdapter.wallet.toViem(...options)
1022
+
1023
+ // return layerFromViem(wallet as Viem.WalletClient)
1024
+ // })
1025
+
1026
+ /**
1027
+ * @category layers
1028
+ * @since 1.0.0
1029
+ */
1030
+ export const layerFromBrowser = (options: {
1031
+ providerPredicate: P.Predicate<Mipd.EIP6963ProviderDetail>;
1032
+ accountPredicate: P.Predicate<`0x${string}`>;
1033
+ }): Layer.Layer<EvmWalletClient | Client.WalletClient, Error.SdkError> =>
1034
+ Layer.unwrapScoped(makeBrowser(options));