@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/dist/read/wallet.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import {
|
|
2
|
+
import { type MusicosDeploymentInvalid, type MusicosWorkNotFound } from "@misofm/musicos";
|
|
3
|
+
import { type PartyosDeploymentError } from "@misofm/partyos";
|
|
4
|
+
import { DecodeError, Sui, SuiGraphQL, type BatchItemError, type GraphQLUnavailable, type TransportError } from "@unconfirmed/sui-effect";
|
|
5
|
+
import { OperationsUnavailableError } from "../errors.ts";
|
|
3
6
|
import type { MisoConfig } from "./config.ts";
|
|
4
7
|
import type { Balance, OwnedParty, OwnedRecord, OwnedWork, Ownership, PendingMembership, WorkDetail } from "./types.ts";
|
|
5
8
|
type WorkAdminCapType = {
|
|
@@ -19,14 +22,14 @@ export declare function classifyVaultedWorkAdminCapType(type: string, vaultPacka
|
|
|
19
22
|
* The server-side type filter and exact local check deliberately exclude records
|
|
20
23
|
* from any retired package namespace.
|
|
21
24
|
*/
|
|
22
|
-
export declare const getOwnedRecords: (owner: string, config: MisoConfig) => Effect.Effect<OwnedRecord[],
|
|
25
|
+
export declare const getOwnedRecords: (owner: string, config: MisoConfig) => Effect.Effect<OwnedRecord[], TransportError, Sui>;
|
|
23
26
|
/**
|
|
24
27
|
* The parties `owner` administers. A wallet "owns" a party iff it holds the
|
|
25
28
|
* party's `PartyAdminCap`, so this is one owned-objects listing filtered to the
|
|
26
29
|
* cap type plus a name resolve. Caps are transferable, which is why this is
|
|
27
30
|
* authoritative in a way that remembering created parties client-side is not.
|
|
28
31
|
*/
|
|
29
|
-
export declare const getOwnedParties: (owner: string, config: MisoConfig) => Effect.Effect<OwnedParty[],
|
|
32
|
+
export declare const getOwnedParties: (owner: string, config: MisoConfig) => Effect.Effect<OwnedParty[], PartyosDeploymentError | TransportError, Sui>;
|
|
30
33
|
/**
|
|
31
34
|
* Pending group invitations for every individual party the wallet administers.
|
|
32
35
|
*
|
|
@@ -35,26 +38,34 @@ export declare const getOwnedParties: (owner: string, config: MisoConfig) => Eff
|
|
|
35
38
|
* names are resolved in one batch so the API can render an inbox without extra
|
|
36
39
|
* browser reads.
|
|
37
40
|
*/
|
|
38
|
-
export declare const getPendingMemberships: (owner: string, config: MisoConfig) => Effect.Effect<PendingMembership[],
|
|
41
|
+
export declare const getPendingMemberships: (owner: string, config: MisoConfig) => Effect.Effect<PendingMembership[], DecodeError | PartyosDeploymentError | TransportError, Sui>;
|
|
39
42
|
/**
|
|
40
43
|
* Every work the wallet administers, keyed by its ADMIN CAP id (the studio
|
|
41
44
|
* catalog's routing unit — caps are what control means here).
|
|
42
45
|
*
|
|
43
|
-
* Three transports, one answer: direct or vaulted cap discovery is
|
|
44
|
-
* request maps every share type to its work address (
|
|
45
|
-
* object has type X"); one
|
|
46
|
+
* Three transports, one answer: direct or vaulted cap discovery is Core; one aliased GraphQL
|
|
47
|
+
* request maps every share type to its work address (Core cannot ask "which
|
|
48
|
+
* object has type X"); one Core batch loads all the work contents. Releases skip
|
|
46
49
|
* the GraphQL hop entirely — `ReleaseAdminCap` is not generic and carries
|
|
47
50
|
* `release_id` directly.
|
|
48
51
|
*/
|
|
49
|
-
export declare const getOwnedWorks: (owner: string, config: MisoConfig) => Effect.Effect<OwnedWork[],
|
|
52
|
+
export declare const getOwnedWorks: (owner: string, config: MisoConfig) => Effect.Effect<OwnedWork[], GraphQLUnavailable | MusicosDeploymentInvalid | OperationsUnavailableError | TransportError | BatchItemError, Sui | SuiGraphQL>;
|
|
50
53
|
/** Classify a direct or vaulted cap by its on-chain type, then resolve its work. */
|
|
51
|
-
export declare const getWorkByCap: (capId: string, config: MisoConfig) => Effect.Effect<WorkDetail | null,
|
|
54
|
+
export declare const getWorkByCap: (capId: string, config: MisoConfig) => Effect.Effect<WorkDetail | null, GraphQLUnavailable | MusicosDeploymentInvalid | MusicosWorkNotFound | OperationsUnavailableError | TransportError | BatchItemError, Sui | SuiGraphQL>;
|
|
52
55
|
/**
|
|
53
56
|
* A wallet's balance in one currency. Keep the aggregate and both Sui storage
|
|
54
57
|
* classes: callers using a `FundsWithdrawal` must never mistake coin-object
|
|
55
58
|
* value for immediately withdrawable address balance.
|
|
59
|
+
*
|
|
60
|
+
* TODO(stage 2/3): the predecessor cached `getCoinMetadata` per (transport
|
|
61
|
+
* client, coin type) in a module-level `WeakMap`. This standalone function has
|
|
62
|
+
* no layer to hold an `Effect.cachedWithTTL`-backed cache in (the issue's own
|
|
63
|
+
* target design for this); dropped rather than reintroducing a module-level
|
|
64
|
+
* cache keyed on a raw client object, which `Sui`'s per-call service instance
|
|
65
|
+
* makes awkward to key by. Revisit once this becomes a `Miso.read.getBalance`
|
|
66
|
+
* service member with a layer to hold the cache.
|
|
56
67
|
*/
|
|
57
|
-
export declare const getBalance: (address: string, config: MisoConfig, coinType?: string | undefined) => Effect.Effect<Balance,
|
|
68
|
+
export declare const getBalance: (address: string, config: MisoConfig, coinType?: string | undefined) => Effect.Effect<Balance, DecodeError | TransportError, Sui>;
|
|
58
69
|
/**
|
|
59
70
|
* Whether `address` controls a party — i.e. holds its `PartyAdminCap`. The cap is
|
|
60
71
|
* a DERIVED object of the party, so this is one `getObject` on a computed id, no
|
|
@@ -64,13 +75,13 @@ export declare const getBalance: (address: string, config: MisoConfig, coinType?
|
|
|
64
75
|
* A failed read means "can't confirm", which resolves to `false` — the editor
|
|
65
76
|
* stays hidden rather than being offered and then rejected on submit.
|
|
66
77
|
*/
|
|
67
|
-
export declare const ownsParty: (address: string, partyId: string, config: MisoConfig) => Effect.Effect<Ownership, never,
|
|
78
|
+
export declare const ownsParty: (address: string, partyId: string, config: MisoConfig) => Effect.Effect<Ownership, never, Sui>;
|
|
68
79
|
/**
|
|
69
80
|
* Whether `address` owns a record. Records are address-owned objects, so this is
|
|
70
81
|
* one `getObject` and an owner compare. Presentation gating only — it decides
|
|
71
82
|
* whether the Snapshots tab appears, and a non-owner has no snapshot content to
|
|
72
83
|
* fetch regardless.
|
|
73
84
|
*/
|
|
74
|
-
export declare const ownsRecord: (address: string, recordId: string) => Effect.Effect<Ownership, never,
|
|
85
|
+
export declare const ownsRecord: (address: string, recordId: string) => Effect.Effect<Ownership, never, Sui>;
|
|
75
86
|
export {};
|
|
76
87
|
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/read/wallet.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/read/wallet.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAA0B,MAAM,QAAQ,CAAC;AACxD,OAAO,EAKL,KAAK,wBAAwB,EAE7B,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAkC,KAAK,sBAAsB,EAAuB,MAAM,iBAAiB,CAAC;AACnH,OAAO,EAEL,WAAW,EAEX,GAAG,EAEH,UAAU,EAEV,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAoCpB,KAAK,gBAAgB,GACjB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAsDxB,mFAAmF;AACnF,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GACpB,gBAAgB,GAAG,IAAI,CAmBzB;AA+BD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,0FAqC1B,CAAC;AAIH;;;;;GAKG;AACH,eAAO,MAAM,eAAe,kHA+B1B,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,uIA8BhC,CAAC;AAqHH;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,mMA4DxB,CAAC;AAEH,oFAAoF;AACpF,eAAO,MAAM,YAAY,+NAyHvB,CAAC;AAIH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,mIAwBrB,CAAC;AAWH;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,gGAYpB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,6EAUrB,CAAC"}
|
package/dist/read/wallet.js
CHANGED
|
@@ -10,11 +10,12 @@
|
|
|
10
10
|
// gRPC) is exactly the sort of thing that should exist once in the SDK rather
|
|
11
11
|
// than be reimplemented by every browser, Worker, server, or native client.
|
|
12
12
|
import { normalizeStructTag, normalizeSuiAddress, parseStructTag } from "@mysten/sui/utils";
|
|
13
|
-
import { Effect, Option } from "effect";
|
|
14
|
-
import { contracts as networkContracts, getCompositionByShareType,
|
|
13
|
+
import { Effect, Option, Result, Stream } from "effect";
|
|
14
|
+
import { contracts as networkContracts, getCompositionByShareType, getRecordingByShareType, Musicos, } from "@misofm/musicos";
|
|
15
15
|
import { party as partyContracts } from "@misofm/partyos/contracts";
|
|
16
|
-
import { derivePartyAdminCapId,
|
|
17
|
-
import {
|
|
16
|
+
import { derivePartyAdminCapId, Partyos } from "@misofm/partyos";
|
|
17
|
+
import { CoinType, DecodeError, ObjectId, Sui, SuiAddress, SuiGraphQL, StructTag, } from "@unconfirmed/sui-effect";
|
|
18
|
+
import { OperationsUnavailableError } from "../errors.js";
|
|
18
19
|
import { int, u64 } from "./internal/scalars.js";
|
|
19
20
|
import * as vaultContract from "../contracts/vault/vault.js";
|
|
20
21
|
import * as recordContract from "../contracts/record/record.js";
|
|
@@ -26,7 +27,25 @@ import { getRecordingTitles, getWorkAddressesByShareTypes, getWorksByIds } from
|
|
|
26
27
|
* set can't spin forever. 50/page × 20 = 1000 objects — far beyond any realistic
|
|
27
28
|
* library.
|
|
28
29
|
*/
|
|
29
|
-
const
|
|
30
|
+
const MAX_OWNED_OBJECTS = 1000;
|
|
31
|
+
/**
|
|
32
|
+
* Builds `Musicos.layer({ deployment: { packageId } })` / `Partyos.layer({
|
|
33
|
+
* deployment })`, provides it, and hands back the effect it wraps — see
|
|
34
|
+
* `../catalog.ts`'s `withMusicos` for the same idiom (kept file-local; see
|
|
35
|
+
* `docs/CONVERSION-STATUS.md`).
|
|
36
|
+
*/
|
|
37
|
+
function withMusicos(packageId, effect) {
|
|
38
|
+
return Effect.gen(function* () {
|
|
39
|
+
const musicos = yield* Musicos;
|
|
40
|
+
return yield* effect(musicos);
|
|
41
|
+
}).pipe(Effect.provide(Musicos.layer({ deployment: { packageId } })));
|
|
42
|
+
}
|
|
43
|
+
function withPartyos(partyosPackageId, effect) {
|
|
44
|
+
return Effect.gen(function* () {
|
|
45
|
+
const partyos = yield* Partyos;
|
|
46
|
+
return yield* effect(partyos);
|
|
47
|
+
}).pipe(Effect.provide(Partyos.layer({ deployment: { partyos: partyosPackageId } })));
|
|
48
|
+
}
|
|
30
49
|
function classifyWorkAdminCapType(type, misoPackageId) {
|
|
31
50
|
let tag;
|
|
32
51
|
try {
|
|
@@ -104,21 +123,6 @@ function isCanonicalRecordType(type, recordPackageId) {
|
|
|
104
123
|
}
|
|
105
124
|
return true;
|
|
106
125
|
}
|
|
107
|
-
/** One page of `client.core.listOwnedObjects`, requesting `content` when `withContent` is set. */
|
|
108
|
-
const listOwnedObjectsPage = Effect.fn("listOwnedObjectsPage")(function* (owner, type, cursor, withContent) {
|
|
109
|
-
const client = yield* SuiClient;
|
|
110
|
-
return yield* Effect.tryPromise({
|
|
111
|
-
try: (signal) => client.core.listOwnedObjects({
|
|
112
|
-
owner,
|
|
113
|
-
type,
|
|
114
|
-
cursor,
|
|
115
|
-
limit: 50,
|
|
116
|
-
...(withContent ? { include: { content: true } } : {}),
|
|
117
|
-
signal,
|
|
118
|
-
}),
|
|
119
|
-
catch: (cause) => new SuiRpcError({ operation: "listOwnedObjects", cause }),
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
126
|
/**
|
|
123
127
|
* The records `owner` holds. Ownership is DIRECT — a record is an address-owned
|
|
124
128
|
* `<record>::record::Record` with no pressing/license/receipt intermediary.
|
|
@@ -126,44 +130,35 @@ const listOwnedObjectsPage = Effect.fn("listOwnedObjectsPage")(function* (owner,
|
|
|
126
130
|
* from any retired package namespace.
|
|
127
131
|
*/
|
|
128
132
|
export const getOwnedRecords = Effect.fn("getOwnedRecords")(function* (owner, config) {
|
|
129
|
-
const
|
|
130
|
-
let cursor = null;
|
|
133
|
+
const sui = yield* Sui;
|
|
131
134
|
const sales = requireRecordSalesDeployment(config.recordSales);
|
|
132
|
-
const recordType = `${sales.recordPackageId}::record::Record
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if (normalizeSuiAddress(record.id) !== normalizeSuiAddress(obj.objectId)) {
|
|
143
|
-
throw new Error(`Record ${obj.objectId} has mismatched embedded UID ${record.id}`);
|
|
144
|
-
}
|
|
145
|
-
const derived = deriveRecordId(record.pressing_id, record.number, sales.recordPackageId);
|
|
146
|
-
if (normalizeSuiAddress(derived) !== normalizeSuiAddress(obj.objectId)) {
|
|
147
|
-
throw new Error(`Record ${obj.objectId} is not derived from its Pressing and number`);
|
|
148
|
-
}
|
|
149
|
-
out.push({
|
|
150
|
-
id: obj.objectId,
|
|
151
|
-
type: obj.type,
|
|
152
|
-
releaseId: record.release_id,
|
|
153
|
-
pressingId: record.pressing_id,
|
|
154
|
-
edition: record.edition,
|
|
155
|
-
number: record.number,
|
|
156
|
-
purchaseCurrency: normalizeStructTag(record.purchase_currency.name),
|
|
157
|
-
purchasePrice: record.purchase_price,
|
|
158
|
-
purchasedBy: record.purchased_by,
|
|
159
|
-
purchasedTimestampMs: record.purchased_timestamp_ms,
|
|
160
|
-
});
|
|
135
|
+
const recordType = StructTag.make(`${sales.recordPackageId}::record::Record`);
|
|
136
|
+
const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: recordType }).pipe(Stream.take(MAX_OWNED_OBJECTS)));
|
|
137
|
+
const out = [];
|
|
138
|
+
for (const obj of objects) {
|
|
139
|
+
if (!isCanonicalRecordType(obj.type, sales.recordPackageId)) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const record = recordContract.Record.parse(obj.content);
|
|
143
|
+
if (normalizeSuiAddress(record.id) !== normalizeSuiAddress(obj.id)) {
|
|
144
|
+
throw new Error(`Record ${obj.id} has mismatched embedded UID ${record.id}`);
|
|
161
145
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
146
|
+
const derived = deriveRecordId(record.pressing_id, record.number, sales.recordPackageId);
|
|
147
|
+
if (normalizeSuiAddress(derived) !== normalizeSuiAddress(obj.id)) {
|
|
148
|
+
throw new Error(`Record ${obj.id} is not derived from its Pressing and number`);
|
|
149
|
+
}
|
|
150
|
+
out.push({
|
|
151
|
+
id: obj.id,
|
|
152
|
+
type: obj.type,
|
|
153
|
+
releaseId: record.release_id,
|
|
154
|
+
pressingId: record.pressing_id,
|
|
155
|
+
edition: record.edition,
|
|
156
|
+
number: record.number,
|
|
157
|
+
purchaseCurrency: normalizeStructTag(record.purchase_currency.name),
|
|
158
|
+
purchasePrice: record.purchase_price,
|
|
159
|
+
purchasedBy: record.purchased_by,
|
|
160
|
+
purchasedTimestampMs: record.purchased_timestamp_ms,
|
|
161
|
+
});
|
|
167
162
|
}
|
|
168
163
|
return out;
|
|
169
164
|
});
|
|
@@ -175,14 +170,15 @@ export const getOwnedRecords = Effect.fn("getOwnedRecords")(function* (owner, co
|
|
|
175
170
|
* authoritative in a way that remembering created parties client-side is not.
|
|
176
171
|
*/
|
|
177
172
|
export const getOwnedParties = Effect.fn("getOwnedParties")(function* (owner, config) {
|
|
178
|
-
const
|
|
173
|
+
const sui = yield* Sui;
|
|
174
|
+
const capType = StructTag.make(`${config.partyos.partyos}::party::PartyAdminCap`);
|
|
179
175
|
// One page of 50 caps is plenty for launch-scale artists; paginate if labels
|
|
180
176
|
// ever start hitting the cap.
|
|
181
|
-
const
|
|
177
|
+
const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: capType }).pipe(Stream.take(50)));
|
|
182
178
|
const caps = objects.flatMap((obj) => {
|
|
183
179
|
try {
|
|
184
180
|
const cap = partyContracts.PartyAdminCap.parse(obj.content);
|
|
185
|
-
return [{ capId: obj.
|
|
181
|
+
return [{ capId: obj.id, partyId: cap.party_id }];
|
|
186
182
|
}
|
|
187
183
|
catch {
|
|
188
184
|
return [];
|
|
@@ -190,9 +186,10 @@ export const getOwnedParties = Effect.fn("getOwnedParties")(function* (owner, co
|
|
|
190
186
|
});
|
|
191
187
|
if (caps.length === 0)
|
|
192
188
|
return [];
|
|
193
|
-
const
|
|
189
|
+
const results = yield* withPartyos(config.partyos.partyos, (partyos) => partyos.getPartiesByIds(caps.map((c) => ObjectId.make(c.partyId))));
|
|
190
|
+
const parties = new Map(results.flatMap((result, index) => (Result.isSuccess(result) ? [[caps[index].partyId, result.success]] : [])));
|
|
194
191
|
return caps.flatMap(({ capId, partyId }) => {
|
|
195
|
-
const p = parties
|
|
192
|
+
const p = parties.get(partyId);
|
|
196
193
|
return p ? [{ partyId, capId, name: p.name, kind: p.kind }] : [];
|
|
197
194
|
});
|
|
198
195
|
});
|
|
@@ -209,13 +206,14 @@ export const getPendingMemberships = Effect.fn("getPendingMemberships")(function
|
|
|
209
206
|
const individuals = controlled.filter((party) => party.kind === "individual");
|
|
210
207
|
if (individuals.length === 0)
|
|
211
208
|
return [];
|
|
212
|
-
const invitations = yield* Effect.forEach(individuals, (member) =>
|
|
209
|
+
const invitations = yield* withPartyos(config.partyos.partyos, (partyos) => Effect.forEach(individuals, (member) => partyos.getPendingMemberships(ObjectId.make(member.partyId)).pipe(Effect.map((groupIds) => ({ member, groupIds }))), { concurrency: "unbounded" }));
|
|
213
210
|
const groupIds = [...new Set(invitations.flatMap(({ groupIds }) => groupIds))];
|
|
214
211
|
if (groupIds.length === 0)
|
|
215
212
|
return [];
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
213
|
+
const groupResults = yield* withPartyos(config.partyos.partyos, (partyos) => partyos.getPartiesByIds(groupIds));
|
|
214
|
+
const groups = new Map(groupResults.flatMap((result, index) => (Result.isSuccess(result) ? [[groupIds[index], result.success]] : [])));
|
|
215
|
+
return invitations.flatMap(({ member, groupIds: memberGroupIds }) => memberGroupIds.flatMap((groupId) => {
|
|
216
|
+
const group = groups.get(groupId);
|
|
219
217
|
return group?.kind === "group"
|
|
220
218
|
? [{ memberPartyId: member.partyId, memberCapId: member.capId, groupId, groupName: group.name }]
|
|
221
219
|
: [];
|
|
@@ -223,26 +221,19 @@ export const getPendingMemberships = Effect.fn("getPendingMemberships")(function
|
|
|
223
221
|
});
|
|
224
222
|
// ── Works (studio catalog) ───────────────────────────────────────────────────
|
|
225
223
|
/**
|
|
226
|
-
* Owned generic admin caps
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
224
|
+
* Owned generic admin caps. The bare type filter matches every instantiation of
|
|
225
|
+
* `CompositionAdminCap<T>` / `RecordingAdminCap<T>`; the share type `T` is
|
|
226
|
+
* parsed back out of each instance's type tag, because the cap does not store
|
|
227
|
+
* the work's id — only its share type.
|
|
230
228
|
*/
|
|
231
229
|
const ownedGenericCaps = Effect.fn("ownedGenericCaps")(function* (owner, capType) {
|
|
230
|
+
const sui = yield* Sui;
|
|
231
|
+
const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: StructTag.make(capType) }).pipe(Stream.take(MAX_OWNED_OBJECTS)));
|
|
232
232
|
const caps = [];
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const match = /<(.+)>$/.exec(obj.type);
|
|
238
|
-
if (match?.[1])
|
|
239
|
-
caps.push({ id: obj.objectId, shareType: match[1] });
|
|
240
|
-
}
|
|
241
|
-
if (!res.hasNextPage)
|
|
242
|
-
break;
|
|
243
|
-
cursor = res.cursor;
|
|
244
|
-
if (!cursor)
|
|
245
|
-
break;
|
|
233
|
+
for (const obj of objects) {
|
|
234
|
+
const match = /<(.+)>$/.exec(obj.type);
|
|
235
|
+
if (match?.[1])
|
|
236
|
+
caps.push({ id: obj.id, shareType: match[1] });
|
|
246
237
|
}
|
|
247
238
|
return caps;
|
|
248
239
|
});
|
|
@@ -252,41 +243,40 @@ const ownedGenericCaps = Effect.fn("ownedGenericCaps")(function* (owner, capType
|
|
|
252
243
|
* surface (composition / recording / release), not a sale-management surface.
|
|
253
244
|
*/
|
|
254
245
|
const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (owner, config) {
|
|
246
|
+
// No current-or-legacy Vault package id: this deployment has no vaulted
|
|
247
|
+
// works to enumerate at all, so the caller (`getOwnedWorks`) fails typed
|
|
248
|
+
// rather than silently reporting only the direct caps (B1, misofm/sdks#35
|
|
249
|
+
// verification — `MisoConfig` itself always constructs; this is the one
|
|
250
|
+
// member that actually needs the missing field).
|
|
251
|
+
if (config.protocol.vault === null) {
|
|
252
|
+
return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
|
|
253
|
+
}
|
|
255
254
|
const out = { compositions: [], recordings: [], releases: [] };
|
|
256
255
|
const vaultPackageId = config.protocol.vault;
|
|
257
256
|
const misoPackageId = config.deployment.musicos;
|
|
258
|
-
const capType = `${vaultPackageId}::vault::VaultAdminCap
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const { vault_id: vaultId } = vaultContract.VaultAdminCap.parse(object.content);
|
|
270
|
-
if (work.kind === "composition") {
|
|
271
|
-
out.compositions.push({ id: object.objectId, shareType: work.shareType, vaultId });
|
|
272
|
-
}
|
|
273
|
-
else if (work.kind === "recording") {
|
|
274
|
-
out.recordings.push({ id: object.objectId, shareType: work.shareType, vaultId });
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
out.releases.push({ id: object.objectId, vaultId });
|
|
278
|
-
}
|
|
257
|
+
const capType = StructTag.make(`${vaultPackageId}::vault::VaultAdminCap`);
|
|
258
|
+
const sui = yield* Sui;
|
|
259
|
+
const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: capType }).pipe(Stream.take(MAX_OWNED_OBJECTS)));
|
|
260
|
+
for (const object of objects) {
|
|
261
|
+
const work = classifyVaultedWorkAdminCapType(object.type, vaultPackageId, misoPackageId);
|
|
262
|
+
if (!work)
|
|
263
|
+
continue;
|
|
264
|
+
try {
|
|
265
|
+
const { vault_id: vaultId } = vaultContract.VaultAdminCap.parse(object.content);
|
|
266
|
+
if (work.kind === "composition") {
|
|
267
|
+
out.compositions.push({ id: object.id, shareType: work.shareType, vaultId });
|
|
279
268
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
// authority and should not hide otherwise valid catalog entries.
|
|
269
|
+
else if (work.kind === "recording") {
|
|
270
|
+
out.recordings.push({ id: object.id, shareType: work.shareType, vaultId });
|
|
283
271
|
}
|
|
272
|
+
else {
|
|
273
|
+
out.releases.push({ id: object.id, vaultId });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// A malformed object under the configured vault namespace is not usable
|
|
278
|
+
// authority and should not hide otherwise valid catalog entries.
|
|
284
279
|
}
|
|
285
|
-
if (!res.hasNextPage)
|
|
286
|
-
break;
|
|
287
|
-
cursor = res.cursor;
|
|
288
|
-
if (!cursor)
|
|
289
|
-
break;
|
|
290
280
|
}
|
|
291
281
|
return out;
|
|
292
282
|
});
|
|
@@ -294,24 +284,35 @@ const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (owner,
|
|
|
294
284
|
const resolveVaultedReleaseCaps = Effect.fn("resolveVaultedReleaseCaps")(function* (caps, config) {
|
|
295
285
|
if (caps.length === 0)
|
|
296
286
|
return [];
|
|
287
|
+
// Every caller only reaches here with a non-empty `caps` after already
|
|
288
|
+
// establishing `config.protocol.vault` is configured (`ownedVaultedWorkCaps`,
|
|
289
|
+
// `getWorkByCap`'s own guard below) — this is a defensive typed failure,
|
|
290
|
+
// not an expected path, so an interpolated `null` can never reach `vaultType`.
|
|
291
|
+
if (config.protocol.vault === null) {
|
|
292
|
+
return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
|
|
293
|
+
}
|
|
297
294
|
const releaseCapType = `${config.deployment.musicos}::release::ReleaseAdminCap`;
|
|
298
295
|
const vaultType = normalizeStructTag(`${config.protocol.vault}::vault::Vault<${releaseCapType}>`);
|
|
299
|
-
const
|
|
296
|
+
const sui = yield* Sui;
|
|
297
|
+
const results = yield* sui.getObjects(caps.map((cap) => ObjectId.make(cap.vaultId)));
|
|
300
298
|
const releasesByVault = new Map();
|
|
301
|
-
|
|
299
|
+
results.forEach((result, index) => {
|
|
300
|
+
if (!Result.isSuccess(result))
|
|
301
|
+
return;
|
|
302
|
+
const object = result.success;
|
|
302
303
|
try {
|
|
303
304
|
if (normalizeStructTag(object.type) !== vaultType)
|
|
304
|
-
|
|
305
|
+
return;
|
|
305
306
|
const vault = vaultContract.Vault(networkContracts.release.ReleaseAdminCap).parse(object.content);
|
|
306
307
|
const releaseId = vault.cap?.value?.release_id;
|
|
307
308
|
if (releaseId)
|
|
308
|
-
releasesByVault.set(
|
|
309
|
+
releasesByVault.set(caps[index].vaultId, releaseId);
|
|
309
310
|
}
|
|
310
311
|
catch {
|
|
311
312
|
// Batch catalog discovery is best-effort per authority, matching the
|
|
312
313
|
// existing direct-cap path's treatment of unreadable work objects.
|
|
313
314
|
}
|
|
314
|
-
}
|
|
315
|
+
});
|
|
315
316
|
return caps.flatMap((cap) => {
|
|
316
317
|
const releaseId = releasesByVault.get(cap.vaultId);
|
|
317
318
|
return releaseId ? [{ id: cap.id, releaseId }] : [];
|
|
@@ -321,9 +322,9 @@ const resolveVaultedReleaseCaps = Effect.fn("resolveVaultedReleaseCaps")(functio
|
|
|
321
322
|
* Every work the wallet administers, keyed by its ADMIN CAP id (the studio
|
|
322
323
|
* catalog's routing unit — caps are what control means here).
|
|
323
324
|
*
|
|
324
|
-
* Three transports, one answer: direct or vaulted cap discovery is
|
|
325
|
-
* request maps every share type to its work address (
|
|
326
|
-
* object has type X"); one
|
|
325
|
+
* Three transports, one answer: direct or vaulted cap discovery is Core; one aliased GraphQL
|
|
326
|
+
* request maps every share type to its work address (Core cannot ask "which
|
|
327
|
+
* object has type X"); one Core batch loads all the work contents. Releases skip
|
|
327
328
|
* the GraphQL hop entirely — `ReleaseAdminCap` is not generic and carries
|
|
328
329
|
* `release_id` directly.
|
|
329
330
|
*/
|
|
@@ -332,13 +333,13 @@ export const getOwnedWorks = Effect.fn("getOwnedWorks")(function* (owner, config
|
|
|
332
333
|
const [directCompCaps, directRecCaps, directRelCaps, vaulted] = yield* Effect.all([
|
|
333
334
|
ownedGenericCaps(owner, `${miso}::composition::CompositionAdminCap`),
|
|
334
335
|
ownedGenericCaps(owner, `${miso}::recording::RecordingAdminCap`),
|
|
335
|
-
|
|
336
|
+
withMusicos(miso, (musicos) => musicos.getOwnedReleaseAdminCaps(SuiAddress.make(normalizeSuiAddress(owner)))),
|
|
336
337
|
ownedVaultedWorkCaps(owner, config),
|
|
337
338
|
]);
|
|
338
339
|
const vaultedRelCaps = yield* resolveVaultedReleaseCaps(vaulted.releases, config);
|
|
339
340
|
const compCaps = [...directCompCaps, ...vaulted.compositions];
|
|
340
341
|
const recCaps = [...directRecCaps, ...vaulted.recordings];
|
|
341
|
-
const relCaps = [...directRelCaps, ...vaultedRelCaps];
|
|
342
|
+
const relCaps = [...directRelCaps.map((cap) => ({ id: String(cap.id), releaseId: String(cap.id) })), ...vaultedRelCaps];
|
|
342
343
|
const addresses = yield* getWorkAddressesByShareTypes({ compositions: compCaps.map((c) => c.shareType), recordings: recCaps.map((c) => c.shareType) }, miso);
|
|
343
344
|
const works = yield* getWorksByIds({
|
|
344
345
|
compositions: Object.values(addresses.compositions).filter((id) => id !== undefined),
|
|
@@ -377,7 +378,8 @@ export const getOwnedWorks = Effect.fn("getOwnedWorks")(function* (owner, config
|
|
|
377
378
|
/** Classify a direct or vaulted cap by its on-chain type, then resolve its work. */
|
|
378
379
|
export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config) {
|
|
379
380
|
const miso = config.deployment.musicos;
|
|
380
|
-
const
|
|
381
|
+
const sui = yield* Sui;
|
|
382
|
+
const found = yield* sui.getObjectOption(ObjectId.make(normalizeSuiAddress(capId)));
|
|
381
383
|
if (Option.isNone(found))
|
|
382
384
|
return null;
|
|
383
385
|
const { content, type } = found.value;
|
|
@@ -411,7 +413,7 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config)
|
|
|
411
413
|
if (direct?.kind === "release") {
|
|
412
414
|
// `ReleaseAdminCap`'s BCS carries `release_id` directly — no `json` include needed.
|
|
413
415
|
const { release_id: releaseId } = networkContracts.release.ReleaseAdminCap.parse(content);
|
|
414
|
-
const r = yield* getReleaseById(releaseId);
|
|
416
|
+
const r = yield* withMusicos(miso, (musicos) => musicos.getReleaseById(ObjectId.make(releaseId)));
|
|
415
417
|
return {
|
|
416
418
|
capId,
|
|
417
419
|
kind: "release",
|
|
@@ -422,6 +424,13 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config)
|
|
|
422
424
|
trackCount: r.tracks.length,
|
|
423
425
|
};
|
|
424
426
|
}
|
|
427
|
+
// Every direct classification above already fell through: this cap can
|
|
428
|
+
// only be a legitimate work authority if it is a vaulted one, which
|
|
429
|
+
// requires the deployment's Vault package id (B1, misofm/sdks#35
|
|
430
|
+
// verification) — fail typed rather than misreport "no such work".
|
|
431
|
+
if (config.protocol.vault === null) {
|
|
432
|
+
return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
|
|
433
|
+
}
|
|
425
434
|
const vaulted = classifyVaultedWorkAdminCapType(type, config.protocol.vault, miso);
|
|
426
435
|
if (!vaulted) {
|
|
427
436
|
// A real object, but not a supported work authority — "no such work",
|
|
@@ -456,7 +465,7 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config)
|
|
|
456
465
|
const [releaseCap] = yield* resolveVaultedReleaseCaps([{ id: capId, vaultId }], config);
|
|
457
466
|
if (!releaseCap)
|
|
458
467
|
throw new Error(`Release vault ${vaultId} carries no release admin cap`);
|
|
459
|
-
const r = yield* getReleaseById(releaseCap.releaseId);
|
|
468
|
+
const r = yield* withMusicos(miso, (musicos) => musicos.getReleaseById(ObjectId.make(releaseCap.releaseId)));
|
|
460
469
|
return {
|
|
461
470
|
capId,
|
|
462
471
|
kind: "release",
|
|
@@ -468,59 +477,37 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config)
|
|
|
468
477
|
};
|
|
469
478
|
});
|
|
470
479
|
// ── Balance ──────────────────────────────────────────────────────────────────
|
|
471
|
-
const decimalsByClient = new WeakMap();
|
|
472
|
-
/**
|
|
473
|
-
* Resolve once per (transport client, coin type). Failed lookups are evicted so
|
|
474
|
-
* a transient fullnode error cannot poison a long-lived API worker.
|
|
475
|
-
*/
|
|
476
|
-
function coinDecimalsPromise(client, coinType) {
|
|
477
|
-
let cache = decimalsByClient.get(client);
|
|
478
|
-
if (!cache) {
|
|
479
|
-
cache = new Map();
|
|
480
|
-
decimalsByClient.set(client, cache);
|
|
481
|
-
}
|
|
482
|
-
const key = normalizeStructTag(coinType);
|
|
483
|
-
const cached = cache.get(key);
|
|
484
|
-
if (cached)
|
|
485
|
-
return cached;
|
|
486
|
-
const pending = client.core.getCoinMetadata({ coinType: key }).then(({ coinMetadata }) => {
|
|
487
|
-
const decimals = coinMetadata?.decimals;
|
|
488
|
-
if (!Number.isSafeInteger(decimals) || decimals < 0 || decimals > 18) {
|
|
489
|
-
throw new Error(`Coin metadata for ${key} has no supported decimal precision`);
|
|
490
|
-
}
|
|
491
|
-
return decimals;
|
|
492
|
-
});
|
|
493
|
-
cache.set(key, pending);
|
|
494
|
-
pending.catch(() => {
|
|
495
|
-
if (cache.get(key) === pending)
|
|
496
|
-
cache.delete(key);
|
|
497
|
-
});
|
|
498
|
-
return pending;
|
|
499
|
-
}
|
|
500
480
|
/**
|
|
501
481
|
* A wallet's balance in one currency. Keep the aggregate and both Sui storage
|
|
502
482
|
* classes: callers using a `FundsWithdrawal` must never mistake coin-object
|
|
503
483
|
* value for immediately withdrawable address balance.
|
|
484
|
+
*
|
|
485
|
+
* TODO(stage 2/3): the predecessor cached `getCoinMetadata` per (transport
|
|
486
|
+
* client, coin type) in a module-level `WeakMap`. This standalone function has
|
|
487
|
+
* no layer to hold an `Effect.cachedWithTTL`-backed cache in (the issue's own
|
|
488
|
+
* target design for this); dropped rather than reintroducing a module-level
|
|
489
|
+
* cache keyed on a raw client object, which `Sui`'s per-call service instance
|
|
490
|
+
* makes awkward to key by. Revisit once this becomes a `Miso.read.getBalance`
|
|
491
|
+
* service member with a layer to hold the cache.
|
|
504
492
|
*/
|
|
505
493
|
export const getBalance = Effect.fn("getBalance")(function* (address, config, coinType) {
|
|
506
|
-
const
|
|
494
|
+
const sui = yield* Sui;
|
|
507
495
|
const type = coinType ?? config.money.usdCoinType;
|
|
508
|
-
const [
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
catch: (cause) => new SuiRpcError({ operation: "getBalance", cause }),
|
|
512
|
-
}),
|
|
513
|
-
Effect.tryPromise({
|
|
514
|
-
try: () => coinDecimalsPromise(client, type),
|
|
515
|
-
catch: (cause) => new SuiRpcError({ operation: "getCoinMetadata", cause }),
|
|
516
|
-
}),
|
|
496
|
+
const [balance, metadata] = yield* Effect.all([
|
|
497
|
+
sui.getBalance(SuiAddress.make(normalizeSuiAddress(address)), CoinType.make(normalizeStructTag(type))),
|
|
498
|
+
sui.core.getCoinMetadata({ coinType: normalizeStructTag(type) }),
|
|
517
499
|
]);
|
|
500
|
+
const rawDecimals = metadata.coinMetadata?.decimals;
|
|
501
|
+
if (!Number.isSafeInteger(rawDecimals) || rawDecimals < 0 || rawDecimals > 18) {
|
|
502
|
+
return yield* new DecodeError({ expectedType: type, issue: `coin metadata for ${type} has no supported decimal precision` });
|
|
503
|
+
}
|
|
504
|
+
const decimals = rawDecimals;
|
|
518
505
|
return {
|
|
519
506
|
address: normalizeSuiAddress(address),
|
|
520
507
|
coinType: type,
|
|
521
|
-
balance: u64(
|
|
522
|
-
coinBalance: u64(
|
|
523
|
-
addressBalance: u64(
|
|
508
|
+
balance: u64(balance.balance),
|
|
509
|
+
coinBalance: u64(balance.coinBalance),
|
|
510
|
+
addressBalance: u64(balance.addressBalance),
|
|
524
511
|
decimals,
|
|
525
512
|
};
|
|
526
513
|
});
|
|
@@ -540,12 +527,9 @@ function isAddressOwner(owner, address) {
|
|
|
540
527
|
*/
|
|
541
528
|
export const ownsParty = Effect.fn("ownsParty")(function* (address, partyId, config) {
|
|
542
529
|
const capId = derivePartyAdminCapId(partyId, config.partyos.partyos);
|
|
543
|
-
const
|
|
544
|
-
const isOwner = yield* Effect.
|
|
545
|
-
|
|
546
|
-
catch: (cause) => cause,
|
|
547
|
-
}).pipe(Effect.map(({ object }) => isAddressOwner(object?.owner, address)), Effect.catch(() => Effect.succeed(false)));
|
|
548
|
-
return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId };
|
|
530
|
+
const sui = yield* Sui;
|
|
531
|
+
const isOwner = yield* sui.getObject(ObjectId.make(capId)).pipe(Effect.map((object) => isAddressOwner(object.owner, address)), Effect.catch(() => Effect.succeed(false)));
|
|
532
|
+
return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId: String(capId) };
|
|
549
533
|
});
|
|
550
534
|
/**
|
|
551
535
|
* Whether `address` owns a record. Records are address-owned objects, so this is
|
|
@@ -554,11 +538,8 @@ export const ownsParty = Effect.fn("ownsParty")(function* (address, partyId, con
|
|
|
554
538
|
* fetch regardless.
|
|
555
539
|
*/
|
|
556
540
|
export const ownsRecord = Effect.fn("ownsRecord")(function* (address, recordId) {
|
|
557
|
-
const
|
|
558
|
-
const isOwner = yield* Effect.
|
|
559
|
-
try: (signal) => client.core.getObject({ objectId: recordId, signal }),
|
|
560
|
-
catch: (cause) => cause,
|
|
561
|
-
}).pipe(Effect.map(({ object }) => isAddressOwner(object?.owner, address)), Effect.catch(() => Effect.succeed(false)));
|
|
541
|
+
const sui = yield* Sui;
|
|
542
|
+
const isOwner = yield* sui.getObject(ObjectId.make(normalizeSuiAddress(recordId))).pipe(Effect.map((object) => isAddressOwner(object.owner, address)), Effect.catch(() => Effect.succeed(false)));
|
|
562
543
|
return { address: normalizeSuiAddress(address), objectId: recordId, isOwner };
|
|
563
544
|
});
|
|
564
545
|
//# sourceMappingURL=wallet.js.map
|