@misofm/platform 0.26.2 → 0.28.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 +309 -204
- package/dist/Miso.d.ts +403 -0
- package/dist/Miso.d.ts.map +1 -0
- package/dist/Miso.js +455 -0
- package/dist/Miso.js.map +1 -0
- package/dist/auth.d.ts +11 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +16 -3
- package/dist/auth.js.map +1 -1
- package/dist/catalog.d.ts +8 -5
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +36 -19
- package/dist/catalog.js.map +1 -1
- package/dist/client.d.ts +52 -443
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +58 -775
- package/dist/client.js.map +1 -1
- package/dist/contracts/composition_credits/composition_credits.d.ts +38 -48
- package/dist/contracts/composition_credits/composition_credits.d.ts.map +1 -1
- package/dist/contracts/composition_credits/composition_credits.js +20 -4
- package/dist/contracts/composition_credits/composition_credits.js.map +1 -1
- package/dist/contracts/composition_routed_stake/composition_routed_stake.d.ts +64 -1
- package/dist/contracts/composition_routed_stake/composition_routed_stake.d.ts.map +1 -1
- package/dist/contracts/composition_routed_stake/composition_routed_stake.js +66 -1
- package/dist/contracts/composition_routed_stake/composition_routed_stake.js.map +1 -1
- package/dist/contracts/composition_royalty_pool/composition_royalty_pool.d.ts +52 -4
- package/dist/contracts/composition_royalty_pool/composition_royalty_pool.d.ts.map +1 -1
- package/dist/contracts/composition_royalty_pool/composition_royalty_pool.js +52 -4
- package/dist/contracts/composition_royalty_pool/composition_royalty_pool.js.map +1 -1
- package/dist/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.d.ts +63 -1
- package/dist/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.d.ts.map +1 -1
- package/dist/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.js +63 -1
- package/dist/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.js.map +1 -1
- package/dist/contracts/genre/genre.d.ts +10 -1
- package/dist/contracts/genre/genre.d.ts.map +1 -1
- package/dist/contracts/genre/genre.js +8 -1
- package/dist/contracts/genre/genre.js.map +1 -1
- package/dist/contracts/miso_pay/deps/std/type_name.d.ts.map +1 -0
- package/dist/contracts/miso_pay/deps/std/type_name.js.map +1 -0
- package/dist/contracts/miso_pay/pay.d.ts +209 -0
- package/dist/contracts/miso_pay/pay.d.ts.map +1 -0
- package/dist/contracts/miso_pay/pay.js +195 -0
- package/dist/contracts/miso_pay/pay.js.map +1 -0
- package/dist/contracts/party_cta/party_cta.d.ts +49 -3
- package/dist/contracts/party_cta/party_cta.d.ts.map +1 -1
- package/dist/contracts/party_cta/party_cta.js +27 -5
- package/dist/contracts/party_cta/party_cta.js.map +1 -1
- package/dist/contracts/party_genre/party_genre.d.ts +25 -0
- package/dist/contracts/party_genre/party_genre.d.ts.map +1 -1
- package/dist/contracts/party_genre/party_genre.js +14 -3
- package/dist/contracts/party_genre/party_genre.js.map +1 -1
- package/dist/contracts/party_media/party_media.d.ts +19 -3
- package/dist/contracts/party_media/party_media.d.ts.map +1 -1
- package/dist/contracts/party_media/party_media.js +20 -4
- package/dist/contracts/party_media/party_media.js.map +1 -1
- package/dist/contracts/party_platform_link/party_platform_link.d.ts +15 -7
- package/dist/contracts/party_platform_link/party_platform_link.d.ts.map +1 -1
- package/dist/contracts/party_platform_link/party_platform_link.js +15 -7
- package/dist/contracts/party_platform_link/party_platform_link.js.map +1 -1
- package/dist/contracts/party_profile/party_profile.d.ts +63 -8
- package/dist/contracts/party_profile/party_profile.d.ts.map +1 -1
- package/dist/contracts/party_profile/party_profile.js +33 -8
- package/dist/contracts/party_profile/party_profile.js.map +1 -1
- package/dist/contracts/party_roles/party_roles.d.ts +28 -3
- package/dist/contracts/party_roles/party_roles.d.ts.map +1 -1
- package/dist/contracts/party_roles/party_roles.js +19 -4
- package/dist/contracts/party_roles/party_roles.js.map +1 -1
- package/dist/contracts/party_tags/party_tags.d.ts +23 -3
- package/dist/contracts/party_tags/party_tags.d.ts.map +1 -1
- package/dist/contracts/party_tags/party_tags.js +16 -4
- package/dist/contracts/party_tags/party_tags.js.map +1 -1
- package/dist/contracts/party_wallet/party_wallet.d.ts +4 -1
- package/dist/contracts/party_wallet/party_wallet.d.ts.map +1 -1
- package/dist/contracts/party_wallet/party_wallet.js +2 -1
- package/dist/contracts/party_wallet/party_wallet.js.map +1 -1
- package/dist/contracts/platform_link/platform_link.d.ts +207 -0
- package/dist/contracts/platform_link/platform_link.d.ts.map +1 -0
- package/dist/contracts/platform_link/platform_link.js +209 -0
- package/dist/contracts/platform_link/platform_link.js.map +1 -0
- package/dist/contracts/record/pressing.d.ts +53 -7
- package/dist/contracts/record/pressing.d.ts.map +1 -1
- package/dist/contracts/record/pressing.js +50 -4
- package/dist/contracts/record/pressing.js.map +1 -1
- package/dist/contracts/record/record.d.ts +14 -0
- package/dist/contracts/record/record.d.ts.map +1 -1
- package/dist/contracts/record/record.js +15 -1
- package/dist/contracts/record/record.js.map +1 -1
- package/dist/contracts/record_shop/listing.d.ts +80 -35
- package/dist/contracts/record_shop/listing.d.ts.map +1 -1
- package/dist/contracts/record_shop/listing.js +76 -13
- package/dist/contracts/record_shop/listing.js.map +1 -1
- package/dist/contracts/recording_advisory/recording_advisory.d.ts +15 -15
- package/dist/contracts/recording_advisory/recording_advisory.d.ts.map +1 -1
- package/dist/contracts/recording_advisory/recording_advisory.js +15 -8
- package/dist/contracts/recording_advisory/recording_advisory.js.map +1 -1
- package/dist/contracts/recording_credits/recording_credits.d.ts +95 -1350
- package/dist/contracts/recording_credits/recording_credits.d.ts.map +1 -1
- package/dist/contracts/recording_credits/recording_credits.js +63 -12
- package/dist/contracts/recording_credits/recording_credits.js.map +1 -1
- package/dist/contracts/recording_engine_session/recording_engine_session.d.ts +30 -49
- package/dist/contracts/recording_engine_session/recording_engine_session.d.ts.map +1 -1
- package/dist/contracts/recording_engine_session/recording_engine_session.js +19 -4
- package/dist/contracts/recording_engine_session/recording_engine_session.js.map +1 -1
- package/dist/contracts/recording_genre/recording_genre.d.ts +67 -9
- package/dist/contracts/recording_genre/recording_genre.d.ts.map +1 -1
- package/dist/contracts/recording_genre/recording_genre.js +53 -9
- package/dist/contracts/recording_genre/recording_genre.js.map +1 -1
- package/dist/contracts/recording_language/recording_language.d.ts +29 -5
- package/dist/contracts/recording_language/recording_language.d.ts.map +1 -1
- package/dist/contracts/recording_language/recording_language.js +18 -5
- package/dist/contracts/recording_language/recording_language.js.map +1 -1
- package/dist/contracts/recording_master_reference/recording_master_reference.d.ts +25 -15
- package/dist/contracts/recording_master_reference/recording_master_reference.d.ts.map +1 -1
- package/dist/contracts/recording_master_reference/recording_master_reference.js +18 -5
- package/dist/contracts/recording_master_reference/recording_master_reference.js.map +1 -1
- package/dist/contracts/recording_royalty_pool/recording_royalty_pool.d.ts +55 -4
- package/dist/contracts/recording_royalty_pool/recording_royalty_pool.d.ts.map +1 -1
- package/dist/contracts/recording_royalty_pool/recording_royalty_pool.js +55 -4
- package/dist/contracts/recording_royalty_pool/recording_royalty_pool.js.map +1 -1
- package/dist/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.d.ts +66 -1
- package/dist/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.d.ts.map +1 -1
- package/dist/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.js +66 -1
- package/dist/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.js.map +1 -1
- package/dist/contracts/recording_streaming_transcode/recording_streaming_transcode.d.ts +12 -9
- package/dist/contracts/recording_streaming_transcode/recording_streaming_transcode.d.ts.map +1 -1
- package/dist/contracts/recording_streaming_transcode/recording_streaming_transcode.js +11 -4
- package/dist/contracts/recording_streaming_transcode/recording_streaming_transcode.js.map +1 -1
- package/dist/contracts/release_cover_art/release_cover_art.d.ts +168 -74
- package/dist/contracts/release_cover_art/release_cover_art.d.ts.map +1 -1
- package/dist/contracts/release_cover_art/release_cover_art.js +126 -10
- package/dist/contracts/release_cover_art/release_cover_art.js.map +1 -1
- package/dist/contracts/release_credits/release_credits.d.ts +24 -28
- package/dist/contracts/release_credits/release_credits.d.ts.map +1 -1
- package/dist/contracts/release_credits/release_credits.js +18 -4
- package/dist/contracts/release_credits/release_credits.js.map +1 -1
- package/dist/contracts/release_description/release_description.d.ts +16 -5
- package/dist/contracts/release_description/release_description.d.ts.map +1 -1
- package/dist/contracts/release_description/release_description.js +9 -4
- package/dist/contracts/release_description/release_description.js.map +1 -1
- package/dist/contracts/release_dsp_link/release_dsp_link.d.ts +130 -160
- package/dist/contracts/release_dsp_link/release_dsp_link.d.ts.map +1 -1
- package/dist/contracts/release_dsp_link/release_dsp_link.js +74 -19
- package/dist/contracts/release_dsp_link/release_dsp_link.js.map +1 -1
- package/dist/contracts/release_genre/release_genre.d.ts +66 -11
- package/dist/contracts/release_genre/release_genre.d.ts.map +1 -1
- package/dist/contracts/release_genre/release_genre.js +52 -11
- package/dist/contracts/release_genre/release_genre.js.map +1 -1
- package/dist/contracts/release_kind/release_kind.d.ts +28 -5
- package/dist/contracts/release_kind/release_kind.d.ts.map +1 -1
- package/dist/contracts/release_kind/release_kind.js +19 -4
- package/dist/contracts/release_kind/release_kind.js.map +1 -1
- package/dist/contracts/release_revenue_distributor/release_revenue_distributor.d.ts +17 -0
- package/dist/contracts/release_revenue_distributor/release_revenue_distributor.d.ts.map +1 -1
- package/dist/contracts/release_revenue_distributor/release_revenue_distributor.js +15 -0
- package/dist/contracts/release_revenue_distributor/release_revenue_distributor.js.map +1 -1
- package/dist/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.d.ts +37 -1
- package/dist/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.d.ts.map +1 -1
- package/dist/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.js +37 -1
- package/dist/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.js.map +1 -1
- package/dist/contracts/routed_stake/routed_stake.d.ts +78 -6
- package/dist/contracts/routed_stake/routed_stake.d.ts.map +1 -1
- package/dist/contracts/routed_stake/routed_stake.js +79 -7
- package/dist/contracts/routed_stake/routed_stake.js.map +1 -1
- package/dist/contracts/royalty_pool/pool.d.ts +117 -27
- package/dist/contracts/royalty_pool/pool.d.ts.map +1 -1
- package/dist/contracts/royalty_pool/pool.js +117 -28
- package/dist/contracts/royalty_pool/pool.js.map +1 -1
- package/dist/contracts/royalty_pool/stake.d.ts +3 -0
- package/dist/contracts/royalty_pool/stake.d.ts.map +1 -1
- package/dist/contracts/royalty_pool/stake.js +5 -2
- package/dist/contracts/royalty_pool/stake.js.map +1 -1
- package/dist/contracts/share/share.d.ts +80 -0
- package/dist/contracts/share/share.d.ts.map +1 -0
- package/dist/contracts/share/share.js +72 -0
- package/dist/contracts/share/share.js.map +1 -0
- package/dist/contracts/vault/vault.d.ts +51 -0
- package/dist/contracts/vault/vault.d.ts.map +1 -1
- package/dist/contracts/vault/vault.js +55 -4
- package/dist/contracts/vault/vault.js.map +1 -1
- package/dist/contracts.d.ts +60 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +17 -0
- package/dist/contracts.js.map +1 -1
- package/dist/cover.d.ts +5 -6
- package/dist/cover.d.ts.map +1 -1
- package/dist/cover.js +10 -10
- package/dist/cover.js.map +1 -1
- package/dist/credits.d.ts +12 -13
- package/dist/credits.d.ts.map +1 -1
- package/dist/credits.js +16 -10
- package/dist/credits.js.map +1 -1
- package/dist/deployments.d.ts +3 -3
- package/dist/deployments.d.ts.map +1 -1
- package/dist/deployments.js +2 -3
- package/dist/deployments.js.map +1 -1
- package/dist/errors.d.ts +32 -9
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +52 -16
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +1687 -835
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +258 -39
- package/dist/events.js.map +1 -1
- package/dist/genre.d.ts +11 -12
- package/dist/genre.d.ts.map +1 -1
- package/dist/genre.js +5 -3
- package/dist/genre.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/packages.d.ts +1047 -1695
- package/dist/packages.d.ts.map +1 -1
- package/dist/party/client.d.ts +113 -296
- package/dist/party/client.d.ts.map +1 -1
- package/dist/party/client.js +93 -178
- package/dist/party/client.js.map +1 -1
- package/dist/party/extensions/ctas.d.ts +3 -3
- package/dist/party/extensions/ctas.d.ts.map +1 -1
- package/dist/party/extensions/genres.d.ts +4 -4
- package/dist/party/extensions/genres.d.ts.map +1 -1
- package/dist/party/extensions/links.d.ts +5 -5
- package/dist/party/extensions/links.d.ts.map +1 -1
- package/dist/party/extensions/links.js.map +1 -1
- package/dist/party/extensions/media.d.ts +3 -3
- package/dist/party/extensions/media.d.ts.map +1 -1
- package/dist/party/extensions/profile.d.ts +3 -3
- package/dist/party/extensions/profile.d.ts.map +1 -1
- package/dist/party/extensions/roles.d.ts +4 -4
- package/dist/party/extensions/roles.d.ts.map +1 -1
- package/dist/party/extensions/roles.js.map +1 -1
- package/dist/party/extensions/tags.d.ts +4 -4
- package/dist/party/extensions/tags.d.ts.map +1 -1
- package/dist/party/index.d.ts +1 -1
- package/dist/party/index.d.ts.map +1 -1
- package/dist/party/index.js.map +1 -1
- package/dist/party/queries.d.ts +8 -8
- package/dist/party/queries.d.ts.map +1 -1
- package/dist/party/queries.js +83 -56
- package/dist/party/queries.js.map +1 -1
- package/dist/pressing.d.ts +13 -15
- package/dist/pressing.d.ts.map +1 -1
- package/dist/pressing.js +99 -29
- package/dist/pressing.js.map +1 -1
- package/dist/publication.d.ts +13 -6
- package/dist/publication.d.ts.map +1 -1
- package/dist/publication.js +26 -21
- package/dist/publication.js.map +1 -1
- package/dist/queries.js +3 -3
- package/dist/queries.js.map +1 -1
- package/dist/read/artist.d.ts +4 -3
- package/dist/read/artist.d.ts.map +1 -1
- package/dist/read/artist.js +24 -8
- package/dist/read/artist.js.map +1 -1
- package/dist/read/catalog.d.ts +17 -16
- package/dist/read/catalog.d.ts.map +1 -1
- package/dist/read/catalog.js +25 -11
- package/dist/read/catalog.js.map +1 -1
- package/dist/read/client.d.ts +41 -20
- package/dist/read/client.d.ts.map +1 -1
- package/dist/read/client.js +20 -12
- package/dist/read/client.js.map +1 -1
- package/dist/read/config.d.ts +27 -3
- package/dist/read/config.d.ts.map +1 -1
- package/dist/read/config.js +42 -24
- package/dist/read/config.js.map +1 -1
- package/dist/read/genres.d.ts +8 -3
- package/dist/read/genres.d.ts.map +1 -1
- package/dist/read/genres.js +23 -17
- package/dist/read/genres.js.map +1 -1
- package/dist/read/index.d.ts +3 -1
- package/dist/read/index.d.ts.map +1 -1
- package/dist/read/index.js +9 -6
- package/dist/read/index.js.map +1 -1
- package/dist/read/receipts.d.ts +5 -4
- package/dist/read/receipts.d.ts.map +1 -1
- package/dist/read/receipts.js +94 -46
- package/dist/read/receipts.js.map +1 -1
- package/dist/read/royalties.d.ts +25 -0
- package/dist/read/royalties.d.ts.map +1 -0
- package/dist/read/royalties.js +168 -0
- package/dist/read/royalties.js.map +1 -0
- package/dist/read/types.d.ts +27 -0
- package/dist/read/types.d.ts.map +1 -1
- package/dist/read/wallet.d.ts +23 -12
- package/dist/read/wallet.d.ts.map +1 -1
- package/dist/read/wallet.js +158 -177
- package/dist/read/wallet.js.map +1 -1
- package/dist/read/works.d.ts +6 -6
- package/dist/read/works.d.ts.map +1 -1
- package/dist/read/works.js +40 -26
- package/dist/read/works.js.map +1 -1
- package/dist/recording-extensions.d.ts +15 -16
- package/dist/recording-extensions.d.ts.map +1 -1
- package/dist/recording-extensions.js +12 -8
- package/dist/recording-extensions.js.map +1 -1
- package/dist/release-extensions.d.ts +5 -6
- package/dist/release-extensions.d.ts.map +1 -1
- package/dist/release-extensions.js +3 -2
- package/dist/release-extensions.js.map +1 -1
- package/dist/release-graph.d.ts +2 -2
- package/dist/release-graph.d.ts.map +1 -1
- package/dist/release-graph.js.map +1 -1
- package/dist/royalty.d.ts +4 -4
- package/dist/royalty.d.ts.map +1 -1
- package/dist/royalty.js +16 -7
- package/dist/royalty.js.map +1 -1
- package/dist/share.d.ts +58 -24
- package/dist/share.d.ts.map +1 -1
- package/dist/share.js +167 -92
- package/dist/share.js.map +1 -1
- package/dist/transactions.d.ts +15 -6
- package/dist/transactions.d.ts.map +1 -1
- package/dist/transactions.js +1 -0
- package/dist/transactions.js.map +1 -1
- package/dist/vault.d.ts +13 -3
- package/dist/vault.d.ts.map +1 -1
- package/dist/vault.js +22 -16
- package/dist/vault.js.map +1 -1
- package/package.json +9 -8
- package/src/Miso.ts +951 -0
- package/src/auth.ts +16 -3
- package/src/catalog.ts +58 -25
- package/src/client.ts +98 -1359
- package/src/contracts/composition_credits/composition_credits.ts +20 -4
- package/src/contracts/composition_routed_stake/composition_routed_stake.ts +67 -1
- package/src/contracts/composition_royalty_pool/composition_royalty_pool.ts +53 -4
- package/src/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.ts +64 -1
- package/src/contracts/genre/genre.ts +8 -1
- package/src/contracts/miso_pay/pay.ts +356 -0
- package/src/contracts/party_cta/party_cta.ts +27 -5
- package/src/contracts/party_genre/party_genre.ts +14 -3
- package/src/contracts/party_media/party_media.ts +20 -4
- package/src/contracts/party_platform_link/party_platform_link.ts +15 -7
- package/src/contracts/party_profile/party_profile.ts +33 -8
- package/src/contracts/party_roles/party_roles.ts +19 -4
- package/src/contracts/party_tags/party_tags.ts +16 -4
- package/src/contracts/party_wallet/party_wallet.ts +2 -1
- package/src/contracts/platform_link/platform_link.ts +322 -0
- package/src/contracts/record/pressing.ts +50 -4
- package/src/contracts/record/record.ts +15 -1
- package/src/contracts/record_shop/listing.ts +76 -13
- package/src/contracts/recording_advisory/recording_advisory.ts +15 -8
- package/src/contracts/recording_credits/recording_credits.ts +63 -12
- package/src/contracts/recording_engine_session/recording_engine_session.ts +19 -4
- package/src/contracts/recording_genre/recording_genre.ts +53 -9
- package/src/contracts/recording_language/recording_language.ts +18 -5
- package/src/contracts/recording_master_reference/recording_master_reference.ts +18 -5
- package/src/contracts/recording_royalty_pool/recording_royalty_pool.ts +56 -4
- package/src/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.ts +67 -1
- package/src/contracts/recording_streaming_transcode/recording_streaming_transcode.ts +11 -4
- package/src/contracts/release_cover_art/release_cover_art.ts +126 -10
- package/src/contracts/release_credits/release_credits.ts +18 -4
- package/src/contracts/release_description/release_description.ts +9 -4
- package/src/contracts/release_dsp_link/release_dsp_link.ts +74 -19
- package/src/contracts/release_genre/release_genre.ts +52 -11
- package/src/contracts/release_kind/release_kind.ts +19 -4
- package/src/contracts/release_revenue_distributor/release_revenue_distributor.ts +15 -0
- package/src/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.ts +38 -1
- package/src/contracts/routed_stake/routed_stake.ts +79 -7
- package/src/contracts/royalty_pool/pool.ts +140 -38
- package/src/contracts/royalty_pool/stake.ts +5 -2
- package/src/contracts/share/share.ts +97 -0
- package/src/contracts/vault/vault.ts +55 -4
- package/src/contracts.ts +18 -0
- package/src/cover.ts +14 -15
- package/src/credits.ts +27 -22
- package/src/deployments.ts +3 -4
- package/src/errors.ts +77 -34
- package/src/events.ts +260 -39
- package/src/genre.ts +15 -14
- package/src/index.ts +19 -10
- package/src/party/client.ts +217 -208
- package/src/party/extensions/ctas.ts +3 -3
- package/src/party/extensions/genres.ts +4 -4
- package/src/party/extensions/links.ts +7 -7
- package/src/party/extensions/media.ts +3 -3
- package/src/party/extensions/profile.ts +3 -3
- package/src/party/extensions/roles.ts +5 -5
- package/src/party/extensions/tags.ts +4 -4
- package/src/party/index.ts +0 -1
- package/src/party/queries.ts +90 -87
- package/src/pressing.ts +132 -89
- package/src/publication.ts +33 -32
- package/src/queries.ts +3 -3
- package/src/read/artist.ts +36 -17
- package/src/read/catalog.ts +68 -36
- package/src/read/client.ts +55 -30
- package/src/read/config.ts +57 -29
- package/src/read/genres.ts +22 -18
- package/src/read/index.ts +15 -6
- package/src/read/receipts.ts +130 -67
- package/src/read/royalties.ts +212 -0
- package/src/read/types.ts +30 -0
- package/src/read/wallet.ts +226 -216
- package/src/read/works.ts +51 -44
- package/src/recording-extensions.ts +27 -24
- package/src/release-extensions.ts +7 -7
- package/src/release-graph.ts +2 -1
- package/src/royalty.ts +19 -25
- package/src/share.ts +197 -128
- package/src/transactions.ts +15 -8
- package/src/vault.ts +24 -31
- package/dist/contracts/record_shop/deps/std/type_name.d.ts.map +0 -1
- package/dist/contracts/record_shop/deps/std/type_name.js.map +0 -1
- package/dist/contracts/recording_language/deps/language_code/language_code.d.ts +0 -6
- package/dist/contracts/recording_language/deps/language_code/language_code.d.ts.map +0 -1
- package/dist/contracts/recording_language/deps/language_code/language_code.js +0 -8
- package/dist/contracts/recording_language/deps/language_code/language_code.js.map +0 -1
- package/dist/contracts/recording_master_reference/deps/ori/confidentiality.d.ts +0 -24
- package/dist/contracts/recording_master_reference/deps/ori/confidentiality.d.ts.map +0 -1
- package/dist/contracts/recording_master_reference/deps/ori/confidentiality.js +0 -24
- package/dist/contracts/recording_master_reference/deps/ori/confidentiality.js.map +0 -1
- package/dist/contracts/recording_master_reference/deps/ori/data.d.ts +0 -16
- package/dist/contracts/recording_master_reference/deps/ori/data.d.ts.map +0 -1
- package/dist/contracts/recording_master_reference/deps/ori/data.js +0 -12
- package/dist/contracts/recording_master_reference/deps/ori/data.js.map +0 -1
- package/dist/execute.d.ts +0 -32
- package/dist/execute.d.ts.map +0 -1
- package/dist/execute.js +0 -36
- package/dist/execute.js.map +0 -1
- package/src/contracts/recording_language/deps/language_code/language_code.ts +0 -8
- package/src/contracts/recording_master_reference/deps/ori/confidentiality.ts +0 -24
- package/src/contracts/recording_master_reference/deps/ori/data.ts +0 -12
- package/src/execute.ts +0 -56
- /package/dist/contracts/{record_shop → miso_pay}/deps/std/type_name.d.ts +0 -0
- /package/dist/contracts/{record_shop → miso_pay}/deps/std/type_name.js +0 -0
- /package/src/contracts/{record_shop → miso_pay}/deps/std/type_name.ts +0 -0
package/src/read/wallet.ts
CHANGED
|
@@ -11,26 +11,34 @@
|
|
|
11
11
|
// than be reimplemented by every browser, Worker, server, or native client.
|
|
12
12
|
|
|
13
13
|
import { normalizeStructTag, normalizeSuiAddress, parseStructTag } from "@mysten/sui/utils";
|
|
14
|
-
import { Effect, Option } from "effect";
|
|
14
|
+
import { Effect, Option, Result, Stream } from "effect";
|
|
15
15
|
import {
|
|
16
16
|
contracts as networkContracts,
|
|
17
17
|
getCompositionByShareType,
|
|
18
|
-
getOwnedReleaseAdminCaps,
|
|
19
18
|
getRecordingByShareType,
|
|
20
|
-
|
|
19
|
+
Musicos,
|
|
20
|
+
type MusicosDeploymentInvalid,
|
|
21
|
+
type MusicosService,
|
|
22
|
+
type MusicosWorkNotFound,
|
|
21
23
|
} from "@misofm/musicos";
|
|
22
24
|
import { party as partyContracts } from "@misofm/partyos/contracts";
|
|
23
|
-
import { derivePartyAdminCapId,
|
|
25
|
+
import { derivePartyAdminCapId, Partyos, type PartyosDeploymentError, type PartyosService } from "@misofm/partyos";
|
|
24
26
|
import {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
CoinType,
|
|
28
|
+
DecodeError,
|
|
29
|
+
ObjectId,
|
|
30
|
+
Sui,
|
|
31
|
+
SuiAddress,
|
|
28
32
|
SuiGraphQL,
|
|
29
|
-
|
|
30
|
-
type
|
|
31
|
-
type
|
|
32
|
-
type
|
|
33
|
-
|
|
33
|
+
StructTag,
|
|
34
|
+
type BatchItemError,
|
|
35
|
+
type GraphQLUnavailable,
|
|
36
|
+
type ObjectDeleted,
|
|
37
|
+
type ObjectNotFound,
|
|
38
|
+
type ObjectUnavailable,
|
|
39
|
+
type TransportError,
|
|
40
|
+
} from "@unconfirmed/sui-effect";
|
|
41
|
+
import { OperationsUnavailableError } from "../errors.ts";
|
|
34
42
|
import type { MisoConfig } from "./config.ts";
|
|
35
43
|
import { int, u64 } from "./internal/scalars.ts";
|
|
36
44
|
import * as vaultContract from "../contracts/vault/vault.ts";
|
|
@@ -53,7 +61,33 @@ import { getRecordingTitles, getWorkAddressesByShareTypes, getWorksByIds } from
|
|
|
53
61
|
* set can't spin forever. 50/page × 20 = 1000 objects — far beyond any realistic
|
|
54
62
|
* library.
|
|
55
63
|
*/
|
|
56
|
-
const
|
|
64
|
+
const MAX_OWNED_OBJECTS = 1000;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Builds `Musicos.layer({ deployment: { packageId } })` / `Partyos.layer({
|
|
68
|
+
* deployment })`, provides it, and hands back the effect it wraps — see
|
|
69
|
+
* `../catalog.ts`'s `withMusicos` for the same idiom (kept file-local; see
|
|
70
|
+
* `docs/CONVERSION-STATUS.md`).
|
|
71
|
+
*/
|
|
72
|
+
function withMusicos<A, E>(
|
|
73
|
+
packageId: string,
|
|
74
|
+
effect: (musicos: MusicosService) => Effect.Effect<A, E, Sui>,
|
|
75
|
+
): Effect.Effect<A, E | MusicosDeploymentInvalid, Sui> {
|
|
76
|
+
return Effect.gen(function* () {
|
|
77
|
+
const musicos = yield* Musicos;
|
|
78
|
+
return yield* effect(musicos);
|
|
79
|
+
}).pipe(Effect.provide(Musicos.layer({ deployment: { packageId } })));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function withPartyos<A, E>(
|
|
83
|
+
partyosPackageId: string,
|
|
84
|
+
effect: (partyos: PartyosService) => Effect.Effect<A, E, Sui>,
|
|
85
|
+
): Effect.Effect<A, E | PartyosDeploymentError, Sui> {
|
|
86
|
+
return Effect.gen(function* () {
|
|
87
|
+
const partyos = yield* Partyos;
|
|
88
|
+
return yield* effect(partyos);
|
|
89
|
+
}).pipe(Effect.provide(Partyos.layer({ deployment: { partyos: partyosPackageId } })));
|
|
90
|
+
}
|
|
57
91
|
|
|
58
92
|
type WorkAdminCapType =
|
|
59
93
|
| { kind: "composition"; shareType: string }
|
|
@@ -167,35 +201,6 @@ function isCanonicalRecordType(
|
|
|
167
201
|
return true;
|
|
168
202
|
}
|
|
169
203
|
|
|
170
|
-
/** Page shape this file needs from `client.core.listOwnedObjects` — content is optional per-call, not per-object. */
|
|
171
|
-
interface OwnedObjectsPage {
|
|
172
|
-
objects: Array<{ objectId: string; type: string; content?: Uint8Array }>;
|
|
173
|
-
hasNextPage: boolean;
|
|
174
|
-
cursor: string | null;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/** One page of `client.core.listOwnedObjects`, requesting `content` when `withContent` is set. */
|
|
178
|
-
const listOwnedObjectsPage = Effect.fn("listOwnedObjectsPage")(function* (
|
|
179
|
-
owner: string,
|
|
180
|
-
type: string,
|
|
181
|
-
cursor: string | null,
|
|
182
|
-
withContent: boolean,
|
|
183
|
-
): Effect.fn.Return<OwnedObjectsPage, SuiRpcError, SuiClient> {
|
|
184
|
-
const client = yield* SuiClient;
|
|
185
|
-
return yield* Effect.tryPromise({
|
|
186
|
-
try: (signal) =>
|
|
187
|
-
(client.core.listOwnedObjects as (args: unknown) => Promise<OwnedObjectsPage>)({
|
|
188
|
-
owner,
|
|
189
|
-
type,
|
|
190
|
-
cursor,
|
|
191
|
-
limit: 50,
|
|
192
|
-
...(withContent ? { include: { content: true } } : {}),
|
|
193
|
-
signal,
|
|
194
|
-
}),
|
|
195
|
-
catch: (cause) => new SuiRpcError({ operation: "listOwnedObjects", cause }),
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
204
|
/**
|
|
200
205
|
* The records `owner` holds. Ownership is DIRECT — a record is an address-owned
|
|
201
206
|
* `<record>::record::Record` with no pressing/license/receipt intermediary.
|
|
@@ -205,43 +210,38 @@ const listOwnedObjectsPage = Effect.fn("listOwnedObjectsPage")(function* (
|
|
|
205
210
|
export const getOwnedRecords = Effect.fn("getOwnedRecords")(function* (
|
|
206
211
|
owner: string,
|
|
207
212
|
config: MisoConfig,
|
|
208
|
-
): Effect.fn.Return<OwnedRecord[],
|
|
209
|
-
const
|
|
210
|
-
let cursor: string | null = null;
|
|
213
|
+
): Effect.fn.Return<OwnedRecord[], TransportError, Sui> {
|
|
214
|
+
const sui = yield* Sui;
|
|
211
215
|
const sales = requireRecordSalesDeployment(config.recordSales);
|
|
212
|
-
const recordType = `${sales.recordPackageId}::record::Record
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
if (!obj.content) throw new Error(`Record ${obj.objectId} has no BCS content`);
|
|
221
|
-
const record = recordContract.Record.parse(obj.content);
|
|
222
|
-
if (normalizeSuiAddress(record.id) !== normalizeSuiAddress(obj.objectId)) {
|
|
223
|
-
throw new Error(`Record ${obj.objectId} has mismatched embedded UID ${record.id}`);
|
|
224
|
-
}
|
|
225
|
-
const derived = deriveRecordId(record.pressing_id, record.number, sales.recordPackageId);
|
|
226
|
-
if (normalizeSuiAddress(derived) !== normalizeSuiAddress(obj.objectId)) {
|
|
227
|
-
throw new Error(`Record ${obj.objectId} is not derived from its Pressing and number`);
|
|
228
|
-
}
|
|
229
|
-
out.push({
|
|
230
|
-
id: obj.objectId,
|
|
231
|
-
type: obj.type,
|
|
232
|
-
releaseId: record.release_id,
|
|
233
|
-
pressingId: record.pressing_id,
|
|
234
|
-
edition: record.edition,
|
|
235
|
-
number: record.number,
|
|
236
|
-
purchaseCurrency: normalizeStructTag(record.purchase_currency.name),
|
|
237
|
-
purchasePrice: record.purchase_price,
|
|
238
|
-
purchasedBy: record.purchased_by,
|
|
239
|
-
purchasedTimestampMs: record.purchased_timestamp_ms,
|
|
240
|
-
});
|
|
216
|
+
const recordType = StructTag.make(`${sales.recordPackageId}::record::Record`);
|
|
217
|
+
const objects = yield* Stream.runCollect(
|
|
218
|
+
sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: recordType }).pipe(Stream.take(MAX_OWNED_OBJECTS)),
|
|
219
|
+
);
|
|
220
|
+
const out: OwnedRecord[] = [];
|
|
221
|
+
for (const obj of objects) {
|
|
222
|
+
if (!isCanonicalRecordType(obj.type, sales.recordPackageId)) {
|
|
223
|
+
continue;
|
|
241
224
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
225
|
+
const record = recordContract.Record.parse(obj.content);
|
|
226
|
+
if (normalizeSuiAddress(record.id) !== normalizeSuiAddress(obj.id)) {
|
|
227
|
+
throw new Error(`Record ${obj.id} has mismatched embedded UID ${record.id}`);
|
|
228
|
+
}
|
|
229
|
+
const derived = deriveRecordId(record.pressing_id, record.number, sales.recordPackageId);
|
|
230
|
+
if (normalizeSuiAddress(derived) !== normalizeSuiAddress(obj.id)) {
|
|
231
|
+
throw new Error(`Record ${obj.id} is not derived from its Pressing and number`);
|
|
232
|
+
}
|
|
233
|
+
out.push({
|
|
234
|
+
id: obj.id,
|
|
235
|
+
type: obj.type,
|
|
236
|
+
releaseId: record.release_id,
|
|
237
|
+
pressingId: record.pressing_id,
|
|
238
|
+
edition: record.edition,
|
|
239
|
+
number: record.number,
|
|
240
|
+
purchaseCurrency: normalizeStructTag(record.purchase_currency.name),
|
|
241
|
+
purchasePrice: record.purchase_price,
|
|
242
|
+
purchasedBy: record.purchased_by,
|
|
243
|
+
purchasedTimestampMs: record.purchased_timestamp_ms,
|
|
244
|
+
});
|
|
245
245
|
}
|
|
246
246
|
return out;
|
|
247
247
|
});
|
|
@@ -257,29 +257,32 @@ export const getOwnedRecords = Effect.fn("getOwnedRecords")(function* (
|
|
|
257
257
|
export const getOwnedParties = Effect.fn("getOwnedParties")(function* (
|
|
258
258
|
owner: string,
|
|
259
259
|
config: MisoConfig,
|
|
260
|
-
): Effect.fn.Return<OwnedParty[],
|
|
261
|
-
const
|
|
260
|
+
): Effect.fn.Return<OwnedParty[], TransportError | PartyosDeploymentError, Sui> {
|
|
261
|
+
const sui = yield* Sui;
|
|
262
|
+
const capType = StructTag.make(`${config.partyos.partyos}::party::PartyAdminCap`);
|
|
262
263
|
|
|
263
264
|
// One page of 50 caps is plenty for launch-scale artists; paginate if labels
|
|
264
265
|
// ever start hitting the cap.
|
|
265
|
-
const
|
|
266
|
+
const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: capType }).pipe(Stream.take(50)));
|
|
266
267
|
|
|
267
268
|
const caps = objects.flatMap((obj) => {
|
|
268
269
|
try {
|
|
269
|
-
const cap = partyContracts.PartyAdminCap.parse(obj.content
|
|
270
|
-
return [{ capId: obj.
|
|
270
|
+
const cap = partyContracts.PartyAdminCap.parse(obj.content);
|
|
271
|
+
return [{ capId: obj.id, partyId: cap.party_id }];
|
|
271
272
|
} catch {
|
|
272
273
|
return [];
|
|
273
274
|
}
|
|
274
275
|
});
|
|
275
276
|
if (caps.length === 0) return [];
|
|
276
277
|
|
|
277
|
-
const
|
|
278
|
-
caps.map((c) => c.partyId),
|
|
279
|
-
|
|
278
|
+
const results = yield* withPartyos(config.partyos.partyos, (partyos) =>
|
|
279
|
+
partyos.getPartiesByIds(caps.map((c) => ObjectId.make(c.partyId))),
|
|
280
|
+
);
|
|
281
|
+
const parties = new Map(
|
|
282
|
+
results.flatMap((result, index) => (Result.isSuccess(result) ? [[caps[index]!.partyId, result.success] as const] : [])),
|
|
280
283
|
);
|
|
281
284
|
return caps.flatMap(({ capId, partyId }) => {
|
|
282
|
-
const p = parties
|
|
285
|
+
const p = parties.get(partyId);
|
|
283
286
|
return p ? [{ partyId, capId, name: p.name, kind: p.kind }] : [];
|
|
284
287
|
});
|
|
285
288
|
});
|
|
@@ -295,24 +298,28 @@ export const getOwnedParties = Effect.fn("getOwnedParties")(function* (
|
|
|
295
298
|
export const getPendingMemberships = Effect.fn("getPendingMemberships")(function* (
|
|
296
299
|
owner: string,
|
|
297
300
|
config: MisoConfig,
|
|
298
|
-
): Effect.fn.Return<PendingMembership[],
|
|
301
|
+
): Effect.fn.Return<PendingMembership[], DecodeError | TransportError | PartyosDeploymentError, Sui> {
|
|
299
302
|
const controlled = yield* getOwnedParties(owner, config);
|
|
300
303
|
const individuals = controlled.filter((party) => party.kind === "individual");
|
|
301
304
|
if (individuals.length === 0) return [];
|
|
302
305
|
|
|
303
|
-
const invitations = yield*
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
306
|
+
const invitations = yield* withPartyos(config.partyos.partyos, (partyos) =>
|
|
307
|
+
Effect.forEach(
|
|
308
|
+
individuals,
|
|
309
|
+
(member) => partyos.getPendingMemberships(ObjectId.make(member.partyId)).pipe(Effect.map((groupIds) => ({ member, groupIds }))),
|
|
310
|
+
{ concurrency: "unbounded" },
|
|
311
|
+
),
|
|
308
312
|
);
|
|
309
313
|
const groupIds = [...new Set(invitations.flatMap(({ groupIds }) => groupIds))];
|
|
310
314
|
if (groupIds.length === 0) return [];
|
|
311
315
|
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
+
const groupResults = yield* withPartyos(config.partyos.partyos, (partyos) => partyos.getPartiesByIds(groupIds));
|
|
317
|
+
const groups = new Map(
|
|
318
|
+
groupResults.flatMap((result, index) => (Result.isSuccess(result) ? [[groupIds[index]!, result.success] as const] : [])),
|
|
319
|
+
);
|
|
320
|
+
return invitations.flatMap(({ member, groupIds: memberGroupIds }) =>
|
|
321
|
+
memberGroupIds.flatMap((groupId): PendingMembership[] => {
|
|
322
|
+
const group = groups.get(groupId);
|
|
316
323
|
return group?.kind === "group"
|
|
317
324
|
? [{ memberPartyId: member.partyId, memberCapId: member.capId, groupId, groupName: group.name }]
|
|
318
325
|
: [];
|
|
@@ -323,26 +330,23 @@ export const getPendingMemberships = Effect.fn("getPendingMemberships")(function
|
|
|
323
330
|
// ── Works (studio catalog) ───────────────────────────────────────────────────
|
|
324
331
|
|
|
325
332
|
/**
|
|
326
|
-
* Owned generic admin caps
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
*
|
|
333
|
+
* Owned generic admin caps. The bare type filter matches every instantiation of
|
|
334
|
+
* `CompositionAdminCap<T>` / `RecordingAdminCap<T>`; the share type `T` is
|
|
335
|
+
* parsed back out of each instance's type tag, because the cap does not store
|
|
336
|
+
* the work's id — only its share type.
|
|
330
337
|
*/
|
|
331
338
|
const ownedGenericCaps = Effect.fn("ownedGenericCaps")(function* (
|
|
332
339
|
owner: string,
|
|
333
340
|
capType: string,
|
|
334
|
-
): Effect.fn.Return<{ id: string; shareType: string }[],
|
|
341
|
+
): Effect.fn.Return<{ id: string; shareType: string }[], TransportError, Sui> {
|
|
342
|
+
const sui = yield* Sui;
|
|
343
|
+
const objects = yield* Stream.runCollect(
|
|
344
|
+
sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: StructTag.make(capType) }).pipe(Stream.take(MAX_OWNED_OBJECTS)),
|
|
345
|
+
);
|
|
335
346
|
const caps: { id: string; shareType: string }[] = [];
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
for (const obj of res.objects) {
|
|
340
|
-
const match = /<(.+)>$/.exec(obj.type);
|
|
341
|
-
if (match?.[1]) caps.push({ id: obj.objectId, shareType: match[1] });
|
|
342
|
-
}
|
|
343
|
-
if (!res.hasNextPage) break;
|
|
344
|
-
cursor = res.cursor;
|
|
345
|
-
if (!cursor) break;
|
|
347
|
+
for (const obj of objects) {
|
|
348
|
+
const match = /<(.+)>$/.exec(obj.type);
|
|
349
|
+
if (match?.[1]) caps.push({ id: obj.id, shareType: match[1] });
|
|
346
350
|
}
|
|
347
351
|
return caps;
|
|
348
352
|
});
|
|
@@ -357,9 +361,17 @@ const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (
|
|
|
357
361
|
config: MisoConfig,
|
|
358
362
|
): Effect.fn.Return<
|
|
359
363
|
{ compositions: VaultedGenericCap[]; recordings: VaultedGenericCap[]; releases: VaultedReleaseCap[] },
|
|
360
|
-
|
|
361
|
-
|
|
364
|
+
TransportError | OperationsUnavailableError,
|
|
365
|
+
Sui
|
|
362
366
|
> {
|
|
367
|
+
// No current-or-legacy Vault package id: this deployment has no vaulted
|
|
368
|
+
// works to enumerate at all, so the caller (`getOwnedWorks`) fails typed
|
|
369
|
+
// rather than silently reporting only the direct caps (B1, misofm/sdks#35
|
|
370
|
+
// verification — `MisoConfig` itself always constructs; this is the one
|
|
371
|
+
// member that actually needs the missing field).
|
|
372
|
+
if (config.protocol.vault === null) {
|
|
373
|
+
return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
|
|
374
|
+
}
|
|
363
375
|
const out: {
|
|
364
376
|
compositions: VaultedGenericCap[];
|
|
365
377
|
recordings: VaultedGenericCap[];
|
|
@@ -367,36 +379,28 @@ const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (
|
|
|
367
379
|
} = { compositions: [], recordings: [], releases: [] };
|
|
368
380
|
const vaultPackageId = config.protocol.vault;
|
|
369
381
|
const misoPackageId = config.deployment.musicos;
|
|
370
|
-
const capType = `${vaultPackageId}::vault::VaultAdminCap
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
)
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
} else if (work.kind === "recording") {
|
|
388
|
-
out.recordings.push({ id: object.objectId, shareType: work.shareType, vaultId });
|
|
389
|
-
} else {
|
|
390
|
-
out.releases.push({ id: object.objectId, vaultId });
|
|
391
|
-
}
|
|
392
|
-
} catch {
|
|
393
|
-
// A malformed object under the configured vault namespace is not usable
|
|
394
|
-
// authority and should not hide otherwise valid catalog entries.
|
|
382
|
+
const capType = StructTag.make(`${vaultPackageId}::vault::VaultAdminCap`);
|
|
383
|
+
|
|
384
|
+
const sui = yield* Sui;
|
|
385
|
+
const objects = yield* Stream.runCollect(
|
|
386
|
+
sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: capType }).pipe(Stream.take(MAX_OWNED_OBJECTS)),
|
|
387
|
+
);
|
|
388
|
+
for (const object of objects) {
|
|
389
|
+
const work = classifyVaultedWorkAdminCapType(object.type, vaultPackageId, misoPackageId);
|
|
390
|
+
if (!work) continue;
|
|
391
|
+
try {
|
|
392
|
+
const { vault_id: vaultId } = vaultContract.VaultAdminCap.parse(object.content);
|
|
393
|
+
if (work.kind === "composition") {
|
|
394
|
+
out.compositions.push({ id: object.id, shareType: work.shareType, vaultId });
|
|
395
|
+
} else if (work.kind === "recording") {
|
|
396
|
+
out.recordings.push({ id: object.id, shareType: work.shareType, vaultId });
|
|
397
|
+
} else {
|
|
398
|
+
out.releases.push({ id: object.id, vaultId });
|
|
395
399
|
}
|
|
400
|
+
} catch {
|
|
401
|
+
// A malformed object under the configured vault namespace is not usable
|
|
402
|
+
// authority and should not hide otherwise valid catalog entries.
|
|
396
403
|
}
|
|
397
|
-
if (!res.hasNextPage) break;
|
|
398
|
-
cursor = res.cursor;
|
|
399
|
-
if (!cursor) break;
|
|
400
404
|
}
|
|
401
405
|
return out;
|
|
402
406
|
});
|
|
@@ -405,23 +409,33 @@ const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (
|
|
|
405
409
|
const resolveVaultedReleaseCaps = Effect.fn("resolveVaultedReleaseCaps")(function* (
|
|
406
410
|
caps: readonly VaultedReleaseCap[],
|
|
407
411
|
config: MisoConfig,
|
|
408
|
-
): Effect.fn.Return<{ id: string; releaseId: string }[],
|
|
412
|
+
): Effect.fn.Return<{ id: string; releaseId: string }[], TransportError | OperationsUnavailableError, Sui> {
|
|
409
413
|
if (caps.length === 0) return [];
|
|
414
|
+
// Every caller only reaches here with a non-empty `caps` after already
|
|
415
|
+
// establishing `config.protocol.vault` is configured (`ownedVaultedWorkCaps`,
|
|
416
|
+
// `getWorkByCap`'s own guard below) — this is a defensive typed failure,
|
|
417
|
+
// not an expected path, so an interpolated `null` can never reach `vaultType`.
|
|
418
|
+
if (config.protocol.vault === null) {
|
|
419
|
+
return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
|
|
420
|
+
}
|
|
410
421
|
const releaseCapType = `${config.deployment.musicos}::release::ReleaseAdminCap`;
|
|
411
422
|
const vaultType = normalizeStructTag(`${config.protocol.vault}::vault::Vault<${releaseCapType}>`);
|
|
412
|
-
const
|
|
423
|
+
const sui = yield* Sui;
|
|
424
|
+
const results = yield* sui.getObjects(caps.map((cap) => ObjectId.make(cap.vaultId)));
|
|
413
425
|
const releasesByVault = new Map<string, string>();
|
|
414
|
-
|
|
426
|
+
results.forEach((result, index) => {
|
|
427
|
+
if (!Result.isSuccess(result)) return;
|
|
428
|
+
const object = result.success;
|
|
415
429
|
try {
|
|
416
|
-
if (normalizeStructTag(object.type) !== vaultType)
|
|
430
|
+
if (normalizeStructTag(object.type) !== vaultType) return;
|
|
417
431
|
const vault = vaultContract.Vault(networkContracts.release.ReleaseAdminCap).parse(object.content);
|
|
418
432
|
const releaseId = vault.cap?.value?.release_id;
|
|
419
|
-
if (releaseId) releasesByVault.set(
|
|
433
|
+
if (releaseId) releasesByVault.set(caps[index]!.vaultId, releaseId);
|
|
420
434
|
} catch {
|
|
421
435
|
// Batch catalog discovery is best-effort per authority, matching the
|
|
422
436
|
// existing direct-cap path's treatment of unreadable work objects.
|
|
423
437
|
}
|
|
424
|
-
}
|
|
438
|
+
});
|
|
425
439
|
return caps.flatMap((cap) => {
|
|
426
440
|
const releaseId = releasesByVault.get(cap.vaultId);
|
|
427
441
|
return releaseId ? [{ id: cap.id, releaseId }] : [];
|
|
@@ -432,28 +446,32 @@ const resolveVaultedReleaseCaps = Effect.fn("resolveVaultedReleaseCaps")(functio
|
|
|
432
446
|
* Every work the wallet administers, keyed by its ADMIN CAP id (the studio
|
|
433
447
|
* catalog's routing unit — caps are what control means here).
|
|
434
448
|
*
|
|
435
|
-
* Three transports, one answer: direct or vaulted cap discovery is
|
|
436
|
-
* request maps every share type to its work address (
|
|
437
|
-
* object has type X"); one
|
|
449
|
+
* Three transports, one answer: direct or vaulted cap discovery is Core; one aliased GraphQL
|
|
450
|
+
* request maps every share type to its work address (Core cannot ask "which
|
|
451
|
+
* object has type X"); one Core batch loads all the work contents. Releases skip
|
|
438
452
|
* the GraphQL hop entirely — `ReleaseAdminCap` is not generic and carries
|
|
439
453
|
* `release_id` directly.
|
|
440
454
|
*/
|
|
441
455
|
export const getOwnedWorks = Effect.fn("getOwnedWorks")(function* (
|
|
442
456
|
owner: string,
|
|
443
457
|
config: MisoConfig,
|
|
444
|
-
): Effect.fn.Return<
|
|
458
|
+
): Effect.fn.Return<
|
|
459
|
+
OwnedWork[],
|
|
460
|
+
MusicosDeploymentInvalid | DecodeError | BatchItemError | GraphQLUnavailable | TransportError | OperationsUnavailableError,
|
|
461
|
+
Sui | SuiGraphQL
|
|
462
|
+
> {
|
|
445
463
|
const miso = config.deployment.musicos;
|
|
446
464
|
|
|
447
465
|
const [directCompCaps, directRecCaps, directRelCaps, vaulted] = yield* Effect.all([
|
|
448
466
|
ownedGenericCaps(owner, `${miso}::composition::CompositionAdminCap`),
|
|
449
467
|
ownedGenericCaps(owner, `${miso}::recording::RecordingAdminCap`),
|
|
450
|
-
|
|
468
|
+
withMusicos(miso, (musicos) => musicos.getOwnedReleaseAdminCaps(SuiAddress.make(normalizeSuiAddress(owner)))),
|
|
451
469
|
ownedVaultedWorkCaps(owner, config),
|
|
452
470
|
]);
|
|
453
471
|
const vaultedRelCaps = yield* resolveVaultedReleaseCaps(vaulted.releases, config);
|
|
454
472
|
const compCaps = [...directCompCaps, ...vaulted.compositions];
|
|
455
473
|
const recCaps = [...directRecCaps, ...vaulted.recordings];
|
|
456
|
-
const relCaps = [...directRelCaps, ...vaultedRelCaps];
|
|
474
|
+
const relCaps = [...directRelCaps.map((cap) => ({ id: String(cap.id), releaseId: String(cap.id) })), ...vaultedRelCaps];
|
|
457
475
|
|
|
458
476
|
const addresses = yield* getWorkAddressesByShareTypes(
|
|
459
477
|
{ compositions: compCaps.map((c) => c.shareType), recordings: recCaps.map((c) => c.shareType) },
|
|
@@ -500,10 +518,24 @@ export const getOwnedWorks = Effect.fn("getOwnedWorks")(function* (
|
|
|
500
518
|
export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
|
|
501
519
|
capId: string,
|
|
502
520
|
config: MisoConfig,
|
|
503
|
-
): Effect.fn.Return<
|
|
521
|
+
): Effect.fn.Return<
|
|
522
|
+
WorkDetail | null,
|
|
523
|
+
| ObjectNotFound
|
|
524
|
+
| ObjectDeleted
|
|
525
|
+
| ObjectUnavailable
|
|
526
|
+
| DecodeError
|
|
527
|
+
| MusicosDeploymentInvalid
|
|
528
|
+
| MusicosWorkNotFound
|
|
529
|
+
| BatchItemError
|
|
530
|
+
| GraphQLUnavailable
|
|
531
|
+
| TransportError
|
|
532
|
+
| OperationsUnavailableError,
|
|
533
|
+
Sui | SuiGraphQL
|
|
534
|
+
> {
|
|
504
535
|
const miso = config.deployment.musicos;
|
|
505
536
|
|
|
506
|
-
const
|
|
537
|
+
const sui = yield* Sui;
|
|
538
|
+
const found = yield* sui.getObjectOption(ObjectId.make(normalizeSuiAddress(capId)));
|
|
507
539
|
if (Option.isNone(found)) return null;
|
|
508
540
|
const { content, type } = found.value;
|
|
509
541
|
|
|
@@ -539,7 +571,7 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
|
|
|
539
571
|
if (direct?.kind === "release") {
|
|
540
572
|
// `ReleaseAdminCap`'s BCS carries `release_id` directly — no `json` include needed.
|
|
541
573
|
const { release_id: releaseId } = networkContracts.release.ReleaseAdminCap.parse(content);
|
|
542
|
-
const r = yield* getReleaseById(releaseId);
|
|
574
|
+
const r = yield* withMusicos(miso, (musicos) => musicos.getReleaseById(ObjectId.make(releaseId)));
|
|
543
575
|
return {
|
|
544
576
|
capId,
|
|
545
577
|
kind: "release",
|
|
@@ -551,6 +583,13 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
|
|
|
551
583
|
};
|
|
552
584
|
}
|
|
553
585
|
|
|
586
|
+
// Every direct classification above already fell through: this cap can
|
|
587
|
+
// only be a legitimate work authority if it is a vaulted one, which
|
|
588
|
+
// requires the deployment's Vault package id (B1, misofm/sdks#35
|
|
589
|
+
// verification) — fail typed rather than misreport "no such work".
|
|
590
|
+
if (config.protocol.vault === null) {
|
|
591
|
+
return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
|
|
592
|
+
}
|
|
554
593
|
const vaulted = classifyVaultedWorkAdminCapType(type, config.protocol.vault, miso);
|
|
555
594
|
if (!vaulted) {
|
|
556
595
|
// A real object, but not a supported work authority — "no such work",
|
|
@@ -587,7 +626,7 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
|
|
|
587
626
|
|
|
588
627
|
const [releaseCap] = yield* resolveVaultedReleaseCaps([{ id: capId, vaultId }], config);
|
|
589
628
|
if (!releaseCap) throw new Error(`Release vault ${vaultId} carries no release admin cap`);
|
|
590
|
-
const r = yield* getReleaseById(releaseCap.releaseId);
|
|
629
|
+
const r = yield* withMusicos(miso, (musicos) => musicos.getReleaseById(ObjectId.make(releaseCap.releaseId)));
|
|
591
630
|
return {
|
|
592
631
|
capId,
|
|
593
632
|
kind: "release",
|
|
@@ -601,64 +640,41 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
|
|
|
601
640
|
|
|
602
641
|
// ── Balance ──────────────────────────────────────────────────────────────────
|
|
603
642
|
|
|
604
|
-
const decimalsByClient = new WeakMap<object, Map<string, Promise<number>>>();
|
|
605
|
-
|
|
606
|
-
/**
|
|
607
|
-
* Resolve once per (transport client, coin type). Failed lookups are evicted so
|
|
608
|
-
* a transient fullnode error cannot poison a long-lived API worker.
|
|
609
|
-
*/
|
|
610
|
-
function coinDecimalsPromise(client: object & { core: { getCoinMetadata: (args: { coinType: string }) => Promise<{ coinMetadata: { decimals?: number } | null }> } }, coinType: string): Promise<number> {
|
|
611
|
-
let cache = decimalsByClient.get(client);
|
|
612
|
-
if (!cache) {
|
|
613
|
-
cache = new Map();
|
|
614
|
-
decimalsByClient.set(client, cache);
|
|
615
|
-
}
|
|
616
|
-
const key = normalizeStructTag(coinType);
|
|
617
|
-
const cached = cache.get(key);
|
|
618
|
-
if (cached) return cached;
|
|
619
|
-
|
|
620
|
-
const pending = client.core.getCoinMetadata({ coinType: key }).then(({ coinMetadata }) => {
|
|
621
|
-
const decimals = coinMetadata?.decimals;
|
|
622
|
-
if (!Number.isSafeInteger(decimals) || decimals! < 0 || decimals! > 18) {
|
|
623
|
-
throw new Error(`Coin metadata for ${key} has no supported decimal precision`);
|
|
624
|
-
}
|
|
625
|
-
return decimals!;
|
|
626
|
-
});
|
|
627
|
-
cache.set(key, pending);
|
|
628
|
-
pending.catch(() => {
|
|
629
|
-
if (cache!.get(key) === pending) cache!.delete(key);
|
|
630
|
-
});
|
|
631
|
-
return pending;
|
|
632
|
-
}
|
|
633
|
-
|
|
634
643
|
/**
|
|
635
644
|
* A wallet's balance in one currency. Keep the aggregate and both Sui storage
|
|
636
645
|
* classes: callers using a `FundsWithdrawal` must never mistake coin-object
|
|
637
646
|
* value for immediately withdrawable address balance.
|
|
647
|
+
*
|
|
648
|
+
* TODO(stage 2/3): the predecessor cached `getCoinMetadata` per (transport
|
|
649
|
+
* client, coin type) in a module-level `WeakMap`. This standalone function has
|
|
650
|
+
* no layer to hold an `Effect.cachedWithTTL`-backed cache in (the issue's own
|
|
651
|
+
* target design for this); dropped rather than reintroducing a module-level
|
|
652
|
+
* cache keyed on a raw client object, which `Sui`'s per-call service instance
|
|
653
|
+
* makes awkward to key by. Revisit once this becomes a `Miso.read.getBalance`
|
|
654
|
+
* service member with a layer to hold the cache.
|
|
638
655
|
*/
|
|
639
656
|
export const getBalance = Effect.fn("getBalance")(function* (
|
|
640
657
|
address: string,
|
|
641
658
|
config: MisoConfig,
|
|
642
659
|
coinType?: string,
|
|
643
|
-
): Effect.fn.Return<Balance,
|
|
644
|
-
const
|
|
660
|
+
): Effect.fn.Return<Balance, DecodeError | TransportError, Sui> {
|
|
661
|
+
const sui = yield* Sui;
|
|
645
662
|
const type = coinType ?? config.money.usdCoinType;
|
|
646
|
-
const [
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
catch: (cause) => new SuiRpcError({ operation: "getBalance", cause }),
|
|
650
|
-
}),
|
|
651
|
-
Effect.tryPromise({
|
|
652
|
-
try: () => coinDecimalsPromise(client, type),
|
|
653
|
-
catch: (cause) => new SuiRpcError({ operation: "getCoinMetadata", cause }),
|
|
654
|
-
}),
|
|
663
|
+
const [balance, metadata] = yield* Effect.all([
|
|
664
|
+
sui.getBalance(SuiAddress.make(normalizeSuiAddress(address)), CoinType.make(normalizeStructTag(type))),
|
|
665
|
+
sui.core.getCoinMetadata({ coinType: normalizeStructTag(type) }),
|
|
655
666
|
]);
|
|
667
|
+
const rawDecimals = metadata.coinMetadata?.decimals;
|
|
668
|
+
if (!Number.isSafeInteger(rawDecimals) || rawDecimals! < 0 || rawDecimals! > 18) {
|
|
669
|
+
return yield* new DecodeError({ expectedType: type, issue: `coin metadata for ${type} has no supported decimal precision` });
|
|
670
|
+
}
|
|
671
|
+
const decimals: number = rawDecimals!;
|
|
656
672
|
return {
|
|
657
673
|
address: normalizeSuiAddress(address),
|
|
658
674
|
coinType: type,
|
|
659
|
-
balance: u64(
|
|
660
|
-
coinBalance: u64(
|
|
661
|
-
addressBalance: u64(
|
|
675
|
+
balance: u64(balance.balance),
|
|
676
|
+
coinBalance: u64(balance.coinBalance),
|
|
677
|
+
addressBalance: u64(balance.addressBalance),
|
|
662
678
|
decimals,
|
|
663
679
|
};
|
|
664
680
|
});
|
|
@@ -685,17 +701,14 @@ export const ownsParty = Effect.fn("ownsParty")(function* (
|
|
|
685
701
|
address: string,
|
|
686
702
|
partyId: string,
|
|
687
703
|
config: MisoConfig,
|
|
688
|
-
): Effect.fn.Return<Ownership, never,
|
|
704
|
+
): Effect.fn.Return<Ownership, never, Sui> {
|
|
689
705
|
const capId = derivePartyAdminCapId(partyId, config.partyos.partyos);
|
|
690
|
-
const
|
|
691
|
-
const isOwner = yield*
|
|
692
|
-
|
|
693
|
-
catch: (cause) => cause,
|
|
694
|
-
}).pipe(
|
|
695
|
-
Effect.map(({ object }) => isAddressOwner(object?.owner, address)),
|
|
706
|
+
const sui = yield* Sui;
|
|
707
|
+
const isOwner = yield* sui.getObject(ObjectId.make(capId)).pipe(
|
|
708
|
+
Effect.map((object) => isAddressOwner(object.owner, address)),
|
|
696
709
|
Effect.catch(() => Effect.succeed(false)),
|
|
697
710
|
);
|
|
698
|
-
return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId };
|
|
711
|
+
return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId: String(capId) };
|
|
699
712
|
});
|
|
700
713
|
|
|
701
714
|
/**
|
|
@@ -707,13 +720,10 @@ export const ownsParty = Effect.fn("ownsParty")(function* (
|
|
|
707
720
|
export const ownsRecord = Effect.fn("ownsRecord")(function* (
|
|
708
721
|
address: string,
|
|
709
722
|
recordId: string,
|
|
710
|
-
): Effect.fn.Return<Ownership, never,
|
|
711
|
-
const
|
|
712
|
-
const isOwner = yield*
|
|
713
|
-
|
|
714
|
-
catch: (cause) => cause,
|
|
715
|
-
}).pipe(
|
|
716
|
-
Effect.map(({ object }) => isAddressOwner(object?.owner, address)),
|
|
723
|
+
): Effect.fn.Return<Ownership, never, Sui> {
|
|
724
|
+
const sui = yield* Sui;
|
|
725
|
+
const isOwner = yield* sui.getObject(ObjectId.make(normalizeSuiAddress(recordId))).pipe(
|
|
726
|
+
Effect.map((object) => isAddressOwner(object.owner, address)),
|
|
717
727
|
Effect.catch(() => Effect.succeed(false)),
|
|
718
728
|
);
|
|
719
729
|
return { address: normalizeSuiAddress(address), objectId: recordId, isOwner };
|