@misofm/sdk 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/README.md +88 -56
  2. package/dist/client.d.ts +121 -18
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +200 -44
  5. package/dist/client.js.map +1 -1
  6. package/dist/contracts/composition_routed_stake/composition_routed_stake.d.ts +205 -0
  7. package/dist/contracts/composition_routed_stake/composition_routed_stake.d.ts.map +1 -0
  8. package/dist/contracts/composition_routed_stake/composition_routed_stake.js +184 -0
  9. package/dist/contracts/composition_routed_stake/composition_routed_stake.js.map +1 -0
  10. package/dist/contracts/composition_routed_stake/witness.d.ts +7 -0
  11. package/dist/contracts/composition_routed_stake/witness.d.ts.map +1 -0
  12. package/dist/contracts/composition_routed_stake/witness.js +9 -0
  13. package/dist/contracts/composition_routed_stake/witness.js.map +1 -0
  14. package/dist/contracts/composition_royalty_pool/composition_royalty_pool.d.ts +89 -28
  15. package/dist/contracts/composition_royalty_pool/composition_royalty_pool.d.ts.map +1 -1
  16. package/dist/contracts/composition_royalty_pool/composition_royalty_pool.js +84 -23
  17. package/dist/contracts/composition_royalty_pool/composition_royalty_pool.js.map +1 -1
  18. package/dist/contracts/composition_royalty_pool/witness.d.ts +6 -0
  19. package/dist/contracts/composition_royalty_pool/witness.d.ts.map +1 -0
  20. package/dist/contracts/composition_royalty_pool/witness.js +8 -0
  21. package/dist/contracts/composition_royalty_pool/witness.js.map +1 -0
  22. package/dist/contracts/genre/genre.d.ts +96 -0
  23. package/dist/contracts/genre/genre.d.ts.map +1 -0
  24. package/dist/contracts/genre/genre.js +107 -0
  25. package/dist/contracts/genre/genre.js.map +1 -0
  26. package/dist/contracts/recording_advisory/recording_advisory.d.ts +194 -0
  27. package/dist/contracts/recording_advisory/recording_advisory.d.ts.map +1 -0
  28. package/dist/contracts/recording_advisory/recording_advisory.js +204 -0
  29. package/dist/contracts/recording_advisory/recording_advisory.js.map +1 -0
  30. package/dist/contracts/recording_language/deps/language_code/language_code.d.ts +6 -0
  31. package/dist/contracts/recording_language/deps/language_code/language_code.d.ts.map +1 -0
  32. package/dist/contracts/recording_language/deps/language_code/language_code.js +8 -0
  33. package/dist/contracts/recording_language/deps/language_code/language_code.js.map +1 -0
  34. package/dist/contracts/recording_language/recording_language.d.ts +152 -0
  35. package/dist/contracts/recording_language/recording_language.d.ts.map +1 -0
  36. package/dist/contracts/recording_language/recording_language.js +149 -0
  37. package/dist/contracts/recording_language/recording_language.js.map +1 -0
  38. package/dist/contracts/recording_master_reference/deps/ori/walrus_data.d.ts +52 -0
  39. package/dist/contracts/recording_master_reference/deps/ori/walrus_data.d.ts.map +1 -0
  40. package/dist/contracts/recording_master_reference/deps/ori/walrus_data.js +37 -0
  41. package/dist/contracts/recording_master_reference/deps/ori/walrus_data.js.map +1 -0
  42. package/dist/contracts/recording_master_reference/recording_master_reference.d.ts +131 -0
  43. package/dist/contracts/recording_master_reference/recording_master_reference.d.ts.map +1 -0
  44. package/dist/contracts/recording_master_reference/recording_master_reference.js +121 -0
  45. package/dist/contracts/recording_master_reference/recording_master_reference.js.map +1 -0
  46. package/dist/contracts/recording_preview/deps/ori/walrus_data.d.ts +52 -0
  47. package/dist/contracts/recording_preview/deps/ori/walrus_data.d.ts.map +1 -0
  48. package/dist/contracts/recording_preview/deps/ori/walrus_data.js +37 -0
  49. package/dist/contracts/recording_preview/deps/ori/walrus_data.js.map +1 -0
  50. package/dist/contracts/recording_preview/recording_preview.d.ts +104 -0
  51. package/dist/contracts/recording_preview/recording_preview.d.ts.map +1 -0
  52. package/dist/contracts/recording_preview/recording_preview.js +94 -0
  53. package/dist/contracts/recording_preview/recording_preview.js.map +1 -0
  54. package/dist/contracts/recording_royalty_pool/recording_royalty_pool.d.ts +90 -28
  55. package/dist/contracts/recording_royalty_pool/recording_royalty_pool.d.ts.map +1 -1
  56. package/dist/contracts/recording_royalty_pool/recording_royalty_pool.js +84 -23
  57. package/dist/contracts/recording_royalty_pool/recording_royalty_pool.js.map +1 -1
  58. package/dist/contracts/recording_royalty_pool/witness.d.ts +6 -0
  59. package/dist/contracts/recording_royalty_pool/witness.d.ts.map +1 -0
  60. package/dist/contracts/recording_royalty_pool/witness.js +8 -0
  61. package/dist/contracts/recording_royalty_pool/witness.js.map +1 -0
  62. package/dist/contracts/release_description/release_description.d.ts +112 -0
  63. package/dist/contracts/release_description/release_description.d.ts.map +1 -0
  64. package/dist/contracts/release_description/release_description.js +123 -0
  65. package/dist/contracts/release_description/release_description.js.map +1 -0
  66. package/dist/contracts/release_dsp_link/release_dsp_link.d.ts +644 -0
  67. package/dist/contracts/release_dsp_link/release_dsp_link.d.ts.map +1 -0
  68. package/dist/contracts/release_dsp_link/release_dsp_link.js +556 -0
  69. package/dist/contracts/release_dsp_link/release_dsp_link.js.map +1 -0
  70. package/dist/contracts/release_genre/deps/per_track/per_track.d.ts +33 -0
  71. package/dist/contracts/release_genre/deps/per_track/per_track.d.ts.map +1 -0
  72. package/dist/contracts/release_genre/deps/per_track/per_track.js +32 -0
  73. package/dist/contracts/release_genre/deps/per_track/per_track.js.map +1 -0
  74. package/dist/contracts/release_genre/release_genre.d.ts +193 -0
  75. package/dist/contracts/release_genre/release_genre.d.ts.map +1 -0
  76. package/dist/contracts/release_genre/release_genre.js +207 -0
  77. package/dist/contracts/release_genre/release_genre.js.map +1 -0
  78. package/dist/contracts/release_kind/release_kind.d.ts +98 -0
  79. package/dist/contracts/release_kind/release_kind.d.ts.map +1 -0
  80. package/dist/contracts/release_kind/release_kind.js +109 -0
  81. package/dist/contracts/release_kind/release_kind.js.map +1 -0
  82. package/dist/contracts/release_revenue_distributor/release_revenue_distributor.d.ts +106 -0
  83. package/dist/contracts/release_revenue_distributor/release_revenue_distributor.d.ts.map +1 -0
  84. package/dist/contracts/release_revenue_distributor/release_revenue_distributor.js +113 -0
  85. package/dist/contracts/release_revenue_distributor/release_revenue_distributor.js.map +1 -0
  86. package/dist/contracts/release_revenue_distributor/witness.d.ts +7 -0
  87. package/dist/contracts/release_revenue_distributor/witness.d.ts.map +1 -0
  88. package/dist/contracts/release_revenue_distributor/witness.js +9 -0
  89. package/dist/contracts/release_revenue_distributor/witness.js.map +1 -0
  90. package/dist/contracts/routed_stake/deps/royalty_pool/stake.d.ts +54 -0
  91. package/dist/contracts/routed_stake/deps/royalty_pool/stake.d.ts.map +1 -0
  92. package/dist/contracts/routed_stake/deps/royalty_pool/stake.js +37 -0
  93. package/dist/contracts/routed_stake/deps/royalty_pool/stake.js.map +1 -0
  94. package/dist/contracts/routed_stake/deps/std/type_name.d.ts +18 -0
  95. package/dist/contracts/routed_stake/deps/std/type_name.d.ts.map +1 -0
  96. package/dist/contracts/routed_stake/deps/std/type_name.js +20 -0
  97. package/dist/contracts/routed_stake/deps/std/type_name.js.map +1 -0
  98. package/dist/contracts/routed_stake/deps/sui/balance.d.ts +13 -0
  99. package/dist/contracts/routed_stake/deps/sui/balance.d.ts.map +1 -0
  100. package/dist/contracts/routed_stake/deps/sui/balance.js +15 -0
  101. package/dist/contracts/routed_stake/deps/sui/balance.js.map +1 -0
  102. package/dist/contracts/routed_stake/deps/sui/vec_map.d.ts +37 -0
  103. package/dist/contracts/routed_stake/deps/sui/vec_map.d.ts.map +1 -0
  104. package/dist/contracts/routed_stake/deps/sui/vec_map.js +28 -0
  105. package/dist/contracts/routed_stake/deps/sui/vec_map.js.map +1 -0
  106. package/dist/contracts/routed_stake/routed_stake.d.ts +356 -0
  107. package/dist/contracts/routed_stake/routed_stake.d.ts.map +1 -0
  108. package/dist/contracts/routed_stake/routed_stake.js +311 -0
  109. package/dist/contracts/routed_stake/routed_stake.js.map +1 -0
  110. package/dist/contracts/royalty_pool/pool.d.ts +27 -17
  111. package/dist/contracts/royalty_pool/pool.d.ts.map +1 -1
  112. package/dist/contracts/royalty_pool/pool.js +26 -17
  113. package/dist/contracts/royalty_pool/pool.js.map +1 -1
  114. package/dist/contracts/vault/deps/sui/bag.d.ts +35 -0
  115. package/dist/contracts/vault/deps/sui/bag.d.ts.map +1 -0
  116. package/dist/contracts/vault/deps/sui/bag.js +37 -0
  117. package/dist/contracts/vault/deps/sui/bag.js.map +1 -0
  118. package/dist/contracts/vault/deps/sui/borrow.d.ts +20 -0
  119. package/dist/contracts/vault/deps/sui/borrow.d.ts.map +1 -0
  120. package/dist/contracts/vault/deps/sui/borrow.js +21 -0
  121. package/dist/contracts/vault/deps/sui/borrow.js.map +1 -0
  122. package/dist/contracts/vault/vault.d.ts +276 -0
  123. package/dist/contracts/vault/vault.d.ts.map +1 -0
  124. package/dist/contracts/vault/vault.js +274 -0
  125. package/dist/contracts/vault/vault.js.map +1 -0
  126. package/dist/contracts.d.ts +13 -2
  127. package/dist/contracts.d.ts.map +1 -1
  128. package/dist/contracts.js +15 -7
  129. package/dist/contracts.js.map +1 -1
  130. package/dist/cover.d.ts +17 -3
  131. package/dist/cover.d.ts.map +1 -1
  132. package/dist/cover.js +43 -20
  133. package/dist/cover.js.map +1 -1
  134. package/dist/credits.d.ts +31 -12
  135. package/dist/credits.d.ts.map +1 -1
  136. package/dist/credits.js +41 -25
  137. package/dist/credits.js.map +1 -1
  138. package/dist/deployments.d.ts +30 -57
  139. package/dist/deployments.d.ts.map +1 -1
  140. package/dist/deployments.js +5 -53
  141. package/dist/deployments.js.map +1 -1
  142. package/dist/index.d.ts +4 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +6 -5
  145. package/dist/index.js.map +1 -1
  146. package/dist/pressing.d.ts +8 -7
  147. package/dist/pressing.d.ts.map +1 -1
  148. package/dist/pressing.js +91 -32
  149. package/dist/pressing.js.map +1 -1
  150. package/dist/read/artist.js +3 -3
  151. package/dist/read/artist.js.map +1 -1
  152. package/dist/read/catalog.d.ts +14 -9
  153. package/dist/read/catalog.d.ts.map +1 -1
  154. package/dist/read/catalog.js +71 -37
  155. package/dist/read/catalog.js.map +1 -1
  156. package/dist/read/client.d.ts +4 -2
  157. package/dist/read/client.d.ts.map +1 -1
  158. package/dist/read/client.js +15 -4
  159. package/dist/read/client.js.map +1 -1
  160. package/dist/read/config.d.ts +14 -11
  161. package/dist/read/config.d.ts.map +1 -1
  162. package/dist/read/config.js +10 -37
  163. package/dist/read/config.js.map +1 -1
  164. package/dist/read/index.d.ts +2 -2
  165. package/dist/read/index.d.ts.map +1 -1
  166. package/dist/read/index.js +1 -1
  167. package/dist/read/index.js.map +1 -1
  168. package/dist/read/receipts.d.ts +24 -7
  169. package/dist/read/receipts.d.ts.map +1 -1
  170. package/dist/read/receipts.js +78 -25
  171. package/dist/read/receipts.js.map +1 -1
  172. package/dist/read/types.d.ts +43 -25
  173. package/dist/read/types.d.ts.map +1 -1
  174. package/dist/read/types.js +2 -2
  175. package/dist/read/types.js.map +1 -1
  176. package/dist/recording-extensions.d.ts +37 -0
  177. package/dist/recording-extensions.d.ts.map +1 -0
  178. package/dist/recording-extensions.js +61 -0
  179. package/dist/recording-extensions.js.map +1 -0
  180. package/dist/release-extensions.d.ts +84 -0
  181. package/dist/release-extensions.d.ts.map +1 -0
  182. package/dist/release-extensions.js +160 -0
  183. package/dist/release-extensions.js.map +1 -0
  184. package/dist/release-graph.d.ts +17 -26
  185. package/dist/release-graph.d.ts.map +1 -1
  186. package/dist/release-graph.js +55 -49
  187. package/dist/release-graph.js.map +1 -1
  188. package/dist/transactions.d.ts +43 -24
  189. package/dist/transactions.d.ts.map +1 -1
  190. package/dist/transactions.js +48 -27
  191. package/dist/transactions.js.map +1 -1
  192. package/dist/vault.d.ts +268 -0
  193. package/dist/vault.d.ts.map +1 -0
  194. package/dist/vault.js +389 -0
  195. package/dist/vault.js.map +1 -0
  196. package/package.json +17 -11
  197. package/src/client.ts +399 -61
  198. package/src/contracts/composition_routed_stake/composition_routed_stake.ts +346 -0
  199. package/src/contracts/composition_routed_stake/witness.ts +11 -0
  200. package/src/contracts/composition_royalty_pool/composition_royalty_pool.ts +151 -35
  201. package/src/contracts/composition_royalty_pool/witness.ts +7 -0
  202. package/src/contracts/genre/genre.ts +151 -0
  203. package/src/contracts/recording_advisory/recording_advisory.ts +315 -0
  204. package/src/contracts/recording_language/deps/language_code/language_code.ts +7 -0
  205. package/src/contracts/recording_language/recording_language.ts +237 -0
  206. package/src/contracts/recording_master_reference/deps/ori/walrus_data.ts +36 -0
  207. package/src/contracts/recording_master_reference/recording_master_reference.ts +181 -0
  208. package/src/contracts/recording_preview/deps/ori/walrus_data.ts +36 -0
  209. package/src/contracts/recording_preview/recording_preview.ts +154 -0
  210. package/src/contracts/recording_royalty_pool/recording_royalty_pool.ts +152 -35
  211. package/src/contracts/recording_royalty_pool/witness.ts +7 -0
  212. package/src/contracts/release_description/release_description.ts +167 -0
  213. package/src/contracts/release_dsp_link/release_dsp_link.ts +813 -0
  214. package/src/contracts/release_genre/deps/per_track/per_track.ts +36 -0
  215. package/src/contracts/release_genre/release_genre.ts +314 -0
  216. package/src/contracts/release_kind/release_kind.ts +153 -0
  217. package/src/contracts/release_revenue_distributor/release_revenue_distributor.ts +178 -0
  218. package/src/contracts/release_revenue_distributor/witness.ts +11 -0
  219. package/src/contracts/routed_stake/deps/royalty_pool/stake.ts +39 -0
  220. package/src/contracts/routed_stake/deps/std/type_name.ts +22 -0
  221. package/src/contracts/routed_stake/deps/sui/balance.ts +17 -0
  222. package/src/contracts/routed_stake/deps/sui/vec_map.ts +33 -0
  223. package/src/contracts/routed_stake/routed_stake.ts +508 -0
  224. package/src/contracts/royalty_pool/pool.ts +34 -24
  225. package/src/contracts/vault/deps/sui/bag.ts +39 -0
  226. package/src/contracts/vault/deps/sui/borrow.ts +25 -0
  227. package/src/contracts/vault/vault.ts +454 -0
  228. package/src/contracts.ts +16 -9
  229. package/src/cover.ts +62 -37
  230. package/src/credits.ts +64 -51
  231. package/src/deployments.ts +35 -97
  232. package/src/index.ts +11 -5
  233. package/src/pressing.ts +135 -39
  234. package/src/read/artist.ts +3 -3
  235. package/src/read/catalog.ts +99 -44
  236. package/src/read/client.ts +20 -4
  237. package/src/read/config.ts +23 -49
  238. package/src/read/index.ts +3 -1
  239. package/src/read/receipts.ts +103 -26
  240. package/src/read/types.ts +44 -27
  241. package/src/recording-extensions.ts +102 -0
  242. package/src/release-extensions.ts +261 -0
  243. package/src/release-graph.ts +68 -81
  244. package/src/transactions.ts +79 -53
  245. package/src/vault.ts +777 -0
  246. package/dist/contracts/miso_drop/drop.d.ts +0 -550
  247. package/dist/contracts/miso_drop/drop.d.ts.map +0 -1
  248. package/dist/contracts/miso_drop/drop.js +0 -523
  249. package/dist/contracts/miso_drop/drop.js.map +0 -1
  250. package/dist/contracts/release_registry/release_registry.d.ts +0 -114
  251. package/dist/contracts/release_registry/release_registry.d.ts.map +0 -1
  252. package/dist/contracts/release_registry/release_registry.js +0 -119
  253. package/dist/contracts/release_registry/release_registry.js.map +0 -1
  254. package/dist/drop.d.ts +0 -127
  255. package/dist/drop.d.ts.map +0 -1
  256. package/dist/drop.js +0 -202
  257. package/dist/drop.js.map +0 -1
  258. package/dist/extensions/royalty-pool.d.ts +0 -32
  259. package/dist/extensions/royalty-pool.d.ts.map +0 -1
  260. package/dist/extensions/royalty-pool.js +0 -33
  261. package/dist/extensions/royalty-pool.js.map +0 -1
  262. package/src/contracts/miso_drop/drop.ts +0 -798
  263. package/src/contracts/release_registry/release_registry.ts +0 -160
  264. package/src/drop.ts +0 -376
  265. package/src/extensions/royalty-pool.ts +0 -90
package/src/vault.ts ADDED
@@ -0,0 +1,777 @@
1
+ // Copyright (c) Miso Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Capability custody and vault-plugin transaction builders.
6
+ *
7
+ * A direct admin cap remains supported for existing works. New work should give
8
+ * the owner a `VaultAdminCap<AdminCap>` and keep the raw admin cap inside the
9
+ * shared Vault. Every authorized call borrows and returns the raw cap inside
10
+ * one helper; borrowed capabilities are never exposed to application code.
11
+ */
12
+
13
+ import type { BcsType } from "@mysten/sui/bcs";
14
+ import type { ClientWithCoreApi } from "@mysten/sui/client";
15
+ import type {
16
+ Transaction,
17
+ TransactionArgument,
18
+ TransactionObjectArgument,
19
+ } from "@mysten/sui/transactions";
20
+ import { normalizeStructTag } from "@mysten/sui/utils";
21
+ import * as vault from "./contracts/vault/vault.ts";
22
+ import * as compositionRoyaltyPool from "./contracts/composition_royalty_pool/composition_royalty_pool.ts";
23
+ import * as recordingRoyaltyPool from "./contracts/recording_royalty_pool/recording_royalty_pool.ts";
24
+ import * as compositionRoutedStake from "./contracts/composition_routed_stake/composition_routed_stake.ts";
25
+ import * as releaseRevenueDistributor from "./contracts/release_revenue_distributor/release_revenue_distributor.ts";
26
+ import * as routedStake from "./contracts/routed_stake/routed_stake.ts";
27
+
28
+ /** A legacy work whose raw protocol admin cap is still address-owned. */
29
+ /** An object id resolved lazily when a transaction thunk is applied. */
30
+ export type ObjectInput = string | TransactionObjectArgument;
31
+
32
+ function object(tx: Transaction, value: ObjectInput): TransactionObjectArgument {
33
+ return typeof value === "string" ? tx.object(value) : value;
34
+ }
35
+
36
+ export interface DirectAdminCapAuthority {
37
+ readonly kind: "direct";
38
+ readonly adminCap: ObjectInput;
39
+ }
40
+
41
+ /** A work whose protocol admin cap is custodied by a shared Vault. */
42
+ export interface VaultAdminCapAuthority {
43
+ readonly kind: "vault";
44
+ readonly vault: ObjectInput;
45
+ readonly vaultAdminCap: ObjectInput;
46
+ /** Fully-qualified protocol cap type, e.g. `0x…::release::ReleaseAdminCap`. */
47
+ readonly capType: string;
48
+ readonly vaultPackageId: string;
49
+ }
50
+
51
+ /** Explicit compatibility boundary for protocol mutations. */
52
+ export type AdminCapAuthority =
53
+ | DirectAdminCapAuthority
54
+ | VaultAdminCapAuthority;
55
+
56
+ export function directAdminCap(
57
+ adminCap: ObjectInput,
58
+ ): DirectAdminCapAuthority {
59
+ return { kind: "direct", adminCap };
60
+ }
61
+
62
+ function requiredVaultResult<T>(
63
+ result: { readonly [index: number]: T | undefined },
64
+ index: number,
65
+ command: string,
66
+ ): T {
67
+ const value = result[index];
68
+ if (value === undefined) throw new Error(`${command} did not return result ${index}`);
69
+ return value;
70
+ }
71
+
72
+ export function vaultAdminCap(
73
+ authority: Omit<VaultAdminCapAuthority, "kind">,
74
+ ): VaultAdminCapAuthority {
75
+ return { kind: "vault", ...authority };
76
+ }
77
+
78
+ /**
79
+ * Lend an authority's raw protocol cap to `use` for the scope of this PTB.
80
+ *
81
+ * The vault branch deliberately encloses `use` between `borrow_as_admin` and
82
+ * `put_back`; callers cannot accidentally leave a non-drop `Borrow` receipt in
83
+ * the transaction. The direct branch preserves compatibility with pre-vault
84
+ * work without silently treating it as protected custody.
85
+ */
86
+ /**
87
+ * A Move call whose argument list contains exactly one temporarily lent cap.
88
+ * No callback receives that cap, so it cannot escape past `put_back`.
89
+ */
90
+ export interface AdminCapMoveCall {
91
+ readonly target: string;
92
+ readonly typeArguments?: string[];
93
+ readonly arguments: TransactionArgument[];
94
+ readonly adminCapIndex: number;
95
+ }
96
+
97
+ /**
98
+ * Invoke one cap-authorized Move call without exposing a borrowed cap to JS.
99
+ * The returned PTB result belongs to `call.target`, never to the Vault borrow.
100
+ */
101
+ export function invokeWithAdminCap(
102
+ tx: Transaction,
103
+ authority: AdminCapAuthority,
104
+ call: AdminCapMoveCall,
105
+ ): TransactionObjectArgument {
106
+ if (call.adminCapIndex < 0 || call.adminCapIndex > call.arguments.length) {
107
+ throw new Error("admin cap argument index is out of range");
108
+ }
109
+
110
+ const invoke = (adminCap: TransactionArgument) => tx.moveCall({
111
+ target: call.target,
112
+ typeArguments: call.typeArguments,
113
+ arguments: [
114
+ ...call.arguments.slice(0, call.adminCapIndex),
115
+ adminCap,
116
+ ...call.arguments.slice(call.adminCapIndex),
117
+ ],
118
+ });
119
+ if (authority.kind === "direct") return invoke(object(tx, authority.adminCap));
120
+
121
+ const borrowed = tx.add(
122
+ vault.borrowAsAdmin({
123
+ package: authority.vaultPackageId,
124
+ typeArguments: [authority.capType],
125
+ arguments: [object(tx, authority.vault), object(tx, authority.vaultAdminCap)],
126
+ }),
127
+ );
128
+ const adminCap = borrowed[0];
129
+ const receipt = borrowed[1];
130
+ if (adminCap === undefined || receipt === undefined) {
131
+ throw new Error("vault::borrow_as_admin returned an incomplete result");
132
+ }
133
+ const result = invoke(adminCap);
134
+ tx.add(
135
+ vault.putBack({
136
+ package: authority.vaultPackageId,
137
+ typeArguments: [authority.capType],
138
+ arguments: [authority.vault, adminCap, receipt],
139
+ }),
140
+ );
141
+ return result;
142
+ }
143
+
144
+ export interface CustodyNewAdminCapParams {
145
+ /** The freshly-created raw protocol cap, consumed into the Vault. */
146
+ readonly adminCap: TransactionObjectArgument;
147
+ readonly capType: string;
148
+ readonly vaultPackageId: string;
149
+ /** Recipient of the only owner-held authority: VaultAdminCap. */
150
+ readonly owner: string | TransactionArgument;
151
+ /** Optional installation/configuration while the new Vault is still owned. */
152
+ readonly configure?: (
153
+ vaultObject: TransactionArgument,
154
+ vaultAdminCapObject: TransactionArgument,
155
+ ) => void;
156
+ }
157
+
158
+ /** Where a newly-created raw protocol cap ends up after its work is published. */
159
+ export type AdminCapCustody =
160
+ | { readonly kind: "direct"; readonly owner: string | TransactionArgument }
161
+ | {
162
+ readonly kind: "vault";
163
+ readonly owner: string | TransactionArgument;
164
+ readonly capType: string;
165
+ readonly vaultPackageId: string;
166
+ readonly configure?: CustodyNewAdminCapParams["configure"];
167
+ };
168
+
169
+ /** Explicitly transfer a new cap or custody it before the PTB finishes. */
170
+ export function disposeNewAdminCap(
171
+ tx: Transaction,
172
+ adminCap: TransactionObjectArgument,
173
+ custody: AdminCapCustody,
174
+ ): void {
175
+ if (custody.kind === "direct") {
176
+ tx.transferObjects([adminCap], custody.owner);
177
+ return;
178
+ }
179
+ custodyNewAdminCap(tx, {
180
+ adminCap,
181
+ capType: custody.capType,
182
+ vaultPackageId: custody.vaultPackageId,
183
+ owner: custody.owner,
184
+ configure: custody.configure,
185
+ });
186
+ }
187
+
188
+ /** Destroy a vault only while deliberately disposing of its returned raw cap. */
189
+ export function destroyVault(
190
+ tx: Transaction,
191
+ params: {
192
+ readonly vault: ObjectInput;
193
+ readonly vaultAdminCap: ObjectInput;
194
+ readonly capType: string;
195
+ readonly vaultPackageId: string;
196
+ readonly disposition: AdminCapCustody;
197
+ },
198
+ ): void {
199
+ const cap = tx.add(vault.destroy({
200
+ package: params.vaultPackageId,
201
+ typeArguments: [params.capType],
202
+ arguments: [object(tx, params.vault), object(tx, params.vaultAdminCap)],
203
+ }));
204
+ disposeNewAdminCap(tx, cap, params.disposition);
205
+ }
206
+
207
+ /**
208
+ * Custody a freshly-created raw admin cap, optionally install plugins, share the
209
+ * Vault, then transfer only the VaultAdminCap to its owner.
210
+ */
211
+ export function custodyNewAdminCap(
212
+ tx: Transaction,
213
+ params: CustodyNewAdminCapParams,
214
+ ): void {
215
+ const created = tx.add(
216
+ vault._new({
217
+ package: params.vaultPackageId,
218
+ typeArguments: [params.capType],
219
+ arguments: [params.adminCap],
220
+ }),
221
+ );
222
+ const vaultObject = requiredVaultResult(created, 0, "vault::_new");
223
+ const vaultAdminCap = requiredVaultResult(created, 1, "vault::_new");
224
+ params.configure?.(vaultObject, vaultAdminCap);
225
+ tx.add(
226
+ vault.share({
227
+ package: params.vaultPackageId,
228
+ typeArguments: [params.capType],
229
+ arguments: [vaultObject],
230
+ }),
231
+ );
232
+ tx.transferObjects([vaultAdminCap], params.owner);
233
+ }
234
+
235
+ export interface CompositionRoyaltyPoolPluginParams {
236
+ readonly vault: TransactionObjectArgument;
237
+ readonly vaultAdminCap: TransactionObjectArgument;
238
+ readonly compositionShareType: string;
239
+ readonly pluginPackageId: string;
240
+ }
241
+
242
+ /** Install the composition royalty-pool plugin; its witness stays internal. */
243
+ export function installCompositionRoyaltyPoolPlugin(
244
+ tx: Transaction,
245
+ params: CompositionRoyaltyPoolPluginParams,
246
+ ): void {
247
+ tx.add(
248
+ compositionRoyaltyPool.install({
249
+ package: params.pluginPackageId,
250
+ typeArguments: [params.compositionShareType],
251
+ arguments: [params.vault, params.vaultAdminCap],
252
+ }),
253
+ );
254
+ }
255
+
256
+ export function uninstallCompositionRoyaltyPoolPlugin(
257
+ tx: Transaction,
258
+ params: CompositionRoyaltyPoolPluginParams,
259
+ ): void {
260
+ tx.add(compositionRoyaltyPool.uninstall({ package: params.pluginPackageId, typeArguments: [params.compositionShareType], arguments: [params.vault, params.vaultAdminCap] }));
261
+ }
262
+
263
+ export interface InitializeCompositionRoyaltyPoolParams
264
+ extends CompositionRoyaltyPoolPluginParams {
265
+ readonly composition: TransactionObjectArgument;
266
+ readonly currencyType: string;
267
+ }
268
+
269
+ export function initializeCompositionRoyaltyPool(
270
+ tx: Transaction,
271
+ params: InitializeCompositionRoyaltyPoolParams,
272
+ ): void {
273
+ tx.add(
274
+ compositionRoyaltyPool.initializePool({
275
+ package: params.pluginPackageId,
276
+ typeArguments: [params.compositionShareType, params.currencyType],
277
+ arguments: [params.vault, params.composition, params.vaultAdminCap],
278
+ }),
279
+ );
280
+ }
281
+
282
+ export interface CompositionRoyaltyPoolCrankParams {
283
+ readonly vault: TransactionObjectArgument;
284
+ readonly composition: TransactionObjectArgument;
285
+ readonly pool: TransactionObjectArgument;
286
+ readonly compositionShareType: string;
287
+ readonly currencyType: string;
288
+ readonly pluginPackageId: string;
289
+ }
290
+
291
+ /** JSON-safe input for an on-chain u64. Numbers are rejected to prevent rounding. */
292
+ export type U64Input = bigint | string | number;
293
+
294
+ /** Validate an SDK scalar before serializing it as a Move u64. */
295
+ export function asU64(name: string, value: U64Input): bigint {
296
+ if (typeof value === "number" && (!Number.isSafeInteger(value) || value < 0)) {
297
+ throw new Error(`${name}: number must be a non-negative safe integer; use bigint or decimal string`);
298
+ }
299
+ if (typeof value === "string" && !/^(0|[1-9][0-9]*)$/.test(value)) {
300
+ throw new Error(`${name}: expected an unsigned decimal u64`);
301
+ }
302
+ const parsed = typeof value === "bigint" ? value : BigInt(value);
303
+ if (parsed < 0n || parsed > 18_446_744_073_709_551_615n) {
304
+ throw new Error(`${name}: value is outside u64`);
305
+ }
306
+ return parsed;
307
+ }
308
+
309
+ /** Permissionless crank: redeem address funds into the canonical pool. */
310
+ export function redeemCompositionRoyaltyPool(
311
+ tx: Transaction,
312
+ params: CompositionRoyaltyPoolCrankParams & { readonly value: U64Input },
313
+ ): void {
314
+ tx.add(
315
+ compositionRoyaltyPool.redeemAndDeposit({
316
+ package: params.pluginPackageId,
317
+ typeArguments: [params.compositionShareType, params.currencyType],
318
+ arguments: [params.vault, params.composition, params.pool, asU64("value", params.value)],
319
+ }),
320
+ );
321
+ }
322
+
323
+ /** Permissionless crank: receive selected Composition-owned coins into the pool. */
324
+ export function receiveCompositionRoyaltyPool(
325
+ tx: Transaction,
326
+ params: CompositionRoyaltyPoolCrankParams & { readonly coins: readonly ReceivingObjectRef[] },
327
+ ): void {
328
+ tx.add(
329
+ compositionRoyaltyPool.receiveAndDeposit({
330
+ package: params.pluginPackageId,
331
+ typeArguments: [params.compositionShareType, params.currencyType],
332
+ arguments: [
333
+ params.vault,
334
+ params.composition,
335
+ params.pool,
336
+ receivingCoins(tx, params.currencyType, params.coins),
337
+ ],
338
+ }),
339
+ );
340
+ }
341
+
342
+ export interface RecordingRoyaltyPoolPluginParams {
343
+ readonly vault: TransactionObjectArgument;
344
+ readonly vaultAdminCap: TransactionObjectArgument;
345
+ readonly recordingShareType: string;
346
+ readonly compositionShareType: string;
347
+ readonly pluginPackageId: string;
348
+ }
349
+
350
+ export function installRecordingRoyaltyPoolPlugin(
351
+ tx: Transaction,
352
+ params: RecordingRoyaltyPoolPluginParams,
353
+ ): void {
354
+ tx.add(
355
+ recordingRoyaltyPool.install({
356
+ package: params.pluginPackageId,
357
+ typeArguments: [params.recordingShareType],
358
+ arguments: [params.vault, params.vaultAdminCap],
359
+ }),
360
+ );
361
+ }
362
+
363
+ export function uninstallRecordingRoyaltyPoolPlugin(
364
+ tx: Transaction,
365
+ params: RecordingRoyaltyPoolPluginParams,
366
+ ): void {
367
+ tx.add(recordingRoyaltyPool.uninstall({ package: params.pluginPackageId, typeArguments: [params.recordingShareType], arguments: [params.vault, params.vaultAdminCap] }));
368
+ }
369
+
370
+ export interface InitializeRecordingRoyaltyPoolParams
371
+ extends RecordingRoyaltyPoolPluginParams {
372
+ readonly recording: TransactionObjectArgument;
373
+ readonly currencyType: string;
374
+ }
375
+
376
+ export function initializeRecordingRoyaltyPool(
377
+ tx: Transaction,
378
+ params: InitializeRecordingRoyaltyPoolParams,
379
+ ): void {
380
+ tx.add(
381
+ recordingRoyaltyPool.initializePool({
382
+ package: params.pluginPackageId,
383
+ typeArguments: [
384
+ params.recordingShareType,
385
+ params.compositionShareType,
386
+ params.currencyType,
387
+ ],
388
+ arguments: [params.vault, params.recording, params.vaultAdminCap],
389
+ }),
390
+ );
391
+ }
392
+
393
+ export interface RecordingRoyaltyPoolCrankParams {
394
+ readonly vault: TransactionObjectArgument;
395
+ readonly recording: TransactionObjectArgument;
396
+ readonly pool: TransactionObjectArgument;
397
+ readonly recordingShareType: string;
398
+ readonly compositionShareType: string;
399
+ readonly currencyType: string;
400
+ readonly pluginPackageId: string;
401
+ }
402
+
403
+ export function redeemRecordingRoyaltyPool(
404
+ tx: Transaction,
405
+ params: RecordingRoyaltyPoolCrankParams & { readonly value: U64Input },
406
+ ): void {
407
+ tx.add(
408
+ recordingRoyaltyPool.redeemAndDeposit({
409
+ package: params.pluginPackageId,
410
+ typeArguments: [
411
+ params.recordingShareType,
412
+ params.compositionShareType,
413
+ params.currencyType,
414
+ ],
415
+ arguments: [params.vault, params.recording, params.pool, asU64("value", params.value)],
416
+ }),
417
+ );
418
+ }
419
+
420
+ /** Permissionless crank: receive selected Recording-owned coins into the pool. */
421
+ export function receiveRecordingRoyaltyPool(
422
+ tx: Transaction,
423
+ params: RecordingRoyaltyPoolCrankParams & { readonly coins: readonly ReceivingObjectRef[] },
424
+ ): void {
425
+ tx.add(
426
+ recordingRoyaltyPool.receiveAndDeposit({
427
+ package: params.pluginPackageId,
428
+ typeArguments: [
429
+ params.recordingShareType,
430
+ params.compositionShareType,
431
+ params.currencyType,
432
+ ],
433
+ arguments: [
434
+ params.vault,
435
+ params.recording,
436
+ params.pool,
437
+ receivingCoins(tx, params.currencyType, params.coins),
438
+ ],
439
+ }),
440
+ );
441
+ }
442
+
443
+ export interface ReleaseRevenueDistributorPluginParams {
444
+ readonly vault: TransactionObjectArgument;
445
+ readonly vaultAdminCap: TransactionObjectArgument;
446
+ readonly pluginPackageId: string;
447
+ }
448
+
449
+ export function installReleaseRevenueDistributorPlugin(
450
+ tx: Transaction,
451
+ params: ReleaseRevenueDistributorPluginParams,
452
+ ): void {
453
+ tx.add(
454
+ releaseRevenueDistributor.install({
455
+ package: params.pluginPackageId,
456
+ arguments: [params.vault, params.vaultAdminCap],
457
+ }),
458
+ );
459
+ }
460
+
461
+ export function uninstallReleaseRevenueDistributorPlugin(
462
+ tx: Transaction,
463
+ params: ReleaseRevenueDistributorPluginParams,
464
+ ): void {
465
+ tx.add(releaseRevenueDistributor.uninstall({ package: params.pluginPackageId, arguments: [params.vault, params.vaultAdminCap] }));
466
+ }
467
+
468
+ /** Permissionless crank: redeem release-held money and route it by track BPS. */
469
+ export function redeemAndDistributeReleaseRevenue(
470
+ tx: Transaction,
471
+ params: Omit<ReleaseRevenueDistributorPluginParams, "vaultAdminCap"> & {
472
+ readonly release: TransactionObjectArgument;
473
+ readonly currencyType: string;
474
+ readonly value: U64Input;
475
+ },
476
+ ): void {
477
+ tx.add(
478
+ releaseRevenueDistributor.redeemAndDistribute({
479
+ package: params.pluginPackageId,
480
+ typeArguments: [params.currencyType],
481
+ arguments: [params.vault, params.release, asU64("value", params.value)],
482
+ }),
483
+ );
484
+ }
485
+
486
+ /** Permissionless crank: receive release-owned coins and route them by track BPS. */
487
+ export function receiveAndDistributeReleaseRevenue(
488
+ tx: Transaction,
489
+ params: Omit<ReleaseRevenueDistributorPluginParams, "vaultAdminCap"> & {
490
+ readonly release: TransactionObjectArgument;
491
+ readonly currencyType: string;
492
+ readonly coins: readonly ReceivingObjectRef[];
493
+ },
494
+ ): void {
495
+ tx.add(
496
+ releaseRevenueDistributor.receiveAndDistribute({
497
+ package: params.pluginPackageId,
498
+ typeArguments: [params.currencyType],
499
+ arguments: [
500
+ params.vault,
501
+ params.release,
502
+ receivingCoins(tx, params.currencyType, params.coins),
503
+ ],
504
+ }),
505
+ );
506
+ }
507
+
508
+ export interface CompositionRoutedStakePluginParams {
509
+ readonly vault: TransactionObjectArgument;
510
+ readonly vaultAdminCap: TransactionObjectArgument;
511
+ readonly compositionShareType: string;
512
+ readonly pluginPackageId: string;
513
+ }
514
+
515
+ export function installCompositionRoutedStakePlugin(
516
+ tx: Transaction,
517
+ params: CompositionRoutedStakePluginParams,
518
+ ): void {
519
+ tx.add(
520
+ compositionRoutedStake.install({
521
+ package: params.pluginPackageId,
522
+ typeArguments: [params.compositionShareType],
523
+ arguments: [params.vault, params.vaultAdminCap],
524
+ }),
525
+ );
526
+ }
527
+
528
+ export function uninstallCompositionRoutedStakePlugin(
529
+ tx: Transaction,
530
+ params: CompositionRoutedStakePluginParams,
531
+ ): void {
532
+ tx.add(compositionRoutedStake.uninstall({ package: params.pluginPackageId, typeArguments: [params.compositionShareType], arguments: [params.vault, params.vaultAdminCap] }));
533
+ }
534
+
535
+ export interface CreateCompositionRoutedStakeParams
536
+ extends CompositionRoutedStakePluginParams {
537
+ readonly recording: TransactionObjectArgument;
538
+ readonly composition: TransactionObjectArgument;
539
+ readonly recordingShareType: string;
540
+ readonly value: U64Input;
541
+ }
542
+
543
+ export function createCompositionRoutedStake(
544
+ tx: Transaction,
545
+ params: CreateCompositionRoutedStakeParams,
546
+ ): void {
547
+ tx.add(
548
+ compositionRoutedStake.createStake({
549
+ package: params.pluginPackageId,
550
+ typeArguments: [params.recordingShareType, params.compositionShareType],
551
+ arguments: [
552
+ params.vault,
553
+ params.composition,
554
+ params.recording,
555
+ params.vaultAdminCap,
556
+ asU64("value", params.value),
557
+ ],
558
+ }),
559
+ );
560
+ }
561
+
562
+ export interface ManageCompositionRoutedStakeParams
563
+ extends CompositionRoutedStakePluginParams {
564
+ readonly composition: TransactionObjectArgument;
565
+ readonly recording: TransactionObjectArgument;
566
+ readonly routedStake: TransactionObjectArgument;
567
+ readonly royaltyPool: TransactionObjectArgument;
568
+ readonly recordingShareType: string;
569
+ readonly currencyType: string;
570
+ }
571
+
572
+ /** Register the routed stake with the matching Recording royalty pool. */
573
+ export function registerCompositionRoutedStake(
574
+ tx: Transaction,
575
+ params: ManageCompositionRoutedStakeParams,
576
+ ): void {
577
+ tx.add(
578
+ compositionRoutedStake.register({
579
+ package: params.pluginPackageId,
580
+ typeArguments: [
581
+ params.recordingShareType,
582
+ params.compositionShareType,
583
+ params.currencyType,
584
+ ],
585
+ arguments: [
586
+ params.vault,
587
+ params.composition,
588
+ params.recording,
589
+ params.routedStake,
590
+ params.royaltyPool,
591
+ params.vaultAdminCap,
592
+ ],
593
+ }),
594
+ );
595
+ }
596
+
597
+ /** Unregister a routed stake after pending rewards have been swept. */
598
+ export function unregisterCompositionRoutedStake(
599
+ tx: Transaction,
600
+ params: Omit<ManageCompositionRoutedStakeParams, "recording">,
601
+ ): void {
602
+ tx.add(
603
+ compositionRoutedStake.unregister({
604
+ package: params.pluginPackageId,
605
+ typeArguments: [
606
+ params.recordingShareType,
607
+ params.compositionShareType,
608
+ params.currencyType,
609
+ ],
610
+ arguments: [
611
+ params.vault,
612
+ params.composition,
613
+ params.routedStake,
614
+ params.royaltyPool,
615
+ params.vaultAdminCap,
616
+ ],
617
+ }),
618
+ );
619
+ }
620
+
621
+ /** Return routed principal to the Composition address, never to the caller. */
622
+ export function unstakeCompositionRoutedStake(
623
+ tx: Transaction,
624
+ params: Omit<ManageCompositionRoutedStakeParams, "recording" | "royaltyPool" | "currencyType">,
625
+ ): void {
626
+ tx.add(
627
+ compositionRoutedStake.unstake({
628
+ package: params.pluginPackageId,
629
+ typeArguments: [params.recordingShareType, params.compositionShareType],
630
+ arguments: [
631
+ params.vault,
632
+ params.composition,
633
+ params.routedStake,
634
+ params.vaultAdminCap,
635
+ ],
636
+ }),
637
+ );
638
+ }
639
+
640
+ /** Refill an empty routed stake from Recording shares held by the Composition. */
641
+ export function restakeCompositionRoutedStake(
642
+ tx: Transaction,
643
+ params: Omit<ManageCompositionRoutedStakeParams, "recording" | "royaltyPool" | "currencyType"> & {
644
+ readonly value: U64Input;
645
+ },
646
+ ): void {
647
+ tx.add(
648
+ compositionRoutedStake.restake({
649
+ package: params.pluginPackageId,
650
+ typeArguments: [params.recordingShareType, params.compositionShareType],
651
+ arguments: [
652
+ params.vault,
653
+ params.composition,
654
+ params.routedStake,
655
+ params.vaultAdminCap,
656
+ asU64("value", params.value),
657
+ ],
658
+ }),
659
+ );
660
+ }
661
+
662
+ /** Permissionlessly sweep a routed stake's accrued rewards into its parent pool. */
663
+ export function sweepRoutedStake(
664
+ tx: Transaction,
665
+ params: {
666
+ readonly routedStake: ObjectInput;
667
+ /** The pool where the wrapped stake accrues rewards. */
668
+ readonly stakePool: ObjectInput;
669
+ readonly parentId: string;
670
+ readonly royaltyPool: ObjectInput;
671
+ readonly routedStakePackageId: string;
672
+ readonly stakeShareType: string;
673
+ readonly poolShareType: string;
674
+ readonly currencyType: string;
675
+ },
676
+ ): void {
677
+ tx.add(routedStake.sweep({
678
+ package: params.routedStakePackageId,
679
+ typeArguments: [params.stakeShareType, params.poolShareType, params.currencyType],
680
+ arguments: [object(tx, params.routedStake), object(tx, params.stakePool), object(tx, params.royaltyPool), params.parentId],
681
+ }));
682
+ }
683
+
684
+ /** Parse a VaultAdminCap whose phantom capability does not affect BCS layout. */
685
+ export function parseVaultAdminCap(content: Uint8Array) {
686
+ return vault.VaultAdminCap.parse(content);
687
+ }
688
+
689
+ /** Parse lifecycle events whose phantom type parameters do not affect BCS. */
690
+ export function parseVaultCreatedEvent(content: Uint8Array) {
691
+ return vault.VaultCreatedEvent.parse(content);
692
+ }
693
+
694
+ /** Parse the release-distribution summary event into JSON-safe quantities. */
695
+ export function parseReleaseRevenueDistributedEvent(content: Uint8Array) {
696
+ const event = releaseRevenueDistributor.ReleaseRevenueDistributedEvent.parse(
697
+ content,
698
+ );
699
+ return {
700
+ releaseId: event.release_id,
701
+ totalInput: event.total_input.toString(),
702
+ totalDistributed: event.total_distributed.toString(),
703
+ remainder: event.remainder.toString(),
704
+ };
705
+ }
706
+
707
+ /** Parse one per-track routing event, retaining its u64 values as strings. */
708
+ export function parseReleaseTrackRevenueDistributedEvent(content: Uint8Array) {
709
+ const event = releaseRevenueDistributor.ReleaseTrackRevenueDistributedEvent.parse(content);
710
+ return {
711
+ releaseId: event.release_id,
712
+ trackIndex: event.track_index.toString(),
713
+ recordingId: event.recording_id,
714
+ amount: event.amount.toString(),
715
+ };
716
+ }
717
+
718
+ /** Read and BCS-parse an owner-held VaultAdminCap. */
719
+ export async function getVaultAdminCap(
720
+ client: ClientWithCoreApi,
721
+ vaultAdminCapId: string,
722
+ expected: { readonly vaultPackageId: string; readonly capType: string },
723
+ ) {
724
+ const { object } = await client.core.getObject({
725
+ objectId: vaultAdminCapId,
726
+ include: { content: true },
727
+ });
728
+ if (!object || object instanceof Error || !object.content) return null;
729
+ const expectedType = normalizeStructTag(
730
+ `${expected.vaultPackageId}::vault::VaultAdminCap<${expected.capType}>`,
731
+ );
732
+ if (!object.type || normalizeStructTag(object.type) !== expectedType) {
733
+ throw new Error(
734
+ `getVaultAdminCap: expected ${expectedType}, received ${object.type ?? "unknown"}`,
735
+ );
736
+ }
737
+ return parseVaultAdminCap(object.content);
738
+ }
739
+
740
+ /**
741
+ * Build a `vector<Receiving<Coin<Currency>>>` for receive-and-* plugin calls.
742
+ * The caller supplies only object ids; recipient/ownership checks still happen
743
+ * on chain when `hikida::receive_balance` opens each receiving object.
744
+ */
745
+ export interface ReceivingObjectRef {
746
+ readonly objectId: string;
747
+ readonly version: string | number;
748
+ readonly digest: string;
749
+ }
750
+
751
+ /** Resolve owned coins to the exact references required by a Receiving input. */
752
+ export async function resolveReceivingCoins(
753
+ client: ClientWithCoreApi,
754
+ coinIds: readonly string[],
755
+ ): Promise<ReceivingObjectRef[]> {
756
+ const { objects } = await client.core.getObjects({ objectIds: [...coinIds] });
757
+ return objects.map((coin, index) => {
758
+ if (coin instanceof Error || !coin) {
759
+ throw new Error(`resolveReceivingCoins: could not resolve ${coinIds[index]}`);
760
+ }
761
+ return { objectId: coin.objectId, version: coin.version, digest: coin.digest };
762
+ });
763
+ }
764
+
765
+ export function receivingCoins(
766
+ tx: Transaction,
767
+ currencyType: string,
768
+ coins: readonly ReceivingObjectRef[],
769
+ ): TransactionArgument {
770
+ return tx.makeMoveVec({
771
+ type: `0x2::transfer::Receiving<0x2::coin::Coin<${currencyType}>>`,
772
+ elements: coins.map((coin) => tx.receivingRef(coin)),
773
+ });
774
+ }
775
+
776
+ /** Type-only helper for consumers that supply a generated admin-cap BCS type. */
777
+ export type VaultCapBcs<Cap extends BcsType<unknown>> = Cap;