@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.
- package/README.md +88 -56
- package/dist/client.d.ts +121 -18
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +200 -44
- package/dist/client.js.map +1 -1
- package/dist/contracts/composition_routed_stake/composition_routed_stake.d.ts +205 -0
- package/dist/contracts/composition_routed_stake/composition_routed_stake.d.ts.map +1 -0
- package/dist/contracts/composition_routed_stake/composition_routed_stake.js +184 -0
- package/dist/contracts/composition_routed_stake/composition_routed_stake.js.map +1 -0
- package/dist/contracts/composition_routed_stake/witness.d.ts +7 -0
- package/dist/contracts/composition_routed_stake/witness.d.ts.map +1 -0
- package/dist/contracts/composition_routed_stake/witness.js +9 -0
- package/dist/contracts/composition_routed_stake/witness.js.map +1 -0
- package/dist/contracts/composition_royalty_pool/composition_royalty_pool.d.ts +89 -28
- package/dist/contracts/composition_royalty_pool/composition_royalty_pool.d.ts.map +1 -1
- package/dist/contracts/composition_royalty_pool/composition_royalty_pool.js +84 -23
- package/dist/contracts/composition_royalty_pool/composition_royalty_pool.js.map +1 -1
- package/dist/contracts/composition_royalty_pool/witness.d.ts +6 -0
- package/dist/contracts/composition_royalty_pool/witness.d.ts.map +1 -0
- package/dist/contracts/composition_royalty_pool/witness.js +8 -0
- package/dist/contracts/composition_royalty_pool/witness.js.map +1 -0
- package/dist/contracts/genre/genre.d.ts +96 -0
- package/dist/contracts/genre/genre.d.ts.map +1 -0
- package/dist/contracts/genre/genre.js +107 -0
- package/dist/contracts/genre/genre.js.map +1 -0
- package/dist/contracts/recording_advisory/recording_advisory.d.ts +194 -0
- package/dist/contracts/recording_advisory/recording_advisory.d.ts.map +1 -0
- package/dist/contracts/recording_advisory/recording_advisory.js +204 -0
- package/dist/contracts/recording_advisory/recording_advisory.js.map +1 -0
- package/dist/contracts/recording_language/deps/language_code/language_code.d.ts +6 -0
- package/dist/contracts/recording_language/deps/language_code/language_code.d.ts.map +1 -0
- package/dist/contracts/recording_language/deps/language_code/language_code.js +8 -0
- package/dist/contracts/recording_language/deps/language_code/language_code.js.map +1 -0
- package/dist/contracts/recording_language/recording_language.d.ts +152 -0
- package/dist/contracts/recording_language/recording_language.d.ts.map +1 -0
- package/dist/contracts/recording_language/recording_language.js +149 -0
- package/dist/contracts/recording_language/recording_language.js.map +1 -0
- package/dist/contracts/recording_master_reference/deps/ori/walrus_data.d.ts +52 -0
- package/dist/contracts/recording_master_reference/deps/ori/walrus_data.d.ts.map +1 -0
- package/dist/contracts/recording_master_reference/deps/ori/walrus_data.js +37 -0
- package/dist/contracts/recording_master_reference/deps/ori/walrus_data.js.map +1 -0
- package/dist/contracts/recording_master_reference/recording_master_reference.d.ts +131 -0
- package/dist/contracts/recording_master_reference/recording_master_reference.d.ts.map +1 -0
- package/dist/contracts/recording_master_reference/recording_master_reference.js +121 -0
- package/dist/contracts/recording_master_reference/recording_master_reference.js.map +1 -0
- package/dist/contracts/recording_preview/deps/ori/walrus_data.d.ts +52 -0
- package/dist/contracts/recording_preview/deps/ori/walrus_data.d.ts.map +1 -0
- package/dist/contracts/recording_preview/deps/ori/walrus_data.js +37 -0
- package/dist/contracts/recording_preview/deps/ori/walrus_data.js.map +1 -0
- package/dist/contracts/recording_preview/recording_preview.d.ts +104 -0
- package/dist/contracts/recording_preview/recording_preview.d.ts.map +1 -0
- package/dist/contracts/recording_preview/recording_preview.js +94 -0
- package/dist/contracts/recording_preview/recording_preview.js.map +1 -0
- package/dist/contracts/recording_royalty_pool/recording_royalty_pool.d.ts +90 -28
- package/dist/contracts/recording_royalty_pool/recording_royalty_pool.d.ts.map +1 -1
- package/dist/contracts/recording_royalty_pool/recording_royalty_pool.js +84 -23
- package/dist/contracts/recording_royalty_pool/recording_royalty_pool.js.map +1 -1
- package/dist/contracts/recording_royalty_pool/witness.d.ts +6 -0
- package/dist/contracts/recording_royalty_pool/witness.d.ts.map +1 -0
- package/dist/contracts/recording_royalty_pool/witness.js +8 -0
- package/dist/contracts/recording_royalty_pool/witness.js.map +1 -0
- package/dist/contracts/release_description/release_description.d.ts +112 -0
- package/dist/contracts/release_description/release_description.d.ts.map +1 -0
- package/dist/contracts/release_description/release_description.js +123 -0
- package/dist/contracts/release_description/release_description.js.map +1 -0
- package/dist/contracts/release_dsp_link/release_dsp_link.d.ts +644 -0
- package/dist/contracts/release_dsp_link/release_dsp_link.d.ts.map +1 -0
- package/dist/contracts/release_dsp_link/release_dsp_link.js +556 -0
- package/dist/contracts/release_dsp_link/release_dsp_link.js.map +1 -0
- package/dist/contracts/release_genre/deps/per_track/per_track.d.ts +33 -0
- package/dist/contracts/release_genre/deps/per_track/per_track.d.ts.map +1 -0
- package/dist/contracts/release_genre/deps/per_track/per_track.js +32 -0
- package/dist/contracts/release_genre/deps/per_track/per_track.js.map +1 -0
- package/dist/contracts/release_genre/release_genre.d.ts +193 -0
- package/dist/contracts/release_genre/release_genre.d.ts.map +1 -0
- package/dist/contracts/release_genre/release_genre.js +207 -0
- package/dist/contracts/release_genre/release_genre.js.map +1 -0
- package/dist/contracts/release_kind/release_kind.d.ts +98 -0
- package/dist/contracts/release_kind/release_kind.d.ts.map +1 -0
- package/dist/contracts/release_kind/release_kind.js +109 -0
- package/dist/contracts/release_kind/release_kind.js.map +1 -0
- package/dist/contracts/release_revenue_distributor/release_revenue_distributor.d.ts +106 -0
- package/dist/contracts/release_revenue_distributor/release_revenue_distributor.d.ts.map +1 -0
- package/dist/contracts/release_revenue_distributor/release_revenue_distributor.js +113 -0
- package/dist/contracts/release_revenue_distributor/release_revenue_distributor.js.map +1 -0
- package/dist/contracts/release_revenue_distributor/witness.d.ts +7 -0
- package/dist/contracts/release_revenue_distributor/witness.d.ts.map +1 -0
- package/dist/contracts/release_revenue_distributor/witness.js +9 -0
- package/dist/contracts/release_revenue_distributor/witness.js.map +1 -0
- package/dist/contracts/routed_stake/deps/royalty_pool/stake.d.ts +54 -0
- package/dist/contracts/routed_stake/deps/royalty_pool/stake.d.ts.map +1 -0
- package/dist/contracts/routed_stake/deps/royalty_pool/stake.js +37 -0
- package/dist/contracts/routed_stake/deps/royalty_pool/stake.js.map +1 -0
- package/dist/contracts/routed_stake/deps/std/type_name.d.ts +18 -0
- package/dist/contracts/routed_stake/deps/std/type_name.d.ts.map +1 -0
- package/dist/contracts/routed_stake/deps/std/type_name.js +20 -0
- package/dist/contracts/routed_stake/deps/std/type_name.js.map +1 -0
- package/dist/contracts/routed_stake/deps/sui/balance.d.ts +13 -0
- package/dist/contracts/routed_stake/deps/sui/balance.d.ts.map +1 -0
- package/dist/contracts/routed_stake/deps/sui/balance.js +15 -0
- package/dist/contracts/routed_stake/deps/sui/balance.js.map +1 -0
- package/dist/contracts/routed_stake/deps/sui/vec_map.d.ts +37 -0
- package/dist/contracts/routed_stake/deps/sui/vec_map.d.ts.map +1 -0
- package/dist/contracts/routed_stake/deps/sui/vec_map.js +28 -0
- package/dist/contracts/routed_stake/deps/sui/vec_map.js.map +1 -0
- package/dist/contracts/routed_stake/routed_stake.d.ts +356 -0
- package/dist/contracts/routed_stake/routed_stake.d.ts.map +1 -0
- package/dist/contracts/routed_stake/routed_stake.js +311 -0
- package/dist/contracts/routed_stake/routed_stake.js.map +1 -0
- package/dist/contracts/royalty_pool/pool.d.ts +27 -17
- package/dist/contracts/royalty_pool/pool.d.ts.map +1 -1
- package/dist/contracts/royalty_pool/pool.js +26 -17
- package/dist/contracts/royalty_pool/pool.js.map +1 -1
- package/dist/contracts/vault/deps/sui/bag.d.ts +35 -0
- package/dist/contracts/vault/deps/sui/bag.d.ts.map +1 -0
- package/dist/contracts/vault/deps/sui/bag.js +37 -0
- package/dist/contracts/vault/deps/sui/bag.js.map +1 -0
- package/dist/contracts/vault/deps/sui/borrow.d.ts +20 -0
- package/dist/contracts/vault/deps/sui/borrow.d.ts.map +1 -0
- package/dist/contracts/vault/deps/sui/borrow.js +21 -0
- package/dist/contracts/vault/deps/sui/borrow.js.map +1 -0
- package/dist/contracts/vault/vault.d.ts +276 -0
- package/dist/contracts/vault/vault.d.ts.map +1 -0
- package/dist/contracts/vault/vault.js +274 -0
- package/dist/contracts/vault/vault.js.map +1 -0
- package/dist/contracts.d.ts +13 -2
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +15 -7
- package/dist/contracts.js.map +1 -1
- package/dist/cover.d.ts +17 -3
- package/dist/cover.d.ts.map +1 -1
- package/dist/cover.js +43 -20
- package/dist/cover.js.map +1 -1
- package/dist/credits.d.ts +31 -12
- package/dist/credits.d.ts.map +1 -1
- package/dist/credits.js +41 -25
- package/dist/credits.js.map +1 -1
- package/dist/deployments.d.ts +30 -57
- package/dist/deployments.d.ts.map +1 -1
- package/dist/deployments.js +5 -53
- package/dist/deployments.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/pressing.d.ts +8 -7
- package/dist/pressing.d.ts.map +1 -1
- package/dist/pressing.js +91 -32
- package/dist/pressing.js.map +1 -1
- package/dist/read/artist.js +3 -3
- package/dist/read/artist.js.map +1 -1
- package/dist/read/catalog.d.ts +14 -9
- package/dist/read/catalog.d.ts.map +1 -1
- package/dist/read/catalog.js +71 -37
- package/dist/read/catalog.js.map +1 -1
- package/dist/read/client.d.ts +4 -2
- package/dist/read/client.d.ts.map +1 -1
- package/dist/read/client.js +15 -4
- package/dist/read/client.js.map +1 -1
- package/dist/read/config.d.ts +14 -11
- package/dist/read/config.d.ts.map +1 -1
- package/dist/read/config.js +10 -37
- package/dist/read/config.js.map +1 -1
- package/dist/read/index.d.ts +2 -2
- package/dist/read/index.d.ts.map +1 -1
- package/dist/read/index.js +1 -1
- package/dist/read/index.js.map +1 -1
- package/dist/read/receipts.d.ts +24 -7
- package/dist/read/receipts.d.ts.map +1 -1
- package/dist/read/receipts.js +78 -25
- package/dist/read/receipts.js.map +1 -1
- package/dist/read/types.d.ts +43 -25
- package/dist/read/types.d.ts.map +1 -1
- package/dist/read/types.js +2 -2
- package/dist/read/types.js.map +1 -1
- package/dist/recording-extensions.d.ts +37 -0
- package/dist/recording-extensions.d.ts.map +1 -0
- package/dist/recording-extensions.js +61 -0
- package/dist/recording-extensions.js.map +1 -0
- package/dist/release-extensions.d.ts +84 -0
- package/dist/release-extensions.d.ts.map +1 -0
- package/dist/release-extensions.js +160 -0
- package/dist/release-extensions.js.map +1 -0
- package/dist/release-graph.d.ts +17 -26
- package/dist/release-graph.d.ts.map +1 -1
- package/dist/release-graph.js +55 -49
- package/dist/release-graph.js.map +1 -1
- package/dist/transactions.d.ts +43 -24
- package/dist/transactions.d.ts.map +1 -1
- package/dist/transactions.js +48 -27
- package/dist/transactions.js.map +1 -1
- package/dist/vault.d.ts +268 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +389 -0
- package/dist/vault.js.map +1 -0
- package/package.json +17 -11
- package/src/client.ts +399 -61
- package/src/contracts/composition_routed_stake/composition_routed_stake.ts +346 -0
- package/src/contracts/composition_routed_stake/witness.ts +11 -0
- package/src/contracts/composition_royalty_pool/composition_royalty_pool.ts +151 -35
- package/src/contracts/composition_royalty_pool/witness.ts +7 -0
- package/src/contracts/genre/genre.ts +151 -0
- package/src/contracts/recording_advisory/recording_advisory.ts +315 -0
- package/src/contracts/recording_language/deps/language_code/language_code.ts +7 -0
- package/src/contracts/recording_language/recording_language.ts +237 -0
- package/src/contracts/recording_master_reference/deps/ori/walrus_data.ts +36 -0
- package/src/contracts/recording_master_reference/recording_master_reference.ts +181 -0
- package/src/contracts/recording_preview/deps/ori/walrus_data.ts +36 -0
- package/src/contracts/recording_preview/recording_preview.ts +154 -0
- package/src/contracts/recording_royalty_pool/recording_royalty_pool.ts +152 -35
- package/src/contracts/recording_royalty_pool/witness.ts +7 -0
- package/src/contracts/release_description/release_description.ts +167 -0
- package/src/contracts/release_dsp_link/release_dsp_link.ts +813 -0
- package/src/contracts/release_genre/deps/per_track/per_track.ts +36 -0
- package/src/contracts/release_genre/release_genre.ts +314 -0
- package/src/contracts/release_kind/release_kind.ts +153 -0
- package/src/contracts/release_revenue_distributor/release_revenue_distributor.ts +178 -0
- package/src/contracts/release_revenue_distributor/witness.ts +11 -0
- package/src/contracts/routed_stake/deps/royalty_pool/stake.ts +39 -0
- package/src/contracts/routed_stake/deps/std/type_name.ts +22 -0
- package/src/contracts/routed_stake/deps/sui/balance.ts +17 -0
- package/src/contracts/routed_stake/deps/sui/vec_map.ts +33 -0
- package/src/contracts/routed_stake/routed_stake.ts +508 -0
- package/src/contracts/royalty_pool/pool.ts +34 -24
- package/src/contracts/vault/deps/sui/bag.ts +39 -0
- package/src/contracts/vault/deps/sui/borrow.ts +25 -0
- package/src/contracts/vault/vault.ts +454 -0
- package/src/contracts.ts +16 -9
- package/src/cover.ts +62 -37
- package/src/credits.ts +64 -51
- package/src/deployments.ts +35 -97
- package/src/index.ts +11 -5
- package/src/pressing.ts +135 -39
- package/src/read/artist.ts +3 -3
- package/src/read/catalog.ts +99 -44
- package/src/read/client.ts +20 -4
- package/src/read/config.ts +23 -49
- package/src/read/index.ts +3 -1
- package/src/read/receipts.ts +103 -26
- package/src/read/types.ts +44 -27
- package/src/recording-extensions.ts +102 -0
- package/src/release-extensions.ts +261 -0
- package/src/release-graph.ts +68 -81
- package/src/transactions.ts +79 -53
- package/src/vault.ts +777 -0
- package/dist/contracts/miso_drop/drop.d.ts +0 -550
- package/dist/contracts/miso_drop/drop.d.ts.map +0 -1
- package/dist/contracts/miso_drop/drop.js +0 -523
- package/dist/contracts/miso_drop/drop.js.map +0 -1
- package/dist/contracts/release_registry/release_registry.d.ts +0 -114
- package/dist/contracts/release_registry/release_registry.d.ts.map +0 -1
- package/dist/contracts/release_registry/release_registry.js +0 -119
- package/dist/contracts/release_registry/release_registry.js.map +0 -1
- package/dist/drop.d.ts +0 -127
- package/dist/drop.d.ts.map +0 -1
- package/dist/drop.js +0 -202
- package/dist/drop.js.map +0 -1
- package/dist/extensions/royalty-pool.d.ts +0 -32
- package/dist/extensions/royalty-pool.d.ts.map +0 -1
- package/dist/extensions/royalty-pool.js +0 -33
- package/dist/extensions/royalty-pool.js.map +0 -1
- package/src/contracts/miso_drop/drop.ts +0 -798
- package/src/contracts/release_registry/release_registry.ts +0 -160
- package/src/drop.ts +0 -376
- package/src/extensions/royalty-pool.ts +0 -90
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// First-party metadata attached to a protocol Release. The JSON/CLI release
|
|
5
|
+
// intent aggregates these concerns, but every value is written by its own
|
|
6
|
+
// independently deployed extension package.
|
|
7
|
+
|
|
8
|
+
import { deriveDynamicFieldID } from "@mysten/sui/utils";
|
|
9
|
+
import type {
|
|
10
|
+
Transaction,
|
|
11
|
+
TransactionArgument,
|
|
12
|
+
} from "@mysten/sui/transactions";
|
|
13
|
+
import type { TxThunk } from "./transactions.ts";
|
|
14
|
+
import * as genre from "./contracts/genre/genre.ts";
|
|
15
|
+
import * as releaseDescription from "./contracts/release_description/release_description.ts";
|
|
16
|
+
import * as releaseDspLink from "./contracts/release_dsp_link/release_dsp_link.ts";
|
|
17
|
+
import * as releaseGenre from "./contracts/release_genre/release_genre.ts";
|
|
18
|
+
import * as releaseKind from "./contracts/release_kind/release_kind.ts";
|
|
19
|
+
import { asU64, directAdminCap, invokeWithAdminCap, type AdminCapAuthority, type U64Input } from "./vault.ts";
|
|
20
|
+
|
|
21
|
+
type ReleaseAuthorityInput =
|
|
22
|
+
| { readonly authority: AdminCapAuthority; readonly releaseAdminCapId?: never }
|
|
23
|
+
| { readonly authority?: never; readonly releaseAdminCapId: string };
|
|
24
|
+
interface ReleaseExtensionTargetBase {
|
|
25
|
+
releaseId: string;
|
|
26
|
+
}
|
|
27
|
+
export type ReleaseExtensionTarget = ReleaseExtensionTargetBase & ReleaseAuthorityInput;
|
|
28
|
+
function authority(p: ReleaseExtensionTarget): AdminCapAuthority {
|
|
29
|
+
if (p.authority !== undefined) return p.authority;
|
|
30
|
+
if (p.releaseAdminCapId !== undefined) return directAdminCap(p.releaseAdminCapId);
|
|
31
|
+
throw new Error("release authority is required");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type SetReleaseKindParams = ReleaseExtensionTarget & {
|
|
35
|
+
kind: string;
|
|
36
|
+
releaseKindPackageId: string;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Attach the release's self-declared kind (for example "EP" or "Mixtape"). */
|
|
40
|
+
export function setReleaseKind(p: SetReleaseKindParams): TxThunk {
|
|
41
|
+
const bytes = new TextEncoder().encode(p.kind).length;
|
|
42
|
+
if (bytes === 0) throw new Error("setReleaseKind: kind must not be empty");
|
|
43
|
+
if (bytes > 32) {
|
|
44
|
+
throw new Error(
|
|
45
|
+
`setReleaseKind: kind must be at most 32 UTF-8 bytes (got ${bytes})`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
return (tx) => {
|
|
49
|
+
invokeWithAdminCap(tx, authority(p), {
|
|
50
|
+
target: `${p.releaseKindPackageId}::release_kind::set_kind`,
|
|
51
|
+
arguments: [tx.object(p.releaseId), tx.pure.string(p.kind)],
|
|
52
|
+
adminCapIndex: 1,
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type SetReleaseDescriptionParams = ReleaseExtensionTarget & {
|
|
58
|
+
description: string;
|
|
59
|
+
releaseDescriptionPackageId: string;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/** Attach the release's editorial description. */
|
|
63
|
+
export function setReleaseDescription(p: SetReleaseDescriptionParams): TxThunk {
|
|
64
|
+
const bytes = new TextEncoder().encode(p.description).length;
|
|
65
|
+
if (bytes === 0) {
|
|
66
|
+
throw new Error("setReleaseDescription: description must not be empty");
|
|
67
|
+
}
|
|
68
|
+
if (bytes > 8192) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`setReleaseDescription: description must be at most 8192 UTF-8 bytes (got ${bytes})`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return (tx) => {
|
|
74
|
+
invokeWithAdminCap(tx, authority(p), {
|
|
75
|
+
target: `${p.releaseDescriptionPackageId}::release_description::set_description`,
|
|
76
|
+
arguments: [tx.object(p.releaseId), tx.pure.string(p.description)],
|
|
77
|
+
adminCapIndex: 1,
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const GENRE_NAME_RE = /^[A-Z]+(?:_[A-Z]+)*$/;
|
|
83
|
+
|
|
84
|
+
/** Validate the canonical on-chain genre vocabulary spelling. */
|
|
85
|
+
export function assertCanonicalGenreName(name: string): void {
|
|
86
|
+
const bytes = new TextEncoder().encode(name).length;
|
|
87
|
+
if (bytes === 0 || bytes > 64 || !GENRE_NAME_RE.test(name)) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
`Genre name must be 1-64 bytes of uppercase A-Z and underscores; got ${JSON.stringify(name)}`,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Derive the immutable Genre object id for a canonical vocabulary name. */
|
|
95
|
+
export function deriveGenreId(
|
|
96
|
+
genreRegistryId: string,
|
|
97
|
+
genrePackageId: string,
|
|
98
|
+
canonicalName: string,
|
|
99
|
+
): string {
|
|
100
|
+
assertCanonicalGenreName(canonicalName);
|
|
101
|
+
return deriveDynamicFieldID(
|
|
102
|
+
genreRegistryId,
|
|
103
|
+
`${genrePackageId}::genre::GenreKey`,
|
|
104
|
+
genre.GenreKey.serialize([canonicalName]).toBytes(),
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface TrackGenreAssignment {
|
|
109
|
+
trackIndex: U64Input;
|
|
110
|
+
genreId: string;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export type SetReleaseGenresParams = ReleaseExtensionTarget & {
|
|
114
|
+
primaryGenreId: string;
|
|
115
|
+
secondaryGenreIds?: readonly string[];
|
|
116
|
+
trackPrimaryGenres?: readonly TrackGenreAssignment[];
|
|
117
|
+
releaseGenrePackageId: string;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/** Attach primary/secondary release genres and optional per-track overrides. */
|
|
121
|
+
export function setReleaseGenres(p: SetReleaseGenresParams): TxThunk {
|
|
122
|
+
return (tx) => {
|
|
123
|
+
invokeWithAdminCap(tx, authority(p), {
|
|
124
|
+
target: `${p.releaseGenrePackageId}::release_genre::set_primary_genre`,
|
|
125
|
+
arguments: [tx.object(p.releaseId), tx.object(p.primaryGenreId)],
|
|
126
|
+
adminCapIndex: 1,
|
|
127
|
+
});
|
|
128
|
+
for (const genreId of p.secondaryGenreIds ?? []) {
|
|
129
|
+
invokeWithAdminCap(tx, authority(p), {
|
|
130
|
+
target: `${p.releaseGenrePackageId}::release_genre::add_secondary_genre`,
|
|
131
|
+
arguments: [tx.object(p.releaseId), tx.object(genreId)],
|
|
132
|
+
adminCapIndex: 1,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
for (const assignment of p.trackPrimaryGenres ?? []) {
|
|
136
|
+
invokeWithAdminCap(tx, authority(p), {
|
|
137
|
+
target: `${p.releaseGenrePackageId}::release_genre::set_track_primary_genre`,
|
|
138
|
+
arguments: [
|
|
139
|
+
tx.object(p.releaseId),
|
|
140
|
+
tx.pure.u64(asU64("trackIndex", assignment.trackIndex)),
|
|
141
|
+
tx.object(assignment.genreId),
|
|
142
|
+
],
|
|
143
|
+
adminCapIndex: 1,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export type DspLink =
|
|
150
|
+
| { platform: "Spotify"; id: string }
|
|
151
|
+
| {
|
|
152
|
+
platform: "AppleMusic";
|
|
153
|
+
storefront: string;
|
|
154
|
+
albumId: string;
|
|
155
|
+
trackId?: string;
|
|
156
|
+
}
|
|
157
|
+
| { platform: "AmazonMusic"; albumId: string; trackId?: string }
|
|
158
|
+
| { platform: "Bandcamp"; subdomain: string; slug: string }
|
|
159
|
+
| { platform: "Deezer"; id: string }
|
|
160
|
+
| { platform: "SoundCloud"; user: string; slug: string }
|
|
161
|
+
| { platform: "Tidal"; id: string }
|
|
162
|
+
| { platform: "YouTubeMusic"; id: string };
|
|
163
|
+
|
|
164
|
+
function buildDspLink(
|
|
165
|
+
tx: Transaction,
|
|
166
|
+
packageId: string,
|
|
167
|
+
link: DspLink,
|
|
168
|
+
): TransactionArgument {
|
|
169
|
+
switch (link.platform) {
|
|
170
|
+
case "Spotify":
|
|
171
|
+
return tx.add(
|
|
172
|
+
releaseDspLink.newSpotify({ package: packageId, arguments: [link.id] }),
|
|
173
|
+
);
|
|
174
|
+
case "AppleMusic":
|
|
175
|
+
return tx.add(
|
|
176
|
+
link.trackId === undefined
|
|
177
|
+
? releaseDspLink.newAppleMusicAlbum({
|
|
178
|
+
package: packageId,
|
|
179
|
+
arguments: [link.storefront, link.albumId],
|
|
180
|
+
})
|
|
181
|
+
: releaseDspLink.newAppleMusicTrack({
|
|
182
|
+
package: packageId,
|
|
183
|
+
arguments: [link.storefront, link.albumId, link.trackId],
|
|
184
|
+
}),
|
|
185
|
+
);
|
|
186
|
+
case "AmazonMusic":
|
|
187
|
+
return tx.add(
|
|
188
|
+
link.trackId === undefined
|
|
189
|
+
? releaseDspLink.newAmazonMusicAlbum({
|
|
190
|
+
package: packageId,
|
|
191
|
+
arguments: [link.albumId],
|
|
192
|
+
})
|
|
193
|
+
: releaseDspLink.newAmazonMusicTrack({
|
|
194
|
+
package: packageId,
|
|
195
|
+
arguments: [link.albumId, link.trackId],
|
|
196
|
+
}),
|
|
197
|
+
);
|
|
198
|
+
case "Bandcamp":
|
|
199
|
+
return tx.add(
|
|
200
|
+
releaseDspLink.newBandcamp({
|
|
201
|
+
package: packageId,
|
|
202
|
+
arguments: [link.subdomain, link.slug],
|
|
203
|
+
}),
|
|
204
|
+
);
|
|
205
|
+
case "Deezer":
|
|
206
|
+
return tx.add(
|
|
207
|
+
releaseDspLink.newDeezer({ package: packageId, arguments: [link.id] }),
|
|
208
|
+
);
|
|
209
|
+
case "SoundCloud":
|
|
210
|
+
return tx.add(
|
|
211
|
+
releaseDspLink.newSoundcloud({
|
|
212
|
+
package: packageId,
|
|
213
|
+
arguments: [link.user, link.slug],
|
|
214
|
+
}),
|
|
215
|
+
);
|
|
216
|
+
case "Tidal":
|
|
217
|
+
return tx.add(
|
|
218
|
+
releaseDspLink.newTidal({ package: packageId, arguments: [link.id] }),
|
|
219
|
+
);
|
|
220
|
+
case "YouTubeMusic":
|
|
221
|
+
return tx.add(
|
|
222
|
+
releaseDspLink.newYoutubeMusic({
|
|
223
|
+
package: packageId,
|
|
224
|
+
arguments: [link.id],
|
|
225
|
+
}),
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export interface TrackDspLink {
|
|
231
|
+
trackIndex: U64Input;
|
|
232
|
+
link: DspLink;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export type SetReleaseDspLinksParams = ReleaseExtensionTarget & {
|
|
236
|
+
releaseLinks?: readonly DspLink[];
|
|
237
|
+
trackLinks?: readonly TrackDspLink[];
|
|
238
|
+
releaseDspLinkPackageId: string;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
/** Attach release-level and per-track DSP links. */
|
|
242
|
+
export function setReleaseDspLinks(p: SetReleaseDspLinksParams): TxThunk {
|
|
243
|
+
return (tx) => {
|
|
244
|
+
for (const link of p.releaseLinks ?? []) {
|
|
245
|
+
const value = buildDspLink(tx, p.releaseDspLinkPackageId, link);
|
|
246
|
+
invokeWithAdminCap(tx, authority(p), {
|
|
247
|
+
target: `${p.releaseDspLinkPackageId}::release_dsp_link::set_release_link`,
|
|
248
|
+
arguments: [tx.object(p.releaseId), value],
|
|
249
|
+
adminCapIndex: 1,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
for (const item of p.trackLinks ?? []) {
|
|
253
|
+
const value = buildDspLink(tx, p.releaseDspLinkPackageId, item.link);
|
|
254
|
+
invokeWithAdminCap(tx, authority(p), {
|
|
255
|
+
target: `${p.releaseDspLinkPackageId}::release_dsp_link::set_track_link`,
|
|
256
|
+
arguments: [tx.object(p.releaseId), tx.pure.u64(asU64("trackIndex", item.trackIndex)), value],
|
|
257
|
+
adminCapIndex: 1,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
}
|
package/src/release-graph.ts
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
// Single-PTB publisher for a whole release graph: creates every composition and
|
|
5
|
-
// recording,
|
|
5
|
+
// recording, derives the release id ON-CHAIN
|
|
6
6
|
// (so recordings need not be shared first), builds the tracks/release,
|
|
7
7
|
// then shares everything and transfers the admin caps — all in ONE transaction.
|
|
8
8
|
//
|
|
9
9
|
// Share currencies must already be published + initialized (their Currency objects
|
|
10
10
|
// shared on-chain); their ids/types are passed in. Ordering is load-bearing:
|
|
11
|
-
// 1. composition::new → recording::new(&comp) (borrow-before-share)
|
|
11
|
+
// 1. composition::new → recording::new(&comp) (borrow-before-share)
|
|
12
12
|
// 2. release::derive_target_release_id(<recording::id results>) →
|
|
13
|
-
// track::new(cap, &rec, derivedId, split) →
|
|
13
|
+
// track::new(cap, &rec, derivedId, split) → release::new(registry, …)
|
|
14
14
|
// 3. publish (share) comps + recs + release, disperse supply, transfer caps
|
|
15
15
|
// Steps 1–2 borrow the works; step 3 consumes them into share_object.
|
|
16
16
|
//
|
|
@@ -19,53 +19,40 @@
|
|
|
19
19
|
//
|
|
20
20
|
// This is the whole-graph orchestration half of the opinionated publish flow —
|
|
21
21
|
// it composes `@misonetwork/sdk`'s bare `composition`/`recording`/`track`/
|
|
22
|
-
// `release` call bindings
|
|
23
|
-
// own `disperseShares`/`finalizeRelease`
|
|
24
|
-
//
|
|
22
|
+
// `release` core call bindings with its
|
|
23
|
+
// own `disperseShares`/`finalizeRelease` helpers into one PTB. Royalty pools are
|
|
24
|
+
// installed later through an admin-cap Vault plugin; the retired raw-cap helper
|
|
25
|
+
// is intentionally not used here.
|
|
25
26
|
|
|
26
27
|
import { Transaction, type TransactionObjectArgument } from "@mysten/sui/transactions";
|
|
27
28
|
import { contracts } from "@misonetwork/sdk";
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const { composition, recording, track, release } = contracts;
|
|
33
|
-
|
|
34
|
-
/** A royalty pool to attach to a work, in the same PTB. */
|
|
35
|
-
export interface RoyaltyPoolNode {
|
|
36
|
-
currency: string;
|
|
37
|
-
/** `composition_royalty_pool` / `recording_royalty_pool` package id. */
|
|
38
|
-
extensionPackageId: string;
|
|
39
|
-
/** Base `royalty_pool` lib package id. */
|
|
40
|
-
royaltyPoolPackageId: string;
|
|
41
|
-
}
|
|
29
|
+
import { custodyOf, disperseShares, finalizeRelease, recordingAuthorityOf, requiredCommandResult, type AdminCustodyInput, type RecordingAuthorityInput, type ShareRecipient } from "./transactions.ts";
|
|
30
|
+
import { disposeNewAdminCap, invokeWithAdminCap } from "./vault.ts";
|
|
31
|
+
|
|
32
|
+
const { composition, recording, track } = contracts;
|
|
42
33
|
|
|
43
|
-
|
|
34
|
+
interface CompositionNodeBase {
|
|
44
35
|
shareType: string;
|
|
45
36
|
shareCurrencyId: string;
|
|
46
37
|
shareTreasuryCapId: string;
|
|
47
38
|
title: string;
|
|
48
39
|
royaltyRateBps: number;
|
|
49
40
|
shareRecipients: ShareRecipient[];
|
|
50
|
-
/** Recipient of the CompositionAdminCap (the owner). */
|
|
51
|
-
adminAddress: string;
|
|
52
|
-
royaltyPool?: RoyaltyPoolNode;
|
|
53
41
|
}
|
|
42
|
+
export type CompositionNode = CompositionNodeBase & AdminCustodyInput;
|
|
54
43
|
|
|
55
|
-
|
|
44
|
+
interface RecordingNodeBase {
|
|
56
45
|
shareType: string;
|
|
57
46
|
shareCurrencyId: string;
|
|
58
47
|
shareTreasuryCapId: string;
|
|
59
48
|
/** The parent composition's share type. */
|
|
60
49
|
compositionShareType: string;
|
|
61
|
-
/** Index into `compositions[]` if the parent is created in THIS PTB… */
|
|
62
|
-
parentCompositionIndex?: number;
|
|
63
|
-
/** …or the on-chain composition object id if the parent already exists. */
|
|
64
|
-
parentCompositionId?: string;
|
|
65
50
|
shareRecipients: ShareRecipient[];
|
|
66
|
-
adminAddress: string;
|
|
67
|
-
royaltyPool?: RoyaltyPoolNode;
|
|
68
51
|
}
|
|
52
|
+
type RecordingParent =
|
|
53
|
+
| { readonly parentCompositionIndex: number; readonly parentCompositionId?: never }
|
|
54
|
+
| { readonly parentCompositionIndex?: never; readonly parentCompositionId: string };
|
|
55
|
+
export type RecordingNode = RecordingNodeBase & RecordingParent & AdminCustodyInput;
|
|
69
56
|
|
|
70
57
|
/** A track whose recording is created in THIS PTB. */
|
|
71
58
|
export interface FreshTrackNode {
|
|
@@ -78,27 +65,33 @@ export interface FreshTrackNode {
|
|
|
78
65
|
* A track over an EXISTING recording, authorized by its admin cap held by the
|
|
79
66
|
* sender. This can coexist with recordings created in this PTB.
|
|
80
67
|
*/
|
|
81
|
-
|
|
68
|
+
interface CapTrackNodeBase {
|
|
82
69
|
recordingId: string;
|
|
83
|
-
recordingAdminCapId: string;
|
|
84
70
|
recordingShareType: string;
|
|
85
71
|
compositionShareType: string;
|
|
86
72
|
splitBps: number;
|
|
87
73
|
}
|
|
74
|
+
export type CapTrackNode = CapTrackNodeBase & RecordingAuthorityInput;
|
|
88
75
|
|
|
89
76
|
export type TrackNode = FreshTrackNode | CapTrackNode;
|
|
90
77
|
|
|
91
78
|
const isFresh = (t: TrackNode): t is FreshTrackNode => "recordingIndex" in t;
|
|
92
79
|
|
|
93
|
-
|
|
80
|
+
function requiredAt<T>(items: readonly T[], index: number, description: string): T {
|
|
81
|
+
const item = items[index];
|
|
82
|
+
if (item === undefined) throw new Error(`${description} index ${index} is out of range`);
|
|
83
|
+
return item;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface ReleaseNodeBase {
|
|
94
87
|
title: string;
|
|
95
88
|
/** u256 nonce as a decimal string (deterministic release id). */
|
|
96
89
|
nonce: string;
|
|
97
|
-
adminAddress: string;
|
|
98
90
|
releaseRegistryId: string;
|
|
99
91
|
/** The ordered tracklist. Display grouping (discs/sides) is extension data. */
|
|
100
92
|
tracks: TrackNode[];
|
|
101
93
|
}
|
|
94
|
+
export type ReleaseNode = ReleaseNodeBase & AdminCustodyInput;
|
|
102
95
|
|
|
103
96
|
export interface PublishReleaseGraphParams {
|
|
104
97
|
compositions: CompositionNode[];
|
|
@@ -106,8 +99,6 @@ export interface PublishReleaseGraphParams {
|
|
|
106
99
|
release?: ReleaseNode;
|
|
107
100
|
misoPackageId: string;
|
|
108
101
|
minatoPackageId: string;
|
|
109
|
-
/** `release_registry` extension package, distinct from its shared object id. */
|
|
110
|
-
releaseRegistryPackageId: string;
|
|
111
102
|
}
|
|
112
103
|
|
|
113
104
|
interface Parts {
|
|
@@ -118,7 +109,7 @@ interface Parts {
|
|
|
118
109
|
|
|
119
110
|
/** Builds the entire graph in a single transaction (see file header for ordering). */
|
|
120
111
|
export function publishReleaseGraph(params: PublishReleaseGraphParams): (tx: Transaction) => void {
|
|
121
|
-
const { misoPackageId: pkg, minatoPackageId
|
|
112
|
+
const { misoPackageId: pkg, minatoPackageId } = params;
|
|
122
113
|
return (tx) => {
|
|
123
114
|
// ── 1) Create every composition, then every recording (borrow-before-share) ──
|
|
124
115
|
const comps: Parts[] = params.compositions.map((c) => {
|
|
@@ -129,43 +120,32 @@ export function publishReleaseGraph(params: PublishReleaseGraphParams): (tx: Tra
|
|
|
129
120
|
arguments: [tx.pure.string(c.title), tx.pure.u16(c.royaltyRateBps), tx.object(c.shareCurrencyId), tx.object(c.shareTreasuryCapId)],
|
|
130
121
|
}),
|
|
131
122
|
);
|
|
132
|
-
const parts: Parts = {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
compositionShareType: c.shareType,
|
|
138
|
-
currency: c.royaltyPool.currency,
|
|
139
|
-
compositionRoyaltyPoolPackageId: c.royaltyPool.extensionPackageId,
|
|
140
|
-
royaltyPoolPackageId: c.royaltyPool.royaltyPoolPackageId,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
123
|
+
const parts: Parts = {
|
|
124
|
+
work: requiredCommandResult(r, 0, "composition::_new"),
|
|
125
|
+
adminCap: requiredCommandResult(r, 1, "composition::_new"),
|
|
126
|
+
balance: requiredCommandResult(r, 2, "composition::_new"),
|
|
127
|
+
};
|
|
143
128
|
return parts;
|
|
144
129
|
});
|
|
145
130
|
|
|
146
131
|
const recTypeArgs = (i: number): [string, string] => {
|
|
147
|
-
const n = params.recordings
|
|
132
|
+
const n = requiredAt(params.recordings, i, "recording");
|
|
148
133
|
return [n.shareType, n.compositionShareType];
|
|
149
134
|
};
|
|
150
135
|
|
|
151
136
|
const recs: Parts[] = params.recordings.map((rec, i) => {
|
|
152
|
-
const parent = rec.parentCompositionIndex !== undefined
|
|
137
|
+
const parent = rec.parentCompositionIndex !== undefined
|
|
138
|
+
? requiredAt(comps, rec.parentCompositionIndex, "parent composition").work
|
|
139
|
+
: tx.object(rec.parentCompositionId);
|
|
153
140
|
const typeArgs = recTypeArgs(i);
|
|
154
141
|
const r = tx.add(
|
|
155
142
|
recording._new({ package: pkg, typeArguments: typeArgs, arguments: [parent, tx.object(rec.shareCurrencyId), tx.object(rec.shareTreasuryCapId)] }),
|
|
156
143
|
);
|
|
157
|
-
const parts: Parts = {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
recordingShareType: rec.shareType,
|
|
163
|
-
compositionShareType: rec.compositionShareType,
|
|
164
|
-
currency: rec.royaltyPool.currency,
|
|
165
|
-
recordingRoyaltyPoolPackageId: rec.royaltyPool.extensionPackageId,
|
|
166
|
-
royaltyPoolPackageId: rec.royaltyPool.royaltyPoolPackageId,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
144
|
+
const parts: Parts = {
|
|
145
|
+
work: requiredCommandResult(r, 0, "recording::_new"),
|
|
146
|
+
adminCap: requiredCommandResult(r, 1, "recording::_new"),
|
|
147
|
+
balance: requiredCommandResult(r, 2, "recording::_new"),
|
|
148
|
+
};
|
|
169
149
|
return parts;
|
|
170
150
|
});
|
|
171
151
|
|
|
@@ -177,50 +157,57 @@ export function publishReleaseGraph(params: PublishReleaseGraphParams): (tx: Tra
|
|
|
177
157
|
type: "0x2::object::ID",
|
|
178
158
|
elements: ordered.map((t) =>
|
|
179
159
|
isFresh(t)
|
|
180
|
-
? tx.add(recording.id({ package: pkg, typeArguments: recTypeArgs(t.recordingIndex), arguments: [recs
|
|
160
|
+
? tx.add(recording.id({ package: pkg, typeArguments: recTypeArgs(t.recordingIndex), arguments: [requiredAt(recs, t.recordingIndex, "fresh recording").work] }))
|
|
181
161
|
: tx.pure.id(t.recordingId),
|
|
182
162
|
),
|
|
183
163
|
});
|
|
184
164
|
const splitVec = tx.makeMoveVec({ type: "u64", elements: ordered.map((t) => tx.pure.u64(t.splitBps)) });
|
|
185
165
|
// This returns an ID value (not an object); pass the result straight to
|
|
186
166
|
// `track::new` so every track consents to this exact release target.
|
|
187
|
-
const releaseId = tx.
|
|
188
|
-
|
|
189
|
-
|
|
167
|
+
const releaseId = tx.moveCall({
|
|
168
|
+
target: `${pkg}::release::derive_target_release_id`,
|
|
169
|
+
arguments: [tx.object(rel.releaseRegistryId), idVec, splitVec, tx.pure.u256(BigInt(rel.nonce))],
|
|
170
|
+
});
|
|
190
171
|
|
|
191
172
|
const trackArgs = ordered.map((t) => {
|
|
192
173
|
if (isFresh(t)) {
|
|
193
174
|
const typeArgs = recTypeArgs(t.recordingIndex);
|
|
194
|
-
const parts = recs
|
|
175
|
+
const parts = requiredAt(recs, t.recordingIndex, "fresh recording");
|
|
195
176
|
return tx.add(track._new({ package: pkg, typeArguments: typeArgs, arguments: [parts.adminCap, parts.work, releaseId, tx.pure.u16(t.splitBps)] }));
|
|
196
177
|
}
|
|
197
178
|
const typeArgs: [string, string] = [t.recordingShareType, t.compositionShareType];
|
|
198
179
|
const rec = tx.object(t.recordingId);
|
|
199
|
-
return tx
|
|
180
|
+
return invokeWithAdminCap(tx, recordingAuthorityOf(t), {
|
|
181
|
+
target: `${pkg}::track::new`,
|
|
182
|
+
typeArguments: typeArgs,
|
|
183
|
+
arguments: [rec, releaseId, tx.pure.u16(t.splitBps)],
|
|
184
|
+
adminCapIndex: 0,
|
|
185
|
+
});
|
|
200
186
|
});
|
|
201
187
|
const trackVec = tx.makeMoveVec({ type: `${pkg}::track::Track`, elements: trackArgs });
|
|
202
|
-
const created = tx.
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
188
|
+
const created = tx.moveCall({
|
|
189
|
+
target: `${pkg}::release::new`,
|
|
190
|
+
arguments: [tx.object(rel.releaseRegistryId), tx.pure.string(rel.title), trackVec, tx.pure.u256(BigInt(rel.nonce))],
|
|
191
|
+
});
|
|
192
|
+
const releaseParts = {
|
|
193
|
+
release: requiredCommandResult(created, 0, "release::new"),
|
|
194
|
+
adminCap: requiredCommandResult(created, 1, "release::new"),
|
|
195
|
+
};
|
|
196
|
+
finalizeRelease(tx, { ...releaseParts, adminCustody: custodyOf(rel), misoPackageId: pkg });
|
|
210
197
|
}
|
|
211
198
|
|
|
212
199
|
// ── 3) Share every work, disperse its supply, transfer admin caps ──
|
|
213
200
|
params.compositions.forEach((c, i) => {
|
|
214
|
-
const parts = comps
|
|
201
|
+
const parts = requiredAt(comps, i, "composition");
|
|
215
202
|
disperseShares(tx, minatoPackageId, c.shareType, parts.balance, c.shareRecipients);
|
|
216
203
|
tx.add(composition.publish({ package: pkg, typeArguments: [c.shareType], arguments: [parts.work, parts.adminCap] }));
|
|
217
|
-
tx
|
|
204
|
+
disposeNewAdminCap(tx, parts.adminCap, custodyOf(c));
|
|
218
205
|
});
|
|
219
206
|
params.recordings.forEach((rec, i) => {
|
|
220
|
-
const parts = recs
|
|
207
|
+
const parts = requiredAt(recs, i, "recording");
|
|
221
208
|
tx.add(recording.publish({ package: pkg, typeArguments: recTypeArgs(i), arguments: [parts.work, parts.adminCap] }));
|
|
222
209
|
disperseShares(tx, minatoPackageId, rec.shareType, parts.balance, rec.shareRecipients);
|
|
223
|
-
tx
|
|
210
|
+
disposeNewAdminCap(tx, parts.adminCap, custodyOf(rec));
|
|
224
211
|
});
|
|
225
212
|
};
|
|
226
213
|
}
|