@misofm/platform 0.0.0 → 0.19.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 +459 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +783 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/contracts.d.ts +33 -0
  16. package/dist/contracts.d.ts.map +1 -0
  17. package/dist/contracts.js +48 -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 +221 -0
  28. package/dist/deployments.d.ts.map +1 -0
  29. package/dist/deployments.js +176 -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 +215 -0
  52. package/dist/publication.d.ts.map +1 -0
  53. package/dist/publication.js +864 -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 +58 -0
  108. package/dist/recording-extensions.d.ts.map +1 -0
  109. package/dist/recording-extensions.js +148 -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 +1310 -0
  139. package/src/contracts.ts +53 -0
  140. package/src/cover.ts +240 -0
  141. package/src/credits.ts +906 -0
  142. package/src/deployments.ts +354 -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 +1205 -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 +241 -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,398 @@
1
+ // Copyright (c) Miso Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ //
4
+ // What one record sale actually was, read back from its transaction.
5
+ //
6
+ // The transaction digest plus Record ID is the receipt's identity: everything shown is
7
+ // re-derived from chain state, so a receipt link survives a refresh, a deep link,
8
+ // or a share to another device. `listing::purchase` emits `RecordSoldEvent` carrying
9
+ // the copy that was minted, its number in the run, and what the buyer paid.
10
+ //
11
+ // Two reads, in order, because a receipt is opened at two very different ages:
12
+ // fullnode the fresh path — usually the instant the transaction lands, possibly
13
+ // before this node has it, hence `waitForTransaction`.
14
+ // indexer the old path — GraphQL keeps transactions the fullnode has pruned.
15
+ // This is what makes a months-old receipt link still open.
16
+ //
17
+ // Where the money goes is PRESENTATIONAL, not a second on-chain fact: `purchase`
18
+ // forwards the whole payment to the release's funds accumulator (there is no
19
+ // platform fee), and the royalty layer splits it downstream by the same terms this
20
+ // read walks. We show the buyer that arithmetic, in the same truncating integer
21
+ // math the chain does.
22
+ import * as listingContract from "@misofm/protocol/contracts/miso_record_shop/listing";
23
+ import { extractTypeParams2, getCompositionsByIds, } from "@misofm/protocol";
24
+ import { normalizeStructTag, normalizeSuiAddress } from "@mysten/sui/utils";
25
+ import { getPressingDetail } from "./catalog.js";
26
+ import { int } from "./internal/scalars.js";
27
+ import { requireRecordSalesDeployment } from "../deployments.js";
28
+ import { getWorkAddressesByShareTypes } from "./works.js";
29
+ const BPS = 10000n;
30
+ const U64_MAX = (1n << 64n) - 1n;
31
+ /** `miso_record_shop::listing::RecordSoldEvent<Currency>`. */
32
+ const RECORD_SOLD_EVENT_NAME = "listing::RecordSoldEvent";
33
+ /**
34
+ * How long to wait for the fullnode to have the transaction before falling back
35
+ * to the indexer. Propagation is p95 ~330ms, so this only ever runs long for a
36
+ * digest the node genuinely doesn't have.
37
+ */
38
+ const FULLNODE_WAIT_MS = 5_000;
39
+ export class MalformedRecordSoldEventError extends Error {
40
+ name = "MalformedRecordSoldEventError";
41
+ }
42
+ function coerceU64(v) {
43
+ const value = typeof v === "bigint"
44
+ ? v
45
+ : typeof v === "number" && Number.isSafeInteger(v)
46
+ ? BigInt(v)
47
+ : typeof v === "string" && /^\d+$/.test(v)
48
+ ? BigInt(v)
49
+ : null;
50
+ return value !== null && value >= 0n && value <= U64_MAX ? value : null;
51
+ }
52
+ function priceFromUnknown(value) {
53
+ if (!value || typeof value !== "object")
54
+ return null;
55
+ const variants = value;
56
+ const fixed = variants.$kind === "Fixed" || Object.hasOwn(variants, "Fixed");
57
+ const floor = variants.$kind === "Floor" || Object.hasOwn(variants, "Floor");
58
+ if (fixed === floor)
59
+ return null;
60
+ const amount = coerceU64(fixed ? variants.Fixed : variants.Floor);
61
+ return amount == null || amount <= 0n
62
+ ? null
63
+ : { kind: fixed ? "fixed" : "floor", amount: amount.toString() };
64
+ }
65
+ function typeName(value) {
66
+ const raw = typeof value === "string"
67
+ ? value
68
+ : value && typeof value === "object"
69
+ ? value.name
70
+ : null;
71
+ if (typeof raw !== "string" || !raw)
72
+ return null;
73
+ try {
74
+ return normalizeStructTag(raw);
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ function positiveU32(value) {
81
+ const bigint = coerceU64(value);
82
+ return bigint == null || bigint <= 0n || bigint > 0xffffffffn
83
+ ? null
84
+ : Number(bigint);
85
+ }
86
+ function positiveU16(value) {
87
+ const number = positiveU32(value);
88
+ return number == null || number > 0xffff ? null : number;
89
+ }
90
+ function validPricingRelationship(purchasePrice, pricing) {
91
+ const configured = BigInt(pricing.amount);
92
+ return pricing.kind === "fixed"
93
+ ? purchasePrice === configured
94
+ : purchasePrice >= configured;
95
+ }
96
+ /**
97
+ * The event's JSON projection — the fallback for transports that surface `json`
98
+ * but no BCS. Field names are the Move ones (snake_case).
99
+ */
100
+ function saleFromJson(json, currencyType) {
101
+ const edition = positiveU16(json.edition);
102
+ const number = positiveU32(json.number);
103
+ const purchasePrice = coerceU64(json.purchase_price);
104
+ const purchasedTimestampMs = coerceU64(json.purchased_timestamp_ms);
105
+ const recordId = json.record_id;
106
+ const pricing = priceFromUnknown(json.pricing);
107
+ const embeddedCurrency = typeName(json.purchase_currency);
108
+ if (edition == null ||
109
+ number == null ||
110
+ purchasePrice == null || purchasePrice <= 0n ||
111
+ purchasedTimestampMs == null ||
112
+ !pricing || !validPricingRelationship(purchasePrice, pricing) ||
113
+ embeddedCurrency !== currencyType ||
114
+ typeof recordId !== "string" || !recordId ||
115
+ typeof json.listing_id !== "string" || !json.listing_id ||
116
+ typeof json.pressing_id !== "string" || !json.pressing_id ||
117
+ typeof json.release_id !== "string" || !json.release_id ||
118
+ typeof json.purchased_by !== "string" || !json.purchased_by)
119
+ return null;
120
+ return {
121
+ listingId: json.listing_id,
122
+ pressingId: json.pressing_id,
123
+ releaseId: json.release_id,
124
+ recordId,
125
+ edition,
126
+ number,
127
+ purchaseCurrency: embeddedCurrency,
128
+ purchasePrice: purchasePrice.toString(),
129
+ pricing,
130
+ currencyType,
131
+ purchasedBy: json.purchased_by,
132
+ purchasedTimestampMs: purchasedTimestampMs.toString(),
133
+ };
134
+ }
135
+ /**
136
+ * Whether `eventType` is this deployment's `listing::RecordSoldEvent<Currency>`.
137
+ *
138
+ * Event BCS is structural, so a same-shaped event from another package must never
139
+ * be decoded as a Miso sale. Normalize both package/type tags and require exactly
140
+ * one (possibly nested) currency type argument.
141
+ */
142
+ export function recordSoldCurrencyType(eventType, recordShopPackageId) {
143
+ let tag;
144
+ try {
145
+ tag = normalizeStructTag(eventType);
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ const prefix = `${normalizeSuiAddress(recordShopPackageId)}::${RECORD_SOLD_EVENT_NAME}`;
151
+ if (!tag.startsWith(`${prefix}<`) || !tag.endsWith(">"))
152
+ return null;
153
+ const typeArgument = tag.slice(prefix.length + 1, -1);
154
+ if (!typeArgument)
155
+ return null;
156
+ let depth = 0;
157
+ for (const char of typeArgument) {
158
+ if (char === "<")
159
+ depth += 1;
160
+ else if (char === ">") {
161
+ depth -= 1;
162
+ if (depth < 0)
163
+ return null;
164
+ }
165
+ else if (char === "," && depth === 0) {
166
+ return null;
167
+ }
168
+ }
169
+ return depth === 0 ? typeArgument : null;
170
+ }
171
+ export function isRecordSoldEventType(eventType, recordShopPackageId) {
172
+ return recordSoldCurrencyType(eventType, recordShopPackageId) !== null;
173
+ }
174
+ /**
175
+ * The sale a transaction recorded, or null if it emitted none. BCS is the stable
176
+ * shape (a JSON projection's field names vary by transport), so it is tried first.
177
+ */
178
+ export function findRecordSales(events, recordShopPackageId) {
179
+ const sales = [];
180
+ for (const e of events) {
181
+ const currencyType = recordSoldCurrencyType(e.eventType, recordShopPackageId);
182
+ if (!currencyType)
183
+ continue;
184
+ try {
185
+ // The generated struct decodes addresses to 0x-hex and u64s to decimal strings.
186
+ const s = listingContract.RecordSoldEvent.parse(e.bcs);
187
+ const pricing = priceFromUnknown(s.pricing);
188
+ const embeddedCurrency = typeName(s.purchase_currency);
189
+ const purchasePrice = BigInt(s.purchase_price);
190
+ if (!pricing || embeddedCurrency !== currencyType ||
191
+ !validPricingRelationship(purchasePrice, pricing) ||
192
+ s.edition <= 0 || s.number <= 0)
193
+ throw new MalformedRecordSoldEventError("malformed canonical RecordSoldEvent");
194
+ sales.push({
195
+ listingId: s.listing_id,
196
+ pressingId: s.pressing_id,
197
+ releaseId: s.release_id,
198
+ recordId: s.record_id,
199
+ edition: s.edition,
200
+ number: s.number,
201
+ purchaseCurrency: embeddedCurrency,
202
+ purchasePrice: s.purchase_price,
203
+ pricing,
204
+ currencyType,
205
+ purchasedBy: s.purchased_by,
206
+ purchasedTimestampMs: s.purchased_timestamp_ms,
207
+ });
208
+ continue;
209
+ }
210
+ catch (error) {
211
+ // Never reinterpret malformed canonical BCS through a looser JSON view.
212
+ if (e.bcs.length > 0) {
213
+ if (error instanceof MalformedRecordSoldEventError)
214
+ throw error;
215
+ throw new MalformedRecordSoldEventError(`malformed canonical RecordSoldEvent BCS: ${error instanceof Error ? error.message : String(error)}`);
216
+ }
217
+ }
218
+ const fromJson = e.json && saleFromJson(e.json, currencyType);
219
+ if (!fromJson)
220
+ throw new MalformedRecordSoldEventError("malformed canonical RecordSoldEvent JSON");
221
+ sales.push(fromJson);
222
+ }
223
+ return sales;
224
+ }
225
+ /** Select one canonical sale by its Record ID. Selection is always explicit. */
226
+ export function findRecordSale(events, recordShopPackageId, recordId) {
227
+ const sales = findRecordSales(events, recordShopPackageId);
228
+ return sales.find((sale) => normalizeSuiAddress(sale.recordId) === normalizeSuiAddress(recordId)) ?? null;
229
+ }
230
+ /** Every canonical sale, read from the fullnode in event order. */
231
+ async function salesFromFullnode(client, txDigest) {
232
+ const result = await client.sui.waitForTransaction({
233
+ digest: txDigest,
234
+ include: { events: true },
235
+ timeout: FULLNODE_WAIT_MS,
236
+ });
237
+ if (result.$kind !== "Transaction" || !result.Transaction.status.success) {
238
+ throw new Error(`Transaction did not succeed: ${txDigest}`);
239
+ }
240
+ const sales = requireRecordSalesDeployment(client.config.recordSales);
241
+ const found = findRecordSales(result.Transaction.events, sales.recordShopPackageId);
242
+ if (found.length === 0)
243
+ throw new Error(`No record purchase in transaction ${txDigest}`);
244
+ return found;
245
+ }
246
+ const TX_EVENTS_QUERY = `query TransactionEvents($digest: String!) {
247
+ transaction(digest: $digest) {
248
+ effects {
249
+ status
250
+ events { nodes { contents { type { repr } json } } }
251
+ }
252
+ }
253
+ }`;
254
+ /** Every canonical sale, read from the GraphQL indexer in event order. */
255
+ async function salesFromIndexer(client, txDigest) {
256
+ const { data, errors } = await client.graphqlRaw.query({
257
+ query: TX_EVENTS_QUERY,
258
+ variables: { digest: txDigest },
259
+ });
260
+ if (errors?.length)
261
+ throw new Error(errors[0].message);
262
+ const effects = data?.transaction?.effects;
263
+ if (!effects)
264
+ throw new Error(`Transaction not found: ${txDigest}`);
265
+ if (effects.status !== "SUCCESS")
266
+ throw new Error(`Transaction did not succeed: ${txDigest}`);
267
+ const salesDeployment = requireRecordSalesDeployment(client.config.recordSales);
268
+ const sales = [];
269
+ for (const node of effects.events?.nodes ?? []) {
270
+ const contents = node.contents;
271
+ if (!contents)
272
+ continue;
273
+ const currencyType = recordSoldCurrencyType(contents.type.repr, salesDeployment.recordShopPackageId);
274
+ if (!currencyType)
275
+ continue;
276
+ const sale = typeof contents.json === "object" && contents.json !== null
277
+ ? saleFromJson(contents.json, currencyType)
278
+ : null;
279
+ if (!sale)
280
+ throw new MalformedRecordSoldEventError("malformed canonical RecordSoldEvent JSON");
281
+ sales.push(sale);
282
+ }
283
+ if (sales.length > 0)
284
+ return sales;
285
+ throw new Error(`No record purchase in transaction ${txDigest}`);
286
+ }
287
+ async function salesFromChain(client, txDigest) {
288
+ return salesFromFullnode(client, txDigest).catch((error) => {
289
+ if (error instanceof MalformedRecordSoldEventError)
290
+ throw error;
291
+ return salesFromIndexer(client, txDigest);
292
+ });
293
+ }
294
+ /**
295
+ * Each recording's parent composition royalty rate, in basis points, keyed by
296
+ * recording id.
297
+ *
298
+ * A `Recording<RecordingShare, CompositionShare>` names its parent by SHARE TYPE,
299
+ * not by id, so the hop is: recording type tag → composition share type →
300
+ * (GraphQL) composition id → (Core) the composition's `royaltyRate`.
301
+ *
302
+ * Best-effort by design: any failure returns the rates resolved so far, and the
303
+ * receipt drops to a track-level breakdown rather than failing the whole page.
304
+ */
305
+ async function compositionRatesByRecording(client, recordingIds) {
306
+ if (recordingIds.length === 0)
307
+ return {};
308
+ const shareTypeByRecording = {};
309
+ const { objects } = await client.protocol.core.getObjects({ objectIds: [...new Set(recordingIds)] });
310
+ for (const obj of objects) {
311
+ if (obj instanceof Error || !obj.type)
312
+ continue;
313
+ try {
314
+ const [, compositionShareType] = extractTypeParams2(obj.type);
315
+ shareTypeByRecording[obj.objectId] = compositionShareType;
316
+ }
317
+ catch {
318
+ // A recording type we can't read the parent off — skip this track.
319
+ }
320
+ }
321
+ const shareTypes = Object.values(shareTypeByRecording);
322
+ if (shareTypes.length === 0)
323
+ return {};
324
+ const addresses = await getWorkAddressesByShareTypes(client.graphql, { compositions: shareTypes, recordings: [] }, client.config.deployment.miso);
325
+ const compositionIds = Object.values(addresses.compositions).filter((id) => !!id);
326
+ const compositions = await getCompositionsByIds(client.protocol, compositionIds);
327
+ const rates = {};
328
+ for (const [recordingId, shareType] of Object.entries(shareTypeByRecording)) {
329
+ const compositionId = addresses.compositions[shareType];
330
+ const composition = compositionId ? compositions[compositionId] : undefined;
331
+ if (composition)
332
+ rates[recordingId] = int(composition.royaltyRate.value);
333
+ }
334
+ return rates;
335
+ }
336
+ /**
337
+ * Split `paid` across the release's tracks by their `splitBps`, then split each
338
+ * track's share between its composition and its recording. All BigInt — the same
339
+ * truncating integer math the on-chain royalty layer does, so the numbers shown
340
+ * are the numbers paid.
341
+ */
342
+ export function breakdown(tracks, paid, compositionRates) {
343
+ const paidUnits = BigInt(paid);
344
+ return tracks.map((track) => {
345
+ const amount = (paidUnits * BigInt(track.splitBps)) / BPS;
346
+ const rate = compositionRates[track.recordingId];
347
+ const base = {
348
+ no: track.no,
349
+ title: track.title,
350
+ recordingId: track.recordingId,
351
+ splitBps: track.splitBps,
352
+ amount: amount.toString(),
353
+ };
354
+ if (rate == null)
355
+ return { ...base, composition: null, recording: null };
356
+ const composition = (amount * BigInt(rate)) / BPS;
357
+ return { ...base, composition: composition.toString(), recording: (amount - composition).toString() };
358
+ });
359
+ }
360
+ /**
361
+ * The receipt for `txDigest`. The event identifies the exact immutable Pressing
362
+ * and Listing; callers cannot accidentally reinterpret a Pressing id as an
363
+ * obsolete sale-object id.
364
+ *
365
+ * The sale identifies the Pressing before its detail is fetched. `null` only when
366
+ * that immutable Pressing cannot be read; it is never superseded or destroyed.
367
+ */
368
+ async function hydratePurchaseReceipt(client, sale) {
369
+ const detail = await getPressingDetail(client, sale.pressingId);
370
+ if (!detail)
371
+ return null;
372
+ // Best-effort: a failed composition lookup costs the sub-rows, not the page.
373
+ const rates = await compositionRatesByRecording(client, detail.release.tracks.map((t) => t.recordingId)).catch(() => ({}));
374
+ return {
375
+ sale,
376
+ detail,
377
+ price: sale.pricing.amount,
378
+ tracks: breakdown(detail.release.tracks, sale.purchasePrice, rates),
379
+ };
380
+ }
381
+ /** Read and hydrate every canonical Record sale in transaction event order. */
382
+ export async function getPurchaseReceipts(client, txDigest) {
383
+ const sales = await salesFromChain(client, txDigest);
384
+ const hydrated = await Promise.all(sales.map((sale) => hydratePurchaseReceipt(client, sale)));
385
+ if (hydrated.some((receipt) => receipt === null)) {
386
+ throw new Error(`A canonical Record sale in transaction ${txDigest} references an unreadable Pressing`);
387
+ }
388
+ return hydrated;
389
+ }
390
+ /** Read one canonical receipt selected by its Record ID. Selection is mandatory:
391
+ * one transaction may purchase multiple Records from the same Pressing. */
392
+ export async function getPurchaseReceipt(client, txDigest, recordId) {
393
+ const sales = await salesFromChain(client, txDigest);
394
+ const wanted = normalizeSuiAddress(recordId);
395
+ const sale = sales.find((candidate) => normalizeSuiAddress(candidate.recordId) === wanted);
396
+ return sale ? hydratePurchaseReceipt(client, sale) : null;
397
+ }
398
+ //# sourceMappingURL=receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipts.js","sourceRoot":"","sources":["../../src/read/receipts.ts"],"names":[],"mappings":"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"}