@laceio/sdk 0.1.1-canary.2 → 0.1.1

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 (386) hide show
  1. package/dist/{TransactionBuilder-CCjOn7NA.cjs → TransactionBuilder-DrB3NVTi.cjs} +0 -42
  2. package/dist/{TransactionBuilder-CIzdw18M.js → TransactionBuilder-V6aLx4SV.js} +1 -1
  3. package/dist/{_polyfill-buffer-patch-CM8X7JiY.cjs → _polyfill-buffer-patch-BnPVerlG.cjs} +2 -21
  4. package/dist/account-guards.stable-B1DSSh9D.cjs +10 -0
  5. package/dist/account-guards.stable-JRQ5qx2V.js +5 -0
  6. package/dist/{activity-type-Ch6ljxBy.cjs → activity-type.stable-BJEfeLxL.cjs} +1 -2
  7. package/dist/{activity-type-GsJGWs-3.js → activity-type.stable-C76_hWd7.js} +1 -2
  8. package/dist/{address-book-address-validator-ByIZOdO-.js → address-book-address-validator-DIUolI-s.js} +2 -2
  9. package/dist/{address-book-address-validator-BjOWerRE.cjs → address-book-address-validator-DNwQGlOB.cjs} +2 -2
  10. package/dist/bitcoin.cjs +0 -45
  11. package/dist/bitcoin.d.ts +1 -29782
  12. package/dist/bitcoin.js +0 -20
  13. package/dist/{blockfrost-tx-submit-provider-CLNQ5ycR.cjs → blockfrost-tx-submit-provider-BAIzV5o3.cjs} +167 -3
  14. package/dist/{blockfrost-tx-submit-provider-CBWQ0wK9.js → blockfrost-tx-submit-provider-DPTrapz-.js} +157 -5
  15. package/dist/{secret-box-DrjLZuS1.cjs → bytes.vo-Ck5u40RA.cjs} +35 -1
  16. package/dist/{secret-box-DUR0ACYz.js → bytes.vo-TgiwogWF.js} +25 -3
  17. package/dist/{cardano-network-id.vo-wfLiAxpY.js → cardano-network-id.vo-CK1tNQDg.js} +1 -1
  18. package/dist/{cardano-network-id.vo-BEvFd_74.cjs → cardano-network-id.vo-DSxrFk9S.cjs} +1 -1
  19. package/dist/cardano.cjs +18 -22
  20. package/dist/cardano.d.ts +3982 -18409
  21. package/dist/cardano.js +11 -16
  22. package/dist/codecs-B7X9pAsK.cjs +1945 -0
  23. package/dist/codecs-CC1Xjntz.js +1882 -0
  24. package/dist/{const-oMF-TLow.cjs → const-BDEg2Trq.cjs} +4 -4
  25. package/dist/{const-iwzZEE_w.cjs → const-BY8B3_0_.cjs} +1 -1
  26. package/dist/{const-CBGn60yu.js → const-C84qHkjp.js} +4 -4
  27. package/dist/{const-CjmfjBP3.js → const-DXk2tFyv.js} +1 -1
  28. package/dist/{delegation-tx-builder-BR6bt1fE.js → delegation-tx-builder-CGVqlaFE.js} +5 -5
  29. package/dist/{delegation-tx-builder-DVwGfiV0.cjs → delegation-tx-builder-CRpLP6jH.cjs} +6 -6
  30. package/dist/{deregistration-tx-builder-BhJRGj1M.js → deregistration-tx-builder-B-CrUyX6.js} +5 -5
  31. package/dist/{deregistration-tx-builder-Cv_09HGf.cjs → deregistration-tx-builder-DZGwB4cz.cjs} +6 -6
  32. package/dist/{earn-rewards-tx-builder-RYzKsZ6-.js → earn-rewards-tx-builder-BDbTDZmD.js} +5 -5
  33. package/dist/{earn-rewards-tx-builder-52gJiJYa.cjs → earn-rewards-tx-builder-D5sUT5v8.cjs} +6 -6
  34. package/dist/{group-cardano-addresses-by-account-D06r7daZ.cjs → group-cardano-addresses-by-account-B533oVXR.cjs} +35 -19
  35. package/dist/{group-cardano-addresses-by-account-CxCqFDrX.js → group-cardano-addresses-by-account-RHKoEskR.js} +35 -19
  36. package/dist/{guarded-transaction-signer-BhnTBjf6.cjs → guarded-transaction-signer-Bxl6_XNd.cjs} +18 -17
  37. package/dist/{guarded-transaction-signer-BSEx83R-.js → guarded-transaction-signer-CpKLj8Kp.js} +15 -8
  38. package/dist/{in-memory-wallet-integration-CH4rcg92.cjs → in-memory-wallet-integration-CnLYeX4-.cjs} +108 -17
  39. package/dist/{in-memory-wallet-integration-BKu985Jz.js → in-memory-wallet-integration-Croiuopx.js} +104 -7
  40. package/dist/{in-memory-wallet-integration-B0blZBxM.js → in-memory-wallet-integration-D-qn65Kx.js} +2 -5
  41. package/dist/{in-memory-wallet-integration-CwPCDMIe.cjs → in-memory-wallet-integration-DVh9sRXa.cjs} +2 -3
  42. package/dist/index.cjs +47 -84
  43. package/dist/index.d.ts +13618 -40268
  44. package/dist/index.js +24 -52
  45. package/dist/{init-DUF4ar8P.cjs → init-B64zCLxG.cjs} +4 -4
  46. package/dist/{init-Y3mkB4XS.js → init-BAJJzBza.js} +2 -2
  47. package/dist/{init-BTzOjA8x.cjs → init-BJVU54pI.cjs} +1 -1
  48. package/dist/{init-D6BxBs7e.cjs → init-BKhH6mVR.cjs} +1 -1
  49. package/dist/{init-EP0CUWNK.cjs → init-BsCBAGWf.cjs} +2 -2
  50. package/dist/{init-Dy-05ktr.cjs → init-BtzMZ7Pk.cjs} +1 -1
  51. package/dist/init-Bv53hpLM.js +19 -0
  52. package/dist/{init-BopV9ed4.cjs → init-C-jErzp5.cjs} +2 -2
  53. package/dist/{init-CjT-WZcW.cjs → init-C4Bkib9u.cjs} +59 -49
  54. package/dist/{init-BEjCRHxU.cjs → init-C7IeJwQR.cjs} +61 -258
  55. package/dist/{init-C-G32J12.cjs → init-CB__aLD7.cjs} +2 -2
  56. package/dist/{init-CyAY4Lzl.js → init-CFYsq82V.js} +1 -1
  57. package/dist/{init-0zzs9aqU.js → init-CLHuAMB-.js} +4 -4
  58. package/dist/{init-DA7zmptx.js → init-CNLGJJRx.js} +1 -1
  59. package/dist/{init-B-YE57gg.js → init-CR6tpw1B.js} +33 -25
  60. package/dist/init-CRbjI7p1.js +3494 -0
  61. package/dist/{init-CSDpdu0Q.cjs → init-CSHwHnfg.cjs} +2 -2
  62. package/dist/{init-CNM5m7M2.js → init-Cg9XdAru.js} +4 -4
  63. package/dist/{init-B3-1ghyx.js → init-CigestoM.js} +2 -2
  64. package/dist/{init-Dv3zKj0r.cjs → init-D6DBUsD3.cjs} +4 -4
  65. package/dist/init-DAna1KCg.cjs +3495 -0
  66. package/dist/{init-D74mn8nH2.js → init-DDdhguVC.js} +2 -2
  67. package/dist/init-DGe47B22.cjs +364 -0
  68. package/dist/init-DMtyvYfC.cjs +21 -0
  69. package/dist/{init-BrdVzxei.cjs → init-DX4WyB0R.cjs} +3 -3
  70. package/dist/{init-C8URA2OX.js → init-DcYY6zMD.js} +1 -1
  71. package/dist/{init-DFMiP2ZH.cjs → init-DkIc5nqF.cjs} +1 -1
  72. package/dist/{init-vqxOQNZi.js → init-Dku4b2lG.js} +1 -1
  73. package/dist/{init-NdhG_VrF.cjs → init-DxUHsN53.cjs} +6 -6
  74. package/dist/{init-COMH3Hfo.js → init-FMGDET-9.js} +60 -259
  75. package/dist/{init-DrkOb-wd.cjs → init-LfyMo-sS.cjs} +2 -2
  76. package/dist/{init-NCjgwCZy.js → init-Rxohwpmu.js} +2 -2
  77. package/dist/init-TkPDD750.js +363 -0
  78. package/dist/{init-C2RgrfZe.js → init-TkPq_Ny_.js} +1 -1
  79. package/dist/{init-5KcGcBb5.cjs → init-U8c9yHYx.cjs} +1 -1
  80. package/dist/{init-CX0AMQUn.js → init-aJHl-7AO.js} +2 -2
  81. package/dist/{init-rmt7-fQE.cjs → init-anYu6XB7.cjs} +2 -2
  82. package/dist/{init-Fw89ZmrR.js → init-w9GEs73W.js} +2 -2
  83. package/dist/{init-Dnsv155v.js → init-y2Ra0vZP.js} +3 -3
  84. package/dist/{init-DFjT8YvT.js → init-zSzCjoor.js} +4 -4
  85. package/dist/{is-retriable-error-BUiVJDwH.js → is-retriable-error-BU0e3hVI.js} +1 -1
  86. package/dist/{is-retriable-error-Dpt860if.cjs → is-retriable-error-CeeuHqDa.cjs} +1 -1
  87. package/dist/{lace-context-BZciB9c7.js → lace-context-CZcNHr4M.js} +4 -4
  88. package/dist/{lace-context-DgR6vLli.cjs → lace-context-fJTDghdp.cjs} +4 -4
  89. package/dist/{libsodium-wrappers-BhbOA8dQ.js → libsodium-wrappers-UH0LaOUE.js} +1647 -3
  90. package/dist/modules-cardano-BDvuL4Xx.js +5248 -0
  91. package/dist/modules-cardano-D2G3De2P.cjs +5432 -0
  92. package/dist/{retry-config-Dmgt28wM.js → retry-config-BcUmMS--.js} +1 -1
  93. package/dist/{retry-config-BaCfVC1H.cjs → retry-config-DC5IMaH7.cjs} +1 -1
  94. package/dist/{seam-cardano-B_etH4F4.js → seam-cardano-CATqBEyK.js} +1 -1
  95. package/dist/{signer-factory-B7PMe3lQ.js → signer-factory-9URFliA5.js} +3 -6
  96. package/dist/{signer-factory-DduwpsQj.cjs → signer-factory-BWGUmnvm.cjs} +3 -4
  97. package/dist/{slice-CqVNnz-j.js → slice-B2PhoWAg.js} +125 -316
  98. package/dist/{slice-DyNs7oWp.js → slice-BNu73oBa.js} +2 -2
  99. package/dist/{slice-GwiiJRoq.js → slice-CB4SnzMm.js} +3 -3
  100. package/dist/slice-CGVHXHDt.cjs +125 -0
  101. package/dist/{slice-CU80pbiu.js → slice-CnyWevM9.js} +3 -3
  102. package/dist/{slice-CwyYrh1H.js → slice-CobanYgn.js} +2 -2
  103. package/dist/{slice-7G2xxYKJ.cjs → slice-CuHUaPZx.cjs} +3 -3
  104. package/dist/{slice-DayJvMRD.cjs → slice-D11m2EKl.cjs} +1 -1
  105. package/dist/{slice-Bg6HEr3K.cjs → slice-DGcNrbPR.cjs} +4 -4
  106. package/dist/{slice-B4CdYoPu.cjs → slice-DZmQJNV8.cjs} +2 -2
  107. package/dist/slice-DhvF7L6X.js +107 -0
  108. package/dist/{slice-C9TT5KhY.cjs → slice-Do2R2CYW.cjs} +6 -6
  109. package/dist/{slice-Bs2aMERu.cjs → slice-DtaO72qY.cjs} +3 -3
  110. package/dist/{slice-C34iOOUH.cjs → slice-HeHCv3bl.cjs} +7 -7
  111. package/dist/{slice-D-9aPKG-.js → slice-d0p6-xj5.js} +6 -6
  112. package/dist/{slice-CK07EBCo.js → slice-eIwcwKHI.js} +4 -4
  113. package/dist/{slice-DBpJ2QGf.js → slice-maaskdUn.js} +6 -6
  114. package/dist/{slice-6sP0Qs5V.cjs → slice-mxLQ_FeY.cjs} +127 -343
  115. package/dist/{slice-DnG-yvpI.cjs → slice-oqm_r1cS.cjs} +2 -2
  116. package/dist/{slice-Da426sf9.js → slice-zJ9XVYjZ.js} +1 -1
  117. package/dist/{sync-operation-utils-KT5Y9yFK.js → sync-operation-utils-BYXLO80m.js} +52 -1
  118. package/dist/{sync-operation-utils-C9kcmjKH.cjs → sync-operation-utils-SdPbwFoD.cjs} +87 -0
  119. package/dist/{token-id-mapper-qx7XfH0b.js → token-id-mapper-B2ivlLv3.js} +2 -2
  120. package/dist/{token-id-mapper-IApjwuJb.cjs → token-id-mapper-DsPAL6Nh.cjs} +2 -2
  121. package/dist/{util-D1e0skzp.js → util-BaLzwa32.js} +1 -1
  122. package/dist/{util-BeG7WXzM.cjs → util-CGzqQ8IV.cjs} +1 -1
  123. package/dist/{utils-DsElZgCI.cjs → utils-5JvjbqH3.cjs} +1 -7
  124. package/dist/{utils-BfBEUvWA.js → utils-o8aMjfln.js} +2 -2
  125. package/dist/{vote-delegation-tx-builder-CtdIgaIt.cjs → vote-delegation-tx-builder-BpEMSti4.cjs} +6 -6
  126. package/dist/{vote-delegation-tx-builder-CQjGvVNZ.js → vote-delegation-tx-builder-CmKv6GoG.js} +5 -5
  127. package/package.json +4 -96
  128. package/dist/_polyfill-buffer-patch-yNxN4d5E.js +0 -1467
  129. package/dist/_web-crypto-random-bytes-Bo-GTcRS.js +0 -197
  130. package/dist/acc-module-4iIUv6My.cjs +0 -27654
  131. package/dist/acc-module-Cmj8EsIb.js +0 -27624
  132. package/dist/account-BlYkEmcs.cjs +0 -11
  133. package/dist/account-DVX0F5_M.js +0 -6
  134. package/dist/account-call-D68oF6bh.js +0 -267
  135. package/dist/account-call-DIIa2rK_.cjs +0 -314
  136. package/dist/account-call-NgLhYein.cjs +0 -4
  137. package/dist/account-call-n-Nkp35e.js +0 -3
  138. package/dist/account-guards-BtjTGxDZ.cjs +0 -42
  139. package/dist/account-guards-D9Lu5T3W.js +0 -36
  140. package/dist/account-tokens-CtN2BaFy.js +0 -16
  141. package/dist/account-tokens-DXr8DlpW.cjs +0 -21
  142. package/dist/address-B9ntKL8K.js +0 -13761
  143. package/dist/address-BXp-mY8H.cjs +0 -11270
  144. package/dist/address-book-address-validator-DK0dnsRS.cjs +0 -41
  145. package/dist/address-book-address-validator-Di_ywo8M.js +0 -39
  146. package/dist/artefact-loader-54uK5RAa.js +0 -160
  147. package/dist/artefact-loader-DZPYrq-6.cjs +0 -183
  148. package/dist/auto-dismiss-failure-on-success-C-qoJuid.cjs +0 -37
  149. package/dist/auto-dismiss-failure-on-success-s8MGDEIu.js +0 -31
  150. package/dist/bip32-D6wd_QMn.cjs +0 -3851
  151. package/dist/bitcoin-data-provider-BYPSmuZS.js +0 -21
  152. package/dist/bitcoin-data-provider-w1oEDSU3.cjs +0 -26
  153. package/dist/bn-d3nSOIf7.cjs +0 -2553
  154. package/dist/browser-B1eMbDwh.js +0 -7468
  155. package/dist/bytes.vo-BB7_4JK6.js +0 -23
  156. package/dist/bytes.vo-BNRquqaO.cjs +0 -34
  157. package/dist/cardano-DfPwhwm-.js +0 -3
  158. package/dist/client-DXBLHk7K.cjs +0 -808
  159. package/dist/codecs-Cswkg7Tm.cjs +0 -4051
  160. package/dist/codecs-Dc1Krpbt.js +0 -3903
  161. package/dist/const-BfEnY8fg.js +0 -153
  162. package/dist/const-BhYOdznB.cjs +0 -42
  163. package/dist/const-CUnCl5U0.js +0 -13
  164. package/dist/const-DLrX5SD9.cjs +0 -31995
  165. package/dist/contract-C_CBwwiC.cjs +0 -189
  166. package/dist/contract-s_x-9-lz.js +0 -171
  167. package/dist/create-add-accounts-Brqk84vF.js +0 -102
  168. package/dist/create-add-accounts-DzXIh7Ot.cjs +0 -114
  169. package/dist/device-commitment-hex.vo-5wFtQvDS.js +0 -26
  170. package/dist/device-commitment-hex.vo-CT3RmAug.cjs +0 -31
  171. package/dist/device-readers-70i7tQqU.cjs +0 -8
  172. package/dist/device-readers-B7--ezKM.js +0 -4
  173. package/dist/device-readers-BWOmz9eD.js +0 -145
  174. package/dist/device-readers-CIgYZN7f.cjs +0 -168
  175. package/dist/dist-BMi5ZjEq.cjs +0 -43175
  176. package/dist/dist-BtIq4XFn.cjs +0 -535
  177. package/dist/dist-C3SHC_Ho.cjs +0 -1394
  178. package/dist/dist-CykEjYEX.cjs +0 -3814
  179. package/dist/dist-Dcsxh3be.cjs +0 -3452
  180. package/dist/dist-DqJfSlTd.cjs +0 -4413
  181. package/dist/dist-nTZ70qj7.cjs +0 -1306
  182. package/dist/enc-key-circuits-C8fGAMEF.cjs +0 -24
  183. package/dist/enc-key-circuits-DA2Xs3vZ.js +0 -13
  184. package/dist/english-Byb9M0E_.cjs +0 -2057
  185. package/dist/envelopes-BkH1Qdxk.js +0 -1620
  186. package/dist/envelopes-ETZEJS_O.cjs +0 -1721
  187. package/dist/errors-BZ8hnhCM.cjs +0 -584
  188. package/dist/errors-DIJTAsLa.js +0 -392
  189. package/dist/esm-HBSUQw3w.js +0 -384
  190. package/dist/esm-LZuaZjMf.cjs +0 -389
  191. package/dist/experimental.cjs +0 -7073
  192. package/dist/experimental.d.ts +0 -84347
  193. package/dist/experimental.js +0 -6915
  194. package/dist/gated-call-Boy6rXdC.js +0 -3
  195. package/dist/gated-call-DJWY299W.cjs +0 -736
  196. package/dist/gated-call-DjoRPqn1.js +0 -695
  197. package/dist/gated-call-SomdJ5nj.cjs +0 -4
  198. package/dist/grant-circuits-_1x--moV.cjs +0 -49
  199. package/dist/grant-circuits-swuzEdUl.js +0 -26
  200. package/dist/grant-rules-7Zqi_3BN.cjs +0 -7114
  201. package/dist/grant-rules-_xJHAT2M.js +0 -6833
  202. package/dist/grant-status-B2y49iIu.js +0 -2688
  203. package/dist/grant-status-DOr3t_u8.cjs +0 -2820
  204. package/dist/grants--b0LQQzZ.cjs +0 -266
  205. package/dist/grants-BIs6qm3b.js +0 -213
  206. package/dist/grants-CSgfYlOO.js +0 -5
  207. package/dist/grants-D61131nK.cjs +0 -17
  208. package/dist/hex-D9ITYbwt.cjs +0 -263
  209. package/dist/hex-mkXcV3pN.js +0 -191
  210. package/dist/http-client-B3N-TMxu.cjs +0 -167
  211. package/dist/http-client-TRlhDZGh.js +0 -155
  212. package/dist/identity-BMLuufva.cjs +0 -263
  213. package/dist/identity-DII6f-h7.js +0 -233
  214. package/dist/in-memory-wallet-integration-B2xzxORj.cjs +0 -20741
  215. package/dist/in-memory-wallet-integration-CUKesGG1.js +0 -130
  216. package/dist/in-memory-wallet-integration-CoPx69lQ.cjs +0 -240
  217. package/dist/in-memory-wallet-integration-TM9bBphA.js +0 -20738
  218. package/dist/init-B5X_sGj9.cjs +0 -6
  219. package/dist/init-BJn-8_hf.js +0 -141
  220. package/dist/init-Bp6yJk31.js +0 -1142
  221. package/dist/init-Bu4iXcTH.cjs +0 -34
  222. package/dist/init-C00gw1zi.js +0 -422
  223. package/dist/init-CIjZaQvL.js +0 -3584
  224. package/dist/init-CR7BfztQ.cjs +0 -18
  225. package/dist/init-Cp8EJGbm.js +0 -5
  226. package/dist/init-CpIadSUb.js +0 -33
  227. package/dist/init-D5UiYI12.cjs +0 -106
  228. package/dist/init-DAikR9qU.js +0 -1177
  229. package/dist/init-DGjXwWs2.cjs +0 -143
  230. package/dist/init-DHrCbpkW.cjs +0 -121
  231. package/dist/init-DU5yYX5u.js +0 -2374
  232. package/dist/init-DWvkFDkc.cjs +0 -1176
  233. package/dist/init-DY1unoGb.cjs +0 -1141
  234. package/dist/init-DlqJuHhl.js +0 -119
  235. package/dist/init-DuYENxci.js +0 -17
  236. package/dist/init-E7c40ddW.cjs +0 -3585
  237. package/dist/init-GsT2AEa4.cjs +0 -424
  238. package/dist/init-KQnIdm39.js +0 -104
  239. package/dist/init-ZjNDDC-T.cjs +0 -2375
  240. package/dist/jubjub-authoriser-BxE3oN2y.js +0 -86
  241. package/dist/jubjub-authoriser-C6SDEP9I.cjs +0 -87
  242. package/dist/key-source-5oUBFiC7.cjs +0 -583
  243. package/dist/key-source-B08HukZg.js +0 -2550
  244. package/dist/keyDerivation-D3k9XyHg.js +0 -4077
  245. package/dist/keyDerivation-u0nBA93T.cjs +0 -274
  246. package/dist/lib--iqvW4O_.js +0 -2354
  247. package/dist/lib-Yk6Upl5D.cjs +0 -2359
  248. package/dist/midnight-account-id.vo-0x9X-r3l.cjs +0 -10
  249. package/dist/midnight-account-id.vo-DjCAGcqc.js +0 -5
  250. package/dist/midnight-engine-DpemplKO.js +0 -5
  251. package/dist/midnight-engine-xU1wotne.cjs +0 -6
  252. package/dist/midnight-wallet-DIsAlSn6.js +0 -18
  253. package/dist/midnight-wallet-XTZc2li7.cjs +0 -24
  254. package/dist/midnight.cjs +0 -1406
  255. package/dist/midnight.d.ts +0 -28586
  256. package/dist/midnight.js +0 -1350
  257. package/dist/modules-cardano-CtWLntet.cjs +0 -1108
  258. package/dist/modules-cardano-D2dkeKHY.js +0 -995
  259. package/dist/node-relay-Cv0cNknM.js +0 -48
  260. package/dist/node-relay-DblH5fKv.cjs +0 -49
  261. package/dist/outputs-Bd2yZVjx.js +0 -720
  262. package/dist/outputs-CJoQBIA2.cjs +0 -990
  263. package/dist/pbkdf2-CIW-oWrm.cjs +0 -1337
  264. package/dist/pending-operation-B0_P78Jo.cjs +0 -26
  265. package/dist/pending-operation-BIS6mpjB.js +0 -21
  266. package/dist/providers-BLgJ0uQs.cjs +0 -366
  267. package/dist/providers-CwnT4vEE.js +0 -343
  268. package/dist/redacted-BmE2aXqr.js +0 -81
  269. package/dist/redacted-CRZJLS3w.cjs +0 -86
  270. package/dist/safe-buffer-B_vMqJWU.js +0 -43
  271. package/dist/safe-buffer-DYOwEfHB.cjs +0 -48
  272. package/dist/sdk-DIcjlgLF.js +0 -1241
  273. package/dist/sdk-Dgal10kG.cjs +0 -1439
  274. package/dist/sdk-init-BKkqFtWZ.cjs +0 -3791
  275. package/dist/sdk-init-DNd-oQXp.js +0 -1044
  276. package/dist/send-proof-progress-DTK3ZuYB.js +0 -22
  277. package/dist/send-proof-progress-dDoqIohG.cjs +0 -33
  278. package/dist/side-effects-BnqYz7Nl.js +0 -768
  279. package/dist/side-effects-CngaeXi0.cjs +0 -804
  280. package/dist/sign-bitcoin-transaction-with-seed-D4z62-jV.js +0 -147
  281. package/dist/sign-bitcoin-transaction-with-seed-DsLYXnCY.cjs +0 -158
  282. package/dist/signer-3fk8lZtE.cjs +0 -7
  283. package/dist/signer-CsL28DrK.cjs +0 -121
  284. package/dist/signer-DGluibtn.js +0 -92
  285. package/dist/signer-RqB5pu3K.js +0 -2
  286. package/dist/signer-factory-BA7WFJVZ.js +0 -282
  287. package/dist/signer-factory-CORIG4Yl.cjs +0 -130
  288. package/dist/signer-factory-Cd2TwD50.js +0 -129
  289. package/dist/signer-factory-Cwd6o-lG.cjs +0 -281
  290. package/dist/slice-BOyAAaj0.cjs +0 -378
  291. package/dist/slice-BnTJeMOb.js +0 -354
  292. package/dist/slice-C4uXUT7S.js +0 -9013
  293. package/dist/slice-CxKWDuBP.js +0 -87
  294. package/dist/slice-DQv_RhsI.cjs +0 -9031
  295. package/dist/slice-HjLXJyQG2.cjs +0 -105
  296. package/dist/src-BDzYIksE.cjs +0 -20637
  297. package/dist/src-BFoefPv_.js +0 -20755
  298. package/dist/store-B1Lq3cEf.cjs +0 -66
  299. package/dist/store-DuBG8qh5.js +0 -37
  300. package/dist/submit-BBYjnZu8.cjs +0 -87
  301. package/dist/submit-D_yxYM_T.js +0 -70
  302. package/dist/submit-bitcoin-tx-BkZIeF4b.js +0 -983
  303. package/dist/submit-bitcoin-tx-DZNQgihl.cjs +0 -1049
  304. package/dist/token-id-mapper-Bnds3xKH.cjs +0 -18
  305. package/dist/token-id-mapper-CnKHQ8DV.js +0 -16
  306. package/dist/tokens-Cevp7rdU.cjs +0 -62
  307. package/dist/tokens-Diw4MLRM.js +0 -44
  308. package/dist/types-B8uiJn-X.js +0 -12
  309. package/dist/types-CJT6XF2c.js +0 -10
  310. package/dist/types-CLRUYpfe.cjs +0 -23
  311. package/dist/types-DWbVZpnF.cjs +0 -15
  312. package/dist/types-T0cjaR75.js +0 -33
  313. package/dist/types-Zj78LtYu.cjs +0 -50
  314. package/dist/unwrap-provider-result-BZSiwabU.js +0 -32
  315. package/dist/unwrap-provider-result-ZqfBsTkk.cjs +0 -39
  316. package/dist/utils-BfMdr_1w.cjs +0 -112
  317. package/dist/utils-CvAW5Yw7.js +0 -65
  318. package/dist/v8Signatures-CO_Uloy7.cjs +0 -71
  319. package/dist/watch-Cz1J42um.cjs +0 -52205
  320. package/dist/watch-Z53L4yoK.js +0 -13054
  321. /package/dist/{account-id.vo-DwqFjK5u.cjs → account-id.vo-LvCBVn5r.cjs} +0 -0
  322. /package/dist/{account-id.vo-OPz2v-JZ.js → account-id.vo-MYSI7YFm.js} +0 -0
  323. /package/dist/{actions-iLXdgL5Y.js → actions-9QSQR-GB.js} +0 -0
  324. /package/dist/{actions-B2BJ4RTy.cjs → actions-DdGbj7c7.cjs} +0 -0
  325. /package/dist/{apply-vkey-witnesses-ZnFS0jnJ.cjs → apply-vkey-witnesses-CLzVSWxl.cjs} +0 -0
  326. /package/dist/{apply-vkey-witnesses-BKx3lcs0.js → apply-vkey-witnesses-ClZbpk5w.js} +0 -0
  327. /package/dist/{asyncoption-CruEYOBI.js → asyncoption-Cw07zPH7.js} +0 -0
  328. /package/dist/{asyncoption-i0VbqVTq.cjs → asyncoption-DYoGuQfP.cjs} +0 -0
  329. /package/dist/{bignum.vo-CEXOIew0.js → bignum.vo-B0rK_PQ1.js} +0 -0
  330. /package/dist/{bignum.vo-hx2kuqlA.cjs → bignum.vo-DsG3kNiZ.cjs} +0 -0
  331. /package/dist/{bip32ed25519-B7Yat217.cjs → bip32ed25519-1ApqeAZk.cjs} +0 -0
  332. /package/dist/{bip32ed25519-FQ8qvdcq.js → bip32ed25519-DetAdGwD.js} +0 -0
  333. /package/dist/{blake2b-DEeVUdKR.cjs → blake2b-B9tftbvG.cjs} +0 -0
  334. /package/dist/{blake2b-BiQTw3GC.js → blake2b-DOEVc57D.js} +0 -0
  335. /package/dist/{blockchain-network-id.vo-BAKEwGjG.cjs → blockchain-network-id.vo-BXpZhvvQ.cjs} +0 -0
  336. /package/dist/{blockchain-network-id.vo-CiVykuqG.js → blockchain-network-id.vo-DNRkuT5B.js} +0 -0
  337. /package/dist/{blockingWithLatestFrom-Cd8c8EPG.js → blockingWithLatestFrom-C5wp_uA-.js} +0 -0
  338. /package/dist/{blockingWithLatestFrom-D8kBPBMX.cjs → blockingWithLatestFrom-DY8OPg0w.cjs} +0 -0
  339. /package/dist/{cardano-network-id-to-network-type-C0ufJOyE.cjs → cardano-network-id-to-network-type-BDTF-HmK.cjs} +0 -0
  340. /package/dist/{cardano-network-id-to-network-type-BWwzeEtM.js → cardano-network-id-to-network-type-CrZfUcyP.js} +0 -0
  341. /package/dist/{cardano-tx-id.vo-D3ASTIMd.cjs → cardano-tx-id.vo-BPhV-AmZ.cjs} +0 -0
  342. /package/dist/{cardano-tx-id.vo-BXLo1b7Q.js → cardano-tx-id.vo-DF9NzZXk.js} +0 -0
  343. /package/dist/{composite-signer-factory-m5cVs9h_.cjs → composite-signer-factory-BpF1mIYA.cjs} +0 -0
  344. /package/dist/{composite-signer-factory-CR8YHA1y.js → composite-signer-factory-_46QsNBz.js} +0 -0
  345. /package/dist/{error-DIZOY2Lw.js → error-BCp9NkPi.js} +0 -0
  346. /package/dist/{error-Cb3EnD0u.cjs → error-CNIquqT5.cjs} +0 -0
  347. /package/dist/{esm-browser-MG97cre9.js → esm-browser-C93Q-EOI.js} +0 -0
  348. /package/dist/{esm-browser-bweqfBlL.cjs → esm-browser-DTc9IK3D.cjs} +0 -0
  349. /package/dist/{feature-flag-key.vo-RlfHL3hq.cjs → feature-flag-key.vo-BPz-ZAp6.cjs} +0 -0
  350. /package/dist/{feature-flag-key.vo-DN_-4-sG.js → feature-flag-key.vo-ofrB6ZVQ.js} +0 -0
  351. /package/dist/{first-state-of-status-unPynOuM.js → first-state-of-status-DQnMT3ya.js} +0 -0
  352. /package/dist/{first-state-of-status-CbT7hPa4.cjs → first-state-of-status-OROkXcRv.cjs} +0 -0
  353. /package/dist/{init-zUoRG_EC2.cjs → init-C5CEZ1m0.cjs} +0 -0
  354. /package/dist/{init-DHaMxHM1.js → init-CKipPE_c.js} +0 -0
  355. /package/dist/{init-Atisw4x2.cjs → init-DFQQ9dTW.cjs} +0 -0
  356. /package/dist/{init-829HRYcz.js → init-Es3wHW7D.js} +0 -0
  357. /package/dist/{init-BgNobbNq.cjs → init-IAk_CkGa.cjs} +0 -0
  358. /package/dist/{init-atCFur0v.js → init-cqN3uX2j.js} +0 -0
  359. /package/dist/{is-redux-persist-state-BCFnSm36.cjs → is-redux-persist-state-CTn3WZVh.cjs} +0 -0
  360. /package/dist/{is-redux-persist-state-yBfq0h_E.js → is-redux-persist-state-Cxcd0_bM.js} +0 -0
  361. /package/dist/{key-value-store--W3SrMaw.js → key-value-store-8cMzeNyG.js} +0 -0
  362. /package/dist/{key-value-store-C2Xt5Emp.cjs → key-value-store-DUAepXQf.cjs} +0 -0
  363. /package/dist/{repo-slice-RxFm0zDZ.js → repo-slice-DwyMhCR1.js} +0 -0
  364. /package/dist/{repo-slice-7X4AYYVm.cjs → repo-slice-WxetRhMY.cjs} +0 -0
  365. /package/dist/{reselect-CGoLzEPv.js → reselect-C06X06oX.js} +0 -0
  366. /package/dist/{reselect-Bd94u0K-.cjs → reselect-CRDqmQY9.cjs} +0 -0
  367. /package/dist/{serializable-BHdKIgk3.js → serializable-B8GahgE1.js} +0 -0
  368. /package/dist/{serializable-BxHkoPdk.cjs → serializable-CRdnFaLZ.cjs} +0 -0
  369. /package/dist/{slice-obCSLm1x.js → slice-B87b52iM.js} +0 -0
  370. /package/dist/{slice-Bk0Sv05J.js → slice-Be7hj4Iy.js} +0 -0
  371. /package/dist/{slice-BiRsDKOK.cjs → slice-D11FHQuQ.cjs} +0 -0
  372. /package/dist/{slice-Dqw1ecum.cjs → slice-FioKeHtA.cjs} +0 -0
  373. /package/dist/{src-Cqp0B2M_.cjs → src-BTPIvlDI.cjs} +0 -0
  374. /package/dist/{src-BlxEp6Mm.js → src-vq1wS9sZ.js} +0 -0
  375. /package/dist/{time.vo-D3wWRw9L.cjs → time.vo-CQ8pSXz2.cjs} +0 -0
  376. /package/dist/{time.vo-tNheinXm.js → time.vo-DkYYGYp6.js} +0 -0
  377. /package/dist/{toEmpty-8Zax1MPd.js → toEmpty-CgAl3097.js} +0 -0
  378. /package/dist/{toEmpty-CYAbupM4.cjs → toEmpty-DAMmNB5r.cjs} +0 -0
  379. /package/dist/{token-id.vo-DXv5uS9n.cjs → token-id.vo-BxG9TG0O.cjs} +0 -0
  380. /package/dist/{token-id.vo-Bvwhr3ZE.js → token-id.vo-ClsroxHO.js} +0 -0
  381. /package/dist/{util-CzeB3hfa.cjs → util-CmdAhheh.cjs} +0 -0
  382. /package/dist/{util-C8a4fA9p.js → util-DxzlYNS5.js} +0 -0
  383. /package/dist/{util-selector-BWPH68_l.cjs → util-selector-BcAncU4L.cjs} +0 -0
  384. /package/dist/{util-selector-BSTsxgne.js → util-selector-CcK-GAdE.js} +0 -0
  385. /package/dist/{while-active-B0lWy_6l.js → while-active-BpppWuCs.js} +0 -0
  386. /package/dist/{while-active-Dsowp0Fi.cjs → while-active-Dhc2LwOm.cjs} +0 -0
@@ -1,1177 +0,0 @@
1
- import "./_web-crypto-random-bytes-Bo-GTcRS.js";
2
- import "./_polyfill-buffer-patch-yNxN4d5E.js";
3
- import "./libsodium-wrappers-BhbOA8dQ.js";
4
- import "./codecs-Dc1Krpbt.js";
5
- import { t as SecretBox } from "./secret-box-DUR0ACYz.js";
6
- import { _ as CardanoRewardAccount, n as filterSpendableUtxos, s as isCardanoAddressOfSupportedNetwork, t as createInputResolver } from "./util-D1e0skzp.js";
7
- import { t as ByteArray } from "./bytes.vo-BB7_4JK6.js";
8
- import { t as BigNumber } from "./bignum.vo-CEXOIew0.js";
9
- import { n as Ok$1, t as Err$1 } from "./asyncoption-CruEYOBI.js";
10
- import { t as firstStateOfStatus } from "./first-state-of-status-unPynOuM.js";
11
- import "./retry-config-Dmgt28wM.js";
12
- import { t as ActivityType } from "./activity-type-GsJGWs-3.js";
13
- import { t as CardanoNetworkId } from "./cardano-network-id.vo-wfLiAxpY.js";
14
- import { r as LOVELACE_TOKEN_ID } from "./const-CBGn60yu.js";
15
- import { n as TransactionBuilder, s as InputSelectionError } from "./TransactionBuilder-CIzdw18M.js";
16
- import { t as applyVkeyWitnesses } from "./apply-vkey-witnesses-BKx3lcs0.js";
17
- import { t as refuseExtensionAccount } from "./account-guards-D9Lu5T3W.js";
18
- import { t as unwrapProviderResult } from "./unwrap-provider-result-BZSiwabU.js";
19
- import { InMemoryKeyAgent, KeyPurpose, util } from "@laceio/cardano/key-management";
20
- import { SodiumBip32Ed25519 } from "@laceio/cardano/crypto";
21
- import { Cardano, Serialization, metadatum } from "@laceio/cardano/core";
22
- import { HexBlob } from "@laceio/cardano/util";
23
- import { catchError, combineLatest, concat, exhaustMap, filter, firstValueFrom, forkJoin, from, groupBy, map, merge, mergeMap, of, switchMap, take, throwError, timeout, timer } from "rxjs";
24
- import { computeMinimumCoinQuantity, tokenBundleSizeExceedsLimit } from "@laceio/cardano/tx-construction";
25
- //#region ../../packages/contract/cardano-context/src/value-objects/cardano-testnet-id.vo.ts
26
- const CARDANO_CHAIN_ID_BY_TESTNET = {
27
- preprod: Cardano.ChainIds.Preprod,
28
- preview: Cardano.ChainIds.Preview,
29
- sanchonet: Cardano.ChainIds.Sanchonet
30
- };
31
- const PREPROD_MAGIC = Number(Cardano.ChainIds.Preprod.networkMagic);
32
- const PREVIEW_MAGIC = Number(Cardano.ChainIds.Preview.networkMagic);
33
- const SANCHONET_MAGIC = Number(Cardano.ChainIds.Sanchonet.networkMagic);
34
- const getCardanoTestnetIdByNetworkMagic = (networkMagic) => {
35
- const magic = Number(networkMagic);
36
- if (magic === PREPROD_MAGIC) return "preprod";
37
- if (magic === PREVIEW_MAGIC) return "preview";
38
- if (magic === SANCHONET_MAGIC) return "sanchonet";
39
- };
40
- const getCardanoChainIdByTestnetId = (id) => CARDANO_CHAIN_ID_BY_TESTNET[id];
41
- //#endregion
42
- //#region ../../packages/module/blockchain-cardano/src/store/composer/resolve-validity-interval.ts
43
- /** Two hours, matching the send flow's window (`build-tx.ts`). */
44
- const DEFAULT_VALIDITY_SECONDS = 7200;
45
- /**
46
- * The era covering `slot`: the last summary that has already started.
47
- * Summaries arrive oldest-first, so this walks forward while the next
48
- * era's start is still at or below the slot.
49
- */
50
- const eraSummaryAtSlot = (eraSummaries, slot) => {
51
- let index = 0;
52
- while (index + 1 < eraSummaries.length && eraSummaries[index + 1].start.slot <= slot) index++;
53
- return eraSummaries[index];
54
- };
55
- const secondsToSlots = (seconds, slotLengthMs) => Math.ceil(seconds * 1e3 / slotLengthMs);
56
- /**
57
- * Convert a tip-relative duration into the absolute slots a Cardano
58
- * validity interval needs.
59
- *
60
- * @throws If the era summaries are missing/unusable, or the requested
61
- * window is not a positive, coherent interval.
62
- */
63
- const resolveValidityInterval = ({ tipSlot, eraSummaries, validitySeconds = DEFAULT_VALIDITY_SECONDS, validityStartSeconds }) => {
64
- if (eraSummaries.length === 0) throw new Error("Cannot resolve a validity interval: no Cardano era summaries available");
65
- if (!Number.isFinite(validitySeconds) || validitySeconds <= 0) throw new Error(`Validity window must be a positive number of seconds, got ${validitySeconds}`);
66
- const { slotLength } = eraSummaryAtSlot(eraSummaries, tipSlot).parameters;
67
- if (!Number.isFinite(slotLength) || slotLength <= 0) throw new Error(`Era summary reports an unusable slot length: ${slotLength}`);
68
- const invalidHereafter = Cardano.Slot(tipSlot + secondsToSlots(validitySeconds, slotLength));
69
- if (validityStartSeconds === void 0) return { invalidHereafter };
70
- if (!Number.isFinite(validityStartSeconds) || validityStartSeconds < 0) throw new Error(`Validity start must be a non-negative number of seconds, got ${validityStartSeconds}`);
71
- const invalidBefore = Cardano.Slot(tipSlot + secondsToSlots(validityStartSeconds, slotLength));
72
- if (invalidBefore >= invalidHereafter) throw new Error(`Validity window is empty: start slot ${invalidBefore} is not before end slot ${invalidHereafter}`);
73
- return {
74
- invalidBefore,
75
- invalidHereafter
76
- };
77
- };
78
- //#endregion
79
- //#region ../../packages/module/blockchain-cardano/src/store/composer/build-composer-tx.ts
80
- /** Failure with a code the side-effect maps to actionable copy. */
81
- const fail = (message, code) => Object.assign(new Error(message), { code });
82
- const utxoRefKey = (txIn) => `${txIn.txId}#${txIn.index}`;
83
- /**
84
- * An address from the request, as the SDK's payment address.
85
- *
86
- * The SDK's own constructor throws an UNCODED `InvalidStringError`, which would
87
- * reach the side-effect as a build fault rather than as the request mistake it
88
- * is — a bech32 the user mistyped would then read as "we couldn't build your
89
- * transaction" instead of "check what you entered".
90
- *
91
- * @param what - names the address in the message, since a request may carry
92
- * several and the failure has to say which one is unusable.
93
- */
94
- const toPaymentAddress = (value, what) => {
95
- try {
96
- return Cardano.PaymentAddress(value);
97
- } catch {
98
- throw fail(`${what} is not a Cardano address: "${value}"`, "invalid-address");
99
- }
100
- };
101
- /**
102
- * Quantities cross the slice boundary as decimal strings, so a malformed
103
- * one is a request error rather than a programming error — parse it into
104
- * a coded failure instead of letting `BigInt` throw an uncoded SyntaxError.
105
- */
106
- const toQuantity = (value, what) => {
107
- if (!/^-?\d+$/.test(value)) throw fail(`${what} is not a whole number: "${value}"`, "invalid-output");
108
- return BigInt(value);
109
- };
110
- const toValue = (output) => {
111
- const coins = toQuantity(output.lovelace, `Lovelace amount for the output to ${output.address}`);
112
- if (coins < 0n) throw fail(`Output to ${output.address} requests a negative amount of lovelace`, "invalid-output");
113
- if (!output.assets || output.assets.length === 0) return { coins };
114
- const assets = /* @__PURE__ */ new Map();
115
- for (const asset of output.assets) {
116
- const quantity = toQuantity(asset.quantity, `Quantity for asset ${asset.assetId}`);
117
- if (quantity <= 0n) throw fail(`Asset ${asset.assetId} requests a non-positive quantity`, "invalid-output");
118
- const assetId = asset.assetId;
119
- assets.set(assetId, (assets.get(assetId) ?? 0n) + quantity);
120
- }
121
- return {
122
- coins,
123
- assets
124
- };
125
- };
126
- /**
127
- * Raise the output's lovelace to the protocol minimum for its size when
128
- * the request is below it. An assets-only output can therefore ask for
129
- * `'0'` and still be spendable.
130
- */
131
- const withMinimumCoin = (address, value, params) => {
132
- if (tokenBundleSizeExceedsLimit(params.maxValueSize)(value.assets)) throw fail(`Output to ${address} exceeds the maximum token bundle size`, "invalid-output");
133
- const minimumCoin = BigInt(computeMinimumCoinQuantity(params.coinsPerUtxoByte)({
134
- address,
135
- value
136
- }));
137
- return value.coins >= minimumCoin ? value : {
138
- ...value,
139
- coins: minimumCoin
140
- };
141
- };
142
- const parseMetadata = (request) => {
143
- if (!request.metadata || request.metadata.length === 0) return void 0;
144
- const blob = /* @__PURE__ */ new Map();
145
- for (const entry of request.metadata) {
146
- if (!/^\d+$/.test(entry.label)) throw fail(`Metadata label "${entry.label}" is not a non-negative integer`, "invalid-metadata");
147
- let parsed;
148
- try {
149
- parsed = JSON.parse(entry.json);
150
- } catch (error) {
151
- throw fail(`Metadata for label ${entry.label} is not valid JSON: ${error.message}`, "invalid-metadata");
152
- }
153
- blob.set(BigInt(entry.label), metadatum.jsonToMetadatum(parsed));
154
- }
155
- return blob;
156
- };
157
- const resolveSelectedInputs = (request, spendableUtxos) => {
158
- if (!request.selectedInputs || request.selectedInputs.length === 0) return [];
159
- const byRef = new Map(spendableUtxos.map((utxo) => [utxoRefKey(utxo[0]), utxo]));
160
- return request.selectedInputs.map((ref) => {
161
- const utxo = byRef.get(`${ref.txId}#${ref.index}`);
162
- if (!utxo) throw fail(`Selected input ${ref.txId}#${ref.index} is not among the account's spendable UTxOs`, "input-unavailable");
163
- return utxo;
164
- });
165
- };
166
- /**
167
- * The balancer's own failure type is the only signal that the account cannot
168
- * cover what was asked for — an unaffordable amount is a request mistake, not a
169
- * build fault, and only the coded form reaches the copy that says so.
170
- *
171
- * Tagged rather than replaced: the reported name and message stay the
172
- * balancer's, which is what names the shortfall for a diagnostic.
173
- */
174
- const codeInputSelectionFailure = async (build) => {
175
- try {
176
- return await build;
177
- } catch (error) {
178
- if (error instanceof InputSelectionError) throw Object.assign(error, { code: "insufficient-funds" });
179
- throw error;
180
- }
181
- };
182
- const buildComposerTx = async ({ request, changeAddress, networkMagic, protocolParameters, spendableUtxos, tipSlot, eraSummaries }) => {
183
- if (request.outputs.length === 0) throw fail("A composed transaction needs at least one output", "no-outputs");
184
- if (spendableUtxos.length === 0) throw fail("The account has no spendable UTxOs to fund this transaction", "no-utxos");
185
- const validityInterval = resolveValidityInterval({
186
- tipSlot,
187
- eraSummaries,
188
- validitySeconds: request.validitySeconds,
189
- validityStartSeconds: request.validityStartSeconds
190
- });
191
- const selectedInputs = resolveSelectedInputs(request, spendableUtxos);
192
- const selectedReferences = new Set(selectedInputs.map((utxo) => utxoRefKey(utxo[0])));
193
- const coverUtxos = spendableUtxos.filter((utxo) => !selectedReferences.has(utxoRefKey(utxo[0])));
194
- const builder = new TransactionBuilder(networkMagic, protocolParameters).setChangeAddress(changeAddress).setUnspentOutputs(coverUtxos).setValidityInterval(validityInterval);
195
- for (const utxo of selectedInputs) builder.addInput(utxo);
196
- const metadataBlob = parseMetadata(request);
197
- if (metadataBlob) for (const [label, value] of metadataBlob) builder.setMetadata(label, value);
198
- for (const output of request.outputs) {
199
- const address = toPaymentAddress(output.address, "The address of an output");
200
- builder.addOutput({
201
- address,
202
- value: withMinimumCoin(address, toValue(output), protocolParameters)
203
- });
204
- }
205
- const transaction = await codeInputSelectionFailure(builder.build());
206
- return {
207
- cbor: transaction.toCbor(),
208
- txId: transaction.getId(),
209
- fee: transaction.toCore().body.fee
210
- };
211
- };
212
- //#endregion
213
- //#region ../../packages/module/blockchain-cardano/src/store/composer/build-side-effect.ts
214
- const GENERIC_BUILD_ERROR_KEYS$1 = {
215
- title: "v2.composer.build.error.title",
216
- subtitle: "v2.composer.build.error.subtitle"
217
- };
218
- const BUILD_ERROR_KEYS_BY_CODE$1 = {
219
- "no-utxos": {
220
- title: "v2.composer.build.error.no-utxos.title",
221
- subtitle: "v2.composer.build.error.no-utxos.subtitle"
222
- },
223
- "no-outputs": {
224
- title: "v2.composer.build.error.invalid-request.title",
225
- subtitle: "v2.composer.build.error.invalid-request.subtitle"
226
- },
227
- "invalid-output": {
228
- title: "v2.composer.build.error.invalid-request.title",
229
- subtitle: "v2.composer.build.error.invalid-request.subtitle"
230
- },
231
- "invalid-metadata": {
232
- title: "v2.composer.build.error.invalid-request.title",
233
- subtitle: "v2.composer.build.error.invalid-request.subtitle"
234
- },
235
- "input-unavailable": {
236
- title: "v2.composer.build.error.invalid-request.title",
237
- subtitle: "v2.composer.build.error.invalid-request.subtitle"
238
- },
239
- "invalid-address": {
240
- title: "v2.composer.build.error.invalid-request.title",
241
- subtitle: "v2.composer.build.error.invalid-request.subtitle"
242
- },
243
- "insufficient-funds": {
244
- title: "v2.composer.build.error.invalid-request.title",
245
- subtitle: "v2.composer.build.error.invalid-request.subtitle"
246
- }
247
- };
248
- const failure$1 = (error, code) => ({
249
- success: false,
250
- error: {
251
- name: error.name,
252
- message: error.message
253
- },
254
- errorTranslationKeys: (code ? BUILD_ERROR_KEYS_BY_CODE$1[code] : void 0) ?? GENERIC_BUILD_ERROR_KEYS$1
255
- });
256
- const buildComposition = async (state, stateObservables, dependencies) => {
257
- try {
258
- const { accountId, request } = state;
259
- const cardano = dependencies.txExecutorCardano;
260
- const cardanoContext = stateObservables.cardanoContext;
261
- const [networkMagic, protocolParameters, tip, eraSummaries, accountUtxos, unspendableUtxos, addresses] = await Promise.all([
262
- firstValueFrom(cardano.cardanoNetworkMagic$),
263
- firstValueFrom(cardanoContext.selectProtocolParameters$),
264
- firstValueFrom(cardanoContext.selectTip$),
265
- firstValueFrom(cardanoContext.selectEraSummaries$),
266
- firstValueFrom(cardano.cardanoAccountUtxos$),
267
- firstValueFrom(cardano.cardanoAccountUnspendableUtxos$),
268
- firstValueFrom(cardano.cardanoAddresses$)
269
- ]);
270
- if (networkMagic === void 0) throw new Error("Cardano network magic not available");
271
- if (!protocolParameters) throw new Error("Cardano protocol parameters not available");
272
- if (!tip) throw new Error("Cardano chain tip not available");
273
- if (!eraSummaries) throw new Error("Cardano era summaries not available");
274
- refuseExtensionAccount(accountId, addresses);
275
- const primary = addresses.filter((address) => address.accountId === accountId && address.blockchainName === "Cardano")[0];
276
- if (!primary) throw new Error("No Cardano addresses found for account");
277
- const result = await buildComposerTx({
278
- request,
279
- changeAddress: toPaymentAddress(request.changeAddress ?? primary.address, "The change address"),
280
- networkMagic,
281
- protocolParameters,
282
- spendableUtxos: filterSpendableUtxos(accountUtxos[accountId] ?? [], unspendableUtxos[accountId] ?? []),
283
- tipSlot: Number(tip.slot),
284
- eraSummaries
285
- });
286
- return {
287
- success: true,
288
- serializedTx: result.cbor,
289
- txId: result.txId,
290
- fees: [{
291
- tokenId: LOVELACE_TOKEN_ID,
292
- amount: BigNumber(result.fee)
293
- }]
294
- };
295
- } catch (error) {
296
- return failure$1(error instanceof Error ? error : new Error(String(error)), error.code);
297
- }
298
- };
299
- const makeComposerBuilding = () => (_, stateObservables, dependencies) => firstStateOfStatus(stateObservables.composerFlow.selectState$, "Building").pipe(switchMap((state) => from(buildComposition(state, stateObservables, dependencies)).pipe(map((result) => dependencies.actions.composerFlow.buildCompleted({
300
- accountId: state.accountId,
301
- result
302
- })))));
303
- //#endregion
304
- //#region ../../packages/module/blockchain-cardano/src/store/composer-flow-side-effects.ts
305
- const composerFlowSideEffects = [makeComposerBuilding()];
306
- //#endregion
307
- //#region ../../packages/module/blockchain-cardano/src/store/dependencies.ts
308
- const initializeDependencies = async (_, { logger }) => ({ cardanoInMemorySigning: { signTransaction: (props) => forkJoin([from(SodiumBip32Ed25519.create()), from(util.createTxInKeyPathMap(props.tx.body().toCore(), props.knownAddresses, createInputResolver(props.utxo)))]).pipe(mergeMap(([bip32Ed25519, txInKeyPathMap]) => {
309
- const encryptedRootPrivateKeyBytes = ByteArray.fromHex(props.encryptedRootPrivateKey);
310
- return from(new InMemoryKeyAgent({
311
- accountIndex: props.accountIndex,
312
- chainId: props.chainId,
313
- encryptedRootPrivateKeyBytes: [...encryptedRootPrivateKeyBytes],
314
- extendedAccountPublicKey: props.extendedAccountPublicKey,
315
- getPassphrase: async () => props.authSecret,
316
- purpose: KeyPurpose.STANDARD
317
- }, {
318
- bip32Ed25519,
319
- logger,
320
- rootPrivateKeyEncryption: SecretBox.isSealed(encryptedRootPrivateKeyBytes) ? {
321
- encrypt: SecretBox.seal,
322
- decrypt: SecretBox.open
323
- } : void 0
324
- }).signTransaction(props.tx.body(), {
325
- knownAddresses: props.knownAddresses,
326
- txInKeyPathMap,
327
- scripts: props.tx.toCore().witness.scripts
328
- })).pipe(map((signatures) => {
329
- const witnessSet = props.tx.witnessSet();
330
- applyVkeyWitnesses(witnessSet, signatures);
331
- props.tx.setWitnessSet(witnessSet);
332
- return Ok$1(props.tx);
333
- }));
334
- }), catchError((error) => of(Err$1({
335
- code: "SIGNING_FAILED",
336
- message: error.message
337
- })))) } });
338
- //#endregion
339
- //#region ../../packages/lib/cnight-dust-designation/src/constants.ts
340
- const LOVELACE_FOR_REGISTRATION = 1586080n;
341
- //#endregion
342
- //#region ../../packages/lib/cnight-dust-designation/src/errors.ts
343
- const Ok = (value) => ({
344
- ok: true,
345
- value
346
- });
347
- const Err = (error) => ({
348
- ok: false,
349
- error
350
- });
351
- //#endregion
352
- //#region ../../packages/lib/cnight-dust-designation/src/value-objects/network-id.vo.ts
353
- const CardanoDustNetwork = {
354
- mainnet: "mainnet",
355
- testnet: "testnet",
356
- fromNetworkMagic: (networkMagic) => networkMagic === 764824073 ? CardanoDustNetwork.mainnet : CardanoDustNetwork.testnet,
357
- toNetworkId: (network) => network === CardanoDustNetwork.mainnet ? 1 : 0
358
- };
359
- //#endregion
360
- //#region ../../packages/lib/cnight-dust-designation/src/cnight-asset.ts
361
- const TESTNET_CNIGHT_POLICY_ID = Cardano.PolicyId("d2dbff622e509dda256fedbd31ef6e9fd98ed49ad91d5c0e07f68af1");
362
- const TESTNET_CNIGHT_ASSET_NAME = Cardano.AssetName("");
363
- const MAINNET_CNIGHT_POLICY_ID = Cardano.PolicyId("0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa");
364
- /** "NIGHT" in hex — the mainnet cNIGHT token is named NIGHT. */
365
- const MAINNET_CNIGHT_ASSET_NAME = Cardano.AssetName("4e49474854");
366
- const getCnightAssetId = (network) => {
367
- const policyId = network === CardanoDustNetwork.mainnet ? MAINNET_CNIGHT_POLICY_ID : TESTNET_CNIGHT_POLICY_ID;
368
- const assetName = network === CardanoDustNetwork.mainnet ? MAINNET_CNIGHT_ASSET_NAME : TESTNET_CNIGHT_ASSET_NAME;
369
- return Cardano.AssetId.fromParts(policyId, assetName);
370
- };
371
- //#endregion
372
- //#region ../../packages/lib/cnight-dust-designation/src/scripts/mainnet.ts
373
- const CNIGHT_GENERATES_DUST_MAINNET_CBOR = "590c8401010029800aba4aba2aba1aba0aab9faab9eaab9dab9cab9a488888888a60022a6600492119657870656374205b782c202e2e726573745d203d206c69737400168a9980124929657870656374205b506169722822222c2031295d203d20746f6b656e73207c3e20746f5f706169727300168a9980124936657870656374206275696c74696e2e6c656e6774685f6f665f62797465617272617928647573745f6164647265737329203c3d20333300168a998012495365787065637420447573744d617070696e67446174756d207b20635f77616c6c65742c20647573745f61646472657373207d203d0a2020202020202020202020202020202020206f75747075745f646174756d00168a998012493065787065637420447573744d617070696e67446174756d207b20635f77616c6c65742c202e2e207d203d20646174756d00164888896600330013009375401f2300d300e001911919800800801912cc00400629422b3001300330100018a518998010011808800a0144039370e90004dc3a40052232330010010032259800800c026264b300130040018800c4cc00c00cc04800900b1808000a01c9b874801122222229800980a003cc040dd51809803c88966002600e60246ea800e264646600200200844b30010018a508acc004cdc79bae30190010038a51899801001180d000a026405c6eb8c058c04cdd5001c4cc0200048cdd798098008022020911192cc004c020006264b3001001801c4c966002003004802401200913259800980d801c01a00a80c0dd7000a0363018001405860286ea80122b300130070018992cc00400600713259800800c01200900480244c9660026036007006802a030375c00280d8c060005016180a1baa0048012022404460246ea800d22223322323298009bab301b0019bac301b301c301c0019bac301b007980b9baa0039bac301b0049bab301b0024888889660026024007133225980099baf30230104c103d87980008acc00401a2a6603c9211b657870656374205b696e7075742c202e2e5d203d20696e7075747300168992cc0040062b300130153020375400313259800800c06e264b30010018992cc00400603b13259800800c07a03d01e80f44c966002605400719800802456600266e24dc6800a408519800802403601c80a2040811a03e809a03e8138dd7000a05430270014094604e00501c80e40720388140c09400502318109baa00180d203c80d406a03501a409864b300132330010010082259800800c528456600266ebcc098c08cdd51813000801c528c4cc008008c09c00502020488992cc00400603b13259800981380144c96600266e3d220100375c6046005159800980b800c4c8c96600264b30010018a99812a48130657870656374205b5f2c202e2e6e66745d203d2076616c7565207c3e20746f5f64696374207c3e20746f5f70616972730016899baf374c60560026e98cc0a4cdd81ba9009374c6605266ec13010140004c010101004bd6f7b63025eb7bdb1810281bab30290018992cc004c060c098dd5000c4c0a8c09cdd5000c54cc09524012165787065637420496e6c696e65446174756d28646174756d29203d20646174756d001640906052605400315330244901266578706563742069735f73696e676c65746f6e2876616c75652c20706f6c6963792c202222290016408c6052604a6ea8cc05c0248cdd7981498131baa30293026375400200466e95200233026375200c97ae080fa04280fa042375a604600301e4090604a0028118dd5981099801002119b8f375c6042002009153301f49016b6578706563740a202020206c6973742e616e79280a202020202020696e707574732c0a202020202020666e28696e7075743a20496e70757429207b20696e7075742e6f75747075745f7265666572656e6365203d3d206f6e655f73686f745f726566207d2c0a202020202900164078604660406ea8c08c01902144c96600266ebcdd31981199bb04c10140003750653001001804520004004444b30010028800c660020073028002acc004cdd7981398121baa302730243754603460486ea8c09c008012266e0000520018800a042400c81292f5bded8c0604266004008466e3cdd71810800802456600330013371e0069111c0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa00a50a5140791980099b8f003489076d61696e6e657400a50a51407914a080f2294101e19ba548008cc088dd480125eb8101d1bae3021301e375401244646600200200644b300100180f44c96600260080031001899801801981380120403025001408d1598009807801c4c9660026024603c6ea800626464944ca6002003007802a002222598008014400633001003981380156600266ebcc098c08cdd5181318119baa301930233754604c00400b159800800c54cc0852413f657870656374205b4f7574707574207b20616464726573732c2076616c75652c20646174756d2c202e2e207d2c202e2e726573745d203d206f757470757473001689919912cc004cdd7981498131baa30290030088992cc0040062a6604a920133657870656374205b5f2c202e2e6e66745f69645d203d2076616c7565207c3e20746f5f64696374207c3e20746f5f706169727300168acc004cdd79ba6302b0010088992cc004c064c09cdd5000c4c966002003159800980e98141baa0018992cc00400604713259800800c4c9660020030258992cc00400604d026813409a264b300130320038cc0040122b3001337126e3400520428acc006600200901580b20388804c54cc0b12413b65787065637420636865636b5f6175746828635f77616c6c65742c2065787472615f7369676e61746f726965732c207769746864726177616c7329001640ad02840ad027406d02740bc6eb80050321817800a05a302f002812409204902440c0605a0028158c0a4dd5000c089026408a045022811205c302b3028375400315330264912865787065637420496e6c696e65446174756d286f75747075745f646174756d29203d20646174756d001640946054605600715330254901266578706563742061735f64617461286e66745f696429203d3d2065787065637465645f6e6674001640908140dd59814801454cc09124012d65787065637420616464726573732e7061796d656e745f63726564656e7469616c203d3d206f776e5f637265640016408c6050002605000460466ea8c09800502444005020200640906e98cc084cdd81811180f9baa0014c0103a14001004bd6f7b630454cc07524012265787065637420536372697074286f776e5f6861736829203d206f776e5f63726564001640706042603c6ea80262b3001301100389919912cc004c054c080dd5000c4c966002003159800980b18109baa0018992cc00400603713259800800c4c96600200301d8992cc00400603d01e80f407a264b3001302b0038cc004012264b3001301b3027375400313259800cc00401a021011405d15980099b880014800229462b30013301e01123375e60520020071301d0018a5040988132294102619192cc004c074c0a4dd5000c5200089bad302d302a37540028138c966002603a60526ea80062980103d87a8000899198008009bab302e302b375400444b30010018a6103d87a8000899192cc004cdc8a45000018acc004cdc7a44100001899ba548000cc0c0c0b80092f5c114c0103d87a800040ad133004004303200340ac6eb8c0b0004c0bc00502d204e323300100100d2259800800c5300103d87a8000899192cc004cdc8802800c56600266e3c014006266e9520003302f302d0024bd7045300103d87a800040a9133004004303100340a86eb8c0ac004c0b800502c1bae302b3028375400315330264919165787065637420536372697074286f776e5f686173682920617320736372697074203d0a202020202020202020206d7573745f66696e6428696e707574732c20666e28696e70757429207b20696e7075742e6f75747075745f7265666572656e6365203d3d206f7574707574207d292e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c001640946054604e6ea8c0a8c09cdd5180e98139baa3301900d23375e605660506ea800402603e80a203e8140dd7000a05630280014098605000501c80e40720388148c09800502418111baa00180d203e80d406a03501a409c604860426ea80062a6603e9211a65787065637420536f6d6528646174756d29203d20646174756d00164078604400260446046002603c6ea80262b30013370e9003001c5660026024603a6ea8c084c088c078dd5004c528c5901b45901b2036406c80d8603660360026034603400460306030006602e603000845268a99803a491856616c696461746f722072657475726e65642066616c7365001365640181";
374
- //#endregion
375
- //#region ../../packages/lib/cnight-dust-designation/src/scripts/testnet.ts
376
- const CNIGHT_GENERATES_DUST_TESTNET_CBOR = "590c6801010029800aba4aba2aba1aba0aab9faab9eaab9dab9cab9a488888888a60022a6600492119657870656374205b782c202e2e726573745d203d206c69737400168a9980124929657870656374205b506169722822222c2031295d203d20746f6b656e73207c3e20746f5f706169727300168a9980124936657870656374206275696c74696e2e6c656e6774685f6f665f62797465617272617928647573745f6164647265737329203c3d20333300168a998012495365787065637420447573744d617070696e67446174756d207b20635f77616c6c65742c20647573745f61646472657373207d203d0a2020202020202020202020202020202020206f75747075745f646174756d00168a998012493065787065637420447573744d617070696e67446174756d207b20635f77616c6c65742c202e2e207d203d20646174756d00164888896600330013009375401f2300d300e001911919800800801912cc00400629422b3001300330100018a518998010011808800a0144039370e90004dc3a40052232330010010032259800800c026264b300130040018800c4cc00c00cc04800900b1808000a01c9b874801122222229800980a003cc040dd51809803c88966002600e60246ea800e264646600200200844b30010018a508acc004cdc79bae30190010038a51899801001180d000a026405c6eb8c058c04cdd5001c4cc0200048cdd798098008022020911192cc004c020006264b3001001801c4c966002003004802401200913259800980d801c01a00a80c0dd7000a0363018001405860286ea80122b300130070018992cc00400600713259800800c01200900480244c9660026036007006802a030375c00280d8c060005016180a1baa0048012022404460246ea800d22223322323298009bab301b0019bac301b301c301c0019bac301b007980b9baa0039bac301b0049bab301b0024888889660026024007133225980099baf30230104c103d87980008acc00401a2a6603c9211b657870656374205b696e7075742c202e2e5d203d20696e7075747300168992cc0040062b300130153020375400313259800800c06e264b30010018992cc00400603b13259800800c07a03d01e80f44c966002605400719800802456600266e24dc6800a408519800802403601c80a2040811a03e809a03e8138dd7000a05430270014094604e00501c80e40720388140c09400502318109baa00180d203c80d406a03501a409864b300132330010010082259800800c528456600266ebcc098c08cdd51813000801c528c4cc008008c09c00502020488992cc00400603b13259800981380144c96600266e3d220100375c6046005159800980b800c4c8c96600264b30010018a99812a48130657870656374205b5f2c202e2e6e66745d203d2076616c7565207c3e20746f5f64696374207c3e20746f5f70616972730016899baf374c60560026e98cc0a4cdd81ba9009374c6605266ec13010140004c010101004bd6f7b63025eb7bdb1810281bab30290018992cc004c060c098dd5000c4c0a8c09cdd5000c54cc09524012165787065637420496e6c696e65446174756d28646174756d29203d20646174756d001640906052605400315330244901266578706563742069735f73696e676c65746f6e2876616c75652c20706f6c6963792c202222290016408c6052604a6ea8cc05c0248cdd7981498131baa30293026375400200466e95200233026375200c97ae080fa04280fa042375a604600301e4090604a0028118dd5981099801002119b8f375c6042002009153301f49016b6578706563740a202020206c6973742e616e79280a202020202020696e707574732c0a202020202020666e28696e7075743a20496e70757429207b20696e7075742e6f75747075745f7265666572656e6365203d3d206f6e655f73686f745f726566207d2c0a202020202900164078604660406ea8c08c01902144c96600266ebcdd31981199bb04c10140003750653001001804520004004444b30010028800c660020073028002acc004cdd7981398121baa302730243754603460486ea8c09c008012266e0000520018800a042400c81292f5bded8c0604266004008466e3cdd7181080080246600266e3c00d22011cd2dbff622e509dda256fedbd31ef6e9fd98ed49ad91d5c0e07f68af100a50a51407914a080f0cdd2a4004660446ea40092f5c080e8dd71810980f1baa0092232330010010032259800800c07a264b300130040018800c4cc00c00cc09c0090201812800a0468acc004c03c00e264b30013012301e3754003132324a2653001001803c0150011112cc00400a200319800801cc09c00ab30013375e604c60466ea8c098c08cdd5180c98119baa30260020058acc0040062a660429213f657870656374205b4f7574707574207b20616464726573732c2076616c75652c20646174756d2c202e2e207d2c202e2e726573745d203d206f757470757473001689919912cc004cdd7981498131baa30290030088992cc0040062a6604a920133657870656374205b5f2c202e2e6e66745f69645d203d2076616c7565207c3e20746f5f64696374207c3e20746f5f706169727300168acc004cdd79ba6302b0010088992cc004c064c09cdd5000c4c966002003159800980e98141baa0018992cc00400604713259800800c4c9660020030258992cc00400604d026813409a264b300130320038cc0040122b3001337126e3400520428acc006600200901580b20388804c54cc0b12413b65787065637420636865636b5f6175746828635f77616c6c65742c2065787472615f7369676e61746f726965732c207769746864726177616c7329001640ad02840ad027406d02740bc6eb80050321817800a05a302f002812409204902440c0605a0028158c0a4dd5000c089026408a045022811205c302b3028375400315330264912865787065637420496e6c696e65446174756d286f75747075745f646174756d29203d20646174756d001640946054605600715330254901266578706563742061735f64617461286e66745f696429203d3d2065787065637465645f6e6674001640908140dd59814801454cc09124012d65787065637420616464726573732e7061796d656e745f63726564656e7469616c203d3d206f776e5f637265640016408c6050002605000460466ea8c09800502444005020200640906e98cc084cdd81811180f9baa0014c0103a14001004bd6f7b630454cc07524012265787065637420536372697074286f776e5f6861736829203d206f776e5f63726564001640706042603c6ea80262b3001301100389919912cc004c054c080dd5000c4c966002003159800980b18109baa0018992cc00400603713259800800c4c96600200301d8992cc00400603d01e80f407a264b3001302b0038cc004012264b3001301b3027375400313259800cc00401a021011405d15980099b880014800229462b30013301e01123375e60520020071301d0018a5040988132294102619192cc004c074c0a4dd5000c5200089bad302d302a37540028138c966002603a60526ea80062980103d87a8000899198008009bab302e302b375400444b30010018a6103d87a8000899192cc004cdc8a45000018acc004cdc7a44100001899ba548000cc0c0c0b80092f5c114c0103d87a800040ad133004004303200340ac6eb8c0b0004c0bc00502d204e323300100100d2259800800c5300103d87a8000899192cc004cdc8802800c56600266e3c014006266e9520003302f302d0024bd7045300103d87a800040a9133004004303100340a86eb8c0ac004c0b800502c1bae302b3028375400315330264919165787065637420536372697074286f776e5f686173682920617320736372697074203d0a202020202020202020206d7573745f66696e6428696e707574732c20666e28696e70757429207b20696e7075742e6f75747075745f7265666572656e6365203d3d206f7574707574207d292e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c001640946054604e6ea8c0a8c09cdd5180e98139baa3301900d23375e605660506ea800402603e80a203e8140dd7000a05630280014098605000501c80e40720388148c09800502418111baa00180d203e80d406a03501a409c604860426ea80062a6603e9211a65787065637420536f6d6528646174756d29203d20646174756d00164078604400260446046002603c6ea80262b30013370e9003001c5660026024603a6ea8c084c088c078dd5004c528c5901b45901b2036406c80d8603660360026034603400460306030006602e603000845268a99803a491856616c696461746f722072657475726e65642066616c7365001365640181";
377
- //#endregion
378
- //#region ../../packages/lib/cnight-dust-designation/src/scripts/index.ts
379
- const cborWrapHexBytes = (payloadHex) => {
380
- const lengthBytes = payloadHex.length / 2;
381
- let header;
382
- if (lengthBytes < 24) header = (64 | lengthBytes).toString(16).padStart(2, "0");
383
- else if (lengthBytes < 256) header = "58" + lengthBytes.toString(16).padStart(2, "0");
384
- else if (lengthBytes < 65536) header = "59" + lengthBytes.toString(16).padStart(4, "0");
385
- else if (lengthBytes < 4294967296) header = "5a" + lengthBytes.toString(16).padStart(8, "0");
386
- else throw new Error(`script too large to CBOR-wrap (${lengthBytes} bytes)`);
387
- return header + payloadHex;
388
- };
389
- const getDustGeneratorScriptCbor = (network) => HexBlob(cborWrapHexBytes(network === CardanoDustNetwork.mainnet ? CNIGHT_GENERATES_DUST_MAINNET_CBOR : CNIGHT_GENERATES_DUST_TESTNET_CBOR));
390
- const getDustGeneratorPlutusV3Script = (network) => Serialization.PlutusV3Script.fromCbor(getDustGeneratorScriptCbor(network));
391
- //#endregion
392
- //#region ../../packages/lib/cnight-dust-designation/src/plutus/datum.ts
393
- const encodeCWallet = (cWallet) => {
394
- const fields = new Serialization.PlutusList();
395
- const hashBytes = cWallet.kind === "verificationKey" ? cWallet.stakeKeyHash : cWallet.scriptHash;
396
- fields.add(Serialization.PlutusData.newBytes(hashBytes));
397
- const alternative = cWallet.kind === "verificationKey" ? 0n : 1n;
398
- return Serialization.PlutusData.newConstrPlutusData(new Serialization.ConstrPlutusData(alternative, fields));
399
- };
400
- const encodeDustMappingDatum = (value) => {
401
- const fields = new Serialization.PlutusList();
402
- fields.add(encodeCWallet(value.cWallet));
403
- fields.add(Serialization.PlutusData.newBytes(value.dustAddress));
404
- return Serialization.PlutusData.newConstrPlutusData(new Serialization.ConstrPlutusData(0n, fields));
405
- };
406
- const dustMappingDatumToCbor = (value) => encodeDustMappingDatum(value).toCbor();
407
- var CardanoStakeKeyHashError = class extends Error {
408
- code;
409
- constructor(message) {
410
- super(message);
411
- this.name = "CardanoStakeKeyHashError";
412
- this.code = "invalid-length";
413
- }
414
- };
415
- const CardanoStakeKeyHash = (bytes) => {
416
- if (bytes.length !== 28) throw new CardanoStakeKeyHashError(`CardanoStakeKeyHash expects 28 bytes, got ${bytes.length}`);
417
- return bytes;
418
- };
419
- CardanoStakeKeyHash.toHex = (hash) => Array.from(hash).map((b) => b.toString(16).padStart(2, "0")).join("");
420
- CardanoStakeKeyHash.fromHex = (hex) => {
421
- const normalised = hex.startsWith("0x") ? hex.slice(2) : hex;
422
- if (normalised.length !== 56) throw new CardanoStakeKeyHashError(`CardanoStakeKeyHash hex expects 56 chars, got ${normalised.length}`);
423
- if (!/^[0-9a-fA-F]+$/.test(normalised)) throw new CardanoStakeKeyHashError(`CardanoStakeKeyHash hex contains non-hex characters: ${hex}`);
424
- const bytes = new Uint8Array(28);
425
- for (let index = 0; index < bytes.length; index++) bytes[index] = parseInt(normalised.slice(index * 2, index * 2 + 2), 16);
426
- return CardanoStakeKeyHash(bytes);
427
- };
428
- var MidnightCoinPubkeyError = class extends Error {
429
- code;
430
- constructor(code, message) {
431
- super(message);
432
- this.name = "MidnightCoinPubkeyError";
433
- this.code = code;
434
- }
435
- };
436
- const MidnightCoinPubkey = (bytes) => {
437
- if (bytes.length > 33) throw new MidnightCoinPubkeyError("invalid-length", `MidnightCoinPubkey accepts at most 33 bytes, got ${bytes.length}`);
438
- return bytes;
439
- };
440
- MidnightCoinPubkey.toHex = (pubkey) => Array.from(pubkey).map((b) => b.toString(16).padStart(2, "0")).join("");
441
- //#endregion
442
- //#region ../../packages/lib/cnight-dust-designation/src/plutus/datum-decode.ts
443
- const decodeDustMappingDatum = (cbor) => {
444
- let data;
445
- try {
446
- data = Serialization.PlutusData.fromCbor(HexBlob(cbor.toString()));
447
- } catch {
448
- return;
449
- }
450
- const outer = data.asConstrPlutusData();
451
- if (!outer || outer.getAlternative() !== 0n) return void 0;
452
- const fields = outer.getData();
453
- if (fields.getLength() !== 2) return void 0;
454
- const cWalletData = fields.get(0).asConstrPlutusData();
455
- if (!cWalletData) return void 0;
456
- const cWalletFields = cWalletData.getData();
457
- if (cWalletFields.getLength() !== 1) return void 0;
458
- const credBytes = cWalletFields.get(0).asBoundedBytes();
459
- if (!credBytes || credBytes.length !== 28) return void 0;
460
- let cWallet;
461
- if (cWalletData.getAlternative() === 0n) cWallet = {
462
- kind: "verificationKey",
463
- stakeKeyHash: CardanoStakeKeyHash(credBytes)
464
- };
465
- else if (cWalletData.getAlternative() === 1n) cWallet = {
466
- kind: "script",
467
- scriptHash: credBytes
468
- };
469
- else return;
470
- const dustBytes = fields.get(1).asBoundedBytes();
471
- if (!dustBytes || dustBytes.length > 33) return void 0;
472
- let dustAddress;
473
- try {
474
- dustAddress = MidnightCoinPubkey(dustBytes);
475
- } catch {
476
- return;
477
- }
478
- return {
479
- cWallet,
480
- dustAddress
481
- };
482
- };
483
- /**
484
- * True when the datum's c_wallet VerificationKey hash matches the
485
- * given stake-key-hash. Used by the designation-detection hook to
486
- * find the active account's registration UTxO among the script
487
- * address's outputs.
488
- */
489
- const datumMatchesStakeKey = (datum, stakeKeyHash) => {
490
- if (datum.cWallet.kind !== "verificationKey") return false;
491
- if (datum.cWallet.stakeKeyHash.length !== stakeKeyHash.length) return false;
492
- for (let index = 0; index < stakeKeyHash.length; index++) if (datum.cWallet.stakeKeyHash[index] !== stakeKeyHash[index]) return false;
493
- return true;
494
- };
495
- //#endregion
496
- //#region ../../packages/lib/cnight-dust-designation/src/plutus/redeemer.ts
497
- const emptyConstr = (alternative) => Serialization.PlutusData.newConstrPlutusData(new Serialization.ConstrPlutusData(alternative, new Serialization.PlutusList()));
498
- const dustActionCreate = () => emptyConstr(0n);
499
- const dustActionBurn = () => emptyConstr(1n);
500
- const dataVoid = () => emptyConstr(0n);
501
- const dustActionCreateCbor = () => dustActionCreate().toCbor();
502
- const dustActionBurnCbor = () => dustActionBurn().toCbor();
503
- const dataVoidCbor = () => dataVoid().toCbor();
504
- //#endregion
505
- //#region ../../packages/lib/cnight-dust-designation/src/plutus/script-address.ts
506
- const getDustGeneratorScriptHash = (network) => getDustGeneratorPlutusV3Script(network).hash();
507
- const getDustGeneratorPaymentAddress = (network) => {
508
- const scriptHash = getDustGeneratorScriptHash(network);
509
- const networkId = CardanoDustNetwork.toNetworkId(network);
510
- const credential = {
511
- type: Cardano.CredentialType.ScriptHash,
512
- hash: scriptHash
513
- };
514
- return Cardano.EnterpriseAddress.fromCredentials(networkId, credential).toAddress().toBech32();
515
- };
516
- const getDustGeneratorRewardAccount = (network) => {
517
- const scriptHash = getDustGeneratorScriptHash(network);
518
- const networkId = CardanoDustNetwork.toNetworkId(network);
519
- const credential = {
520
- type: Cardano.CredentialType.ScriptHash,
521
- hash: scriptHash
522
- };
523
- return Cardano.RewardAddress.fromCredentials(networkId, credential).toAddress().toBech32();
524
- };
525
- const getDustMappingNftPolicyId = (network) => Cardano.PolicyId(getDustGeneratorScriptHash(network));
526
- /**
527
- * The DUST-mapping NFT minted by the validator has policy = script
528
- * hash and asset_name = empty bytestring. This is the on-chain
529
- * identifier callers query for to determine "is this account
530
- * designated?".
531
- */
532
- const getDustMappingNftAssetId = (network) => Cardano.AssetId.fromParts(getDustMappingNftPolicyId(network), Cardano.AssetName(""));
533
- //#endregion
534
- //#region ../../packages/lib/cnight-dust-designation/src/dust-address-decode.ts
535
- const COMPACT_MODE_1_MIN = 64n;
536
- const COMPACT_MODE_2_MIN = 1n << 14n;
537
- const COMPACT_MODE_3_MIN = 1n << 30n;
538
- const BLS12_381_SCALAR_MODULUS = BigInt("0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001");
539
- const leBytesToScalar = (bytes) => {
540
- let scalar = 0n;
541
- for (let index = bytes.length - 1; index >= 0; index--) scalar = scalar << 8n | BigInt(bytes[index]);
542
- return scalar;
543
- };
544
- /**
545
- * Why `payload` is not the canonical (minimal) SCALE-compact encoding of an
546
- * in-field BLS12-381 scalar, or `undefined` when it is.
547
- *
548
- * Minimality is ours to enforce: neither the Midnight SDK codec nor the
549
- * midnight-node pallet checks it, and a padded encoding's claimability is
550
- * unknown — so a non-canonical target must never reach the datum.
551
- *
552
- * Returns a reason instead of throwing so each boundary can surface it in its
553
- * own channel: this file throws at the address-string input boundary, the
554
- * blueprint builder returns `Err` at the datum-write boundary.
555
- */
556
- const canonicalDustPayloadDefect = (payload) => {
557
- if (payload.length === 0) return "empty payload";
558
- const header = payload[0];
559
- const mode = header & 3;
560
- let scalar;
561
- if (mode === 0) {
562
- if (payload.length !== 1) return `single-byte mode declared, ${payload.length}-byte payload`;
563
- scalar = BigInt(header >> 2);
564
- } else if (mode === 1) {
565
- if (payload.length !== 2) return `two-byte mode declared, ${payload.length}-byte payload`;
566
- scalar = BigInt(header >> 2) + (BigInt(payload[1]) << 6n);
567
- if (scalar < COMPACT_MODE_1_MIN) return `${scalar} fits a shorter mode`;
568
- } else if (mode === 2) {
569
- if (payload.length !== 4) return `four-byte mode declared, ${payload.length}-byte payload`;
570
- scalar = BigInt(header >> 2) + (BigInt(payload[1]) << 6n) + (BigInt(payload[2]) << 14n) + (BigInt(payload[3]) << 22n);
571
- if (scalar < COMPACT_MODE_2_MIN) return `${scalar} fits a shorter mode`;
572
- } else {
573
- const declaredScalarBytes = (header >> 2) + 4;
574
- if (payload.length !== declaredScalarBytes + 1) return `${declaredScalarBytes}-byte scalar declared, ${payload.length - 1} bytes present`;
575
- if (payload[payload.length - 1] === 0) return "most significant scalar byte is zero";
576
- scalar = leBytesToScalar(payload.subarray(1));
577
- if (scalar < COMPACT_MODE_3_MIN) return `${scalar} fits a shorter mode`;
578
- }
579
- return scalar >= BLS12_381_SCALAR_MODULUS ? "scalar is outside the BLS12-381 field" : void 0;
580
- };
581
- //#endregion
582
- //#region ../../packages/lib/cnight-dust-designation/src/builders/build-night-designation-tx.ts
583
- const NFT_ASSET_NAME = Cardano.AssetName("");
584
- const computeScriptOutputLovelace = ({ scriptAddress, nftAsset, datumCbor, coinsPerUtxoByte }) => {
585
- const datum = Serialization.PlutusData.fromCbor(datumCbor).toCore();
586
- const representativeOutput = {
587
- address: scriptAddress,
588
- value: {
589
- coins: LOVELACE_FOR_REGISTRATION,
590
- assets: new Map([[nftAsset, 1n]])
591
- },
592
- datum
593
- };
594
- const minCoin = computeMinimumCoinQuantity(coinsPerUtxoByte)(representativeOutput);
595
- return minCoin < 1586080n ? LOVELACE_FOR_REGISTRATION : minCoin;
596
- };
597
- const dustPubkeyError = (dustPubkey) => {
598
- if (dustPubkey.length > 33) return {
599
- code: "dust-address-too-long",
600
- message: `dust_address exceeds the on-chain 33-byte limit enforced by the validator.`,
601
- actualBytes: dustPubkey.length,
602
- maxBytes: 33
603
- };
604
- const defect = canonicalDustPayloadDefect(dustPubkey);
605
- return defect === void 0 ? void 0 : {
606
- code: "invalid-dust-payload",
607
- message: `dust_address is not a canonical SCALE-compact payload (${defect}).`
608
- };
609
- };
610
- const buildNightDesignationTxBlueprint = (params) => {
611
- if (params.cnightUtxos.length === 0) return Err({
612
- code: "no-cnight",
613
- message: "No cNIGHT in this account."
614
- });
615
- const scriptAddress = getDustGeneratorPaymentAddress(params.network);
616
- const scriptRewardAccount = getDustGeneratorRewardAccount(params.network);
617
- const nftPolicyId = getDustMappingNftPolicyId(params.network);
618
- const nftAsset = getDustMappingNftAssetId(params.network);
619
- const scriptCbor = getDustGeneratorScriptCbor(params.network);
620
- const requiredSigners = {
621
- paymentKeyHash: params.paymentKeyHash,
622
- stakeKeyHash: params.stakeKeyHash
623
- };
624
- if (params.action.kind === "register") {
625
- const dustError = dustPubkeyError(params.action.dustPubkey);
626
- if (dustError) return Err(dustError);
627
- const datumCbor = dustMappingDatumToCbor({
628
- cWallet: {
629
- kind: "verificationKey",
630
- stakeKeyHash: params.stakeKeyHash
631
- },
632
- dustAddress: params.action.dustPubkey
633
- });
634
- return Ok({
635
- network: params.network,
636
- scriptAddress,
637
- scriptRewardAccount,
638
- dustMappingNftAssetId: nftAsset,
639
- forcedInputs: params.cnightUtxos,
640
- scriptOutput: {
641
- address: scriptAddress,
642
- lovelace: computeScriptOutputLovelace({
643
- scriptAddress,
644
- nftAsset,
645
- datumCbor,
646
- coinsPerUtxoByte: params.coinsPerUtxoByte
647
- }),
648
- nftAsset,
649
- nftQuantity: 1n,
650
- inlineDatumCbor: datumCbor
651
- },
652
- mint: {
653
- policyId: nftPolicyId,
654
- assetName: NFT_ASSET_NAME,
655
- quantity: 1n,
656
- redeemerCbor: dustActionCreateCbor()
657
- },
658
- spendRedeemer: null,
659
- withdrawal: null,
660
- requiredSigners,
661
- scriptCbor
662
- });
663
- }
664
- if (params.action.kind === "update") {
665
- const dustError = dustPubkeyError(params.action.dustPubkey);
666
- if (dustError) return Err(dustError);
667
- const datumCbor = dustMappingDatumToCbor({
668
- cWallet: {
669
- kind: "verificationKey",
670
- stakeKeyHash: params.stakeKeyHash
671
- },
672
- dustAddress: params.action.dustPubkey
673
- });
674
- return Ok({
675
- network: params.network,
676
- scriptAddress,
677
- scriptRewardAccount,
678
- dustMappingNftAssetId: nftAsset,
679
- forcedInputs: [...params.cnightUtxos, params.action.registrationUtxo],
680
- scriptOutput: {
681
- address: scriptAddress,
682
- lovelace: computeScriptOutputLovelace({
683
- scriptAddress,
684
- nftAsset,
685
- datumCbor,
686
- coinsPerUtxoByte: params.coinsPerUtxoByte
687
- }),
688
- nftAsset,
689
- nftQuantity: 1n,
690
- inlineDatumCbor: datumCbor
691
- },
692
- mint: null,
693
- spendRedeemer: {
694
- registrationUtxo: params.action.registrationUtxo,
695
- redeemerCbor: dataVoidCbor()
696
- },
697
- withdrawal: {
698
- rewardAccount: scriptRewardAccount,
699
- lovelace: params.action.scriptWithdrawableLovelace,
700
- redeemerCbor: dataVoidCbor()
701
- },
702
- requiredSigners,
703
- scriptCbor
704
- });
705
- }
706
- return Ok({
707
- network: params.network,
708
- scriptAddress,
709
- scriptRewardAccount,
710
- dustMappingNftAssetId: nftAsset,
711
- forcedInputs: [...params.cnightUtxos, params.action.registrationUtxo],
712
- scriptOutput: null,
713
- mint: {
714
- policyId: nftPolicyId,
715
- assetName: NFT_ASSET_NAME,
716
- quantity: -1n,
717
- redeemerCbor: dustActionBurnCbor()
718
- },
719
- spendRedeemer: {
720
- registrationUtxo: params.action.registrationUtxo,
721
- redeemerCbor: dataVoidCbor()
722
- },
723
- withdrawal: null,
724
- requiredSigners,
725
- scriptCbor
726
- });
727
- };
728
- //#endregion
729
- //#region ../../packages/lib/cnight-dust-designation/src/value-objects/cardano-payment-key-hash.vo.ts
730
- var CardanoPaymentKeyHashError = class extends Error {
731
- code;
732
- constructor(message) {
733
- super(message);
734
- this.name = "CardanoPaymentKeyHashError";
735
- this.code = "invalid-length";
736
- }
737
- };
738
- const CardanoPaymentKeyHash = (bytes) => {
739
- if (bytes.length !== 28) throw new CardanoPaymentKeyHashError(`CardanoPaymentKeyHash expects 28 bytes, got ${bytes.length}`);
740
- return bytes;
741
- };
742
- CardanoPaymentKeyHash.toHex = (hash) => Array.from(hash).map((b) => b.toString(16).padStart(2, "0")).join("");
743
- CardanoPaymentKeyHash.fromHex = (hex) => {
744
- const normalised = hex.startsWith("0x") ? hex.slice(2) : hex;
745
- if (normalised.length !== 56) throw new CardanoPaymentKeyHashError(`CardanoPaymentKeyHash hex expects 56 chars, got ${normalised.length}`);
746
- if (!/^[0-9a-fA-F]+$/.test(normalised)) throw new CardanoPaymentKeyHashError(`CardanoPaymentKeyHash hex contains non-hex characters: ${hex}`);
747
- const bytes = new Uint8Array(28);
748
- for (let index = 0; index < bytes.length; index++) bytes[index] = parseInt(normalised.slice(index * 2, index * 2 + 2), 16);
749
- return CardanoPaymentKeyHash(bytes);
750
- };
751
- //#endregion
752
- //#region ../../packages/module/blockchain-cardano/src/store/night-designation/account-key-hashes.ts
753
- const hexToBytes = (hex) => {
754
- if (hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(hex)) throw new Error(`Invalid hex string: "${hex}"`);
755
- return Uint8Array.from((hex.match(/.{1,2}/g) ?? []).map((byte) => parseInt(byte, 16)));
756
- };
757
- /**
758
- * Read the account's credentials off its primary Cardano address.
759
- *
760
- * Throws when the account has no Cardano address or its address carries no
761
- * stake credential — an enterprise address cannot satisfy the validator's
762
- * `check_auth`, so there is no designation to build or index for it.
763
- */
764
- const resolveAccountKeyHashes = (addresses, accountId) => {
765
- const primary = addresses.find((address) => address.accountId === accountId && address.blockchainName === "Cardano");
766
- if (!primary) throw new Error("No Cardano addresses found for account");
767
- const baseAddress = Cardano.Address.fromString(primary.address)?.asBase();
768
- if (!baseAddress) throw new Error("Account address is not a base (payment+stake) address");
769
- return {
770
- primaryAddress: Cardano.PaymentAddress(primary.address),
771
- paymentKeyHash: CardanoPaymentKeyHash(hexToBytes(baseAddress.getPaymentCredential().hash)),
772
- stakeKeyHash: CardanoStakeKeyHash(hexToBytes(baseAddress.getStakeCredential().hash))
773
- };
774
- };
775
- //#endregion
776
- //#region ../../packages/module/blockchain-cardano/src/store/night-designation/build-night-designation-tx.ts
777
- const toPlutusData = (cbor) => Serialization.PlutusData.fromCbor(cbor).toCore();
778
- const toKeyHashHex = (bytes) => Array.from(bytes).map((byte) => byte.toString(16).padStart(2, "0")).join("");
779
- const sameRef = (a, b) => a.txId === b.txId && a.index === b.index;
780
- const buildNightDesignationTx = async (params, dependencies) => {
781
- const blueprintResult = buildNightDesignationTxBlueprint({
782
- network: params.network,
783
- cnightUtxos: params.cnightUtxos,
784
- stakeKeyHash: params.stakeKeyHash,
785
- paymentKeyHash: params.paymentKeyHash,
786
- action: params.action,
787
- coinsPerUtxoByte: params.protocolParameters.coinsPerUtxoByte
788
- });
789
- if (!blueprintResult.ok) return blueprintResult;
790
- const blueprint = blueprintResult.value;
791
- const builder = new TransactionBuilder(dependencies.networkMagic, params.protocolParameters);
792
- builder.setChangeAddress(params.changeAddress).setUnspentOutputs(dependencies.coverUtxos).setCollateralUtxos(dependencies.coverUtxos).setCollateralChangeAddress(params.changeAddress).setPlutusContext({
793
- costModels: params.protocolParameters.costModels,
794
- txEvaluator: dependencies.txEvaluator,
795
- inputResolver: dependencies.inputResolver
796
- });
797
- builder.attachScript({
798
- __type: Cardano.ScriptType.Plutus,
799
- version: Cardano.PlutusLanguageVersion.V3,
800
- bytes: Serialization.PlutusV3Script.fromCbor(blueprint.scriptCbor).rawBytes()
801
- });
802
- const registrationRef = blueprint.spendRedeemer?.registrationUtxo[0];
803
- for (const utxo of blueprint.forcedInputs) if (blueprint.spendRedeemer && registrationRef && sameRef(utxo[0], registrationRef)) builder.addInput(utxo, { redeemer: toPlutusData(blueprint.spendRedeemer.redeemerCbor) });
804
- else builder.addInput(utxo);
805
- if (blueprint.mint) {
806
- const assetId = Cardano.AssetId.fromParts(blueprint.mint.policyId, blueprint.mint.assetName);
807
- builder.mintAssets(new Map([[assetId, blueprint.mint.quantity]]), toPlutusData(blueprint.mint.redeemerCbor));
808
- }
809
- if (blueprint.scriptOutput) builder.addOutput({
810
- address: blueprint.scriptOutput.address,
811
- value: {
812
- coins: blueprint.scriptOutput.lovelace,
813
- assets: new Map([[blueprint.scriptOutput.nftAsset, blueprint.scriptOutput.nftQuantity]])
814
- },
815
- datum: toPlutusData(blueprint.scriptOutput.inlineDatumCbor)
816
- });
817
- if (blueprint.withdrawal) builder.addScriptWithdrawal(blueprint.withdrawal.rewardAccount, blueprint.withdrawal.lovelace, toPlutusData(blueprint.withdrawal.redeemerCbor));
818
- builder.addRequiredSigner(toKeyHashHex(blueprint.requiredSigners.paymentKeyHash));
819
- builder.addRequiredSigner(toKeyHashHex(blueprint.requiredSigners.stakeKeyHash));
820
- builder.setValidityInterval({ invalidHereafter: params.ttlSlot });
821
- const transaction = await builder.build();
822
- const cbor = transaction.toCbor();
823
- const fee = transaction.body().fee();
824
- return Ok({
825
- cbor,
826
- txId: transaction.getId(),
827
- fee
828
- });
829
- };
830
- //#endregion
831
- //#region ../../packages/module/blockchain-cardano/src/store/night-designation/bounded-ex-units-evaluator.ts
832
- const BOUNDED_EX_UNITS_PER_REDEEMER = {
833
- memory: 2e6,
834
- steps: 7e8
835
- };
836
- /**
837
- * A {@link TxEvaluator} that returns a fixed, conservative budget for
838
- * every redeemer in the transaction (no network round-trip).
839
- */
840
- const boundedExUnitsEvaluator = { evaluate: async (tx) => (tx.witness.redeemers ?? []).map((redeemer) => ({
841
- purpose: redeemer.purpose,
842
- index: redeemer.index,
843
- budget: BOUNDED_EX_UNITS_PER_REDEEMER
844
- })) };
845
- //#endregion
846
- //#region ../../packages/module/blockchain-cardano/src/store/night-designation/provider-ex-units-evaluator.ts
847
- /**
848
- * Padding on every evaluated budget. The builder rewrites the fee (and the
849
- * change output that absorbs it) AFTER evaluation, so the script context the
850
- * node executes is not byte-identical to the one it priced. Under-declaring
851
- * fails phase-2 and forfeits the collateral, so the difference is paid for
852
- * rather than gambled on.
853
- */
854
- const EX_UNITS_MARGIN_PERCENT = 10;
855
- const withMargin = (budget) => ({
856
- memory: Math.ceil(budget.memory * (100 + EX_UNITS_MARGIN_PERCENT) / 100),
857
- steps: Math.ceil(budget.steps * (100 + EX_UNITS_MARGIN_PERCENT) / 100)
858
- });
859
- /**
860
- * A {@link TxEvaluator} that prices redeemers through the Cardano provider,
861
- * leaving any redeemer the provider did not price on the fixed budget
862
- * `boundedExUnitsEvaluator` assigns it.
863
- */
864
- const createProviderExUnitsEvaluator = ({ cardanoProvider, chainId, logger }) => {
865
- const evaluate = async (tx) => {
866
- try {
867
- const result = await firstValueFrom(cardanoProvider.evaluateTx({ tx: Serialization.Transaction.fromCore(tx).toCbor() }, { chainId }));
868
- if (result.isOk()) return result.value;
869
- logger.warn("cNIGHT designation: ex-units evaluation declined, using the bounded budget", result.error);
870
- } catch (error) {
871
- logger.warn("cNIGHT designation: ex-units evaluation failed, using the bounded budget", error);
872
- }
873
- };
874
- return { evaluate: async (tx, resolvedInputs) => {
875
- const bounded = await boundedExUnitsEvaluator.evaluate(tx, resolvedInputs);
876
- if (bounded.length === 0) return bounded;
877
- const evaluated = await evaluate(tx);
878
- return bounded.map((entry) => {
879
- const match = evaluated?.find((budget) => budget.purpose === entry.purpose && budget.index === entry.index);
880
- return match ? {
881
- ...entry,
882
- budget: withMargin(match.budget)
883
- } : entry;
884
- });
885
- } };
886
- };
887
- //#endregion
888
- //#region ../../packages/module/blockchain-cardano/src/store/night-designation/registration-utxo.ts
889
- const decodeDatumOrSkip = (datum) => {
890
- try {
891
- return decodeDustMappingDatum(Serialization.PlutusData.fromCore(datum).toCbor());
892
- } catch {
893
- return;
894
- }
895
- };
896
- /**
897
- * Pick the account's registration out of the UTxOs sitting at the dust
898
- * generator's script address.
899
- *
900
- * A registration is identified by the singleton DUST-mapping NFT plus an
901
- * inline `DustMappingDatum` whose `c_wallet` verification-key hash is the
902
- * account's stake key hash. Undecodable datums belong to other accounts (or
903
- * to a future datum revision) and are skipped rather than treated as errors.
904
- */
905
- const findRegistrationUtxo = (scriptUtxos, nftAssetId, stakeKeyHash) => {
906
- for (const utxo of scriptUtxos) {
907
- const [, out] = utxo;
908
- if (out.value.assets?.get(nftAssetId) !== 1n) continue;
909
- if (!out.datum) continue;
910
- const datum = decodeDatumOrSkip(out.datum);
911
- if (datum && datumMatchesStakeKey(datum, stakeKeyHash)) return {
912
- utxo,
913
- datum
914
- };
915
- }
916
- };
917
- //#endregion
918
- //#region ../../packages/module/blockchain-cardano/src/store/night-designation/build-side-effect.ts
919
- const TTL_BUFFER_SLOTS = 7200;
920
- const LIVE_PENDING_WINDOW_MS = TTL_BUFFER_SLOTS * 1e3 + 6e5;
921
- const PENDING_READ_TIMEOUT_MS = 2e3;
922
- const NO_PENDING_ACTIVITIES = [];
923
- /**
924
- * Only `designate` counts: an update/deregister with no confirmed marker
925
- * already fails `no-registration-utxo`, and with one the scan already refuses
926
- * a designate — so widening this over-blocks for no safety gain.
927
- */
928
- const hasLivePendingDesignate = (pendingActivities) => pendingActivities.some((activity) => {
929
- if (activity.blockchainSpecific?.Cardano?.nightDesignation?.action !== "designate") return false;
930
- return Date.now() - activity.timestamp < LIVE_PENDING_WINDOW_MS;
931
- });
932
- const BUILD_ERROR_KEYS_BY_CODE = {
933
- "already-registered": {
934
- title: "v2.cnight-designation.build.error.already-registered.title",
935
- subtitle: "v2.cnight-designation.build.error.already-registered.subtitle"
936
- },
937
- "no-cnight": {
938
- title: "v2.cnight-designation.build.error.no-cnight.title",
939
- subtitle: "v2.cnight-designation.build.error.no-cnight.subtitle"
940
- },
941
- "no-cardano-utxos": {
942
- title: "v2.cnight-designation.build.error.no-cardano-utxos.title",
943
- subtitle: "v2.cnight-designation.build.error.no-cardano-utxos.subtitle"
944
- },
945
- "no-registration-utxo": {
946
- title: "v2.cnight-designation.build.error.no-registration-utxo.title",
947
- subtitle: "v2.cnight-designation.build.error.no-registration-utxo.subtitle"
948
- },
949
- "script-stake-unregistered": {
950
- title: "v2.cnight-designation.build.error.script-stake-unregistered.title",
951
- subtitle: "v2.cnight-designation.build.error.script-stake-unregistered.subtitle"
952
- }
953
- };
954
- const GENERIC_BUILD_ERROR_KEYS = {
955
- title: "v2.cnight-designation.build.error.title",
956
- subtitle: "v2.cnight-designation.build.error.subtitle"
957
- };
958
- const errorTranslationKeysForCode = (code) => (code ? BUILD_ERROR_KEYS_BY_CODE[code] : void 0) ?? GENERIC_BUILD_ERROR_KEYS;
959
- const failure = (error, code) => ({
960
- success: false,
961
- error: {
962
- name: error.name,
963
- message: error.message
964
- },
965
- errorTranslationKeys: errorTranslationKeysForCode(code)
966
- });
967
- /**
968
- * Resolve the rich cNIGHT action from the serializable `Building` state by
969
- * scanning the script address for the registration UTxO whose inline datum is
970
- * bound to the account's stake key. Every action needs that answer, not just
971
- * update/deregister: Midnight honours neither of two registrations and the
972
- * second revokes the first, so a designate over an existing one is refused
973
- * here (`already-registered`) rather than signed. For update it also reads the
974
- * script reward account so the withdrawal entry matches the amount the ledger
975
- * will actually let the tx take.
976
- */
977
- const resolveAction = async ({ state, network, stakeKeyHash, dependencies, chainId, pendingActivities }) => {
978
- const dustPubkey = state.dustPubkeyHex === void 0 ? void 0 : MidnightCoinPubkey(hexToBytes(state.dustPubkeyHex));
979
- const scriptAddress = getDustGeneratorPaymentAddress(network);
980
- const registration = findRegistrationUtxo(await firstValueFrom(unwrapProviderResult(() => dependencies.cardanoProvider.getUtxosAtAddress({ address: scriptAddress }, { chainId }))), getDustMappingNftAssetId(network), stakeKeyHash);
981
- if (state.action === "designate") {
982
- if (registration) throw Object.assign(/* @__PURE__ */ new Error("This account already has a cNIGHT designation"), { code: "already-registered" });
983
- if (hasLivePendingDesignate(pendingActivities)) throw Object.assign(/* @__PURE__ */ new Error("A cNIGHT designation for this account is still confirming"), { code: "already-registered" });
984
- if (!dustPubkey) throw new Error("Missing dust pubkey for designate");
985
- return {
986
- kind: "register",
987
- dustPubkey
988
- };
989
- }
990
- if (!registration) throw Object.assign(/* @__PURE__ */ new Error("No cNIGHT designation registration found for this account"), { code: "no-registration-utxo" });
991
- if (state.action === "deregister") return {
992
- kind: "deregister",
993
- registrationUtxo: registration.utxo
994
- };
995
- if (!dustPubkey) throw new Error("Missing dust pubkey for update");
996
- const scriptRewardAccountInfo = await firstValueFrom(unwrapProviderResult(() => dependencies.cardanoProvider.getRewardAccountInfo({ rewardAccount: CardanoRewardAccount(getDustGeneratorRewardAccount(network)) }, { chainId })));
997
- if (!scriptRewardAccountInfo.isRegistered) throw Object.assign(/* @__PURE__ */ new Error("The cNIGHT validator's reward account is not registered on this network"), { code: "script-stake-unregistered" });
998
- return {
999
- kind: "update",
1000
- dustPubkey,
1001
- registrationUtxo: registration.utxo,
1002
- scriptWithdrawableLovelace: BigNumber.valueOf(scriptRewardAccountInfo.withdrawableAmount)
1003
- };
1004
- };
1005
- const buildDesignation = async (state, dependencies, pendingActivities) => {
1006
- try {
1007
- const { accountId } = state;
1008
- const cardano = dependencies.txExecutorCardano;
1009
- const [chainId, allAccountUtxos, unspendableUtxos, cardanoAddresses] = await Promise.all([
1010
- firstValueFrom(cardano.cardanoChainId$),
1011
- firstValueFrom(cardano.cardanoAccountUtxos$),
1012
- firstValueFrom(cardano.cardanoAccountUnspendableUtxos$),
1013
- firstValueFrom(cardano.cardanoAddresses$)
1014
- ]);
1015
- if (!chainId) throw new Error("Cardano chain id not available");
1016
- refuseExtensionAccount(accountId, cardanoAddresses);
1017
- const [protocolParameters, tip] = await Promise.all([firstValueFrom(unwrapProviderResult(() => dependencies.cardanoProvider.getProtocolParameters({ chainId }))), firstValueFrom(unwrapProviderResult(() => dependencies.cardanoProvider.getTip({ chainId })))]);
1018
- const network = CardanoDustNetwork.fromNetworkMagic(chainId.networkMagic);
1019
- const { primaryAddress, paymentKeyHash, stakeKeyHash } = resolveAccountKeyHashes(cardanoAddresses, accountId);
1020
- const spendable = filterSpendableUtxos(allAccountUtxos[accountId] ?? [], unspendableUtxos[accountId] ?? []);
1021
- const cnightAssetId = getCnightAssetId(network);
1022
- const cnightUtxos = spendable.filter(([, out]) => out.value.assets?.has(cnightAssetId));
1023
- const coverUtxos = spendable.filter(([, out]) => !out.value.assets?.has(cnightAssetId));
1024
- const action = await resolveAction({
1025
- state,
1026
- network,
1027
- stakeKeyHash,
1028
- dependencies,
1029
- chainId,
1030
- pendingActivities
1031
- });
1032
- if (coverUtxos.length === 0) return failure(/* @__PURE__ */ new Error("No ADA-only UTxO available to cover fee and collateral"), "no-cardano-utxos");
1033
- const result = await buildNightDesignationTx({
1034
- network,
1035
- action,
1036
- cnightUtxos,
1037
- paymentKeyHash,
1038
- stakeKeyHash,
1039
- changeAddress: primaryAddress,
1040
- ttlSlot: Cardano.Slot(Number(tip.slot) + TTL_BUFFER_SLOTS),
1041
- protocolParameters
1042
- }, {
1043
- networkMagic: chainId.networkMagic,
1044
- coverUtxos,
1045
- txEvaluator: createProviderExUnitsEvaluator({
1046
- cardanoProvider: dependencies.cardanoProvider,
1047
- chainId,
1048
- logger: dependencies.logger
1049
- }),
1050
- inputResolver: createInputResolver([
1051
- ...cnightUtxos,
1052
- ...coverUtxos,
1053
- ...action.kind === "register" ? [] : [action.registrationUtxo]
1054
- ])
1055
- });
1056
- if (!result.ok) return failure(new Error(result.error.message), result.error.code);
1057
- return {
1058
- success: true,
1059
- serializedTx: result.value.cbor,
1060
- fees: [{
1061
- tokenId: LOVELACE_TOKEN_ID,
1062
- amount: BigNumber(result.value.fee)
1063
- }]
1064
- };
1065
- } catch (error) {
1066
- const code = error instanceof InputSelectionError ? "no-cardano-utxos" : error.code;
1067
- return failure(error instanceof Error ? error : new Error(String(error)), code);
1068
- }
1069
- };
1070
- const makeNightDesignationBuilding = () => (_, stateObservables, dependencies) => firstStateOfStatus(stateObservables.nightDesignationFlow.selectState$, "Building").pipe(switchMap((state) => stateObservables.activities.selectPendingActivitiesByAccount$.pipe(map((byAccount) => byAccount[state.accountId] ?? NO_PENDING_ACTIVITIES), take(1), timeout({
1071
- first: PENDING_READ_TIMEOUT_MS,
1072
- with: () => of(NO_PENDING_ACTIVITIES)
1073
- }), switchMap((pendingActivities) => from(buildDesignation(state, dependencies, pendingActivities)).pipe(map((result) => dependencies.actions.nightDesignationFlow.buildCompleted({
1074
- accountId: state.accountId,
1075
- result
1076
- })))))));
1077
- //#endregion
1078
- //#region ../../packages/module/blockchain-cardano/src/store/night-designation/index-side-effect.ts
1079
- /**
1080
- * How long a refresh waits for the chain id and addresses it scans with.
1081
- *
1082
- * Only a bound, not a deadline: inputs that never arrive must resolve the entry
1083
- * rather than leave it refreshing forever, with no way back to a retry.
1084
- */
1085
- const INPUTS_TIMEOUT_MS = 2e4;
1086
- const scanInputs$ = (accountId, cardano, inputsTimeoutMs) => combineLatest([cardano.cardanoChainId$, cardano.cardanoAddresses$]).pipe(filter((inputs) => {
1087
- const [chainId, cardanoAddresses] = inputs;
1088
- return chainId !== void 0 && cardanoAddresses.some((address) => address.accountId === accountId && isCardanoAddressOfSupportedNetwork(address, chainId));
1089
- }), take(1), timeout({
1090
- first: inputsTimeoutMs,
1091
- with: () => throwError(() => /* @__PURE__ */ new Error("Cardano chain id / addresses never published"))
1092
- }));
1093
- const readSnapshot$ = ({ accountId, chainId, cardanoAddresses, dependencies }) => {
1094
- const { stakeKeyHash } = resolveAccountKeyHashes(cardanoAddresses, accountId);
1095
- const network = CardanoDustNetwork.fromNetworkMagic(chainId.networkMagic);
1096
- return forkJoin([unwrapProviderResult(() => dependencies.cardanoProvider.getUtxosAtAddress({ address: getDustGeneratorPaymentAddress(network) }, { chainId })), unwrapProviderResult(() => dependencies.cardanoProvider.getRewardAccountInfo({ rewardAccount: CardanoRewardAccount(getDustGeneratorRewardAccount(network)) }, { chainId })).pipe(map((info) => info.isRegistered), catchError(() => of(void 0)))]).pipe(map(([scriptUtxos, isScriptStakeCredentialRegistered]) => {
1097
- const registration = findRegistrationUtxo(scriptUtxos, getDustMappingNftAssetId(network), stakeKeyHash);
1098
- return {
1099
- scriptStakeCredentialRegistered: isScriptStakeCredentialRegistered,
1100
- ...registration === void 0 ? {} : { registration: {
1101
- txId: String(registration.utxo[0].txId),
1102
- outputIndex: registration.utxo[0].index,
1103
- dustPubkeyHex: MidnightCoinPubkey.toHex(registration.datum.dustAddress)
1104
- } }
1105
- };
1106
- }));
1107
- };
1108
- const makeNightDesignationIndexRefresh = ({ inputsTimeoutMs = INPUTS_TIMEOUT_MS } = {}) => ({ nightDesignationIndex: { refreshRequested$ } }, _stateObservables, dependencies) => refreshRequested$.pipe(groupBy(({ payload }) => payload.accountId), mergeMap((perAccount$) => perAccount$.pipe(exhaustMap(({ payload: { accountId } }) => scanInputs$(accountId, dependencies.txExecutorCardano, inputsTimeoutMs).pipe(switchMap(([chainId, cardanoAddresses]) => readSnapshot$({
1109
- accountId,
1110
- chainId,
1111
- cardanoAddresses,
1112
- dependencies
1113
- })), map((snapshot) => dependencies.actions.nightDesignationIndex.refreshCompleted({
1114
- accountId,
1115
- snapshot
1116
- })), catchError(() => of(dependencies.actions.nightDesignationIndex.refreshFailed({ accountId }))))))));
1117
- /**
1118
- * How long an entry may stay provisional before the index re-reads anyway.
1119
- *
1120
- * The wait is on the submitted transaction's activity, which a dropped
1121
- * transaction or a stalled account sync can leave pending forever; without a
1122
- * bound the entry would offer no designation control for the rest of the
1123
- * session.
1124
- */
1125
- const SETTLING_TIMEOUT_MS = 600 * 1e3;
1126
- /**
1127
- * Hold the index provisional from submission until the designation
1128
- * transaction is on chain, then re-read it.
1129
- *
1130
- * `Success` is a SUBMIT result — the txId comes back from submission — so the
1131
- * script address still answers for the state before the designation. Scanning
1132
- * here would write "not designated" over an account that has just designated,
1133
- * and every later read would repeat it. The entry is marked settling instead,
1134
- * and the scan waits for that transaction's activity to stop being pending.
1135
- */
1136
- const makeNightDesignationIndexSettling = ({ settlingTimeoutMs = SETTLING_TIMEOUT_MS } = {}) => (_, stateObservables, { actions }) => firstStateOfStatus(stateObservables.nightDesignationFlow.selectState$, "Success").pipe(mergeMap(({ accountId, txId }) => concat(of(actions.nightDesignationIndex.settlingStarted({
1137
- accountId,
1138
- txId
1139
- })), merge(stateObservables.activities.selectAllMap$.pipe(filter((byAccount) => (byAccount[accountId] ?? []).some((activity) => activity.activityId === txId && activity.type !== ActivityType.Pending))), timer(settlingTimeoutMs)).pipe(take(1), mergeMap(() => from([actions.nightDesignationIndex.refreshRequested({ accountId }), actions.nightDesignationIndex.settlingEnded({ accountId })]))))));
1140
- //#endregion
1141
- //#region ../../packages/module/blockchain-cardano/src/store/sdk-extensions.ts
1142
- const sdkExtensionSideEffects = [...[
1143
- makeNightDesignationBuilding(),
1144
- makeNightDesignationIndexRefresh(),
1145
- makeNightDesignationIndexSettling()
1146
- ]];
1147
- //#endregion
1148
- //#region ../../packages/module/blockchain-cardano/src/store/side-effects.ts
1149
- const mainnetMagic = Number(Cardano.NetworkMagics.Mainnet);
1150
- const deriveCardanoTestnetOptions = (config) => {
1151
- const blockfrostConfigs = config.cardanoProvider.blockfrostConfigs;
1152
- return Object.keys(blockfrostConfigs ?? {}).map((key) => Number(key)).filter((magic) => magic !== mainnetMagic).map(getCardanoTestnetIdByNetworkMagic).filter((id) => Boolean(id)).map((id) => {
1153
- return {
1154
- id: CardanoNetworkId(getCardanoChainIdByTestnetId(id).networkMagic),
1155
- label: id === "preprod" ? "v2.network-status.preprod" : id === "preview" ? "v2.network-status.preview" : "v2.network-status.preprod"
1156
- };
1157
- });
1158
- };
1159
- const registerCardanoTestnetOptions = (testnetOptions) => (_, { network: { selectTestnetOptions$ } }, { actions }) => selectTestnetOptions$.pipe(filter((options) => !options?.Cardano), map(() => actions.network.setTestnetOptions({
1160
- blockchainName: "Cardano",
1161
- options: testnetOptions
1162
- })));
1163
- const createCardanoSideEffects = (config) => {
1164
- return [registerCardanoTestnetOptions(deriveCardanoTestnetOptions(config))];
1165
- };
1166
- //#endregion
1167
- //#region ../../packages/module/blockchain-cardano/src/store/init.ts
1168
- const redux = async (props, dependencies) => ({
1169
- sideEffects: [
1170
- ...createCardanoSideEffects(props.runtime.config),
1171
- ...composerFlowSideEffects,
1172
- ...sdkExtensionSideEffects
1173
- ],
1174
- sideEffectDependencies: await initializeDependencies(props, dependencies)
1175
- });
1176
- //#endregion
1177
- export { redux as default };