@misofm/platform 0.0.0 → 0.18.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 (168) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +686 -3
  3. package/dist/auth.d.ts +73 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +193 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/catalog.d.ts +48 -0
  8. package/dist/catalog.d.ts.map +1 -0
  9. package/dist/catalog.js +92 -0
  10. package/dist/catalog.js.map +1 -0
  11. package/dist/client.d.ts +462 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +788 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/contracts.d.ts +34 -0
  16. package/dist/contracts.d.ts.map +1 -0
  17. package/dist/contracts.js +49 -0
  18. package/dist/contracts.js.map +1 -0
  19. package/dist/cover.d.ts +69 -0
  20. package/dist/cover.d.ts.map +1 -0
  21. package/dist/cover.js +132 -0
  22. package/dist/cover.js.map +1 -0
  23. package/dist/credits.d.ts +200 -0
  24. package/dist/credits.d.ts.map +1 -0
  25. package/dist/credits.js +465 -0
  26. package/dist/credits.js.map +1 -0
  27. package/dist/deployments.d.ts +224 -0
  28. package/dist/deployments.d.ts.map +1 -0
  29. package/dist/deployments.js +177 -0
  30. package/dist/deployments.js.map +1 -0
  31. package/dist/execute.d.ts +30 -0
  32. package/dist/execute.d.ts.map +1 -0
  33. package/dist/execute.js +31 -0
  34. package/dist/execute.js.map +1 -0
  35. package/dist/index.d.ts +21 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +52 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/internal.d.ts +13 -0
  40. package/dist/internal.d.ts.map +1 -0
  41. package/dist/internal.js +41 -0
  42. package/dist/internal.js.map +1 -0
  43. package/dist/mix.d.ts +144 -0
  44. package/dist/mix.d.ts.map +1 -0
  45. package/dist/mix.js +656 -0
  46. package/dist/mix.js.map +1 -0
  47. package/dist/pressing.d.ts +137 -0
  48. package/dist/pressing.d.ts.map +1 -0
  49. package/dist/pressing.js +390 -0
  50. package/dist/pressing.js.map +1 -0
  51. package/dist/publication.d.ts +216 -0
  52. package/dist/publication.d.ts.map +1 -0
  53. package/dist/publication.js +872 -0
  54. package/dist/publication.js.map +1 -0
  55. package/dist/queries.d.ts +2 -0
  56. package/dist/queries.d.ts.map +1 -0
  57. package/dist/queries.js +8 -0
  58. package/dist/queries.js.map +1 -0
  59. package/dist/read/artist.d.ts +18 -0
  60. package/dist/read/artist.d.ts.map +1 -0
  61. package/dist/read/artist.js +86 -0
  62. package/dist/read/artist.js.map +1 -0
  63. package/dist/read/catalog.d.ts +93 -0
  64. package/dist/read/catalog.d.ts.map +1 -0
  65. package/dist/read/catalog.js +441 -0
  66. package/dist/read/catalog.js.map +1 -0
  67. package/dist/read/client.d.ts +37 -0
  68. package/dist/read/client.d.ts.map +1 -0
  69. package/dist/read/client.js +50 -0
  70. package/dist/read/client.js.map +1 -0
  71. package/dist/read/config.d.ts +68 -0
  72. package/dist/read/config.d.ts.map +1 -0
  73. package/dist/read/config.js +63 -0
  74. package/dist/read/config.js.map +1 -0
  75. package/dist/read/genres.d.ts +7 -0
  76. package/dist/read/genres.d.ts.map +1 -0
  77. package/dist/read/genres.js +38 -0
  78. package/dist/read/genres.js.map +1 -0
  79. package/dist/read/index.d.ts +14 -0
  80. package/dist/read/index.d.ts.map +1 -0
  81. package/dist/read/index.js +23 -0
  82. package/dist/read/index.js.map +1 -0
  83. package/dist/read/internal/scalars.d.ts +23 -0
  84. package/dist/read/internal/scalars.d.ts.map +1 -0
  85. package/dist/read/internal/scalars.js +57 -0
  86. package/dist/read/internal/scalars.js.map +1 -0
  87. package/dist/read/internal/walrus.d.ts +6 -0
  88. package/dist/read/internal/walrus.d.ts.map +1 -0
  89. package/dist/read/internal/walrus.js +29 -0
  90. package/dist/read/internal/walrus.js.map +1 -0
  91. package/dist/read/receipts.d.ts +41 -0
  92. package/dist/read/receipts.d.ts.map +1 -0
  93. package/dist/read/receipts.js +398 -0
  94. package/dist/read/receipts.js.map +1 -0
  95. package/dist/read/types.d.ts +328 -0
  96. package/dist/read/types.d.ts.map +1 -0
  97. package/dist/read/types.js +21 -0
  98. package/dist/read/types.js.map +1 -0
  99. package/dist/read/wallet.d.ts +74 -0
  100. package/dist/read/wallet.d.ts.map +1 -0
  101. package/dist/read/wallet.js +578 -0
  102. package/dist/read/wallet.js.map +1 -0
  103. package/dist/read/works.d.ts +29 -0
  104. package/dist/read/works.d.ts.map +1 -0
  105. package/dist/read/works.js +191 -0
  106. package/dist/read/works.js.map +1 -0
  107. package/dist/recording-extensions.d.ts +62 -0
  108. package/dist/recording-extensions.d.ts.map +1 -0
  109. package/dist/recording-extensions.js +159 -0
  110. package/dist/recording-extensions.js.map +1 -0
  111. package/dist/release-extensions.d.ts +93 -0
  112. package/dist/release-extensions.d.ts.map +1 -0
  113. package/dist/release-extensions.js +190 -0
  114. package/dist/release-extensions.js.map +1 -0
  115. package/dist/release-graph.d.ts +65 -0
  116. package/dist/release-graph.d.ts.map +1 -0
  117. package/dist/release-graph.js +136 -0
  118. package/dist/release-graph.js.map +1 -0
  119. package/dist/share-template.d.ts +3 -0
  120. package/dist/share-template.d.ts.map +1 -0
  121. package/dist/share-template.js +46 -0
  122. package/dist/share-template.js.map +1 -0
  123. package/dist/share.d.ts +67 -0
  124. package/dist/share.d.ts.map +1 -0
  125. package/dist/share.js +157 -0
  126. package/dist/share.js.map +1 -0
  127. package/dist/transactions.d.ts +216 -0
  128. package/dist/transactions.d.ts.map +1 -0
  129. package/dist/transactions.js +314 -0
  130. package/dist/transactions.js.map +1 -0
  131. package/dist/vault.d.ts +364 -0
  132. package/dist/vault.d.ts.map +1 -0
  133. package/dist/vault.js +507 -0
  134. package/dist/vault.js.map +1 -0
  135. package/package.json +145 -5
  136. package/src/auth.ts +275 -0
  137. package/src/catalog.ts +189 -0
  138. package/src/client.ts +1320 -0
  139. package/src/contracts.ts +54 -0
  140. package/src/cover.ts +240 -0
  141. package/src/credits.ts +906 -0
  142. package/src/deployments.ts +357 -0
  143. package/src/execute.ts +52 -0
  144. package/src/index.ts +69 -0
  145. package/src/internal.ts +46 -0
  146. package/src/mix.ts +910 -0
  147. package/src/pressing.ts +705 -0
  148. package/src/publication.ts +1214 -0
  149. package/src/queries.ts +9 -0
  150. package/src/read/artist.ts +118 -0
  151. package/src/read/catalog.ts +668 -0
  152. package/src/read/client.ts +87 -0
  153. package/src/read/config.ts +138 -0
  154. package/src/read/genres.ts +37 -0
  155. package/src/read/index.ts +85 -0
  156. package/src/read/internal/scalars.ts +59 -0
  157. package/src/read/internal/walrus.ts +42 -0
  158. package/src/read/receipts.ts +476 -0
  159. package/src/read/types.ts +415 -0
  160. package/src/read/wallet.ts +687 -0
  161. package/src/read/works.ts +297 -0
  162. package/src/recording-extensions.ts +256 -0
  163. package/src/release-extensions.ts +311 -0
  164. package/src/release-graph.ts +219 -0
  165. package/src/share-template.ts +55 -0
  166. package/src/share.ts +261 -0
  167. package/src/transactions.ts +542 -0
  168. package/src/vault.ts +1009 -0
@@ -0,0 +1,872 @@
1
+ // Copyright (c) Miso Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Opinionated, atomic Miso catalog publication.
5
+ *
6
+ * Share packages and their registered Currency objects must already exist. This
7
+ * builder then creates every declared Party, Composition, Recording, Track,
8
+ * Release, extension, Vault plugin, Pressing, and Listing in one PTB. Share
9
+ * allocation is explicit: callers may preserve raw address balances or create
10
+ * holder Stakes, register them before a fresh pool is shared, and transfer the
11
+ * registered objects. Fresh raw protocol capabilities never leave the
12
+ * transaction: data extensions use them directly, Vault-only plugins are
13
+ * configured while each new Vault is still owned, and only the selected direct
14
+ * cap or VaultAdminCap is delivered.
15
+ */
16
+ import { Transaction } from "@mysten/sui/transactions";
17
+ import { contracts as protocolContracts, deriveCompositionAdminCapId, deriveRecordingAdminCapId, deriveReleaseAdminCapId, } from "@misofm/protocol";
18
+ import { derivePartyAdminCapId } from "@misofm/protocol/party";
19
+ import { requireOperationsDeployment, } from "./deployments.js";
20
+ import { createShareStakes, disperseShares, registerShareStake, requiredCommandResult, shareRoyaltyPool, } from "./transactions.js";
21
+ import { addRecordingPrimaryArtist, addReleaseCredit, attachCompositionCredit, attachRecordingCredit, } from "./credits.js";
22
+ import { setRecordingAdvisory, setRecordingInstrumental, setRecordingLanguages, setRecordingMasterReference, setRecordingPreview, setRecordingStreamingTranscode, } from "./recording-extensions.js";
23
+ import { setReleaseDescription, setReleaseDspLinks, setReleaseGenres, setReleaseKind, } from "./release-extensions.js";
24
+ import { setReleaseCover, setReleaseTrackCover } from "./cover.js";
25
+ import { custodyNewAdminCap, createCompositionRoutedStake, deriveVaultAdminCapId, directAdminCap, disposeNewAdminCap, installCompositionRoyaltyPoolPlugin, installRecordingRoyaltyPoolPlugin, installReleaseRevenueDistributorPlugin, invokeWithAdminCap, newCompositionRoyaltyPool, newRecordingRoyaltyPool, parseVaultCreatedEvent, registerCompositionRoutedStake, shareRoutedStake, } from "./vault.js";
26
+ import { derivePressingAdminCapId, derivePressingId, } from "./pressing.js";
27
+ import { requireRecordSalesDeployment } from "./deployments.js";
28
+ import { allCreatedByType, createdByExactType } from "./execute.js";
29
+ import * as pressingContract from "@misofm/protocol/contracts/miso_record/pressing";
30
+ import * as listingContract from "@misofm/protocol/contracts/miso_record_shop/listing";
31
+ const { composition, recording, release, track, party } = protocolContracts;
32
+ export const MAX_ATOMIC_PUBLICATION_COMMANDS = 900;
33
+ export const MAX_ATOMIC_PUBLICATION_INPUTS = 2048;
34
+ /** Fixed protocol work-share supply: 10 million shares at six decimals. */
35
+ const WORK_SHARE_SUPPLY = 10000000000000n;
36
+ function requiredAt(items, index, description) {
37
+ const value = items[index];
38
+ if (value === undefined)
39
+ throw new Error(`${description} index ${index} is out of range`);
40
+ return value;
41
+ }
42
+ function partyCapType(p) {
43
+ return `${p.deployment.protocol.misoParty}::party::PartyAdminCap`;
44
+ }
45
+ function compositionCapType(p, shareType) {
46
+ return `${p.deployment.protocol.miso}::composition::CompositionAdminCap<${shareType}>`;
47
+ }
48
+ function recordingCapType(p, shareType) {
49
+ return `${p.deployment.protocol.miso}::recording::RecordingAdminCap<${shareType}>`;
50
+ }
51
+ function releaseCapType(p) {
52
+ return `${p.deployment.protocol.miso}::release::ReleaseAdminCap`;
53
+ }
54
+ function pressingCapType(p) {
55
+ return `${requireRecordSalesDeployment(p.deployment.recordSales).recordPackageId}::pressing::PressingAdminCap`;
56
+ }
57
+ function publicationUsesVault(p) {
58
+ return (p.parties.some((node) => "create" in node && node.custody.kind === "vault") ||
59
+ p.compositions.some((node) => node.custody.kind === "vault") ||
60
+ p.recordings.some((node) => node.custody.kind === "vault") ||
61
+ p.release?.custody.kind === "vault" ||
62
+ p.release?.tracks.some((node) => "authority" in node && node.authority.kind === "vault") === true ||
63
+ p.pressing?.custody.kind === "vault");
64
+ }
65
+ function operations(p) {
66
+ return requireOperationsDeployment(p.deployment.operations);
67
+ }
68
+ function custody(p, selected, capType, configure) {
69
+ if (selected.kind === "direct")
70
+ return { kind: "direct", owner: selected.owner };
71
+ const available = operations(p);
72
+ return {
73
+ kind: "vault",
74
+ owner: selected.owner,
75
+ vaultRegistry: available.vault.registryId,
76
+ capType,
77
+ vaultPackageId: available.vault.packageId,
78
+ configure,
79
+ };
80
+ }
81
+ function partyByRef(parties, ref) {
82
+ const value = parties.get(ref);
83
+ if (!value)
84
+ throw new Error(`Unknown publication party ref ${JSON.stringify(ref)}`);
85
+ return value;
86
+ }
87
+ function languageVector(tx, p, codes) {
88
+ const values = codes.map((code) => tx.moveCall({
89
+ target: `${p.deployment.protocol.languageCode}::language_code::new`,
90
+ arguments: [tx.pure.string(code)],
91
+ }));
92
+ return tx.makeMoveVec({
93
+ type: `${p.deployment.protocol.languageCode}::language_code::LanguageCode`,
94
+ elements: values,
95
+ });
96
+ }
97
+ function walrusBlob(tx, p, blobId) {
98
+ return tx.moveCall({
99
+ target: `${p.deployment.packages.ori}::walrus_data::new_blob`,
100
+ arguments: [tx.pure.u256(blobId)],
101
+ });
102
+ }
103
+ function listingPrice(tx, p, price) {
104
+ const pkg = requireRecordSalesDeployment(p.deployment.recordSales).recordShopPackageId;
105
+ const args = { package: pkg, arguments: [BigInt(price.amount)] };
106
+ return tx.add(price.kind === "fixed"
107
+ ? listingContract.fixed(args)
108
+ : listingContract.floor(args));
109
+ }
110
+ function publicationEdition(value) {
111
+ if (!Number.isInteger(value) || value <= 0 || value > 0xffff) {
112
+ throw new RangeError("pressing.edition must be an integer from 1 to 65535");
113
+ }
114
+ return value;
115
+ }
116
+ function publicationMaxSupply(value) {
117
+ if (value == null)
118
+ return null;
119
+ if (!Number.isInteger(value) || value <= 0 || value > 0xffff_ffff) {
120
+ throw new RangeError("pressing.maxSupply must be a positive u32 or null");
121
+ }
122
+ return value;
123
+ }
124
+ function compositionRoyaltyCut(royaltyRateBps) {
125
+ // Atomic publication always allocates a non-zero Recording creator remainder.
126
+ // Lower-level routed-stake builders remain available for Move's 100% case.
127
+ if (!Number.isInteger(royaltyRateBps) || royaltyRateBps <= 0 || royaltyRateBps >= 10_000) {
128
+ throw new RangeError("routed stake requires parent royaltyRateBps from 1 to 9999");
129
+ }
130
+ return (WORK_SHARE_SUPPLY * BigInt(royaltyRateBps)) / 10000n;
131
+ }
132
+ function allocatePublicationShares(tx, p, node, balance) {
133
+ if (node.shareDistribution !== "stake") {
134
+ disperseShares(tx, p.deployment.packages.minato, node.shareType, balance, node.shareRecipients);
135
+ return [];
136
+ }
137
+ return createShareStakes(tx, {
138
+ balance,
139
+ shareType: node.shareType,
140
+ recipients: node.shareRecipients,
141
+ royaltyPoolPackageId: p.deployment.packages.royaltyPool,
142
+ });
143
+ }
144
+ function registerPublicationStakes(tx, p, node, stakes, pool, currencyType) {
145
+ for (const stake of stakes) {
146
+ registerShareStake(tx, {
147
+ stake,
148
+ pool,
149
+ shareType: node.shareType,
150
+ currencyType,
151
+ royaltyPoolPackageId: p.deployment.packages.royaltyPool,
152
+ });
153
+ }
154
+ }
155
+ function transferPublicationStakes(tx, node, stakes) {
156
+ if (node.shareDistribution !== "stake") {
157
+ if (stakes.length !== 0)
158
+ throw new Error("balance distribution unexpectedly created stakes");
159
+ return;
160
+ }
161
+ if (stakes.length !== node.shareRecipients.length) {
162
+ throw new Error("publication stake count does not match share recipient count");
163
+ }
164
+ stakes.forEach((stake, index) => {
165
+ tx.transferObjects([stake], tx.pure.address(node.shareRecipients[index].address));
166
+ });
167
+ }
168
+ function publishComposition(tx, p, node, parts) {
169
+ const available = node.custody.kind === "vault" ? operations(p) : undefined;
170
+ const stakes = allocatePublicationShares(tx, p, node, parts.balance);
171
+ const typeArguments = [node.shareType];
172
+ if (node.custody.kind === "direct") {
173
+ tx.add(composition.publish({
174
+ package: p.deployment.protocol.miso,
175
+ typeArguments,
176
+ arguments: [parts.work, parts.adminCap],
177
+ }));
178
+ disposeNewAdminCap(tx, parts.adminCap, custody(p, node.custody, compositionCapType(p, node.shareType)));
179
+ transferPublicationStakes(tx, node, stakes);
180
+ return;
181
+ }
182
+ custodyNewAdminCap(tx, {
183
+ adminCap: parts.adminCap,
184
+ vaultRegistry: available.vault.registryId,
185
+ capType: compositionCapType(p, node.shareType),
186
+ vaultPackageId: available.vault.packageId,
187
+ owner: node.custody.owner,
188
+ configure: (vault, vaultAdminCap) => {
189
+ if (node.royaltyPool) {
190
+ installCompositionRoyaltyPoolPlugin(tx, {
191
+ vault, vaultAdminCap, compositionShareType: node.shareType,
192
+ pluginPackageId: available.plugins.compositionRoyaltyPool,
193
+ });
194
+ const authority = {
195
+ kind: "vault", vault, vaultAdminCap,
196
+ capType: compositionCapType(p, node.shareType),
197
+ vaultPackageId: available.vault.packageId,
198
+ };
199
+ const poolParams = {
200
+ authority, composition: parts.work,
201
+ compositionShareType: node.shareType,
202
+ currencyType: node.royaltyPool.currencyType,
203
+ actionPackageId: available.actions.compositionRoyaltyPool,
204
+ };
205
+ const pool = newCompositionRoyaltyPool(tx, poolParams);
206
+ if (stakes.length > 0) {
207
+ registerPublicationStakes(tx, p, node, stakes, pool, node.royaltyPool.currencyType);
208
+ }
209
+ shareRoyaltyPool(tx, {
210
+ pool,
211
+ shareType: node.shareType,
212
+ currencyType: node.royaltyPool.currencyType,
213
+ royaltyPoolPackageId: p.deployment.packages.royaltyPool,
214
+ });
215
+ }
216
+ invokeWithAdminCap(tx, {
217
+ kind: "vault", vault, vaultAdminCap,
218
+ capType: compositionCapType(p, node.shareType),
219
+ vaultPackageId: available.vault.packageId,
220
+ }, {
221
+ target: `${p.deployment.protocol.miso}::composition::publish`,
222
+ typeArguments,
223
+ arguments: [parts.work, tx.object.clock()],
224
+ adminCapIndex: 1,
225
+ });
226
+ },
227
+ });
228
+ transferPublicationStakes(tx, node, stakes);
229
+ }
230
+ function publishRecording(tx, p, node, parts, parentComposition) {
231
+ const available = node.custody.kind === "vault" ? operations(p) : undefined;
232
+ const typeArguments = [node.shareType, node.compositionShareType];
233
+ const stakes = allocatePublicationShares(tx, p, node, parts.balance);
234
+ if (node.custody.kind === "direct") {
235
+ tx.add(recording.publish({
236
+ package: p.deployment.protocol.miso,
237
+ typeArguments,
238
+ arguments: [parts.work, parts.adminCap],
239
+ }));
240
+ disposeNewAdminCap(tx, parts.adminCap, custody(p, node.custody, recordingCapType(p, node.shareType)));
241
+ transferPublicationStakes(tx, node, stakes);
242
+ return;
243
+ }
244
+ custodyNewAdminCap(tx, {
245
+ adminCap: parts.adminCap,
246
+ vaultRegistry: available.vault.registryId,
247
+ capType: recordingCapType(p, node.shareType),
248
+ vaultPackageId: available.vault.packageId,
249
+ owner: node.custody.owner,
250
+ configure: (vault, vaultAdminCap) => {
251
+ if (node.royaltyPool) {
252
+ installRecordingRoyaltyPoolPlugin(tx, {
253
+ vault, vaultAdminCap,
254
+ recordingShareType: node.shareType,
255
+ compositionShareType: node.compositionShareType,
256
+ pluginPackageId: available.plugins.recordingRoyaltyPool,
257
+ });
258
+ const authority = {
259
+ kind: "vault", vault, vaultAdminCap,
260
+ capType: recordingCapType(p, node.shareType),
261
+ vaultPackageId: available.vault.packageId,
262
+ };
263
+ const poolParams = {
264
+ authority, recording: parts.work,
265
+ recordingShareType: node.shareType,
266
+ compositionShareType: node.compositionShareType,
267
+ currencyType: node.royaltyPool.currencyType,
268
+ actionPackageId: available.actions.recordingRoyaltyPool,
269
+ };
270
+ const pool = newRecordingRoyaltyPool(tx, poolParams);
271
+ if (stakes.length > 0) {
272
+ registerPublicationStakes(tx, p, node, stakes, pool, node.royaltyPool.currencyType);
273
+ }
274
+ if (node.routedStake) {
275
+ if (!parentComposition)
276
+ throw new Error(`${node.ref}: routed stake requires a fresh parent Composition`);
277
+ const authority = directAdminCap(parentComposition.parts.adminCap);
278
+ const routed = createCompositionRoutedStake(tx, {
279
+ authority,
280
+ composition: parentComposition.parts.work,
281
+ recording: parts.work,
282
+ recordingShareType: node.shareType,
283
+ compositionShareType: node.compositionShareType,
284
+ value: compositionRoyaltyCut(parentComposition.node.royaltyRateBps),
285
+ actionPackageId: available.actions.compositionRoutedStake,
286
+ });
287
+ registerCompositionRoutedStake(tx, {
288
+ authority,
289
+ composition: parentComposition.parts.work,
290
+ recording: parts.work,
291
+ routedStake: routed,
292
+ royaltyPool: pool,
293
+ recordingShareType: node.shareType,
294
+ compositionShareType: node.compositionShareType,
295
+ currencyType: node.royaltyPool.currencyType,
296
+ actionPackageId: available.actions.compositionRoutedStake,
297
+ });
298
+ shareRoutedStake(tx, {
299
+ routedStake: routed,
300
+ routedStakePackageId: p.deployment.packages.routedStake,
301
+ stakeShareType: node.shareType,
302
+ poolShareType: node.compositionShareType,
303
+ });
304
+ }
305
+ shareRoyaltyPool(tx, {
306
+ pool,
307
+ shareType: node.shareType,
308
+ currencyType: node.royaltyPool.currencyType,
309
+ royaltyPoolPackageId: p.deployment.packages.royaltyPool,
310
+ });
311
+ }
312
+ invokeWithAdminCap(tx, {
313
+ kind: "vault", vault, vaultAdminCap,
314
+ capType: recordingCapType(p, node.shareType),
315
+ vaultPackageId: available.vault.packageId,
316
+ }, {
317
+ target: `${p.deployment.protocol.miso}::recording::publish`,
318
+ typeArguments,
319
+ arguments: [parts.work, tx.object.clock()],
320
+ adminCapIndex: 1,
321
+ });
322
+ },
323
+ });
324
+ transferPublicationStakes(tx, node, stakes);
325
+ }
326
+ function publishReleaseObject(tx, p, node, releaseObject, adminCap) {
327
+ const available = node.custody.kind === "vault" ? operations(p) : undefined;
328
+ if (node.custody.kind === "direct") {
329
+ tx.add(release.publish({
330
+ package: p.deployment.protocol.miso,
331
+ arguments: [releaseObject, adminCap],
332
+ }));
333
+ disposeNewAdminCap(tx, adminCap, custody(p, node.custody, releaseCapType(p)));
334
+ return;
335
+ }
336
+ custodyNewAdminCap(tx, {
337
+ adminCap,
338
+ vaultRegistry: available.vault.registryId,
339
+ capType: releaseCapType(p),
340
+ vaultPackageId: available.vault.packageId,
341
+ owner: node.custody.owner,
342
+ configure: (vault, vaultAdminCap) => {
343
+ if (node.revenueDistribution) {
344
+ installReleaseRevenueDistributorPlugin(tx, {
345
+ vault, vaultAdminCap,
346
+ pluginPackageId: available.plugins.releaseRevenueDistributor,
347
+ });
348
+ }
349
+ invokeWithAdminCap(tx, {
350
+ kind: "vault", vault, vaultAdminCap,
351
+ capType: releaseCapType(p),
352
+ vaultPackageId: available.vault.packageId,
353
+ }, {
354
+ target: `${p.deployment.protocol.miso}::release::publish`,
355
+ arguments: [releaseObject, tx.object.clock()],
356
+ adminCapIndex: 1,
357
+ });
358
+ },
359
+ });
360
+ }
361
+ /** Build the complete post-share catalog graph as one atomic PTB. */
362
+ export function publishAtomicCatalog(p) {
363
+ if (p.recordings.some((node) => node.streamingTranscodeQuiltId !== undefined) &&
364
+ !p.deployment.packages.recordingStreamingTranscode) {
365
+ throw new Error("A recording streaming transcode requires deployment.packages.recordingStreamingTranscode");
366
+ }
367
+ if (publicationUsesVault(p)) {
368
+ requireOperationsDeployment(p.deployment.operations);
369
+ }
370
+ if (p.pressing) {
371
+ requireRecordSalesDeployment(p.deployment.recordSales);
372
+ if (!p.release)
373
+ throw new Error("A pressing requires a release");
374
+ }
375
+ for (const node of [...p.compositions, ...p.recordings]) {
376
+ if (node.royaltyPool && node.custody.kind !== "vault") {
377
+ throw new Error(`${node.ref}: permissionless royalty cranks require Vault custody`);
378
+ }
379
+ }
380
+ p.recordings.forEach((node) => {
381
+ if (!node.routedStake)
382
+ return;
383
+ if (node.parentCompositionIndex === undefined) {
384
+ throw new Error(`${node.ref}: routed stake requires a fresh parent Composition`);
385
+ }
386
+ if (!node.royaltyPool) {
387
+ throw new Error(`${node.ref}: routed stake requires a Recording royalty pool`);
388
+ }
389
+ if (node.shareDistribution !== "stake") {
390
+ throw new Error(`${node.ref}: routed stake requires Recording stake distribution`);
391
+ }
392
+ const parent = requiredAt(p.compositions, node.parentCompositionIndex, "parent composition");
393
+ if (!parent.royaltyPool) {
394
+ throw new Error(`${node.ref}: routed stake requires a parent Composition royalty pool`);
395
+ }
396
+ if (parent.shareDistribution !== "stake") {
397
+ throw new Error(`${node.ref}: routed stake requires parent Composition stake distribution`);
398
+ }
399
+ compositionRoyaltyCut(parent.royaltyRateBps);
400
+ if (parent.royaltyPool.currencyType !== node.royaltyPool.currencyType) {
401
+ throw new Error(`${node.ref}: routed stake pools must use the same currency type`);
402
+ }
403
+ if (parent.custody.kind !== "vault") {
404
+ throw new Error(`${node.ref}: routed stake requires parent Composition Vault custody`);
405
+ }
406
+ });
407
+ if (p.release?.revenueDistribution && p.release.custody.kind !== "vault") {
408
+ throw new Error("Release revenue distribution requires Vault custody");
409
+ }
410
+ return (tx) => {
411
+ const createdParties = new Map();
412
+ const parties = new Map();
413
+ for (const node of p.parties) {
414
+ if ("id" in node) {
415
+ parties.set(node.ref, tx.object(node.id));
416
+ continue;
417
+ }
418
+ const kind = tx.add(node.create === "group"
419
+ ? party.newGroupKind({ package: p.deployment.protocol.misoParty })
420
+ : party.newIndividualKind({ package: p.deployment.protocol.misoParty }));
421
+ const created = tx.add(party._new({
422
+ package: p.deployment.protocol.misoParty,
423
+ arguments: [kind, node.name],
424
+ }));
425
+ const parts = {
426
+ party: requiredCommandResult(created, 0, "party::new"),
427
+ adminCap: requiredCommandResult(created, 1, "party::new"),
428
+ };
429
+ createdParties.set(node.ref, parts);
430
+ parties.set(node.ref, parts.party);
431
+ }
432
+ const compositions = p.compositions.map((node) => {
433
+ const created = tx.add(composition._new({
434
+ package: p.deployment.protocol.miso,
435
+ typeArguments: [node.shareType],
436
+ arguments: [node.title, node.royaltyRateBps, node.shareCurrencyId, node.shareTreasuryCapId],
437
+ }));
438
+ return {
439
+ work: requiredCommandResult(created, 0, "composition::new"),
440
+ adminCap: requiredCommandResult(created, 1, "composition::new"),
441
+ balance: requiredCommandResult(created, 2, "composition::new"),
442
+ };
443
+ });
444
+ const recordings = p.recordings.map((node) => {
445
+ const parent = node.parentCompositionIndex !== undefined
446
+ ? requiredAt(compositions, node.parentCompositionIndex, "parent composition").work
447
+ : tx.object(node.parentCompositionId);
448
+ const created = tx.add(recording._new({
449
+ package: p.deployment.protocol.miso,
450
+ typeArguments: [node.shareType, node.compositionShareType],
451
+ arguments: [parent, node.shareCurrencyId, node.shareTreasuryCapId],
452
+ }));
453
+ return {
454
+ work: requiredCommandResult(created, 0, "recording::new"),
455
+ adminCap: requiredCommandResult(created, 1, "recording::new"),
456
+ balance: requiredCommandResult(created, 2, "recording::new"),
457
+ };
458
+ });
459
+ let releaseObject;
460
+ let releaseAdminCap;
461
+ if (p.release) {
462
+ const ids = p.release.tracks.map((node) => "recordingIndex" in node
463
+ ? tx.moveCall({
464
+ target: "0x2::object::id",
465
+ typeArguments: [`${p.deployment.protocol.miso}::recording::Recording<${p.recordings[node.recordingIndex].shareType},${p.recordings[node.recordingIndex].compositionShareType}>`],
466
+ arguments: [requiredAt(recordings, node.recordingIndex, "fresh recording").work],
467
+ })
468
+ : tx.pure.id(node.recordingId));
469
+ const targetReleaseId = tx.moveCall({
470
+ target: `${p.deployment.protocol.miso}::release::derive_target_release_id`,
471
+ arguments: [
472
+ tx.object(p.deployment.objects.releaseRegistry),
473
+ tx.makeMoveVec({ type: "0x2::object::ID", elements: ids }),
474
+ tx.makeMoveVec({ type: "u64", elements: p.release.tracks.map((node) => tx.pure.u64(node.splitBps)) }),
475
+ tx.pure.u256(BigInt(p.release.nonce)),
476
+ ],
477
+ });
478
+ const tracks = p.release.tracks.map((node) => {
479
+ if ("recordingIndex" in node) {
480
+ const recNode = requiredAt(p.recordings, node.recordingIndex, "fresh recording");
481
+ const rec = requiredAt(recordings, node.recordingIndex, "fresh recording");
482
+ return tx.add(track._new({
483
+ package: p.deployment.protocol.miso,
484
+ typeArguments: [recNode.shareType, recNode.compositionShareType],
485
+ arguments: [rec.adminCap, rec.work, targetReleaseId, node.splitBps],
486
+ }));
487
+ }
488
+ return invokeWithAdminCap(tx, node.authority, {
489
+ target: `${p.deployment.protocol.miso}::track::new`,
490
+ typeArguments: [node.recordingShareType, node.compositionShareType],
491
+ arguments: [tx.object(node.recordingId), targetReleaseId, tx.pure.u16(node.splitBps)],
492
+ adminCapIndex: 0,
493
+ });
494
+ });
495
+ const created = tx.moveCall({
496
+ target: `${p.deployment.protocol.miso}::release::new`,
497
+ arguments: [
498
+ tx.object(p.deployment.objects.releaseRegistry),
499
+ tx.pure.string(p.release.title),
500
+ tx.makeMoveVec({ type: `${p.deployment.protocol.miso}::track::Track`, elements: tracks }),
501
+ tx.pure.u256(BigInt(p.release.nonce)),
502
+ ],
503
+ });
504
+ releaseObject = requiredCommandResult(created, 0, "release::new");
505
+ releaseAdminCap = requiredCommandResult(created, 1, "release::new");
506
+ }
507
+ p.compositions.forEach((node, index) => {
508
+ const parts = requiredAt(compositions, index, "composition");
509
+ for (const credit of node.credits ?? []) {
510
+ attachCompositionCredit({
511
+ compositionId: parts.work,
512
+ authority: directAdminCap(parts.adminCap),
513
+ partyId: partyByRef(parties, credit.party),
514
+ displayName: credit.displayName,
515
+ roles: credit.roles,
516
+ compositionShareType: node.shareType,
517
+ compositionCreditsPackageId: p.deployment.packages.compositionCredits,
518
+ misoCreditPackageId: p.deployment.packages.credit,
519
+ })(tx);
520
+ }
521
+ });
522
+ p.recordings.forEach((node, index) => {
523
+ const parts = requiredAt(recordings, index, "recording");
524
+ const authority = directAdminCap(parts.adminCap);
525
+ for (const credit of node.credits ?? []) {
526
+ const target = partyByRef(parties, credit.party);
527
+ attachRecordingCredit({
528
+ recordingId: parts.work, authority, partyId: target,
529
+ displayName: credit.displayName, roles: credit.roles,
530
+ recordingShareType: node.shareType,
531
+ compositionShareType: node.compositionShareType,
532
+ recordingCreditsPackageId: p.deployment.packages.recordingCredits,
533
+ misoCreditPackageId: p.deployment.packages.credit,
534
+ })(tx);
535
+ if (credit.primaryArtist) {
536
+ addRecordingPrimaryArtist({
537
+ recordingId: parts.work, authority, partyId: target,
538
+ recordingShareType: node.shareType,
539
+ compositionShareType: node.compositionShareType,
540
+ recordingCreditsPackageId: p.deployment.packages.recordingCredits,
541
+ })(tx);
542
+ }
543
+ }
544
+ if (node.advisory)
545
+ setRecordingAdvisory({
546
+ recordingId: parts.work, authority,
547
+ recordingShareType: node.shareType,
548
+ compositionShareType: node.compositionShareType,
549
+ recordingAdvisoryPackageId: p.deployment.packages.recordingAdvisory,
550
+ rating: node.advisory,
551
+ })(tx);
552
+ if (node.languages?.kind === "instrumental")
553
+ setRecordingInstrumental({
554
+ recordingId: parts.work, authority,
555
+ recordingShareType: node.shareType,
556
+ compositionShareType: node.compositionShareType,
557
+ recordingLanguagePackageId: p.deployment.packages.recordingLanguage,
558
+ })(tx);
559
+ if (node.languages?.kind === "languages")
560
+ setRecordingLanguages({
561
+ recordingId: parts.work, authority,
562
+ recordingShareType: node.shareType,
563
+ compositionShareType: node.compositionShareType,
564
+ recordingLanguagePackageId: p.deployment.packages.recordingLanguage,
565
+ languages: languageVector(tx, p, node.languages.codes),
566
+ })(tx);
567
+ if (node.masterReferenceBlobId !== undefined)
568
+ setRecordingMasterReference({
569
+ recordingId: parts.work, authority,
570
+ recordingShareType: node.shareType,
571
+ compositionShareType: node.compositionShareType,
572
+ recordingMasterReferencePackageId: p.deployment.packages.recordingMasterReference,
573
+ reference: walrusBlob(tx, p, node.masterReferenceBlobId),
574
+ })(tx);
575
+ if (node.streamingTranscodeQuiltId !== undefined)
576
+ setRecordingStreamingTranscode({
577
+ recordingId: parts.work, authority,
578
+ recordingShareType: node.shareType,
579
+ compositionShareType: node.compositionShareType,
580
+ recordingStreamingTranscodePackageId: p.deployment.packages.recordingStreamingTranscode,
581
+ oriPackageId: p.deployment.packages.ori,
582
+ quiltId: node.streamingTranscodeQuiltId,
583
+ })(tx);
584
+ if (node.previewBlobId !== undefined)
585
+ setRecordingPreview({
586
+ recordingId: parts.work, authority,
587
+ recordingShareType: node.shareType,
588
+ compositionShareType: node.compositionShareType,
589
+ recordingPreviewPackageId: p.deployment.packages.recordingPreview,
590
+ reference: walrusBlob(tx, p, node.previewBlobId),
591
+ })(tx);
592
+ });
593
+ if (p.release && releaseObject && releaseAdminCap) {
594
+ const authority = directAdminCap(releaseAdminCap);
595
+ for (const credit of p.release.credits ?? [])
596
+ addReleaseCredit({
597
+ releaseId: releaseObject, authority,
598
+ partyId: partyByRef(parties, credit.party),
599
+ displayName: credit.displayName, role: credit.role,
600
+ releaseCreditsPackageId: p.deployment.packages.releaseCredits,
601
+ misoCreditPackageId: p.deployment.packages.credit,
602
+ })(tx);
603
+ if (p.release.kind)
604
+ setReleaseKind({
605
+ releaseId: releaseObject, authority, kind: p.release.kind,
606
+ releaseKindPackageId: p.deployment.packages.releaseKind,
607
+ })(tx);
608
+ if (p.release.description)
609
+ setReleaseDescription({
610
+ releaseId: releaseObject, authority, description: p.release.description,
611
+ releaseDescriptionPackageId: p.deployment.packages.releaseDescription,
612
+ })(tx);
613
+ if (p.release.genres)
614
+ setReleaseGenres({
615
+ releaseId: releaseObject, authority,
616
+ primaryGenreId: p.release.genres.primaryGenreId,
617
+ secondaryGenreIds: p.release.genres.secondaryGenreIds ?? [],
618
+ trackPrimaryGenres: p.release.genres.tracks ?? [],
619
+ releaseGenrePackageId: p.deployment.packages.releaseGenre,
620
+ })(tx);
621
+ if (p.release.dspLinks)
622
+ setReleaseDspLinks({
623
+ releaseId: releaseObject, authority,
624
+ releaseLinks: p.release.dspLinks.release ?? [],
625
+ trackLinks: p.release.dspLinks.tracks ?? [],
626
+ releaseDspLinkPackageId: p.deployment.packages.releaseDspLink,
627
+ })(tx);
628
+ if (p.release.cover?.stillBlobId !== undefined)
629
+ setReleaseCover({
630
+ releaseId: releaseObject, authority,
631
+ stillBlobId: p.release.cover.stillBlobId,
632
+ animatedBlobId: p.release.cover.animatedBlobId,
633
+ coverArtPackageId: p.deployment.packages.coverArt,
634
+ releaseCoverArtPackageId: p.deployment.packages.releaseCoverArt,
635
+ oriPackageId: p.deployment.packages.ori,
636
+ })(tx);
637
+ for (const cover of p.release.cover?.tracks ?? [])
638
+ setReleaseTrackCover({
639
+ releaseId: releaseObject, authority,
640
+ trackIndex: cover.trackIndex,
641
+ stillBlobId: cover.stillBlobId,
642
+ animatedBlobId: cover.animatedBlobId,
643
+ coverArtPackageId: p.deployment.packages.coverArt,
644
+ releaseCoverArtPackageId: p.deployment.packages.releaseCoverArt,
645
+ oriPackageId: p.deployment.packages.ori,
646
+ })(tx);
647
+ }
648
+ let pressingParts;
649
+ if (p.pressing && releaseObject && releaseAdminCap) {
650
+ const sales = requireRecordSalesDeployment(p.deployment.recordSales);
651
+ const created = tx.add(pressingContract._new({
652
+ package: sales.recordPackageId,
653
+ arguments: [
654
+ releaseObject,
655
+ releaseAdminCap,
656
+ publicationEdition(p.pressing.edition),
657
+ publicationMaxSupply(p.pressing.maxSupply),
658
+ ],
659
+ }));
660
+ pressingParts = {
661
+ pressing: requiredCommandResult(created, 0, "pressing::new"),
662
+ adminCap: requiredCommandResult(created, 1, "pressing::new"),
663
+ };
664
+ tx.add(pressingContract.authorizeDistributor({
665
+ package: sales.recordPackageId,
666
+ typeArguments: [`${sales.recordShopPackageId}::witness::Witness`],
667
+ arguments: [pressingParts.pressing, pressingParts.adminCap],
668
+ }));
669
+ for (const listing of p.pressing.listings) {
670
+ const createdListing = tx.add(listingContract._new({
671
+ package: sales.recordShopPackageId,
672
+ typeArguments: [listing.currencyType],
673
+ arguments: [
674
+ pressingParts.pressing,
675
+ pressingParts.adminCap,
676
+ listingPrice(tx, p, listing.price),
677
+ ],
678
+ }));
679
+ if (listing.enabled === false) {
680
+ tx.add(listingContract.setState({
681
+ package: sales.recordShopPackageId,
682
+ typeArguments: [listing.currencyType],
683
+ arguments: [
684
+ createdListing,
685
+ pressingParts.adminCap,
686
+ tx.add(listingContract.disabled({ package: sales.recordShopPackageId })),
687
+ ],
688
+ }));
689
+ }
690
+ tx.add(listingContract.share({
691
+ package: sales.recordShopPackageId,
692
+ typeArguments: [listing.currencyType],
693
+ arguments: [createdListing],
694
+ }));
695
+ }
696
+ }
697
+ p.recordings.forEach((node, index) => publishRecording(tx, p, node, requiredAt(recordings, index, "recording"), node.parentCompositionIndex === undefined
698
+ ? undefined
699
+ : {
700
+ node: requiredAt(p.compositions, node.parentCompositionIndex, "parent composition"),
701
+ parts: requiredAt(compositions, node.parentCompositionIndex, "parent composition"),
702
+ }));
703
+ p.compositions.forEach((node, index) => publishComposition(tx, p, node, requiredAt(compositions, index, "composition")));
704
+ if (p.release && releaseObject && releaseAdminCap) {
705
+ publishReleaseObject(tx, p, p.release, releaseObject, releaseAdminCap);
706
+ }
707
+ for (const node of p.parties) {
708
+ if ("id" in node)
709
+ continue;
710
+ const parts = createdParties.get(node.ref);
711
+ tx.add(party.share({
712
+ package: p.deployment.protocol.misoParty,
713
+ arguments: [parts.party, parts.adminCap],
714
+ }));
715
+ disposeNewAdminCap(tx, parts.adminCap, custody(p, node.custody, partyCapType(p)));
716
+ }
717
+ if (p.pressing && pressingParts) {
718
+ const sales = requireRecordSalesDeployment(p.deployment.recordSales);
719
+ tx.add(pressingContract.share({
720
+ package: sales.recordPackageId,
721
+ arguments: [pressingParts.pressing],
722
+ }));
723
+ disposeNewAdminCap(tx, pressingParts.adminCap, custody(p, p.pressing.custody, pressingCapType(p)));
724
+ }
725
+ };
726
+ }
727
+ /** Assemble without RPC access so callers can fail before publishing share packages. */
728
+ export function inspectAtomicPublication(p) {
729
+ const tx = new Transaction();
730
+ publishAtomicCatalog(p)(tx);
731
+ const data = tx.getData();
732
+ return { commands: data.commands.length, inputs: data.inputs.length };
733
+ }
734
+ export function assertAtomicPublicationBounds(p) {
735
+ const inspection = inspectAtomicPublication(p);
736
+ if (inspection.commands > MAX_ATOMIC_PUBLICATION_COMMANDS) {
737
+ throw new Error(`Atomic publication requires ${inspection.commands} commands; the SDK safety cap is ` +
738
+ `${MAX_ATOMIC_PUBLICATION_COMMANDS} (Sui permits at most 1024).`);
739
+ }
740
+ if (inspection.inputs > MAX_ATOMIC_PUBLICATION_INPUTS) {
741
+ throw new Error(`Atomic publication requires ${inspection.inputs} inputs; Sui permits at most ` +
742
+ `${MAX_ATOMIC_PUBLICATION_INPUTS}.`);
743
+ }
744
+ return inspection;
745
+ }
746
+ function compactType(type) {
747
+ return type.replace(/\s+/g, "");
748
+ }
749
+ function findByShareType(created, shareType, description) {
750
+ const wanted = compactType(shareType);
751
+ const matches = created.filter((item) => compactType(item.objectType).includes(wanted));
752
+ if (matches.length !== 1)
753
+ throw new Error(`Expected one ${description} for ${shareType}; found ${matches.length}`);
754
+ return matches[0].objectId;
755
+ }
756
+ function vaultsByCap(result, vaultPackageId) {
757
+ const out = new Map();
758
+ for (const event of result.events) {
759
+ if (!event.eventType.includes("::vault::VaultCreatedEvent<"))
760
+ continue;
761
+ const parsed = parseVaultCreatedEvent(event.bcs);
762
+ out.set(parsed.cap_id, {
763
+ vaultId: parsed.vault_id,
764
+ vaultAdminCapId: deriveVaultAdminCapId(parsed.vault_id, vaultPackageId),
765
+ });
766
+ }
767
+ return out;
768
+ }
769
+ function authorityOut(result, vaults, selected, adminCapId, capType, vaultPackageId) {
770
+ if (selected.kind === "direct")
771
+ return { kind: "direct", adminCapId };
772
+ const found = vaults.get(adminCapId);
773
+ if (!found)
774
+ throw new Error(`No VaultCreatedEvent for admin cap ${adminCapId} in ${result.digest}`);
775
+ return { kind: "vault", ...found, capType, vaultPackageId };
776
+ }
777
+ /** Parse one atomic publication using type identity plus lifecycle event payloads. */
778
+ export function parseAtomicPublicationResult(p, result) {
779
+ const available = publicationUsesVault(p) ? operations(p) : undefined;
780
+ const vaultPackageId = available?.vault.packageId ?? "";
781
+ const vaults = available
782
+ ? vaultsByCap(result, vaultPackageId)
783
+ : new Map();
784
+ const createdCompositions = allCreatedByType(result, "::composition::Composition<");
785
+ const createdRecordings = allCreatedByType(result, "::recording::Recording<");
786
+ const createdPools = allCreatedByType(result, "::pool::RoyaltyPool<");
787
+ const createdPartyNodes = p.parties.filter((node) => "create" in node);
788
+ const partyEvents = result.events.filter((event) => event.eventType.endsWith("::party::PartyCreatedEvent"));
789
+ if (partyEvents.length !== createdPartyNodes.length) {
790
+ throw new Error(`Expected ${createdPartyNodes.length} PartyCreatedEvent values; found ${partyEvents.length}`);
791
+ }
792
+ const parties = {};
793
+ for (const node of p.parties) {
794
+ if ("id" in node) {
795
+ parties[node.ref] = {
796
+ id: node.id,
797
+ adminCapId: derivePartyAdminCapId(node.id, p.deployment.protocol.misoParty),
798
+ created: false,
799
+ };
800
+ }
801
+ }
802
+ createdPartyNodes.forEach((node, index) => {
803
+ const event = partyEvents[index];
804
+ const parsed = protocolContracts.party.PartyCreatedEvent.parse(event.bcs);
805
+ const adminCapId = derivePartyAdminCapId(parsed.party_id, p.deployment.protocol.misoParty);
806
+ parties[node.ref] = {
807
+ id: parsed.party_id,
808
+ adminCapId,
809
+ created: true,
810
+ authority: authorityOut(result, vaults, node.custody, adminCapId, partyCapType(p), vaultPackageId),
811
+ };
812
+ });
813
+ const compositions = {};
814
+ p.compositions.forEach((node) => {
815
+ const id = findByShareType(createdCompositions, node.shareType, "Composition");
816
+ const adminCapId = deriveCompositionAdminCapId(id, p.deployment.protocol.miso);
817
+ compositions[node.ref] = {
818
+ id,
819
+ adminCapId,
820
+ shareType: node.shareType,
821
+ authority: authorityOut(result, vaults, node.custody, adminCapId, compositionCapType(p, node.shareType), vaultPackageId),
822
+ royaltyPoolId: node.royaltyPool ? findByShareType(createdPools, node.shareType, "Composition RoyaltyPool") : undefined,
823
+ };
824
+ });
825
+ const recordings = {};
826
+ p.recordings.forEach((node) => {
827
+ const id = findByShareType(createdRecordings, node.shareType, "Recording");
828
+ const adminCapId = deriveRecordingAdminCapId(id, p.deployment.protocol.miso);
829
+ recordings[node.ref] = {
830
+ id,
831
+ adminCapId,
832
+ shareType: node.shareType,
833
+ compositionShareType: node.compositionShareType,
834
+ authority: authorityOut(result, vaults, node.custody, adminCapId, recordingCapType(p, node.shareType), vaultPackageId),
835
+ royaltyPoolId: node.royaltyPool ? findByShareType(createdPools, node.shareType, "Recording RoyaltyPool") : undefined,
836
+ routedStakeId: node.routedStake
837
+ ? createdByExactType(result, `${p.deployment.packages.routedStake}::routed_stake::RoutedStake<${node.shareType},${node.compositionShareType}>`)
838
+ : undefined,
839
+ };
840
+ });
841
+ let releaseOut;
842
+ if (p.release) {
843
+ const id = createdByExactType(result, `${p.deployment.protocol.miso}::release::Release`);
844
+ const adminCapId = deriveReleaseAdminCapId(id, p.deployment.protocol.miso);
845
+ releaseOut = {
846
+ id,
847
+ adminCapId,
848
+ authority: authorityOut(result, vaults, p.release.custody, adminCapId, releaseCapType(p), vaultPackageId),
849
+ };
850
+ }
851
+ let pressingOut;
852
+ if (p.pressing && releaseOut) {
853
+ const sales = requireRecordSalesDeployment(p.deployment.recordSales);
854
+ const id = derivePressingId(releaseOut.id, p.pressing.edition, sales.recordPackageId);
855
+ const adminCapId = derivePressingAdminCapId(id, sales.recordPackageId);
856
+ pressingOut = {
857
+ id,
858
+ adminCapId,
859
+ authority: authorityOut(result, vaults, p.pressing.custody, adminCapId, pressingCapType(p), vaultPackageId),
860
+ };
861
+ }
862
+ return {
863
+ digest: result.digest,
864
+ gasUsed: result.gasUsed,
865
+ parties,
866
+ compositions,
867
+ recordings,
868
+ release: releaseOut,
869
+ pressing: pressingOut,
870
+ };
871
+ }
872
+ //# sourceMappingURL=publication.js.map