@layerzerolabs/common-canton 1.2.80 → 1.2.82

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 (311) hide show
  1. package/dist/{3NNZDKUQ.js → 25ZZZGNN.js} +3 -3
  2. package/dist/{3NNZDKUQ.js.map → 25ZZZGNN.js.map} +1 -1
  3. package/dist/{4O355BG7.js → 3I23YKYV.js} +3 -3
  4. package/dist/{4O355BG7.js.map → 3I23YKYV.js.map} +1 -1
  5. package/dist/{IDBCBX2F.js → 3TPQEBCC.js} +4 -4
  6. package/dist/{IDBCBX2F.js.map → 3TPQEBCC.js.map} +1 -1
  7. package/dist/43KGTQUU.js +99 -0
  8. package/dist/43KGTQUU.js.map +1 -0
  9. package/dist/{7RS76HLN.js → 44EVBXCG.js} +4 -4
  10. package/dist/{7RS76HLN.js.map → 44EVBXCG.js.map} +1 -1
  11. package/dist/{GSQGAMYI.js → 4P5QC3JV.js} +4 -4
  12. package/dist/{GSQGAMYI.js.map → 4P5QC3JV.js.map} +1 -1
  13. package/dist/5CADV7BB.js +67 -0
  14. package/dist/5CADV7BB.js.map +1 -0
  15. package/dist/{7KCG6XNJ.js → 5KN65GJK.js} +3 -3
  16. package/dist/{7KCG6XNJ.js.map → 5KN65GJK.js.map} +1 -1
  17. package/dist/{ZBLS2HTS.js → 5W44RCVL.js} +3 -3
  18. package/dist/{ZBLS2HTS.js.map → 5W44RCVL.js.map} +1 -1
  19. package/dist/{ULT5A5TC.js → 6SVME57P.js} +3 -3
  20. package/dist/{ULT5A5TC.js.map → 6SVME57P.js.map} +1 -1
  21. package/dist/{TM3DTBXT.js → 6TNI5YY3.js} +3 -3
  22. package/dist/{TM3DTBXT.js.map → 6TNI5YY3.js.map} +1 -1
  23. package/dist/{3JL644IZ.js → 75BEFQTY.js} +3 -3
  24. package/dist/{3JL644IZ.js.map → 75BEFQTY.js.map} +1 -1
  25. package/dist/{M6FSENHW.js → 75TAXYGR.js} +3 -3
  26. package/dist/{M6FSENHW.js.map → 75TAXYGR.js.map} +1 -1
  27. package/dist/{37KTIK6O.js → 75VVMQKH.js} +4 -4
  28. package/dist/{37KTIK6O.js.map → 75VVMQKH.js.map} +1 -1
  29. package/dist/{O4AMCIVA.js → 7IMQETOY.js} +3 -3
  30. package/dist/{O4AMCIVA.js.map → 7IMQETOY.js.map} +1 -1
  31. package/dist/7JEW4NHI.js +40 -0
  32. package/dist/7JEW4NHI.js.map +1 -0
  33. package/dist/{N6YQSSHF.js → 7MEBFPGZ.js} +4 -4
  34. package/dist/{N6YQSSHF.js.map → 7MEBFPGZ.js.map} +1 -1
  35. package/dist/{NNB44CLI.js → B3E3Z2XP.js} +4 -4
  36. package/dist/{NNB44CLI.js.map → B3E3Z2XP.js.map} +1 -1
  37. package/dist/{B5WQLYXA.js → B7MBM6I4.js} +3 -3
  38. package/dist/{B5WQLYXA.js.map → B7MBM6I4.js.map} +1 -1
  39. package/dist/{7MCSZFDW.js → BH24MB7Z.js} +3 -3
  40. package/dist/{7MCSZFDW.js.map → BH24MB7Z.js.map} +1 -1
  41. package/dist/{W5JSNM4P.js → BQ2SFPGS.js} +5 -5
  42. package/dist/{W5JSNM4P.js.map → BQ2SFPGS.js.map} +1 -1
  43. package/dist/{CQBWBXEP.js → BWPOOFYL.js} +3 -3
  44. package/dist/{CQBWBXEP.js.map → BWPOOFYL.js.map} +1 -1
  45. package/dist/BZXMNRDO.js +105 -0
  46. package/dist/BZXMNRDO.js.map +1 -0
  47. package/dist/{7AX6ETEC.js → CLHFF2NZ.js} +3 -3
  48. package/dist/{7AX6ETEC.js.map → CLHFF2NZ.js.map} +1 -1
  49. package/dist/{CRVXAMIK.js → DFCC26G3.js} +4 -4
  50. package/dist/{CRVXAMIK.js.map → DFCC26G3.js.map} +1 -1
  51. package/dist/{YIP3DFVS.js → FGQEPZNL.js} +3 -3
  52. package/dist/{YIP3DFVS.js.map → FGQEPZNL.js.map} +1 -1
  53. package/dist/G4IAVHVV.js +69 -0
  54. package/dist/G4IAVHVV.js.map +1 -0
  55. package/dist/{FVMFTILS.js → HB636AF5.js} +3 -3
  56. package/dist/{FVMFTILS.js.map → HB636AF5.js.map} +1 -1
  57. package/dist/{CMN4A3XH.js → HCNXHOIJ.js} +3 -3
  58. package/dist/{CMN4A3XH.js.map → HCNXHOIJ.js.map} +1 -1
  59. package/dist/{X5KMH3AN.js → ISTGNQEF.js} +3 -3
  60. package/dist/{X5KMH3AN.js.map → ISTGNQEF.js.map} +1 -1
  61. package/dist/IUQEDBC6.js +102 -0
  62. package/dist/IUQEDBC6.js.map +1 -0
  63. package/dist/{BIHZXZGJ.js → JAONRVNE.js} +3 -3
  64. package/dist/{BIHZXZGJ.js.map → JAONRVNE.js.map} +1 -1
  65. package/dist/{Q7L2ADEU.js → JBO4ZQNH.js} +3 -3
  66. package/dist/{Q7L2ADEU.js.map → JBO4ZQNH.js.map} +1 -1
  67. package/dist/{PL4H5XEA.js → K7FRAGGM.js} +3 -3
  68. package/dist/{PL4H5XEA.js.map → K7FRAGGM.js.map} +1 -1
  69. package/dist/L64D74BZ.js +332 -0
  70. package/dist/L64D74BZ.js.map +1 -0
  71. package/dist/{DYK7UQLE.js → LMKFC7LV.js} +43 -43
  72. package/dist/{DYK7UQLE.js.map → LMKFC7LV.js.map} +1 -1
  73. package/dist/{ICIMAW3A.js → LSKYLA4P.js} +4 -4
  74. package/dist/{ICIMAW3A.js.map → LSKYLA4P.js.map} +1 -1
  75. package/dist/MO6W6SKU.js +412 -0
  76. package/dist/MO6W6SKU.js.map +1 -0
  77. package/dist/MV4DFHZP.js +424 -0
  78. package/dist/MV4DFHZP.js.map +1 -0
  79. package/dist/{XCOCX2NQ.js → MW2R4OL5.js} +3 -3
  80. package/dist/{XCOCX2NQ.js.map → MW2R4OL5.js.map} +1 -1
  81. package/dist/{TP2SKXF6.js → N3QRG2AK.js} +25 -5
  82. package/dist/N3QRG2AK.js.map +1 -0
  83. package/dist/NGED2YCU.js +75 -0
  84. package/dist/NGED2YCU.js.map +1 -0
  85. package/dist/NQWAH7C4.js +3 -0
  86. package/dist/NQWAH7C4.js.map +1 -0
  87. package/dist/{3K5JL2TP.js → NYEJEKEY.js} +12 -3
  88. package/dist/NYEJEKEY.js.map +1 -0
  89. package/dist/{DX46ASEP.js → OU543BQK.js} +4 -4
  90. package/dist/{DX46ASEP.js.map → OU543BQK.js.map} +1 -1
  91. package/dist/{YCF6SVF6.js → P7PG4R5T.js} +62 -9
  92. package/dist/P7PG4R5T.js.map +1 -0
  93. package/dist/PDVMANRS.js +557 -0
  94. package/dist/PDVMANRS.js.map +1 -0
  95. package/dist/{RIREEIYO.js → PLCXYLPU.js} +3 -3
  96. package/dist/{RIREEIYO.js.map → PLCXYLPU.js.map} +1 -1
  97. package/dist/{Q4D2T7BS.js → PTJBIMSS.js} +3 -3
  98. package/dist/{Q4D2T7BS.js.map → PTJBIMSS.js.map} +1 -1
  99. package/dist/Q3BYU6GJ.js +46 -0
  100. package/dist/Q3BYU6GJ.js.map +1 -0
  101. package/dist/{DR3COIEJ.js → QIYRAOGU.js} +3 -3
  102. package/dist/{DR3COIEJ.js.map → QIYRAOGU.js.map} +1 -1
  103. package/dist/{O25T2HOW.js → QRPS2ZRD.js} +3 -3
  104. package/dist/{O25T2HOW.js.map → QRPS2ZRD.js.map} +1 -1
  105. package/dist/{3EY5Z4BX.js → RDG3GOWQ.js} +3 -3
  106. package/dist/{3EY5Z4BX.js.map → RDG3GOWQ.js.map} +1 -1
  107. package/dist/{AFZOQGRN.js → RH6PBMPO.js} +3 -3
  108. package/dist/{AFZOQGRN.js.map → RH6PBMPO.js.map} +1 -1
  109. package/dist/SA63DYLV.js +121 -0
  110. package/dist/SA63DYLV.js.map +1 -0
  111. package/dist/{65JBI4D3.js → TDVOFX7N.js} +3 -3
  112. package/dist/{65JBI4D3.js.map → TDVOFX7N.js.map} +1 -1
  113. package/dist/{ZBM7PUST.js → TQMPIJZW.js} +3 -3
  114. package/dist/{ZBM7PUST.js.map → TQMPIJZW.js.map} +1 -1
  115. package/dist/{222UT7H4.js → TYI7PTYG.js} +4 -4
  116. package/dist/{222UT7H4.js.map → TYI7PTYG.js.map} +1 -1
  117. package/dist/{F7CLAJVB.js → U2DNZHEJ.js} +3 -3
  118. package/dist/{F7CLAJVB.js.map → U2DNZHEJ.js.map} +1 -1
  119. package/dist/{QLSD7CDL.js → UINDAVKP.js} +3 -3
  120. package/dist/{QLSD7CDL.js.map → UINDAVKP.js.map} +1 -1
  121. package/dist/{FHI4L73X.js → ULL44NXA.js} +4 -4
  122. package/dist/{FHI4L73X.js.map → ULL44NXA.js.map} +1 -1
  123. package/dist/{L26PC3MC.js → UNT3QBTP.js} +3 -3
  124. package/dist/{L26PC3MC.js.map → UNT3QBTP.js.map} +1 -1
  125. package/dist/{6HJEM4C3.js → V2TREL3L.js} +3 -3
  126. package/dist/{6HJEM4C3.js.map → V2TREL3L.js.map} +1 -1
  127. package/dist/VJKB367I.js +159 -0
  128. package/dist/VJKB367I.js.map +1 -0
  129. package/dist/{DRLN6NI7.js → VPGKHXFY.js} +3 -3
  130. package/dist/{DRLN6NI7.js.map → VPGKHXFY.js.map} +1 -1
  131. package/dist/{BWU4MCVK.js → W5CHA5AA.js} +4 -4
  132. package/dist/{BWU4MCVK.js.map → W5CHA5AA.js.map} +1 -1
  133. package/dist/{55MRWPLR.js → W7DMST44.js} +3 -3
  134. package/dist/{55MRWPLR.js.map → W7DMST44.js.map} +1 -1
  135. package/dist/{Q5QMWEOQ.js → WZ4QCFOE.js} +3 -3
  136. package/dist/{Q5QMWEOQ.js.map → WZ4QCFOE.js.map} +1 -1
  137. package/dist/XCOORR26.js +125 -0
  138. package/dist/XCOORR26.js.map +1 -0
  139. package/dist/{6AK25YSE.js → XENB5GVW.js} +4 -4
  140. package/dist/{6AK25YSE.js.map → XENB5GVW.js.map} +1 -1
  141. package/dist/{3NMWQBVE.js → YHT3X6LW.js} +3 -3
  142. package/dist/{3NMWQBVE.js.map → YHT3X6LW.js.map} +1 -1
  143. package/dist/YMXOSAU4.js +18 -0
  144. package/dist/YMXOSAU4.js.map +1 -0
  145. package/dist/{35HFP3P5.js → ZSOWBGX3.js} +3 -3
  146. package/dist/{35HFP3P5.js.map → ZSOWBGX3.js.map} +1 -1
  147. package/dist/{U3XCZGRR.js → ZZUOA324.js} +5 -5
  148. package/dist/{U3XCZGRR.js.map → ZZUOA324.js.map} +1 -1
  149. package/dist/client/amulet.d.ts +24 -6
  150. package/dist/client/amulet.d.ts.map +1 -1
  151. package/dist/client/amulet.js +8 -2
  152. package/dist/client/canton-client.d.ts +9 -1
  153. package/dist/client/canton-client.d.ts.map +1 -1
  154. package/dist/client/canton-client.js +113 -107
  155. package/dist/client/grpc.js +3 -3
  156. package/dist/client/index.js +115 -109
  157. package/dist/client/interface.d.ts +10 -1
  158. package/dist/client/interface.d.ts.map +1 -1
  159. package/dist/client/topology/utils.js +2 -2
  160. package/dist/errors.d.ts +5 -0
  161. package/dist/errors.d.ts.map +1 -1
  162. package/dist/errors.js +1 -1
  163. package/dist/events.js +3 -3
  164. package/dist/index.js +132 -118
  165. package/dist/open-api/apis/DefaultApi.js +104 -104
  166. package/dist/open-api/apis/index.js +104 -104
  167. package/dist/open-api/index.js +104 -104
  168. package/dist/open-api/models/Command.js +5 -5
  169. package/dist/open-api/models/Completion.js +3 -3
  170. package/dist/open-api/models/Completion1.js +3 -3
  171. package/dist/open-api/models/CompletionResponse.js +8 -8
  172. package/dist/open-api/models/CompletionResponseOneOf.js +3 -3
  173. package/dist/open-api/models/CompletionStreamResponse.js +9 -9
  174. package/dist/open-api/models/CreateUserRequest.js +7 -7
  175. package/dist/open-api/models/CumulativeFilter.js +7 -7
  176. package/dist/open-api/models/DeduplicationPeriod.js +1 -1
  177. package/dist/open-api/models/DeduplicationPeriod1.js +1 -1
  178. package/dist/open-api/models/DeduplicationPeriod2.js +3 -3
  179. package/dist/open-api/models/EventFormat.js +9 -9
  180. package/dist/open-api/models/ExperimentalFeatures.js +2 -2
  181. package/dist/open-api/models/FeaturesDescriptor.js +4 -4
  182. package/dist/open-api/models/Filters.js +8 -8
  183. package/dist/open-api/models/GetActiveContractsPageRequest.js +10 -10
  184. package/dist/open-api/models/GetActiveContractsRequest.js +10 -10
  185. package/dist/open-api/models/GetCompletionByHashResponse.js +3 -3
  186. package/dist/open-api/models/GetEventsByContractIdRequest.js +10 -10
  187. package/dist/open-api/models/GetLedgerApiVersionResponse.js +5 -5
  188. package/dist/open-api/models/GetUpdateByHashRequest.js +12 -12
  189. package/dist/open-api/models/GetUpdateByIdRequest.js +12 -12
  190. package/dist/open-api/models/GetUpdateByOffsetRequest.js +12 -12
  191. package/dist/open-api/models/GetUpdatesPageRequest.js +12 -12
  192. package/dist/open-api/models/GetUpdatesRequest.js +12 -12
  193. package/dist/open-api/models/GrantUserRightsRequest.js +7 -7
  194. package/dist/open-api/models/GrantUserRightsResponse.js +7 -7
  195. package/dist/open-api/models/IdentifierFilter.js +6 -6
  196. package/dist/open-api/models/JsCommands.js +7 -7
  197. package/dist/open-api/models/JsContractEntry.js +4 -4
  198. package/dist/open-api/models/JsExecuteSubmissionAndWaitForTransactionRequest.js +18 -18
  199. package/dist/open-api/models/JsExecuteSubmissionAndWaitRequest.js +8 -8
  200. package/dist/open-api/models/JsExecuteSubmissionRequest.js +8 -8
  201. package/dist/open-api/models/JsGetActiveContractsPageResponse.js +6 -6
  202. package/dist/open-api/models/JsGetActiveContractsResponse.js +5 -5
  203. package/dist/open-api/models/JsGetUpdateResponse.js +4 -4
  204. package/dist/open-api/models/JsGetUpdatesPageResponse.js +4 -4
  205. package/dist/open-api/models/JsGetUpdatesResponse.js +4 -4
  206. package/dist/open-api/models/JsPrepareSubmissionRequest.js +10 -10
  207. package/dist/open-api/models/JsSubmitAndWaitForTransactionRequest.js +18 -18
  208. package/dist/open-api/models/JsTopologyTransaction.js +2 -2
  209. package/dist/open-api/models/Kind.js +5 -5
  210. package/dist/open-api/models/ListUserRightsResponse.js +7 -7
  211. package/dist/open-api/models/MinLedgerTime.js +4 -4
  212. package/dist/open-api/models/Operation.js +4 -4
  213. package/dist/open-api/models/PriorTopologySerial.js +3 -3
  214. package/dist/open-api/models/RevokeUserRightsRequest.js +7 -7
  215. package/dist/open-api/models/RevokeUserRightsResponse.js +7 -7
  216. package/dist/open-api/models/Right.js +6 -6
  217. package/dist/open-api/models/Serial.js +2 -2
  218. package/dist/open-api/models/SubmitAndWaitForReassignmentRequest.js +10 -10
  219. package/dist/open-api/models/Time.js +3 -3
  220. package/dist/open-api/models/TopologyEvent.js +2 -2
  221. package/dist/open-api/models/TopologyEventEvent.js +2 -2
  222. package/dist/open-api/models/TopologyTransaction.js +2 -2
  223. package/dist/open-api/models/TransactionFormat.js +10 -10
  224. package/dist/open-api/models/Update.js +4 -4
  225. package/dist/open-api/models/UpdateFormat.js +11 -11
  226. package/dist/open-api/models/UpdateOneOf2.js +2 -2
  227. package/dist/open-api/models/UpdateVettedPackagesRequest.js +9 -9
  228. package/dist/open-api/models/VettedPackagesChange.js +5 -5
  229. package/dist/open-api/models/index.js +103 -103
  230. package/dist/provider.js +116 -110
  231. package/dist/refresh/callback-burn-mint.d.ts +22 -0
  232. package/dist/refresh/callback-burn-mint.d.ts.map +1 -0
  233. package/dist/refresh/callback-burn-mint.js +7 -0
  234. package/dist/refresh/callback-burn-mint.js.map +1 -0
  235. package/dist/refresh/callback-contracts.d.ts +5 -0
  236. package/dist/refresh/callback-contracts.d.ts.map +1 -0
  237. package/dist/refresh/callback-contracts.js +4 -0
  238. package/dist/refresh/callback-contracts.js.map +1 -0
  239. package/dist/refresh/callback-lock-unlock.d.ts +19 -0
  240. package/dist/refresh/callback-lock-unlock.d.ts.map +1 -0
  241. package/dist/refresh/callback-lock-unlock.js +7 -0
  242. package/dist/refresh/callback-lock-unlock.js.map +1 -0
  243. package/dist/refresh/callback.d.ts +112 -0
  244. package/dist/refresh/callback.d.ts.map +1 -0
  245. package/dist/refresh/callback.js +10 -0
  246. package/dist/refresh/callback.js.map +1 -0
  247. package/dist/refresh/index.d.ts +12 -0
  248. package/dist/refresh/index.d.ts.map +1 -1
  249. package/dist/refresh/index.js +25 -7
  250. package/dist/refresh/onesig-config.d.ts +20 -0
  251. package/dist/refresh/onesig-config.d.ts.map +1 -0
  252. package/dist/refresh/onesig-config.js +6 -0
  253. package/dist/refresh/onesig-config.js.map +1 -0
  254. package/dist/refresh/onesig-discovery.d.ts +15 -0
  255. package/dist/refresh/onesig-discovery.d.ts.map +1 -0
  256. package/dist/refresh/onesig-discovery.js +7 -0
  257. package/dist/refresh/onesig-discovery.js.map +1 -0
  258. package/dist/refresh/onesig-request.d.ts +26 -0
  259. package/dist/refresh/onesig-request.d.ts.map +1 -0
  260. package/dist/refresh/onesig-request.js +6 -0
  261. package/dist/refresh/onesig-request.js.map +1 -0
  262. package/dist/refresh/onesig-scope.d.ts +13 -0
  263. package/dist/refresh/onesig-scope.d.ts.map +1 -0
  264. package/dist/refresh/onesig-scope.js +6 -0
  265. package/dist/refresh/onesig-scope.js.map +1 -0
  266. package/dist/refresh/onesig-transfer-instruction.d.ts +19 -0
  267. package/dist/refresh/onesig-transfer-instruction.d.ts.map +1 -0
  268. package/dist/refresh/onesig-transfer-instruction.js +15 -0
  269. package/dist/refresh/onesig-transfer-instruction.js.map +1 -0
  270. package/dist/refresh/onesig-transfer.d.ts +21 -0
  271. package/dist/refresh/onesig-transfer.d.ts.map +1 -0
  272. package/dist/refresh/onesig-transfer.js +16 -0
  273. package/dist/refresh/onesig-transfer.js.map +1 -0
  274. package/dist/refresh/plan.d.ts +937 -5
  275. package/dist/refresh/plan.d.ts.map +1 -1
  276. package/dist/refresh/plan.js +1 -1
  277. package/dist/refresh/prepare-amulet-transfer.d.ts +9 -0
  278. package/dist/refresh/prepare-amulet-transfer.d.ts.map +1 -0
  279. package/dist/refresh/prepare-amulet-transfer.js +12 -0
  280. package/dist/refresh/prepare-amulet-transfer.js.map +1 -0
  281. package/dist/refresh/prepare-transfer-instruction-acceptance.d.ts +9 -0
  282. package/dist/refresh/prepare-transfer-instruction-acceptance.d.ts.map +1 -0
  283. package/dist/refresh/prepare-transfer-instruction-acceptance.js +4 -0
  284. package/dist/refresh/prepare-transfer-instruction-acceptance.js.map +1 -0
  285. package/dist/refresh/registry-context.d.ts +49 -0
  286. package/dist/refresh/registry-context.d.ts.map +1 -0
  287. package/dist/refresh/registry-context.js +6 -0
  288. package/dist/refresh/registry-context.js.map +1 -0
  289. package/dist/refresh/resolve-plan.d.ts +1 -1
  290. package/dist/refresh/resolve-plan.d.ts.map +1 -1
  291. package/dist/refresh/resolve-plan.js +19 -1
  292. package/dist/refresh/resolve.js +22 -5
  293. package/dist/refresh/select-contracts.d.ts +4 -0
  294. package/dist/refresh/select-contracts.d.ts.map +1 -0
  295. package/dist/refresh/select-contracts.js +4 -0
  296. package/dist/refresh/select-contracts.js.map +1 -0
  297. package/dist/sdk/canton-sdk.js +2 -2
  298. package/dist/sdk/index.js +2 -2
  299. package/dist/transaction.d.ts +1635 -20
  300. package/dist/transaction.d.ts.map +1 -1
  301. package/dist/transaction.js +2 -2
  302. package/package.json +12 -11
  303. package/dist/3K5JL2TP.js.map +0 -1
  304. package/dist/6UDREB6T.js +0 -3
  305. package/dist/6UDREB6T.js.map +0 -1
  306. package/dist/TP2SKXF6.js.map +0 -1
  307. package/dist/UGGRFD54.js +0 -168
  308. package/dist/UGGRFD54.js.map +0 -1
  309. package/dist/V3KXSTGZ.js +0 -350
  310. package/dist/V3KXSTGZ.js.map +0 -1
  311. package/dist/YCF6SVF6.js.map +0 -1
package/dist/V3KXSTGZ.js DELETED
@@ -1,350 +0,0 @@
1
- import { createContractAddressResolver } from './RVJRKYSC.js';
2
- import { getCreateArgumentField } from './SWY4QT4I.js';
3
- import { isCantonDeferredSender, isCantonDeferredSentinel } from './PWKI6T6A.js';
4
- import { __name } from './VUOMXK5T.js';
5
-
6
- // src/refresh/resolve-plan.ts
7
- var DAML_DECIMAL_SCALE = 10n ** 10n;
8
- var MAX_SELECTED_CONTRACTS = 100;
9
- var CANTON_TIME_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/;
10
- var resolveParty = /* @__PURE__ */ __name((partyRef, senderParty, label) => {
11
- if (!isCantonDeferredSender(partyRef)) return partyRef.party;
12
- if (!senderParty) {
13
- throw new Error(`${label} requires a resolved sender party`);
14
- }
15
- return senderParty;
16
- }, "resolveParty");
17
- var parseDamlDecimal = /* @__PURE__ */ __name((value, label) => {
18
- if (typeof value !== "string") {
19
- throw new Error(`${label} must be a DAML Decimal string`);
20
- }
21
- const match = /^([+-]?)(\d+)(?:\.(\d{0,10}))?$/.exec(value);
22
- if (!match) {
23
- throw new Error(`${label} is not a valid DAML Decimal: ${value}`);
24
- }
25
- const sign = match[1] === "-" ? -1n : 1n;
26
- const whole = BigInt(match[2]);
27
- const fraction = BigInt((match[3] ?? "").padEnd(10, "0"));
28
- return sign * (whole * DAML_DECIMAL_SCALE + fraction);
29
- }, "parseDamlDecimal");
30
- var getContractNumericField = /* @__PURE__ */ __name((contract, field) => {
31
- const raw = getCreateArgumentField(contract.createdEvent.createArgument, field);
32
- const value = raw !== null && typeof raw === "object" && "initialAmount" in raw ? raw.initialAmount : raw;
33
- return parseDamlDecimal(value, `Contract ${contract.createdEvent.contractId} numeric field ${field}`);
34
- }, "getContractNumericField");
35
- var selectContractsByGte = /* @__PURE__ */ __name((contracts, field, requestedValue) => {
36
- const requested = parseDamlDecimal(requestedValue, "Requested contract value");
37
- if (requested <= 0n) {
38
- throw new Error("Requested contract value must be positive");
39
- }
40
- const candidates = contracts.map((contract) => ({
41
- contract,
42
- amount: getContractNumericField(contract, field)
43
- })).filter(({ amount }) => amount > 0n).sort((left, right) => left.amount === right.amount ? left.contract.createdEvent.contractId.localeCompare(right.contract.createdEvent.contractId) : left.amount > right.amount ? -1 : 1);
44
- const selected = [];
45
- let total = 0n;
46
- for (const candidate of candidates) {
47
- selected.push(candidate.contract);
48
- total += candidate.amount;
49
- if (total >= requested) break;
50
- }
51
- if (total < requested) {
52
- throw new Error(`Insufficient contract value in field ${field}: requested ${requestedValue}, found ${total.toString()} base units`);
53
- }
54
- if (selected.length > MAX_SELECTED_CONTRACTS) {
55
- throw new Error(`Selection needs ${selected.length} contracts, exceeding the ${MAX_SELECTED_CONTRACTS} input limit`);
56
- }
57
- return selected;
58
- }, "selectContractsByGte");
59
- var makeActiveContractRef = /* @__PURE__ */ __name((selector) => ({
60
- type: "activeContractIds",
61
- partyToFilter: selector.queryAs,
62
- expectedSignatories: selector.expectedSignatories,
63
- templateId: selector.templateId ?? selector.interfaceId,
64
- interfaceId: selector.interfaceId,
65
- contractStateFilter: selector.stateFilter
66
- }), "makeActiveContractRef");
67
- var resolveSelectorContracts = /* @__PURE__ */ __name(async (resolver, selector) => {
68
- const contracts = await resolver.resolveActiveContracts(makeActiveContractRef(selector));
69
- if (!selector.contractId) return contracts;
70
- const source = await resolver.resolveActiveContracts(makeActiveContractRef(selector.contractId.selector));
71
- if (source.length !== 1) throw new Error(`Contract ID source matched ${source.length} contracts, expected exactly one`);
72
- const contractId = getCreateArgumentField(source[0].createdEvent.createArgument, selector.contractId.field);
73
- if (typeof contractId !== "string" || !contractId) throw new Error("Contract ID source must contain a nonempty contract ID");
74
- return contracts.filter((contract) => contract.createdEvent.contractId === contractId);
75
- }, "resolveSelectorContracts");
76
- var resolveContractValue = /* @__PURE__ */ __name(async (resolver, source) => {
77
- const contracts = await resolveSelectorContracts(resolver, source.selector);
78
- if (contracts.length !== 1) {
79
- throw new Error(`Active contract value matched ${contracts.length} contracts, expected exactly one`);
80
- }
81
- const value = getCreateArgumentField(contracts[0].createdEvent.createArgument, source.field);
82
- if (parseDamlDecimal(value, `Contract value ${source.field}`) <= 0n) {
83
- throw new Error(`Contract value ${source.field} must be positive`);
84
- }
85
- return value;
86
- }, "resolveContractValue");
87
- var selectActiveContracts = /* @__PURE__ */ __name(async (contracts, selection, resolver) => {
88
- switch (selection.kind) {
89
- case "exactlyOne":
90
- if (contracts.length !== 1) {
91
- throw new Error(`Active contract selection matched ${contracts.length} contracts, expected exactly one`);
92
- }
93
- return contracts;
94
- case "all":
95
- return contracts;
96
- case "gte":
97
- return selectContractsByGte(contracts, selection.field, typeof selection.value === "string" ? selection.value : await resolveContractValue(resolver, selection.value));
98
- }
99
- }, "selectActiveContracts");
100
- var resolveCantonActiveContracts = /* @__PURE__ */ __name(async (args) => {
101
- const queryParty = resolveParty(args.selector.queryAs, args.senderParty, "Active contract selection");
102
- const resolver = createContractAddressResolver({
103
- client: args.client,
104
- senderParty: args.senderParty,
105
- signingParties: [
106
- queryParty
107
- ],
108
- appendDisclosures: /* @__PURE__ */ __name(() => void 0, "appendDisclosures")
109
- });
110
- const selected = await selectActiveContracts(await resolveSelectorContracts(resolver, args.selector), args.selection, resolver);
111
- return {
112
- contractIds: selected.map(({ createdEvent }) => createdEvent.contractId)
113
- };
114
- }, "resolveCantonActiveContracts");
115
- var isRecord = /* @__PURE__ */ __name((value) => value !== null && typeof value === "object" && !Array.isArray(value), "isRecord");
116
- var isCantonTime = /* @__PURE__ */ __name((value) => typeof value === "string" && CANTON_TIME_PATTERN.test(value) && Number.isFinite(Date.parse(value)), "isCantonTime");
117
- var isActiveContractRefresh = /* @__PURE__ */ __name((refresh) => refresh.resolver.type === "activeContract", "isActiveContractRefresh");
118
- var isActiveContractValueRefresh = /* @__PURE__ */ __name((refresh) => refresh.resolver.type === "activeContractValue", "isActiveContractValueRefresh");
119
- var isAmuletContextRefresh = /* @__PURE__ */ __name((refresh) => refresh.resolver.type === "amuletContext", "isAmuletContextRefresh");
120
- var isTimestampRefresh = /* @__PURE__ */ __name((refresh) => refresh.resolver.type === "timestamp", "isTimestampRefresh");
121
- var replaceAtPath = /* @__PURE__ */ __name((root, path, value) => {
122
- if (path.length === 0) return value;
123
- let current = root;
124
- for (const [position, segment] of path.entries()) {
125
- const isLast = position === path.length - 1;
126
- if ("field" in segment) {
127
- if (!isRecord(current) || !(segment.field in current)) {
128
- throw new Error(`Refresh target field "${segment.field}" does not exist`);
129
- }
130
- if (isLast) {
131
- current[segment.field] = value;
132
- return root;
133
- }
134
- current = current[segment.field];
135
- continue;
136
- }
137
- if ("index" in segment) {
138
- if (!Array.isArray(current) || segment.index >= current.length) {
139
- throw new Error(`Refresh target array index ${segment.index} does not exist`);
140
- }
141
- if (isLast) {
142
- current[segment.index] = value;
143
- return root;
144
- }
145
- current = current[segment.index];
146
- continue;
147
- }
148
- if (!Array.isArray(current)) {
149
- throw new Error(`Refresh target DAML map "${segment.damlMapKey}" is not an array`);
150
- }
151
- const matches = current.filter((entry) => Array.isArray(entry) && entry.length === 2 && entry[0] === segment.damlMapKey);
152
- if (matches.length !== 1) {
153
- throw new Error(`Refresh target DAML map key "${segment.damlMapKey}" matched ${matches.length} entries`);
154
- }
155
- if (isLast) {
156
- matches[0][1] = value;
157
- return root;
158
- }
159
- current = matches[0][1];
160
- }
161
- return root;
162
- }, "replaceAtPath");
163
- var readAtPath = /* @__PURE__ */ __name((root, path) => {
164
- let current = root;
165
- for (const segment of path) {
166
- if ("field" in segment) {
167
- if (!isRecord(current) || !(segment.field in current)) {
168
- throw new Error(`Refresh target field "${segment.field}" does not exist`);
169
- }
170
- current = current[segment.field];
171
- continue;
172
- }
173
- if ("index" in segment) {
174
- if (!Array.isArray(current) || segment.index >= current.length) {
175
- throw new Error(`Refresh target array index ${segment.index} does not exist`);
176
- }
177
- current = current[segment.index];
178
- continue;
179
- }
180
- if (!Array.isArray(current)) {
181
- throw new Error(`Refresh target DAML map "${segment.damlMapKey}" is not an array`);
182
- }
183
- const matches = current.filter((entry) => Array.isArray(entry) && entry.length === 2 && entry[0] === segment.damlMapKey);
184
- if (matches.length !== 1) {
185
- throw new Error(`Refresh target DAML map key "${segment.damlMapKey}" matched ${matches.length} entries`);
186
- }
187
- current = matches[0][1];
188
- }
189
- return current;
190
- }, "readAtPath");
191
- var readTarget = /* @__PURE__ */ __name((commands, target, path) => {
192
- const command = commands[target.commandIndex];
193
- if (!command) {
194
- throw new Error(`Refresh command index ${target.commandIndex} does not exist`);
195
- }
196
- if (target.command === "exercise") {
197
- if (!("exerciseCommand" in command)) {
198
- throw new Error(`Refresh command index ${target.commandIndex} is not an exercise`);
199
- }
200
- if (command.exerciseCommand.choice !== target.choice) {
201
- throw new Error(`Refresh command index ${target.commandIndex} expected choice ${target.choice}, found ${command.exerciseCommand.choice}`);
202
- }
203
- return readAtPath(command.exerciseCommand.choiceArgument, path);
204
- }
205
- if (!("createCommand" in command)) {
206
- throw new Error(`Refresh command index ${target.commandIndex} is not a create`);
207
- }
208
- if (command.createCommand.templateId !== target.template) {
209
- throw new Error(`Refresh command index ${target.commandIndex} expected template ${target.template}, found ${command.createCommand.templateId}`);
210
- }
211
- return readAtPath(command.createCommand.createArguments, path);
212
- }, "readTarget");
213
- var applyPatch = /* @__PURE__ */ __name((commands, target, path, value) => {
214
- const command = commands[target.commandIndex];
215
- if (!command) {
216
- throw new Error(`Refresh command index ${target.commandIndex} does not exist`);
217
- }
218
- if (target.command === "exercise") {
219
- if (!("exerciseCommand" in command)) {
220
- throw new Error(`Refresh command index ${target.commandIndex} is not an exercise`);
221
- }
222
- if (command.exerciseCommand.choice !== target.choice) {
223
- throw new Error(`Refresh command index ${target.commandIndex} expected choice ${target.choice}, found ${command.exerciseCommand.choice}`);
224
- }
225
- command.exerciseCommand.choiceArgument = replaceAtPath(command.exerciseCommand.choiceArgument, path, value);
226
- return;
227
- }
228
- if (!("createCommand" in command)) {
229
- throw new Error(`Refresh command index ${target.commandIndex} is not a create`);
230
- }
231
- if (command.createCommand.templateId !== target.template) {
232
- throw new Error(`Refresh command index ${target.commandIndex} expected template ${target.template}, found ${command.createCommand.templateId}`);
233
- }
234
- command.createCommand.createArguments = replaceAtPath(command.createCommand.createArguments, path, value);
235
- }, "applyPatch");
236
- var applyTarget = /* @__PURE__ */ __name((commands, target, value) => {
237
- if ("field" in target) {
238
- const command = commands[target.commandIndex];
239
- if (!command) {
240
- throw new Error(`Refresh command index ${target.commandIndex} does not exist`);
241
- }
242
- if (!("exerciseCommand" in command)) {
243
- throw new Error(`Refresh command index ${target.commandIndex} is not an exercise`);
244
- }
245
- if (typeof value !== "string") {
246
- throw new Error("Exercise contract ID refresh must resolve to a string");
247
- }
248
- command.exerciseCommand.contractId = value;
249
- return;
250
- }
251
- for (const argument of target.arguments) {
252
- applyPatch(commands, target, argument.path, value);
253
- }
254
- }, "applyTarget");
255
- var containsDeferredSentinel = /* @__PURE__ */ __name((value, key) => {
256
- if (key === "createdEventBlob") return false;
257
- if (isCantonDeferredSentinel(value)) return true;
258
- if (Array.isArray(value)) return value.some((item) => containsDeferredSentinel(item));
259
- if (!isRecord(value)) return false;
260
- return Object.entries(value).some(([childKey, child]) => containsDeferredSentinel(child, childKey));
261
- }, "containsDeferredSentinel");
262
- var disclosuresEqual = /* @__PURE__ */ __name((left, right) => left.contractId === right.contractId && left.templateId === right.templateId && left.createdEventBlob === right.createdEventBlob && left.synchronizerId === right.synchronizerId, "disclosuresEqual");
263
- var resolveCantonRefreshPlan = /* @__PURE__ */ __name(async (args) => {
264
- if (containsDeferredSentinel(args.unresolvedCommands) || containsDeferredSentinel(args.unresolvedDisclosedContracts)) {
265
- throw new Error("Canton refreshPlan cannot be combined with deferred sentinels");
266
- }
267
- const commands = structuredClone(args.unresolvedCommands);
268
- const baselineDisclosureCids = new Set(args.unresolvedDisclosedContracts.map(({ contractId }) => contractId));
269
- const originalCids = new Set(args.refreshPlan.disclosures?.originalCids ?? []);
270
- for (const contractId of originalCids) {
271
- if (!baselineDisclosureCids.has(contractId)) {
272
- throw new Error(`Original disclosure ${contractId} cannot be refreshed: it is not present in unresolvedDisclosedContracts`);
273
- }
274
- }
275
- const disclosureMap = /* @__PURE__ */ new Map();
276
- const appendDisclosures = /* @__PURE__ */ __name((disclosures) => {
277
- for (const disclosure of disclosures) {
278
- const existing = disclosureMap.get(disclosure.contractId);
279
- if (existing && !disclosuresEqual(existing, disclosure)) {
280
- throw new Error(`Conflicting disclosures for contract ${disclosure.contractId}`);
281
- }
282
- disclosureMap.set(disclosure.contractId, disclosure);
283
- }
284
- }, "appendDisclosures");
285
- appendDisclosures(args.unresolvedDisclosedContracts.filter(({ contractId }) => !originalCids.has(contractId)));
286
- const resolver = createContractAddressResolver({
287
- client: args.client,
288
- senderParty: args.senderParty,
289
- signingParties: args.signingParties,
290
- appendDisclosures
291
- });
292
- for (const refresh of args.refreshPlan.commands) {
293
- if (isActiveContractRefresh(refresh)) {
294
- const ref = makeActiveContractRef(refresh.resolver.selector);
295
- const selected = await selectActiveContracts(await resolveSelectorContracts(resolver, refresh.resolver.selector), refresh.resolver.selection, resolver);
296
- await resolver.discloseActiveContracts(ref, selected);
297
- const contractIds = selected.map(({ createdEvent }) => createdEvent.contractId);
298
- const resolved = refresh.resolver.selection.kind === "exactlyOne" ? contractIds[0] : contractIds;
299
- for (const target of refresh.targets) applyTarget(commands, target, resolved);
300
- continue;
301
- }
302
- if (isActiveContractValueRefresh(refresh)) {
303
- const value = await resolveContractValue(resolver, refresh.resolver);
304
- for (const target of refresh.targets) applyTarget(commands, target, value);
305
- continue;
306
- }
307
- if (isAmuletContextRefresh(refresh)) {
308
- const bundle = await args.client.getAmuletContextWithExternalRules({
309
- admin: refresh.resolver.dsoParty,
310
- id: "Amulet"
311
- });
312
- appendDisclosures(bundle.disclosedContracts);
313
- for (const target of refresh.targets) {
314
- applyTarget(commands, target, bundle.amuletContext);
315
- }
316
- }
317
- }
318
- const now = /* @__PURE__ */ new Date();
319
- for (const refresh of args.refreshPlan.commands) {
320
- if (!isTimestampRefresh(refresh)) continue;
321
- for (const target of refresh.targets) {
322
- for (const { path, offsetMs = 0 } of target.arguments) {
323
- const iso = new Date(now.getTime() + offsetMs).toISOString();
324
- const current = readTarget(commands, target, path);
325
- let value;
326
- if (isCantonTime(current)) {
327
- value = iso;
328
- } else if (isRecord(current) && current.tag === "AV_Time" && isCantonTime(current.value)) {
329
- value = {
330
- ...current,
331
- value: iso
332
- };
333
- } else {
334
- throw new Error("Timestamp refresh target must contain a Canton Time value");
335
- }
336
- applyPatch(commands, target, path, value);
337
- }
338
- }
339
- }
340
- return {
341
- commands,
342
- disclosedContracts: [
343
- ...disclosureMap.values()
344
- ]
345
- };
346
- }, "resolveCantonRefreshPlan");
347
-
348
- export { resolveCantonActiveContracts, resolveCantonRefreshPlan, selectContractsByGte };
349
- //# sourceMappingURL=V3KXSTGZ.js.map
350
- //# sourceMappingURL=V3KXSTGZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/refresh/resolve-plan.ts"],"names":["DAML_DECIMAL_SCALE","MAX_SELECTED_CONTRACTS","CANTON_TIME_PATTERN","resolveParty","partyRef","senderParty","label","isCantonDeferredSender","party","Error","parseDamlDecimal","value","match","exec","sign","whole","BigInt","fraction","padEnd","getContractNumericField","contract","field","raw","getCreateArgumentField","createdEvent","createArgument","initialAmount","contractId","selectContractsByGte","contracts","requestedValue","requested","candidates","map","amount","filter","sort","left","right","localeCompare","selected","total","candidate","push","toString","length","makeActiveContractRef","selector","type","partyToFilter","queryAs","expectedSignatories","templateId","interfaceId","contractStateFilter","stateFilter","resolveSelectorContracts","resolver","resolveActiveContracts","source","resolveContractValue","selectActiveContracts","selection","kind","resolveCantonActiveContracts","args","queryParty","createContractAddressResolver","client","signingParties","appendDisclosures","undefined","contractIds","isRecord","Array","isArray","isCantonTime","test","Number","isFinite","Date","parse","isActiveContractRefresh","refresh","isActiveContractValueRefresh","isAmuletContextRefresh","isTimestampRefresh","replaceAtPath","root","path","current","position","segment","entries","isLast","index","damlMapKey","matches","entry","readAtPath","readTarget","commands","target","command","commandIndex","exerciseCommand","choice","choiceArgument","createCommand","template","createArguments","applyPatch","applyTarget","argument","arguments","containsDeferredSentinel","key","isCantonDeferredSentinel","some","item","Object","childKey","child","disclosuresEqual","createdEventBlob","synchronizerId","resolveCantonRefreshPlan","unresolvedCommands","unresolvedDisclosedContracts","structuredClone","baselineDisclosureCids","Set","originalCids","refreshPlan","disclosures","has","disclosureMap","Map","disclosure","existing","get","set","ref","discloseActiveContracts","resolved","targets","bundle","getAmuletContextWithExternalRules","admin","dsoParty","id","disclosedContracts","amuletContext","now","offsetMs","iso","getTime","toISOString","tag","values"],"mappings":"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","file":"V3KXSTGZ.js","sourcesContent":["import type { ICantonClient } from '../client/interface';\nimport {\n type CantonRefreshPartyFilter,\n isCantonDeferredSender,\n isCantonDeferredSentinel,\n} from '../deferredValue';\nimport type { JsActiveContract } from '../open-api/models';\nimport type {\n CantonCommand,\n CantonDisclosedContract,\n CantonUnresolvedCommand,\n} from '../transaction';\nimport { getCreateArgumentField } from '../trusted-origin';\nimport { type ActiveContractRef, createContractAddressResolver } from './address-resolver';\nimport type {\n CantonActiveContractRefresh,\n CantonActiveContractSelection,\n CantonActiveContractValue,\n CantonActiveContractValueRefresh,\n CantonAmuletContextRefresh,\n CantonArgumentRefreshTarget,\n CantonContractSelector,\n CantonRefresh,\n CantonRefreshPath,\n CantonRefreshPlan,\n CantonRefreshTarget,\n CantonTimestampRefresh,\n} from './plan';\n\nconst DAML_DECIMAL_SCALE = 10n ** 10n;\nconst MAX_SELECTED_CONTRACTS = 100;\nconst CANTON_TIME_PATTERN = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?Z$/;\n\nconst resolveParty = (\n partyRef: CantonRefreshPartyFilter,\n senderParty: string | undefined,\n label: string,\n): string => {\n if (!isCantonDeferredSender(partyRef)) return partyRef.party;\n if (!senderParty) {\n throw new Error(`${label} requires a resolved sender party`);\n }\n return senderParty;\n};\n\nconst parseDamlDecimal = (value: unknown, label: string): bigint => {\n if (typeof value !== 'string') {\n throw new Error(`${label} must be a DAML Decimal string`);\n }\n const match = /^([+-]?)(\\d+)(?:\\.(\\d{0,10}))?$/.exec(value);\n if (!match) {\n throw new Error(`${label} is not a valid DAML Decimal: ${value}`);\n }\n const sign = match[1] === '-' ? -1n : 1n;\n const whole = BigInt(match[2]!);\n const fraction = BigInt((match[3] ?? '').padEnd(10, '0'));\n return sign * (whole * DAML_DECIMAL_SCALE + fraction);\n};\n\nconst getContractNumericField = (contract: JsActiveContract, field: string): bigint => {\n const raw = getCreateArgumentField(contract.createdEvent.createArgument, field);\n const value =\n raw !== null && typeof raw === 'object' && 'initialAmount' in raw\n ? (raw as { initialAmount?: unknown }).initialAmount\n : raw;\n return parseDamlDecimal(\n value,\n `Contract ${contract.createdEvent.contractId} numeric field ${field}`,\n );\n};\n\nexport const selectContractsByGte = (\n contracts: JsActiveContract[],\n field: string,\n requestedValue: string,\n): JsActiveContract[] => {\n const requested = parseDamlDecimal(requestedValue, 'Requested contract value');\n if (requested <= 0n) {\n throw new Error('Requested contract value must be positive');\n }\n\n const candidates = contracts\n .map((contract) => ({\n contract,\n amount: getContractNumericField(contract, field),\n }))\n .filter(({ amount }) => amount > 0n)\n .sort((left, right) =>\n left.amount === right.amount\n ? left.contract.createdEvent.contractId.localeCompare(\n right.contract.createdEvent.contractId,\n )\n : left.amount > right.amount\n ? -1\n : 1,\n );\n\n const selected: JsActiveContract[] = [];\n let total = 0n;\n for (const candidate of candidates) {\n selected.push(candidate.contract);\n total += candidate.amount;\n if (total >= requested) break;\n }\n\n if (total < requested) {\n throw new Error(\n `Insufficient contract value in field ${field}: requested ${requestedValue}, found ${total.toString()} base units`,\n );\n }\n if (selected.length > MAX_SELECTED_CONTRACTS) {\n throw new Error(\n `Selection needs ${selected.length} contracts, exceeding the ${MAX_SELECTED_CONTRACTS} input limit`,\n );\n }\n return selected;\n};\n\nconst makeActiveContractRef = (selector: CantonContractSelector): ActiveContractRef => ({\n type: 'activeContractIds',\n partyToFilter: selector.queryAs,\n expectedSignatories: selector.expectedSignatories,\n templateId: selector.templateId ?? selector.interfaceId,\n interfaceId: selector.interfaceId,\n contractStateFilter: selector.stateFilter,\n});\n\nconst resolveSelectorContracts = async (\n resolver: ReturnType<typeof createContractAddressResolver>,\n selector: CantonContractSelector,\n): Promise<JsActiveContract[]> => {\n const contracts = await resolver.resolveActiveContracts(makeActiveContractRef(selector));\n if (!selector.contractId) return contracts;\n const source = await resolver.resolveActiveContracts(\n makeActiveContractRef(selector.contractId.selector),\n );\n if (source.length !== 1)\n throw new Error(\n `Contract ID source matched ${source.length} contracts, expected exactly one`,\n );\n const contractId = getCreateArgumentField(\n source[0]!.createdEvent.createArgument,\n selector.contractId.field,\n );\n if (typeof contractId !== 'string' || !contractId)\n throw new Error('Contract ID source must contain a nonempty contract ID');\n return contracts.filter((contract) => contract.createdEvent.contractId === contractId);\n};\n\nconst resolveContractValue = async (\n resolver: ReturnType<typeof createContractAddressResolver>,\n source: CantonActiveContractValue,\n): Promise<string> => {\n const contracts = await resolveSelectorContracts(resolver, source.selector);\n if (contracts.length !== 1) {\n throw new Error(\n `Active contract value matched ${contracts.length} contracts, expected exactly one`,\n );\n }\n const value = getCreateArgumentField(contracts[0]!.createdEvent.createArgument, source.field);\n if (parseDamlDecimal(value, `Contract value ${source.field}`) <= 0n) {\n throw new Error(`Contract value ${source.field} must be positive`);\n }\n return value as string;\n};\n\nconst selectActiveContracts = async (\n contracts: JsActiveContract[],\n selection: CantonActiveContractSelection,\n resolver: ReturnType<typeof createContractAddressResolver>,\n): Promise<JsActiveContract[]> => {\n switch (selection.kind) {\n case 'exactlyOne':\n if (contracts.length !== 1) {\n throw new Error(\n `Active contract selection matched ${contracts.length} contracts, expected exactly one`,\n );\n }\n return contracts;\n case 'all':\n return contracts;\n case 'gte':\n return selectContractsByGte(\n contracts,\n selection.field,\n typeof selection.value === 'string'\n ? selection.value\n : await resolveContractValue(resolver, selection.value),\n );\n }\n};\n\nexport const resolveCantonActiveContracts = async (args: {\n client: ICantonClient;\n selector: CantonContractSelector;\n selection: CantonActiveContractSelection;\n senderParty?: string;\n}): Promise<{ contractIds: string[] }> => {\n const queryParty = resolveParty(\n args.selector.queryAs,\n args.senderParty,\n 'Active contract selection',\n );\n const resolver = createContractAddressResolver({\n client: args.client,\n senderParty: args.senderParty,\n signingParties: [queryParty],\n appendDisclosures: () => undefined,\n });\n const selected = await selectActiveContracts(\n await resolveSelectorContracts(resolver, args.selector),\n args.selection,\n resolver,\n );\n return {\n contractIds: selected.map(({ createdEvent }) => createdEvent.contractId),\n };\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value);\n\nconst isCantonTime = (value: unknown): value is string =>\n typeof value === 'string' &&\n CANTON_TIME_PATTERN.test(value) &&\n Number.isFinite(Date.parse(value));\n\nconst isActiveContractRefresh = (refresh: CantonRefresh): refresh is CantonActiveContractRefresh =>\n refresh.resolver.type === 'activeContract';\n\nconst isActiveContractValueRefresh = (\n refresh: CantonRefresh,\n): refresh is CantonActiveContractValueRefresh => refresh.resolver.type === 'activeContractValue';\n\nconst isAmuletContextRefresh = (refresh: CantonRefresh): refresh is CantonAmuletContextRefresh =>\n refresh.resolver.type === 'amuletContext';\n\nconst isTimestampRefresh = (refresh: CantonRefresh): refresh is CantonTimestampRefresh =>\n refresh.resolver.type === 'timestamp';\n\nconst replaceAtPath = (root: unknown, path: CantonRefreshPath, value: unknown): unknown => {\n if (path.length === 0) return value;\n\n let current = root;\n for (const [position, segment] of path.entries()) {\n const isLast = position === path.length - 1;\n if ('field' in segment) {\n if (!isRecord(current) || !(segment.field in current)) {\n throw new Error(`Refresh target field \"${segment.field}\" does not exist`);\n }\n if (isLast) {\n current[segment.field] = value;\n return root;\n }\n current = current[segment.field];\n continue;\n }\n if ('index' in segment) {\n if (!Array.isArray(current) || segment.index >= current.length) {\n throw new Error(`Refresh target array index ${segment.index} does not exist`);\n }\n if (isLast) {\n current[segment.index] = value;\n return root;\n }\n current = current[segment.index];\n continue;\n }\n\n if (!Array.isArray(current)) {\n throw new Error(`Refresh target DAML map \"${segment.damlMapKey}\" is not an array`);\n }\n const matches = current.filter(\n (entry): entry is [string, unknown] =>\n Array.isArray(entry) && entry.length === 2 && entry[0] === segment.damlMapKey,\n );\n if (matches.length !== 1) {\n throw new Error(\n `Refresh target DAML map key \"${segment.damlMapKey}\" matched ${matches.length} entries`,\n );\n }\n if (isLast) {\n matches[0]![1] = value;\n return root;\n }\n current = matches[0]![1];\n }\n return root;\n};\n\nconst readAtPath = (root: unknown, path: CantonRefreshPath): unknown => {\n let current = root;\n for (const segment of path) {\n if ('field' in segment) {\n if (!isRecord(current) || !(segment.field in current)) {\n throw new Error(`Refresh target field \"${segment.field}\" does not exist`);\n }\n current = current[segment.field];\n continue;\n }\n if ('index' in segment) {\n if (!Array.isArray(current) || segment.index >= current.length) {\n throw new Error(`Refresh target array index ${segment.index} does not exist`);\n }\n current = current[segment.index];\n continue;\n }\n\n if (!Array.isArray(current)) {\n throw new Error(`Refresh target DAML map \"${segment.damlMapKey}\" is not an array`);\n }\n const matches = current.filter(\n (entry): entry is [string, unknown] =>\n Array.isArray(entry) && entry.length === 2 && entry[0] === segment.damlMapKey,\n );\n if (matches.length !== 1) {\n throw new Error(\n `Refresh target DAML map key \"${segment.damlMapKey}\" matched ${matches.length} entries`,\n );\n }\n current = matches[0]![1];\n }\n return current;\n};\n\nconst readTarget = (\n commands: CantonUnresolvedCommand[],\n target: CantonArgumentRefreshTarget,\n path: CantonRefreshPath,\n): unknown => {\n const command = commands[target.commandIndex];\n if (!command) {\n throw new Error(`Refresh command index ${target.commandIndex} does not exist`);\n }\n\n if (target.command === 'exercise') {\n if (!('exerciseCommand' in command)) {\n throw new Error(`Refresh command index ${target.commandIndex} is not an exercise`);\n }\n if (command.exerciseCommand.choice !== target.choice) {\n throw new Error(\n `Refresh command index ${target.commandIndex} expected choice ${target.choice}, found ${command.exerciseCommand.choice}`,\n );\n }\n return readAtPath(command.exerciseCommand.choiceArgument, path);\n }\n\n if (!('createCommand' in command)) {\n throw new Error(`Refresh command index ${target.commandIndex} is not a create`);\n }\n if (command.createCommand.templateId !== target.template) {\n throw new Error(\n `Refresh command index ${target.commandIndex} expected template ${target.template}, found ${command.createCommand.templateId}`,\n );\n }\n return readAtPath(command.createCommand.createArguments, path);\n};\n\nconst applyPatch = (\n commands: CantonUnresolvedCommand[],\n target: CantonArgumentRefreshTarget,\n path: CantonRefreshPath,\n value: unknown,\n): void => {\n const command = commands[target.commandIndex];\n if (!command) {\n throw new Error(`Refresh command index ${target.commandIndex} does not exist`);\n }\n\n if (target.command === 'exercise') {\n if (!('exerciseCommand' in command)) {\n throw new Error(`Refresh command index ${target.commandIndex} is not an exercise`);\n }\n if (command.exerciseCommand.choice !== target.choice) {\n throw new Error(\n `Refresh command index ${target.commandIndex} expected choice ${target.choice}, found ${command.exerciseCommand.choice}`,\n );\n }\n command.exerciseCommand.choiceArgument = replaceAtPath(\n command.exerciseCommand.choiceArgument,\n path,\n value,\n );\n return;\n }\n\n if (!('createCommand' in command)) {\n throw new Error(`Refresh command index ${target.commandIndex} is not a create`);\n }\n if (command.createCommand.templateId !== target.template) {\n throw new Error(\n `Refresh command index ${target.commandIndex} expected template ${target.template}, found ${command.createCommand.templateId}`,\n );\n }\n command.createCommand.createArguments = replaceAtPath(\n command.createCommand.createArguments,\n path,\n value,\n );\n};\n\nconst applyTarget = (\n commands: CantonUnresolvedCommand[],\n target: CantonRefreshTarget,\n value: unknown,\n): void => {\n if ('field' in target) {\n const command = commands[target.commandIndex];\n if (!command) {\n throw new Error(`Refresh command index ${target.commandIndex} does not exist`);\n }\n if (!('exerciseCommand' in command)) {\n throw new Error(`Refresh command index ${target.commandIndex} is not an exercise`);\n }\n if (typeof value !== 'string') {\n throw new Error('Exercise contract ID refresh must resolve to a string');\n }\n command.exerciseCommand.contractId = value;\n return;\n }\n\n for (const argument of target.arguments) {\n applyPatch(commands, target, argument.path, value);\n }\n};\n\nconst containsDeferredSentinel = (value: unknown, key?: string): boolean => {\n if (key === 'createdEventBlob') return false;\n if (isCantonDeferredSentinel(value)) return true;\n if (Array.isArray(value)) return value.some((item) => containsDeferredSentinel(item));\n if (!isRecord(value)) return false;\n return Object.entries(value).some(([childKey, child]) =>\n containsDeferredSentinel(child, childKey),\n );\n};\n\nconst disclosuresEqual = (left: CantonDisclosedContract, right: CantonDisclosedContract): boolean =>\n left.contractId === right.contractId &&\n left.templateId === right.templateId &&\n left.createdEventBlob === right.createdEventBlob &&\n left.synchronizerId === right.synchronizerId;\n\nexport const resolveCantonRefreshPlan = async (args: {\n unresolvedCommands: CantonUnresolvedCommand[];\n unresolvedDisclosedContracts: CantonDisclosedContract[];\n refreshPlan: CantonRefreshPlan;\n senderParty?: string;\n signingParties: string[];\n client: ICantonClient;\n}): Promise<{ commands: CantonCommand[]; disclosedContracts: CantonDisclosedContract[] }> => {\n if (\n containsDeferredSentinel(args.unresolvedCommands) ||\n containsDeferredSentinel(args.unresolvedDisclosedContracts)\n ) {\n throw new Error('Canton refreshPlan cannot be combined with deferred sentinels');\n }\n\n const commands = structuredClone(args.unresolvedCommands);\n const baselineDisclosureCids = new Set(\n args.unresolvedDisclosedContracts.map(({ contractId }) => contractId),\n );\n const originalCids = new Set(args.refreshPlan.disclosures?.originalCids ?? []);\n for (const contractId of originalCids) {\n if (!baselineDisclosureCids.has(contractId)) {\n throw new Error(\n `Original disclosure ${contractId} cannot be refreshed: it is not present in unresolvedDisclosedContracts`,\n );\n }\n }\n const disclosureMap = new Map<string, CantonDisclosedContract>();\n const appendDisclosures = (disclosures: CantonDisclosedContract[]): void => {\n for (const disclosure of disclosures) {\n const existing = disclosureMap.get(disclosure.contractId);\n if (existing && !disclosuresEqual(existing, disclosure)) {\n throw new Error(`Conflicting disclosures for contract ${disclosure.contractId}`);\n }\n disclosureMap.set(disclosure.contractId, disclosure);\n }\n };\n appendDisclosures(\n args.unresolvedDisclosedContracts.filter(({ contractId }) => !originalCids.has(contractId)),\n );\n\n const resolver = createContractAddressResolver({\n client: args.client,\n senderParty: args.senderParty,\n signingParties: args.signingParties,\n appendDisclosures,\n });\n\n for (const refresh of args.refreshPlan.commands) {\n if (isActiveContractRefresh(refresh)) {\n const ref = makeActiveContractRef(refresh.resolver.selector);\n const selected = await selectActiveContracts(\n await resolveSelectorContracts(resolver, refresh.resolver.selector),\n refresh.resolver.selection,\n resolver,\n );\n await resolver.discloseActiveContracts(ref, selected);\n const contractIds = selected.map(({ createdEvent }) => createdEvent.contractId);\n const resolved =\n refresh.resolver.selection.kind === 'exactlyOne' ? contractIds[0]! : contractIds;\n for (const target of refresh.targets) applyTarget(commands, target, resolved);\n continue;\n }\n\n if (isActiveContractValueRefresh(refresh)) {\n const value = await resolveContractValue(resolver, refresh.resolver);\n for (const target of refresh.targets) applyTarget(commands, target, value);\n continue;\n }\n\n if (isAmuletContextRefresh(refresh)) {\n const bundle = await args.client.getAmuletContextWithExternalRules({\n admin: refresh.resolver.dsoParty,\n id: 'Amulet',\n });\n appendDisclosures(bundle.disclosedContracts);\n for (const target of refresh.targets) {\n applyTarget(commands, target, bundle.amuletContext);\n }\n }\n }\n\n // Timestamp refreshes run after all external reads so their shared instant is\n // as close as possible to prepareForSigning, regardless of declaration order.\n const now = new Date();\n for (const refresh of args.refreshPlan.commands) {\n if (!isTimestampRefresh(refresh)) continue;\n\n for (const target of refresh.targets) {\n for (const { path, offsetMs = 0 } of target.arguments) {\n const iso = new Date(now.getTime() + offsetMs).toISOString();\n const current = readTarget(commands, target, path);\n let value: unknown;\n if (isCantonTime(current)) {\n value = iso;\n } else if (\n isRecord(current) &&\n current.tag === 'AV_Time' &&\n isCantonTime(current.value)\n ) {\n value = { ...current, value: iso };\n } else {\n throw new Error('Timestamp refresh target must contain a Canton Time value');\n }\n applyPatch(commands, target, path, value);\n }\n }\n }\n\n return {\n commands: commands as CantonCommand[],\n disclosedContracts: [...disclosureMap.values()],\n };\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client/amulet.ts"],"names":["AMULET_INSTRUMENT_ID","CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS","fetchAmuletContext","walletUrl","token","instrumentId","now","Date","later","getTime","response","fetch","URL","method","headers","Authorization","body","JSON","stringify","choiceArguments","expectedAdmin","admin","transfer","sender","receiver","amount","requestedAt","toISOString","executeBefore","inputHoldingCids","meta","values","extraArgs","context","ok","text","CantonProtocolError","status","data","json","disclosedContracts","choiceContextData","amuletContext","choiceContext","findDisclosure","templateSuffix","contract","find","templateId","endsWith","findAmuletRulesDisclosures","amuletRules","openMiningRound","fetchAcceptContext","args","encodeURIComponent","contractId","excludeDebugFields","injectExternalPartyAmuletRules","externalRulesContract","tag","value","externalPartyAmuletRulesCid","fetchDsoParty","dso_party_id","scanProxyGet","path","fetchAmuletRules","amulet_rules","fetchOpenAndIssuingMiningRounds","open_mining_rounds","issuing_mining_rounds","toDisclosedContract","entry","contract_id","template_id","createdEventBlob","created_event_blob","synchronizerId","domain_id"],"mappings":"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","file":"YCF6SVF6.js","sourcesContent":["import type { TokenProvider } from '../auth/token-provider';\nimport { CantonProtocolError } from '../errors';\nimport type { CantonDisclosedContract } from '../transaction';\n\n/** Validator-wallet access a {@link CantonClient} needs to serve amulet endpoints. */\nexport type CantonClientWalletConfig = {\n /** Validator wallet URL for scan-proxy CIP-56 endpoints. */\n walletUrl: string;\n /** Bearer-token source for wallet requests. */\n tokenProvider: TokenProvider;\n};\n\n/** The single Amulet instrument id used across Canton Network fee flows. */\nexport const AMULET_INSTRUMENT_ID = 'Amulet';\n\n/** Instrument identifier for an amulet context probe. */\nexport type InstrumentId = { admin: string; id: string };\n\n/** DAML ChoiceContext — a bag of named AnyValues passed to fee-bearing choices. */\nexport type ChoiceContext = { values: Record<string, unknown> };\n\nexport type AmuletContextResult = {\n amuletContext: ChoiceContext;\n disclosedContracts: CantonDisclosedContract[];\n externalPartyAmuletRulesCid: string;\n};\n\n// The probe (amount 0, sender = receiver = admin) never executes — it only fetches context; 1-hour window is ample.\nconst CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS = 60 * 60 * 1000;\n\ntype AmuletContextResponse = {\n choiceContext: {\n disclosedContracts: CantonDisclosedContract[];\n choiceContextData: ChoiceContext;\n };\n};\n\n/** Amulet ChoiceContext from the validator scan-proxy — same call for all fee-bearing choices. */\nexport const fetchAmuletContext = async (\n walletUrl: string,\n token: string,\n instrumentId: InstrumentId,\n): Promise<{ amuletContext: ChoiceContext; disclosedContracts: CantonDisclosedContract[] }> => {\n const now = new Date();\n const later = new Date(now.getTime() + CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS);\n\n const response = await fetch(\n new URL(\n '/api/validator/v0/scan-proxy/registry/transfer-instruction/v1/transfer-factory',\n walletUrl,\n ),\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n choiceArguments: {\n expectedAdmin: instrumentId.admin,\n transfer: {\n sender: instrumentId.admin,\n receiver: instrumentId.admin,\n amount: '0',\n instrumentId,\n requestedAt: now.toISOString(),\n executeBefore: later.toISOString(),\n inputHoldingCids: [],\n meta: { values: {} },\n },\n extraArgs: { context: { values: {} }, meta: { values: {} } },\n },\n }),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new CantonProtocolError(`Failed to get amulet context: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as AmuletContextResponse;\n const { disclosedContracts, choiceContextData: amuletContext } = data.choiceContext;\n\n return { amuletContext, disclosedContracts };\n};\n\nconst findDisclosure = (\n disclosedContracts: CantonDisclosedContract[],\n templateSuffix: string,\n): CantonDisclosedContract => {\n const contract = disclosedContracts.find(({ templateId }) =>\n templateId?.endsWith(templateSuffix),\n );\n\n if (!contract) {\n throw new CantonProtocolError(`${templateSuffix} not found in amulet context`);\n }\n\n return contract;\n};\n\n/** The AmuletRules and OpenMiningRound an amulet context discloses, as `AmuletRules_*` choices need. */\nexport const findAmuletRulesDisclosures = (\n disclosedContracts: CantonDisclosedContract[],\n): { amuletRules: CantonDisclosedContract; openMiningRound: CantonDisclosedContract } => ({\n amuletRules: findDisclosure(disclosedContracts, ':Splice.AmuletRules:AmuletRules'),\n openMiningRound: findDisclosure(disclosedContracts, ':Splice.Round:OpenMiningRound'),\n});\n\n// Validators disagree on where they nest the accept context: some return it under\n// `choiceContext.choiceContextData`, others at the top level, with or without a `values` wrapper.\ntype AcceptContextResponse = {\n choiceContextData?: { values?: Record<string, unknown> } | Record<string, unknown>;\n choiceContext?: {\n choiceContextData?: { values?: Record<string, unknown> };\n disclosedContracts?: CantonDisclosedContract[];\n };\n disclosedContracts?: CantonDisclosedContract[];\n};\n\n/** ChoiceContext for `TransferInstruction_Accept` on a single pending instruction. */\nexport const fetchAcceptContext = async (args: {\n walletUrl: string;\n token: string;\n contractId: string;\n}): Promise<{ choiceContext: ChoiceContext; disclosedContracts: CantonDisclosedContract[] }> => {\n const response = await fetch(\n new URL(\n `/api/validator/v0/scan-proxy/registry/transfer-instruction/v1/${encodeURIComponent(\n args.contractId,\n )}/choice-contexts/accept`,\n args.walletUrl,\n ),\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${args.token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ excludeDebugFields: true }),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new CantonProtocolError(`Failed to get accept context: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as AcceptContextResponse;\n const choiceContextData = data.choiceContext?.choiceContextData ??\n data.choiceContextData ?? { values: {} };\n const disclosedContracts =\n data.choiceContext?.disclosedContracts ?? data.disclosedContracts ?? [];\n const values =\n 'values' in choiceContextData &&\n choiceContextData.values &&\n typeof choiceContextData.values === 'object'\n ? (choiceContextData.values as Record<string, unknown>)\n : choiceContextData;\n\n return { choiceContext: { values }, disclosedContracts };\n};\n\n/** Injects ExternalPartyAmuletRules cid into the ChoiceContext — required by every flow hitting FeeUtils.validateContext. */\nexport const injectExternalPartyAmuletRules = (\n amuletContext: ChoiceContext,\n disclosedContracts: CantonDisclosedContract[],\n): { amuletContext: ChoiceContext; externalPartyAmuletRulesCid: string } => {\n const externalRulesContract = findDisclosure(\n disclosedContracts,\n ':Splice.ExternalPartyAmuletRules:ExternalPartyAmuletRules',\n );\n\n return {\n amuletContext: {\n values: {\n ...amuletContext.values,\n 'external-party-amulet-rules': {\n tag: 'AV_ContractId',\n value: externalRulesContract.contractId,\n },\n },\n },\n externalPartyAmuletRulesCid: externalRulesContract.contractId,\n };\n};\n\n/** Fetch the DSO party id from the validator scan-proxy API. */\nexport const fetchDsoParty = async (walletUrl: string, token: string): Promise<string> => {\n const response = await fetch(new URL('/api/validator/v0/scan-proxy/dso-party-id', walletUrl), {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) {\n throw new CantonProtocolError(`Failed to get DSO party: ${response.status}`);\n }\n const data = (await response.json()) as { dso_party_id: string };\n return data.dso_party_id;\n};\n\n/** Scan-proxy contract envelope (`amulet-rules`, mining rounds). */\nexport type ScanContractEntry = {\n contract: {\n template_id: string;\n contract_id: string;\n payload?: unknown;\n created_event_blob: string;\n created_at?: string;\n };\n domain_id: string;\n};\n\nexport type OpenAndIssuingMiningRounds = {\n open_mining_rounds: Record<string, ScanContractEntry>;\n issuing_mining_rounds: Record<string, ScanContractEntry>;\n};\n\nconst scanProxyGet = async <T>(walletUrl: string, token: string, path: string): Promise<T> => {\n const response = await fetch(new URL(path, walletUrl), {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n const text = await response.text();\n throw new CantonProtocolError(`Scan-proxy ${path} failed: ${response.status} ${text}`);\n }\n return (await response.json()) as T;\n};\n\nexport const fetchAmuletRules = async (\n walletUrl: string,\n token: string,\n): Promise<ScanContractEntry> => {\n const data = await scanProxyGet<{ amulet_rules: ScanContractEntry }>(\n walletUrl,\n token,\n '/api/validator/v0/scan-proxy/amulet-rules',\n );\n return data.amulet_rules;\n};\n\nexport const fetchOpenAndIssuingMiningRounds = async (\n walletUrl: string,\n token: string,\n): Promise<OpenAndIssuingMiningRounds> => {\n const data = await scanProxyGet<OpenAndIssuingMiningRounds>(\n walletUrl,\n token,\n '/api/validator/v0/scan-proxy/open-and-issuing-mining-rounds',\n );\n return {\n open_mining_rounds: data.open_mining_rounds ?? {},\n issuing_mining_rounds: data.issuing_mining_rounds ?? {},\n };\n};\n\nexport const toDisclosedContract = (entry: ScanContractEntry): CantonDisclosedContract => ({\n contractId: entry.contract.contract_id,\n templateId: entry.contract.template_id,\n createdEventBlob: entry.contract.created_event_blob,\n synchronizerId: entry.domain_id,\n});\n"]}