@misofm/sdk 0.2.1 → 0.3.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 (82) hide show
  1. package/README.md +37 -5
  2. package/dist/contracts/miso_drop/drop.d.ts +550 -0
  3. package/dist/contracts/miso_drop/drop.d.ts.map +1 -0
  4. package/dist/contracts/miso_drop/drop.js +523 -0
  5. package/dist/contracts/miso_drop/drop.js.map +1 -0
  6. package/dist/contracts.d.ts +1 -0
  7. package/dist/contracts.d.ts.map +1 -1
  8. package/dist/contracts.js +3 -0
  9. package/dist/contracts.js.map +1 -1
  10. package/dist/drop.d.ts +120 -0
  11. package/dist/drop.d.ts.map +1 -0
  12. package/dist/drop.js +152 -0
  13. package/dist/drop.js.map +1 -0
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +4 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/read/artist.d.ts +24 -0
  19. package/dist/read/artist.d.ts.map +1 -0
  20. package/dist/read/artist.js +114 -0
  21. package/dist/read/artist.js.map +1 -0
  22. package/dist/read/catalog.d.ts +63 -0
  23. package/dist/read/catalog.d.ts.map +1 -0
  24. package/dist/read/catalog.js +252 -0
  25. package/dist/read/catalog.js.map +1 -0
  26. package/dist/read/client.d.ts +36 -0
  27. package/dist/read/client.d.ts.map +1 -0
  28. package/dist/read/client.js +46 -0
  29. package/dist/read/client.js.map +1 -0
  30. package/dist/read/config.d.ts +83 -0
  31. package/dist/read/config.d.ts.map +1 -0
  32. package/dist/read/config.js +76 -0
  33. package/dist/read/config.js.map +1 -0
  34. package/dist/read/genres.d.ts +7 -0
  35. package/dist/read/genres.d.ts.map +1 -0
  36. package/dist/read/genres.js +38 -0
  37. package/dist/read/genres.js.map +1 -0
  38. package/dist/read/index.d.ts +12 -0
  39. package/dist/read/index.d.ts.map +1 -0
  40. package/dist/read/index.js +23 -0
  41. package/dist/read/index.js.map +1 -0
  42. package/dist/read/internal/scalars.d.ts +23 -0
  43. package/dist/read/internal/scalars.d.ts.map +1 -0
  44. package/dist/read/internal/scalars.js +56 -0
  45. package/dist/read/internal/scalars.js.map +1 -0
  46. package/dist/read/internal/walrus.d.ts +4 -0
  47. package/dist/read/internal/walrus.d.ts.map +1 -0
  48. package/dist/read/internal/walrus.js +23 -0
  49. package/dist/read/internal/walrus.js.map +1 -0
  50. package/dist/read/receipts.d.ts +22 -0
  51. package/dist/read/receipts.d.ts.map +1 -0
  52. package/dist/read/receipts.js +233 -0
  53. package/dist/read/receipts.js.map +1 -0
  54. package/dist/read/types.d.ts +279 -0
  55. package/dist/read/types.d.ts.map +1 -0
  56. package/dist/read/types.js +21 -0
  57. package/dist/read/types.js.map +1 -0
  58. package/dist/read/wallet.d.ts +58 -0
  59. package/dist/read/wallet.d.ts.map +1 -0
  60. package/dist/read/wallet.js +325 -0
  61. package/dist/read/wallet.js.map +1 -0
  62. package/dist/read/works.d.ts +31 -0
  63. package/dist/read/works.d.ts.map +1 -0
  64. package/dist/read/works.js +106 -0
  65. package/dist/read/works.js.map +1 -0
  66. package/package.json +15 -2
  67. package/src/contracts/miso_drop/drop.ts +798 -0
  68. package/src/contracts.ts +4 -0
  69. package/src/drop.ts +266 -0
  70. package/src/index.ts +5 -0
  71. package/src/read/artist.ts +136 -0
  72. package/src/read/catalog.ts +293 -0
  73. package/src/read/client.ts +79 -0
  74. package/src/read/config.ts +164 -0
  75. package/src/read/genres.ts +37 -0
  76. package/src/read/index.ts +53 -0
  77. package/src/read/internal/scalars.ts +57 -0
  78. package/src/read/internal/walrus.ts +32 -0
  79. package/src/read/receipts.ts +266 -0
  80. package/src/read/types.ts +361 -0
  81. package/src/read/wallet.ts +360 -0
  82. package/src/read/works.ts +164 -0
@@ -0,0 +1,325 @@
1
+ // Copyright (c) Miso Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ //
4
+ // Address-scoped reads: what a wallet owns, administers, and can spend.
5
+ //
6
+ // None of this is cacheable at a shared edge — every answer is different per
7
+ // address — but it belongs here anyway, because the VALUE of a single read layer
8
+ // is the response shape, not just the cache. The studio catalog's three-transport
9
+ // dance (owned caps over gRPC → share types over GraphQL → work contents over
10
+ // gRPC) is exactly the sort of thing that should exist once in the SDK rather
11
+ // than be reimplemented by every browser, Worker, server, or native client.
12
+ import { normalizeSuiAddress } from "@mysten/sui/utils";
13
+ import { contracts as partyContracts } from "@misonetwork/miso-party";
14
+ import { getCompositionByShareType, getOwnedReleaseAdminCaps, getRecordingByShareType, getReleaseById, isNotFound, } from "@misonetwork/sdk";
15
+ import { int, u64 } from "./internal/scalars.js";
16
+ import { getRecordingTitles, getWorkAddressesByShareTypes, getWorksByIds } from "./works.js";
17
+ /** The on-chain type suffix every record object shares, across both live packages. */
18
+ export const RECORD_TYPE_SUFFIX = "::record::Record";
19
+ /**
20
+ * Page cap on the owned-objects scan, so a wallet holding a huge unrelated object
21
+ * set can't spin forever. 50/page × 20 = 1000 objects — far beyond any realistic
22
+ * library.
23
+ */
24
+ const MAX_PAGES = 20;
25
+ // ── Records ──────────────────────────────────────────────────────────────────
26
+ function coerceNumber(v) {
27
+ if (typeof v === "number" && Number.isFinite(v))
28
+ return v;
29
+ if (typeof v === "bigint")
30
+ return Number(v);
31
+ if (typeof v === "string" && v.trim() !== "" && Number.isFinite(Number(v)))
32
+ return Number(v);
33
+ return null;
34
+ }
35
+ /**
36
+ * This copy's number in its run, across both record struct layouts: card
37
+ * checkout's `{ release_id, number }` and the SDK view's
38
+ * `{ release_id, edition, variant: { Prototype|Production: { number } } }`.
39
+ * The gRPC JSON enum shape varies by transport, so this probes defensively.
40
+ *
41
+ * Precedence is MOST SPECIFIC FIRST — a top-level `number`, then the variant's
42
+ * `number`, and only then `edition`. miso-app's original
43
+ * (`lib/records.ts:readRecordNumber`) checked `edition` before descending into
44
+ * the variant, so an SDK-view record reported which EDITION it came from (2)
45
+ * where the field means which COPY it is (12). `edition` survives as the last
46
+ * resort for a layout that carries nothing better.
47
+ */
48
+ function readRecordNumber(json) {
49
+ const direct = coerceNumber(json.number);
50
+ if (direct != null)
51
+ return direct;
52
+ const variant = json.variant;
53
+ if (variant && typeof variant === "object") {
54
+ const v = variant;
55
+ const top = coerceNumber(v.number);
56
+ if (top != null)
57
+ return top;
58
+ for (const inner of Object.values(v)) {
59
+ if (inner && typeof inner === "object") {
60
+ const n = coerceNumber(inner.number);
61
+ if (n != null)
62
+ return n;
63
+ }
64
+ }
65
+ }
66
+ return coerceNumber(json.edition);
67
+ }
68
+ function readReleaseId(json) {
69
+ const r = json.release_id ?? json.releaseId;
70
+ return typeof r === "string" && r ? r : null;
71
+ }
72
+ /**
73
+ * The records `owner` holds. Ownership is DIRECT — a record is an address-owned
74
+ * `<pkg>::record::Record` with no pressing/license/receipt intermediary.
75
+ *
76
+ * There is deliberately no `type` filter on the listing: two record packages are
77
+ * live, so we match the `::record::Record` SUFFIX client-side and catch both with
78
+ * no package-id config. Objects that fail to parse are skipped, never thrown.
79
+ */
80
+ export async function getOwnedRecords(client, owner) {
81
+ const out = [];
82
+ let cursor = null;
83
+ for (let page = 0; page < MAX_PAGES; page++) {
84
+ // Annotated: `cursor` is both an input and assigned from the result, which
85
+ // TypeScript reads as a circular initializer without an explicit type.
86
+ const res = await client.protocol.core.listOwnedObjects({
87
+ owner,
88
+ cursor,
89
+ limit: 50,
90
+ include: { json: true },
91
+ });
92
+ for (const obj of res.objects) {
93
+ if (!obj.type || !obj.type.endsWith(RECORD_TYPE_SUFFIX))
94
+ continue;
95
+ const json = (obj.json ?? {});
96
+ out.push({
97
+ id: obj.objectId,
98
+ type: obj.type,
99
+ releaseId: readReleaseId(json),
100
+ number: readRecordNumber(json),
101
+ });
102
+ }
103
+ if (!res.hasNextPage)
104
+ break;
105
+ cursor = res.cursor;
106
+ if (!cursor)
107
+ break;
108
+ }
109
+ return out;
110
+ }
111
+ // ── Parties ──────────────────────────────────────────────────────────────────
112
+ /**
113
+ * The parties `owner` administers. A wallet "owns" a party iff it holds the
114
+ * party's `PartyAdminCap`, so this is one owned-objects listing filtered to the
115
+ * cap type plus a name resolve. Caps are transferable, which is why this is
116
+ * authoritative in a way that remembering created parties client-side is not.
117
+ */
118
+ export async function getOwnedParties(client, owner) {
119
+ const capType = `${client.config.party.partyPackageId}::party::PartyAdminCap`;
120
+ // One page of 50 caps is plenty for launch-scale artists; paginate if labels
121
+ // ever start hitting the cap.
122
+ const { objects } = await client.protocol.core.listOwnedObjects({
123
+ owner,
124
+ type: capType,
125
+ limit: 50,
126
+ include: { content: true },
127
+ });
128
+ const caps = objects.flatMap((obj) => {
129
+ try {
130
+ const cap = partyContracts.party.PartyAdminCap.parse(obj.content);
131
+ return [{ capId: obj.objectId, partyId: cap.party_id }];
132
+ }
133
+ catch {
134
+ return [];
135
+ }
136
+ });
137
+ if (caps.length === 0)
138
+ return [];
139
+ const parties = await client.sui.party.getPartiesByIds(caps.map((c) => c.partyId));
140
+ return caps.flatMap(({ capId, partyId }) => {
141
+ const p = parties[partyId];
142
+ return p ? [{ partyId, capId, name: p.name, kind: p.kind }] : [];
143
+ });
144
+ }
145
+ // ── Works (studio catalog) ───────────────────────────────────────────────────
146
+ /**
147
+ * Owned generic admin caps over gRPC. The bare type filter matches every
148
+ * instantiation of `CompositionAdminCap<T>` / `RecordingAdminCap<T>`; the share
149
+ * type `T` is parsed back out of each instance's type tag, because the cap does
150
+ * not store the work's id — only its share type.
151
+ */
152
+ async function ownedGenericCaps(client, owner, capType) {
153
+ const { objects } = await client.protocol.core.listOwnedObjects({ owner, type: capType, limit: 50 });
154
+ const caps = [];
155
+ for (const obj of objects) {
156
+ const match = /<(.+)>$/.exec(obj.type);
157
+ if (match?.[1])
158
+ caps.push({ id: obj.objectId, shareType: match[1] });
159
+ }
160
+ return caps;
161
+ }
162
+ /**
163
+ * Every work the wallet administers, keyed by its ADMIN CAP id (the studio
164
+ * catalog's routing unit — caps are what control means here).
165
+ *
166
+ * Three transports, one answer: cap discovery is gRPC; one aliased GraphQL
167
+ * request maps every share type to its work address (gRPC cannot ask "which
168
+ * object has type X"); one gRPC batch loads all the work contents. Releases skip
169
+ * the GraphQL hop entirely — `ReleaseAdminCap` is not generic and carries
170
+ * `release_id` directly.
171
+ */
172
+ export async function getOwnedWorks(client, owner) {
173
+ const miso = client.config.protocol.miso;
174
+ const [compCaps, recCaps, relCaps] = await Promise.all([
175
+ ownedGenericCaps(client, owner, `${miso}::composition::CompositionAdminCap`),
176
+ ownedGenericCaps(client, owner, `${miso}::recording::RecordingAdminCap`),
177
+ getOwnedReleaseAdminCaps(client.protocol, owner, miso),
178
+ ]);
179
+ const addresses = await getWorkAddressesByShareTypes(client.graphql, { compositions: compCaps.map((c) => c.shareType), recordings: recCaps.map((c) => c.shareType) }, miso);
180
+ const works = await getWorksByIds(client.protocol, {
181
+ compositions: Object.values(addresses.compositions).filter((id) => id !== undefined),
182
+ recordings: Object.values(addresses.recordings).filter((id) => id !== undefined),
183
+ releases: relCaps.map((c) => c.releaseId),
184
+ });
185
+ const recordingTitles = await getRecordingTitles(client.protocol, client.graphql, Object.values(addresses.recordings).filter((id) => id !== undefined), miso);
186
+ const comps = compCaps.flatMap((cap) => {
187
+ const workId = addresses.compositions[cap.shareType];
188
+ const composition = workId ? works.compositions[workId] : undefined;
189
+ if (!workId || !composition)
190
+ return [];
191
+ return [{ capId: cap.id, kind: "composition", workId, title: composition.title, state: composition.state.type }];
192
+ });
193
+ const recs = recCaps.flatMap((cap) => {
194
+ const workId = addresses.recordings[cap.shareType];
195
+ const recording = workId ? works.recordings[workId] : undefined;
196
+ if (!workId || !recording)
197
+ return [];
198
+ return [{
199
+ capId: cap.id,
200
+ kind: "recording",
201
+ workId,
202
+ title: recordingTitles[workId] ?? "Untitled",
203
+ state: recording.state.type,
204
+ }];
205
+ });
206
+ const rels = relCaps.flatMap((cap) => {
207
+ const release = works.releases[cap.releaseId];
208
+ if (!release)
209
+ return [];
210
+ return [{ capId: cap.id, kind: "release", workId: release.id, title: release.title, state: release.state.type }];
211
+ });
212
+ return [...comps, ...recs, ...rels];
213
+ }
214
+ /** Classify a cap by its on-chain type, then resolve the work behind it. */
215
+ export async function getWorkByCap(client, capId) {
216
+ const miso = client.config.protocol.miso;
217
+ let type;
218
+ let json;
219
+ try {
220
+ const { object } = await client.protocol.core.getObject({ objectId: capId, include: { json: true } });
221
+ type = object.type;
222
+ json = (object.json ?? null);
223
+ }
224
+ catch (e) {
225
+ if (isNotFound(e))
226
+ return null;
227
+ throw e;
228
+ }
229
+ if (type.startsWith(`${miso}::composition::CompositionAdminCap<`)) {
230
+ const shareType = type.slice(type.indexOf("<") + 1, -1);
231
+ const c = await getCompositionByShareType(client.protocol, client.graphql, shareType, miso);
232
+ return {
233
+ capId,
234
+ kind: "composition",
235
+ workId: c.id,
236
+ title: c.title,
237
+ state: c.state.type,
238
+ royaltyRateBps: int(c.royaltyRate.value),
239
+ shareType,
240
+ };
241
+ }
242
+ if (type.startsWith(`${miso}::recording::RecordingAdminCap<`)) {
243
+ const shareType = type.slice(type.indexOf("<") + 1, -1);
244
+ const r = await getRecordingByShareType(client.protocol, client.graphql, shareType, miso);
245
+ const titles = await getRecordingTitles(client.protocol, client.graphql, [r.id], miso);
246
+ return {
247
+ capId,
248
+ kind: "recording",
249
+ workId: r.id,
250
+ title: titles[r.id] ?? "Untitled",
251
+ state: r.state.type,
252
+ shareType,
253
+ };
254
+ }
255
+ if (type.startsWith(`${miso}::release::ReleaseAdminCap`)) {
256
+ const releaseId = typeof json?.release_id === "string" ? json.release_id : null;
257
+ if (!releaseId)
258
+ throw new Error(`Release cap ${capId} carries no release id`);
259
+ const r = await getReleaseById(client.protocol, releaseId);
260
+ return {
261
+ capId,
262
+ kind: "release",
263
+ workId: r.id,
264
+ title: r.title,
265
+ state: r.state.type,
266
+ discCount: r.tracks.length > 0 ? 1 : 0,
267
+ trackCount: r.tracks.length,
268
+ };
269
+ }
270
+ // A real object, but not a work admin cap — "no such work", not an error.
271
+ return null;
272
+ }
273
+ // ── Balance ──────────────────────────────────────────────────────────────────
274
+ /**
275
+ * A wallet's spendable balance in one currency. `core.getBalance` totals coin
276
+ * OBJECTS and the address balance, so funds that arrived either way are counted —
277
+ * which matters because `balance::send_funds` (how the app transfers dollars)
278
+ * credits the address balance, not a coin.
279
+ */
280
+ export async function getBalance(client, address, coinType) {
281
+ const type = coinType ?? client.config.money.usdCoinType;
282
+ const res = await client.protocol.core.getBalance({ owner: address, coinType: type });
283
+ return {
284
+ address: normalizeSuiAddress(address),
285
+ coinType: type,
286
+ balance: u64(res.balance.balance),
287
+ decimals: type === client.config.money.usdCoinType ? client.config.money.usdDecimals : 9,
288
+ };
289
+ }
290
+ // ── Ownership ────────────────────────────────────────────────────────────────
291
+ function isAddressOwner(owner, address) {
292
+ const o = owner;
293
+ return (o?.$kind === "AddressOwner" && !!o.AddressOwner && normalizeSuiAddress(o.AddressOwner) === normalizeSuiAddress(address));
294
+ }
295
+ /**
296
+ * Whether `address` controls a party — i.e. holds its `PartyAdminCap`. The cap is
297
+ * a DERIVED object of the party, so this is one `getObject` on a computed id, no
298
+ * search. The chain enforces writes regardless; this drives the UI and hands back
299
+ * the cap id that owner-gated writes need.
300
+ *
301
+ * A failed read means "can't confirm", which resolves to `false` — the editor
302
+ * stays hidden rather than being offered and then rejected on submit.
303
+ */
304
+ export async function ownsParty(client, address, partyId) {
305
+ const capId = client.sui.party.derivePartyAdminCapId(partyId);
306
+ const isOwner = await client.protocol.core
307
+ .getObject({ objectId: capId })
308
+ .then(({ object }) => isAddressOwner(object?.owner, address))
309
+ .catch(() => false);
310
+ return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId };
311
+ }
312
+ /**
313
+ * Whether `address` owns a record. Records are address-owned objects, so this is
314
+ * one `getObject` and an owner compare. Presentation gating only — it decides
315
+ * whether the Snapshots tab appears, and a non-owner has no snapshot content to
316
+ * fetch regardless.
317
+ */
318
+ export async function ownsRecord(client, address, recordId) {
319
+ const isOwner = await client.protocol.core
320
+ .getObject({ objectId: recordId })
321
+ .then(({ object }) => isAddressOwner(object?.owner, address))
322
+ .catch(() => false);
323
+ return { address: normalizeSuiAddress(address), objectId: recordId, isOwner };
324
+ }
325
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/read/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ClientWithCoreApi } from "@mysten/sui/client";
2
+ import type { SuiGraphQLClient } from "@mysten/sui/graphql";
3
+ import { type Composition, type Recording, type Release } from "@misonetwork/sdk";
4
+ export interface WorkShareTypes {
5
+ compositions: readonly string[];
6
+ recordings: readonly string[];
7
+ }
8
+ export interface WorkAddressesByShareType {
9
+ compositions: Partial<Record<string, string>>;
10
+ recordings: Partial<Record<string, string>>;
11
+ }
12
+ /** Resolve work share types without relying on unpublished protocol helpers. */
13
+ export declare function getWorkAddressesByShareTypes(client: SuiGraphQLClient, shareTypes: WorkShareTypes, misoPackageId: string): Promise<WorkAddressesByShareType>;
14
+ export interface WorkIds {
15
+ compositions: readonly string[];
16
+ recordings: readonly string[];
17
+ releases: readonly string[];
18
+ }
19
+ export interface WorksById {
20
+ compositions: Partial<Record<string, Composition>>;
21
+ recordings: Partial<Record<string, Recording>>;
22
+ releases: Partial<Record<string, Release>>;
23
+ }
24
+ /** Fetch each work kind through the authoritative protocol SDK. */
25
+ export declare function getWorksByIds(client: ClientWithCoreApi, ids: WorkIds): Promise<WorksById>;
26
+ /**
27
+ * Resolve display titles for both deployed recording layouts. Older recordings
28
+ * carry `title` in JSON; current recordings inherit it from their composition.
29
+ */
30
+ export declare function getRecordingTitles(client: ClientWithCoreApi, graphql: SuiGraphQLClient, recordingIds: readonly string[], misoPackageId: string): Promise<Record<string, string>>;
31
+ //# sourceMappingURL=works.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"works.d.ts","sourceRoot":"","sources":["../../src/read/works.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,OAAO,EACb,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C;AAWD,gFAAgF;AAChF,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,cAAc,EAC1B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,wBAAwB,CAAC,CAmDnC;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACnD,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/C,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC5C;AAED,mEAAmE;AACnE,wBAAsB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAO/F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwCjC"}
@@ -0,0 +1,106 @@
1
+ // Copyright (c) Miso Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { extractTypeParams2, getCompositionsByIds, getRecordingsByIds, getReleasesByIds, } from "@misonetwork/sdk";
4
+ /** Resolve work share types without relying on unpublished protocol helpers. */
5
+ export async function getWorkAddressesByShareTypes(client, shareTypes, misoPackageId) {
6
+ const compositions = [...new Set(shareTypes.compositions)];
7
+ const recordingSet = new Set(shareTypes.recordings);
8
+ const out = { compositions: {}, recordings: {} };
9
+ const compositionEntries = await Promise.all(compositions.map(async (shareType) => {
10
+ const type = `${misoPackageId}::composition::Composition<${shareType}>`;
11
+ const result = await client.query({
12
+ query: `query WorkByType($type: String!) {
13
+ objects(filter: { type: $type }) {
14
+ nodes { address asMoveObject { contents { type { repr } } } }
15
+ }
16
+ }`,
17
+ variables: { type },
18
+ });
19
+ if (result.errors?.length)
20
+ throw new Error(result.errors[0].message);
21
+ return [shareType, result.data?.objects?.nodes[0]?.address];
22
+ }));
23
+ for (const [shareType, address] of compositionEntries) {
24
+ if (address)
25
+ out.compositions[shareType] = address;
26
+ }
27
+ if (recordingSet.size > 0) {
28
+ const type = `${misoPackageId}::recording::Recording`;
29
+ const result = await client.query({
30
+ query: `query RecordingsByType($type: String!) {
31
+ objects(filter: { type: $type }) {
32
+ nodes { address asMoveObject { contents { type { repr } } } }
33
+ }
34
+ }`,
35
+ variables: { type },
36
+ });
37
+ if (result.errors?.length)
38
+ throw new Error(result.errors[0].message);
39
+ for (const node of result.data?.objects?.nodes ?? []) {
40
+ const repr = node.asMoveObject?.contents?.type.repr;
41
+ if (!repr)
42
+ continue;
43
+ let recordingShareType;
44
+ try {
45
+ [recordingShareType] = extractTypeParams2(repr);
46
+ }
47
+ catch {
48
+ recordingShareType = /<(.+)>$/.exec(repr)?.[1]?.trim();
49
+ }
50
+ if (recordingShareType && recordingSet.has(recordingShareType)) {
51
+ out.recordings[recordingShareType] = node.address;
52
+ }
53
+ }
54
+ }
55
+ return out;
56
+ }
57
+ /** Fetch each work kind through the authoritative protocol SDK. */
58
+ export async function getWorksByIds(client, ids) {
59
+ const [compositions, recordings, releases] = await Promise.all([
60
+ getCompositionsByIds(client, [...ids.compositions]),
61
+ getRecordingsByIds(client, [...ids.recordings]),
62
+ getReleasesByIds(client, [...ids.releases]),
63
+ ]);
64
+ return { compositions, recordings, releases };
65
+ }
66
+ /**
67
+ * Resolve display titles for both deployed recording layouts. Older recordings
68
+ * carry `title` in JSON; current recordings inherit it from their composition.
69
+ */
70
+ export async function getRecordingTitles(client, graphql, recordingIds, misoPackageId) {
71
+ const ids = [...new Set(recordingIds)];
72
+ if (ids.length === 0)
73
+ return {};
74
+ const { objects } = await client.core.getObjects({ objectIds: ids, include: { json: true } });
75
+ const titles = {};
76
+ const compositionShareByRecording = {};
77
+ for (const object of objects) {
78
+ if (object instanceof Error)
79
+ continue;
80
+ const json = object.json;
81
+ if (typeof json?.title === "string" && json.title) {
82
+ titles[object.objectId] = json.title;
83
+ continue;
84
+ }
85
+ try {
86
+ const [, compositionShareType] = extractTypeParams2(object.type);
87
+ compositionShareByRecording[object.objectId] = compositionShareType;
88
+ }
89
+ catch {
90
+ // A deployed layout with no composition type and no JSON title remains Untitled.
91
+ }
92
+ }
93
+ const compositionShareTypes = Object.values(compositionShareByRecording);
94
+ if (compositionShareTypes.length === 0)
95
+ return titles;
96
+ const addresses = await getWorkAddressesByShareTypes(graphql, { compositions: compositionShareTypes, recordings: [] }, misoPackageId);
97
+ const compositions = await getCompositionsByIds(client, Object.values(addresses.compositions).filter((id) => !!id));
98
+ for (const [recordingId, shareType] of Object.entries(compositionShareByRecording)) {
99
+ const compositionId = addresses.compositions[shareType];
100
+ const title = compositionId ? compositions[compositionId]?.title : undefined;
101
+ if (title)
102
+ titles[recordingId] = title;
103
+ }
104
+ return titles;
105
+ }
106
+ //# sourceMappingURL=works.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"works.js","sourceRoot":"","sources":["../../src/read/works.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,sCAAsC;AAItC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,GAIjB,MAAM,kBAAkB,CAAC;AAqB1B,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAwB,EACxB,UAA0B,EAC1B,aAAqB;IAErB,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,GAAG,GAA6B,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAE3E,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC1C,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,GAAG,aAAa,8BAA8B,SAAS,GAAG,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAwC;YACvE,KAAK,EAAE;;;;UAIL;YACF,SAAS,EAAE,EAAE,IAAI,EAAE;SACpB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAU,CAAC;IACvE,CAAC,CAAC,CACH,CAAC;IACF,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACtD,IAAI,OAAO;YAAE,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IACrD,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,GAAG,aAAa,wBAAwB,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAwC;YACvE,KAAK,EAAE;;;;QAIL;YACF,SAAS,EAAE,EAAE,IAAI,EAAE;SACpB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC;QACtE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;YACpD,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,kBAAsC,CAAC;YAC3C,IAAI,CAAC;gBACH,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACzD,CAAC;YACD,IAAI,kBAAkB,IAAI,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC/D,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAcD,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAyB,EAAE,GAAY;IACzE,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7D,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;QACnD,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,gBAAgB,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;KAC5C,CAAC,CAAC;IACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAyB,EACzB,OAAyB,EACzB,YAA+B,EAC/B,aAAqB;IAErB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9F,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,2BAA2B,GAA2B,EAAE,CAAC;IAE/D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,YAAY,KAAK;YAAE,SAAS;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAkC,CAAC;QACvD,IAAI,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACrC,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,EAAE,oBAAoB,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,2BAA2B,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,oBAAoB,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,iFAAiF;QACnF,CAAC;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACzE,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,4BAA4B,CAClD,OAAO,EACP,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,EAAE,EAAE,EACvD,aAAa,CACd,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAC7C,MAAM,EACN,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACzE,CAAC;IACF,KAAK,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,EAAE,CAAC;QACnF,MAAM,aAAa,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,IAAI,KAAK;YAAE,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@misofm/sdk",
3
- "version": "0.2.1",
4
- "description": "Typed query helpers and transaction builders for the Miso platform layer on Sui \u2014 pressings, listings, records, and opinionated work publishing.",
3
+ "version": "0.3.0",
4
+ "description": "Complete client SDK for the Miso platform on Sui \u2014 high-level reads, pressings, listings, records, and work publishing.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -72,6 +72,18 @@
72
72
  "types": "./dist/cover.d.ts",
73
73
  "default": "./dist/cover.js"
74
74
  },
75
+ "./read": {
76
+ "types": "./dist/read/index.d.ts",
77
+ "default": "./dist/read/index.js"
78
+ },
79
+ "./read/types": {
80
+ "types": "./dist/read/types.d.ts",
81
+ "default": "./dist/read/types.js"
82
+ },
83
+ "./drop": {
84
+ "types": "./dist/drop.d.ts",
85
+ "default": "./dist/drop.js"
86
+ },
75
87
  "./extensions/royalty-pool": {
76
88
  "types": "./dist/extensions/royalty-pool.d.ts",
77
89
  "default": "./dist/extensions/royalty-pool.js"
@@ -105,6 +117,7 @@
105
117
  "typescript": "^5"
106
118
  },
107
119
  "dependencies": {
120
+ "@misonetwork/miso-party": "^0.1.1",
108
121
  "@misonetwork/sdk": "^0.3.1"
109
122
  },
110
123
  "main": "./dist/index.js"