Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PAY-2597] Test migration of a single endpoint from apiclient -> SDK #8091

Merged
merged 15 commits into from
Apr 15, 2024

Conversation

schottra
Copy link
Contributor

Description

This change is establishing a shadow pattern for future migrations to SDK.
The goal was to create a pattern that can easily be applied to existing call sites of AudiusAPIClient functions to transform them in to parallel "shadow" calls which will test and log a migrated version of a response without impacting the existing code.

I plan to upgrade this pattern (either in this PR or a future one) to use a feature flag for deployment to a small percentage of audiences and logging diff errors to Sentry so we can keep track of them.
Thus the rollout plan becomes:

  1. Migrate an endpoint
  2. Watch Sentry for some amount of safe time (1-4 weeks)
  3. If no errors logged, switch the code to use the migrated endpoint and remove the check

How Has This Been Tested?

Tested locally against staging. Will triple verify that errors don't actually interrupt the original request flow.

Copy link

changeset-bot bot commented Apr 11, 2024

⚠️ No Changeset found

Latest commit: db20f45

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@@ -100,3 +109,54 @@ export type UserMultihash = Pick<
User,
'metadata_multihash' | 'creator_node_endpoint'
>

/** Converts a SDK `full.UserFull` response to a UserMetadata. Note: Will _not_ include the "current user" fields as those aren't returned by the Users API */
export const userMetadataFromSDK = (
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Open to debate on this pattern. I'm considering just writing zod schemas and using those to parse here instead.
The goal is to transform a SDK object into the model we have here so that calls to a migrated endpoint return the exact same shape as the previous AudiusAPIClient call. We can do another pass later to decide if we want to start using SDK types directly.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started with that approach and abandoned it for a few reasons:

  1. Input to response adapters requires objects that are the same shape as the models defined for APIClient, which differs from what is returned by SDK (mostly do to the undefined vs. null issue).
  2. The ResponseAdapter has logic to default initialize number fields, which the SDK types say will always have valid values. So I think this caught some unnecessary logic in our response adapters.
  3. I was hoping that part of the SDK migration would be removing ResponseAdapters in favor of the model classes having local functions meant to initialize an instance.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair enough! I think #3 is something I would generally agree with, but that will also be a decent tack on of work

@audius-infra
Copy link
Collaborator

Preview this change https://demo.audius.co/rs-migrate-api-client

Copy link
Contributor

@sliptype sliptype left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a very "safe" way of going about this, which I think is good because we are going to be touching so much surface area.

In a way it feels like we are taking something really polished and trying to fit it onto something unpolished. Perhaps ripping the bandaid off so to speak would be less time consuming.

But I'm definitely on board with your approach because it's the only way we will have any sense of certainty if things broke

@@ -48,6 +48,7 @@
"async-retry": "1.3.3",
"bn.js": "5.1.0",
"dayjs": "1.10.7",
"deep-object-diff": "^1.1.9",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📍

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah thanks for the reminder


export type UserMetadata = {
album_count: number
allow_ai_attribution?: boolean
artist_pick_track_id: Nullable<number>
bio: Nullable<string>
blocknumber: number
collectibleList?: Collectible[]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been wondering if we should make a lint rule for object key alphabetization

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would certainly appreciate that. Our models are often kind of hard to read through.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

`DIFF ${apiName} FAILED. Migrated response was error: `,
migrated
)
} else if (migrated == null) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could there be cases where the legacy response is null?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops I had thought that apiclient guaranteed a value. But you're right, there is at least one function that could return null/undefined. So I'll update this to do a direct comparison for things which are not an instance of object/array

@schottra
Copy link
Contributor Author

@sliptype

Perhaps ripping the bandaid off so to speak would be less time consuming.

I hear you and appreciate the perspective. This pattern is also going to be used for the AudiusBackend part of things where it's not so straightforward.

It is a little bit more upfront work than just migrating things. But given that we have no existing tests and so many edge cases in how data gets returned (some things are optional/nullable and only used by a portion of users), this feels like a better way to get a signal on safety of a migration.

@audius-infra
Copy link
Collaborator

Preview this change https://demo.audius.co/rs-migrate-api-client

Copy link
Member

@raymondjacobson raymondjacobson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do agree w/ @sliptype that this is a heavy weight approach, more than I would personally advocate for. But, all good with me. Let's be careful that it doesn't end up giving us false positives. part of the migration may actually help us discovery other data inconsistencies.


export type UserMetadata = {
album_count: number
allow_ai_attribution?: boolean
artist_pick_track_id: Nullable<number>
bio: Nullable<string>
blocknumber: number
collectibleList?: Collectible[]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

@@ -100,3 +109,54 @@ export type UserMultihash = Pick<
User,
'metadata_multihash' | 'creator_node_endpoint'
>

/** Converts a SDK `full.UserFull` response to a UserMetadata. Note: Will _not_ include the "current user" fields as those aren't returned by the Users API */
export const userMetadataFromSDK = (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}
// Both object-like, perform deep diff
if (typeof legacy === 'object' && typeof migrated === 'object') {
const diffValue = detailedDiff(legacy, migrated)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can just use lodash here instead right? isEqual performs deep comparison and we aren't using the added/deleted/updated

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we just want a "are they both equal" approach, yes very true.

There's an updated implementation of this, but the short answer is that those fields are used in examining what is actually different between two responses vs. having to hunt through them property by property on every level to determine what the difference is. They just aren't used programmatically.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah... if they aren't used programmatically though, I don't think the future reader would understand why. Don't love adding another package just for this (600 bytes is small, fair enough). can we report it to sentry? or keep it in as a debug tool? or add some console.debugs?

just trying to be devil's advocate in a world where decreasing bundle size is a big goal

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I appreciate it! We do send the diff up to sentry now. That was a change I added after opening the PR

@schottra
Copy link
Contributor Author

part of the migration may actually help us discovery other data inconsistencies
@raymondjacobson This has already happened just with trying to figure out how to convert SDK types to what we expect in the client code!
And as much as I want to do a "oh I'll just fix this while I'm here", those often result in cascading regressions in all the places that had adapted to that behavior. Hence the goal of returning responses which are identical to APIClient, even if those have some quirks. :-(

* origin/main: (24 commits)
  Fix missing isTrack dependency (lint change) (#8096)
  ddex: limit publisher to 3 retries (#8062)
  Bump version to 0.6.80
  remove unused import (#8098)
  [C-4268] Fix player sagas prev functionality for premium track previews (#8094)
  Disable play e2e test (#8095)
  [PAY-2652] Album purchase/sale notifications (#8085)
  [DVRL-25] - Using Wallet Connect on the Protocol Dashboard (#8089)
  [C-4252] Update search screen navigation to clear search on mobile (#8092)
  Unrevert fetch-nft (#8080)
  PROTO-1711: acdc tip notification reactions (#8026)
  Bump version to 0.6.79
  [C-4226] Remove lossless toggle in upload flow and download section on track (#8083)
  [PAY-2677] Retries for Discovery Solana Relay (#8087)
  [PAY-2684] Fix wrap on audio wallet actions (#8073)
  [PAY-2685] Render TrackAddedToPurchasedAlbumNotification on mobile (#8084)
  [PAY-2585] Premium album edit feature (#8071)
  Standardize ddex envs to work with audius-docker-compose better (#8078)
  [PROTO-1754] Fix DDEX albums being editable, fields not persisting (#8077)
  [C-4260] Improve icon a11y (#8075)
  ...
Copy link

gitguardian bot commented Apr 12, 2024

⚠️ GitGuardian has uncovered 3 secrets following the scan of your pull request.

Please consider investigating the findings and remediating the incidents. Failure to do so may lead to compromising the associated services or software components.

🔎 Detected hardcoded secrets in your pull request
GitGuardian id GitGuardian status Secret Commit Filename
8818104 Triggered Generic High Entropy Secret 835c9ed packages/embed/.env.dev View secret
8818104 Triggered Generic High Entropy Secret 835c9ed packages/embed/.env.stage View secret
8818104 Triggered Generic High Entropy Secret 835c9ed packages/embed/.env.prod View secret
🛠 Guidelines to remediate hardcoded secrets
  1. Understand the implications of revoking this secret by investigating where it is used in your code.
  2. Replace and store your secrets safely. Learn here the best practices.
  3. Revoke and rotate these secrets.
  4. If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.

To avoid such incidents in the future consider


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

Our GitHub checks need improvements? Share your feedbacks!

@audius-infra
Copy link
Collaborator

Preview this change https://demo.audius.co/rs-migrate-api-client

}
}
// Not object like, perform strict equals
if (legacy !== migrated) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be an else if? don't we only want to do strict equals if they're not objects?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh jeez, I definitely happy-pathed this function. Good catch.

@audius-infra
Copy link
Collaborator

Preview this change https://demo.audius.co/rs-migrate-api-client

@audius-infra
Copy link
Collaborator

Preview this change https://demo.audius.co/rs-migrate-api-client

@audius-infra
Copy link
Collaborator

Preview this change https://demo.audius.co/rs-migrate-api-client

* origin/main:
  Bump version to 0.6.81
  v1.5.76
  [PAY-2689] Send tips via SDK (behind feature flag) (#8090)
  require handle_lc in users query (#8102)
  [PAY-2687] E2E tests for premium album edits (#8082)
@audius-infra
Copy link
Collaborator

Preview this change https://demo.audius.co/rs-migrate-api-client

@schottra schottra merged commit e19037a into main Apr 15, 2024
24 of 29 checks passed
@schottra schottra deleted the rs-migrate-api-client branch April 15, 2024 16:58
schottra added a commit that referenced this pull request Apr 15, 2024
* origin/main: (167 commits)
  Use docker image tags to control versioning (#8103)
  [C-3949] Fix infinite library bug (#8107)
  ACDC tip notifs: encode hash id (#8101)
  [PAY-2597] Test migration of a single endpoint from apiclient -> SDK (#8091)
  Fix preview start and end point parsing (#8106)
  [PROTO-1515] Hide modification buttons for ddex tracks and albums (#8097)
  Bump version to 0.6.81
  v1.5.76
  [PAY-2689] Send tips via SDK (behind feature flag) (#8090)
  require handle_lc in users query (#8102)
  [PAY-2687] E2E tests for premium album edits (#8082)
  Fix missing isTrack dependency (lint change) (#8096)
  ddex: limit publisher to 3 retries (#8062)
  Bump version to 0.6.80
  remove unused import (#8098)
  [C-4268] Fix player sagas prev functionality for premium track previews (#8094)
  Disable play e2e test (#8095)
  [PAY-2652] Album purchase/sale notifications (#8085)
  [DVRL-25] - Using Wallet Connect on the Protocol Dashboard (#8089)
  [C-4252] Update search screen navigation to clear search on mobile (#8092)
  ...
audius-infra pushed a commit that referenced this pull request Apr 17, 2024
[eca7b4e] [PAY-2698] Add purchase button do album DMs (mobile) (#8134) Andrew Mendelsohn
[283163b] Upgrade native version to 1.1.94 (#8137) Dylan Jeffers
[863aed6] [INF-690] Delete sdk release job (#8130) Sebastian Klingler
[296c98c] [C-4279] Don't log not found errors to sentry (#8131) Andrew Mendelsohn
[e362ec7] [PAY-2617] Buy button for tracklist in albums (#8111) JD Francis
[b90390c] Convert tier badges back to png from svg [C-1337] (#8105) nicoback2
[5426358] Fixes close icon color on artist dashboard (#8133) Randy Schott
[7544a26] Support coinflow relay on client (#8088) Raymond Jacobson
[c54acb9] Fix premium album uploads (#8129) JD Francis
[fcf9757] [PAY-2697] Add purchase button to album DM unfurl (#8113) Andrew Mendelsohn
[aae5184] [INF-674] Add changesets (#8036) Sebastian Klingler
[5e1ceb4] [PAY-2661] Add collection card (#8100) Dylan Jeffers
[f3716b5] Fix nft undefined bug (#8121) Saliou Diallo
[bfe784b] Add react-router-v5-compat (#8110) Dylan Jeffers
[6cb5cbc] Fix collection screen types (#8124) Dylan Jeffers
[99bce8a] [PAY-2626] Warning modal when removing track from premium album (#8093) JD Francis
[a685aab] Fix metro support for @metaplex-foundation/umi (#8123) Sebastian Klingler
[c2d7d24] Make collectibles grid virtualized (#8009) Raymond Jacobson
[26f85aa] [C-4278] Fix native search collections (#8117) Dylan Jeffers
[05ad52b] Lint fixes for main (#8114) Andrew Mendelsohn
[32ad757] [C-4276] Add skeleton and artwork to harmony (#8108) Dylan Jeffers
[b54a2cd] [C-3949] Fix infinite library bug (#8107) Kyle Shanks
[1b400a4] ACDC tip notifs: encode hash id (#8101) alecsavvy
[e19037a] [PAY-2597] Test migration of a single endpoint from apiclient -> SDK (#8091) Randy Schott
[2da0d76] [PROTO-1515] Hide modification buttons for ddex tracks and albums (#8097) Theo Ilie
audius-infra pushed a commit that referenced this pull request Apr 18, 2024
[189834b] Revert version bump pt 2 sliptype
[33d1cb1] Revert version bump sliptype
[81e664d] v1.5.197 audius-infra
[5b08941] v1.5.196 audius-infra
[653fb4f] v1.5.195 audius-infra
[daa66c1] v1.5.194 audius-infra
[12c3493] v1.5.193 audius-infra
[4ea47f3] v1.5.192 audius-infra
[eae7c9c] v1.5.191 audius-infra
[6fcce3a] v1.5.190 audius-infra
[0e31639] v1.5.189 audius-infra
[bc8299f] v1.5.188 audius-infra
[33ad216] v1.5.187 audius-infra
[9d22f29] v1.5.186 audius-infra
[2d07d10] v1.5.185 audius-infra
[46745f7] v1.5.184 audius-infra
[7f643c6] v1.5.183 audius-infra
[1661499] v1.5.182 audius-infra
[96fc23d] v1.5.181 audius-infra
[e2b81f0] v1.5.180 audius-infra
[b3326ba] v1.5.179 audius-infra
[690168d] v1.5.178 audius-infra
[044f20f] v1.5.177 audius-infra
[6d9836b] v1.5.176 audius-infra
[fc6a40c] v1.5.175 audius-infra
[0ec4587] v1.5.174 audius-infra
[e8e9511] v1.5.173 audius-infra
[5f90c9a] v1.5.172 audius-infra
[781e5b4] v1.5.171 audius-infra
[6445c36] v1.5.170 audius-infra
[a65f44f] v1.5.169 audius-infra
[5f9927b] v1.5.168 audius-infra
[f6d8b3d] v1.5.167 audius-infra
[bfe984d] v1.5.166 audius-infra
[c9d6d6b] v1.5.165 audius-infra
[5ef3c96] v1.5.164 audius-infra
[8a84a3c] v1.5.163 audius-infra
[38d92b2] v1.5.162 audius-infra
[08e0825] v1.5.161 audius-infra
[9fb76bb] v1.5.160 audius-infra
[232e39c] v1.5.159 audius-infra
[45d3f65] v1.5.158 audius-infra
[cf1fe12] v1.5.157 audius-infra
[d9d1e5a] v1.5.156 audius-infra
[c42aae3] v1.5.155 audius-infra
[b11061c] v1.5.154 audius-infra
[e46e26a] v1.5.153 audius-infra
[2a9e030] v1.5.152 audius-infra
[38c9239] v1.5.151 audius-infra
[5c6a81b] v1.5.150 audius-infra
[f3b63bd] v1.5.149 audius-infra
[aa9380a] v1.5.148 audius-infra
[9926f1e] v1.5.147 audius-infra
[0a72ffa] v1.5.146 audius-infra
[e1d8de3] v1.5.145 audius-infra
[342a44c] v1.5.144 audius-infra
[97c0f34] v1.5.143 audius-infra
[d9ac347] v1.5.142 audius-infra
[eea4191] v1.5.141 audius-infra
[065ee82] v1.5.140 audius-infra
[8de980b] v1.5.139 audius-infra
[0afb9ce] v1.5.138 audius-infra
[7747f6b] v1.5.137 audius-infra
[8af8cca] v1.5.136 audius-infra
[85162c7] v1.5.135 audius-infra
[58f911b] v1.5.134 audius-infra
[a6d63bc] v1.5.133 audius-infra
[ba95ddc] v1.5.132 audius-infra
[c8b8ee2] v1.5.131 audius-infra
[08dce07] v1.5.130 audius-infra
[04037bd] v1.5.129 audius-infra
[149dd62] v1.5.128 audius-infra
[b67c590] v1.5.127 audius-infra
[2594c8b] v1.5.126 audius-infra
[cd4ceae] v1.5.125 audius-infra
[2a76eb2] v1.5.124 audius-infra
[eaa2e49] v1.5.123 audius-infra
[2748b4b] v1.5.122 audius-infra
[ffaae4c] v1.5.121 audius-infra
[3dcce94] v1.5.120 audius-infra
[57886e0] v1.5.119 audius-infra
[d2bb663] v1.5.118 audius-infra
[ef095cc] v1.5.117 audius-infra
[d30635a] v1.5.116 audius-infra
[d4dc291] v1.5.115 audius-infra
[0a96677] v1.5.114 audius-infra
[d63f1e2] v1.5.113 audius-infra
[3a34a50] v1.5.112 audius-infra
[054c0af] v1.5.111 audius-infra
[9c0436e] v1.5.110 audius-infra
[2bc96b7] v1.5.109 audius-infra
[38cffa9] v1.5.108 audius-infra
[e60e1fc] v1.5.107 audius-infra
[708b371] v1.5.106 audius-infra
[cda2846] v1.5.105 audius-infra
[8dc235e] v1.5.104 audius-infra
[cc20c06] v1.5.103 audius-infra
[3ca0423] v1.5.102 audius-infra
[d6f4993] v1.5.101 audius-infra
[88b1235] v1.5.100 audius-infra
[5f10b8f] v1.5.99 audius-infra
[9dd5cb1] v1.5.98 audius-infra
[140b332] v1.5.97 audius-infra
[4119352] v1.5.96 audius-infra
[93ee1be] v1.5.95 audius-infra
[e62a84d] v1.5.94 audius-infra
[aee1403] v1.5.93 audius-infra
[074e133] v1.5.92 audius-infra
[3ca80d4] v1.5.91 audius-infra
[ea47f05] v1.5.90 audius-infra
[56b92fd] v1.5.89 audius-infra
[bf933fb] v1.5.88 audius-infra
[54e2ab9] v1.5.87 audius-infra
[7635463] v1.5.86 audius-infra
[2aba710] v1.5.85 audius-infra
[67d7387] v1.5.84 audius-infra
[97dff7a] v1.5.83 audius-infra
[fb7629f] v1.5.82 audius-infra
[2c82d08] v1.5.81 audius-infra
[feb2503] v1.5.80 audius-infra
[8036d7b] v1.5.79 audius-infra
[7a78b19] v1.5.78 audius-infra
[4924c0f] v1.5.77 audius-infra
[eca7b4e] [PAY-2698] Add purchase button do album DMs (mobile) (#8134) Andrew Mendelsohn
[283163b] Upgrade native version to 1.1.94 (#8137) Dylan Jeffers
[863aed6] [INF-690] Delete sdk release job (#8130) Sebastian Klingler
[296c98c] [C-4279] Don't log not found errors to sentry (#8131) Andrew Mendelsohn
[e362ec7] [PAY-2617] Buy button for tracklist in albums (#8111) JD Francis
[b90390c] Convert tier badges back to png from svg [C-1337] (#8105) nicoback2
[5426358] Fixes close icon color on artist dashboard (#8133) Randy Schott
[7544a26] Support coinflow relay on client (#8088) Raymond Jacobson
[c54acb9] Fix premium album uploads (#8129) JD Francis
[fcf9757] [PAY-2697] Add purchase button to album DM unfurl (#8113) Andrew Mendelsohn
[aae5184] [INF-674] Add changesets (#8036) Sebastian Klingler
[5e1ceb4] [PAY-2661] Add collection card (#8100) Dylan Jeffers
[f3716b5] Fix nft undefined bug (#8121) Saliou Diallo
[bfe784b] Add react-router-v5-compat (#8110) Dylan Jeffers
[6cb5cbc] Fix collection screen types (#8124) Dylan Jeffers
[99bce8a] [PAY-2626] Warning modal when removing track from premium album (#8093) JD Francis
[a685aab] Fix metro support for @metaplex-foundation/umi (#8123) Sebastian Klingler
[c2d7d24] Make collectibles grid virtualized (#8009) Raymond Jacobson
[26f85aa] [C-4278] Fix native search collections (#8117) Dylan Jeffers
[05ad52b] Lint fixes for main (#8114) Andrew Mendelsohn
[32ad757] [C-4276] Add skeleton and artwork to harmony (#8108) Dylan Jeffers
[b54a2cd] [C-3949] Fix infinite library bug (#8107) Kyle Shanks
[1b400a4] ACDC tip notifs: encode hash id (#8101) alecsavvy
[e19037a] [PAY-2597] Test migration of a single endpoint from apiclient -> SDK (#8091) Randy Schott
[2da0d76] [PROTO-1515] Hide modification buttons for ddex tracks and albums (#8097) Theo Ilie
audius-infra pushed a commit that referenced this pull request Apr 20, 2024
[e74455d] [PAY-2688] Add prototype foundation for manager mode (#8154) Randy Schott
[6825c33] [PAY-2709, PAY-2710, PAY-2708] Various CollectionTile fixes (#8145) Andrew Mendelsohn
[7ad1e89] [C-4289] Make verify call lint instead of lint:fix (#8152) Sebastian Klingler
[d9420a9] [PAY-2666] Only show withdrawals on withdrawals tab (#8142) Marcus Pasell
[5249858] [ONC-74] Fix social account association (#8162) Marcus Pasell
[d66d393] Make another ddex delivery work (different URL) (#8161) Theo Ilie
[a50c773] [C-4247] Add cumulative rewards UI to web (#8143) Saliou Diallo
[5bce1aa] Add target for iOS privacy manifest (#8155) Sebastian Klingler
[d3510d1] Revert "Test figma code-connect (#8139)" (#8151) Dylan Jeffers
[8c91e4e] fix: Minor copy change in album upload flow (#8150) JD Francis
[bc84708] Test figma code-connect (#8139) Dylan Jeffers
[e6335ba] Allow audio/x-flac mime type (#8141) Steve Perkins
[e467cbe] [PAY-2695] Add hidden and premium collection card variants (#8135) Dylan Jeffers
[7182221] [PROTO-1726] Start simple entrypoint for distro (#8104) Raymond Jacobson
[eca7b4e] [PAY-2698] Add purchase button do album DMs (mobile) (#8134) Andrew Mendelsohn
[283163b] Upgrade native version to 1.1.94 (#8137) Dylan Jeffers
[863aed6] [INF-690] Delete sdk release job (#8130) Sebastian Klingler
[296c98c] [C-4279] Don't log not found errors to sentry (#8131) Andrew Mendelsohn
[e362ec7] [PAY-2617] Buy button for tracklist in albums (#8111) JD Francis
[b90390c] Convert tier badges back to png from svg [C-1337] (#8105) nicoback2
[5426358] Fixes close icon color on artist dashboard (#8133) Randy Schott
[7544a26] Support coinflow relay on client (#8088) Raymond Jacobson
[c54acb9] Fix premium album uploads (#8129) JD Francis
[fcf9757] [PAY-2697] Add purchase button to album DM unfurl (#8113) Andrew Mendelsohn
[aae5184] [INF-674] Add changesets (#8036) Sebastian Klingler
[5e1ceb4] [PAY-2661] Add collection card (#8100) Dylan Jeffers
[f3716b5] Fix nft undefined bug (#8121) Saliou Diallo
[bfe784b] Add react-router-v5-compat (#8110) Dylan Jeffers
[6cb5cbc] Fix collection screen types (#8124) Dylan Jeffers
[99bce8a] [PAY-2626] Warning modal when removing track from premium album (#8093) JD Francis
[a685aab] Fix metro support for @metaplex-foundation/umi (#8123) Sebastian Klingler
[c2d7d24] Make collectibles grid virtualized (#8009) Raymond Jacobson
[26f85aa] [C-4278] Fix native search collections (#8117) Dylan Jeffers
[05ad52b] Lint fixes for main (#8114) Andrew Mendelsohn
[32ad757] [C-4276] Add skeleton and artwork to harmony (#8108) Dylan Jeffers
[b54a2cd] [C-3949] Fix infinite library bug (#8107) Kyle Shanks
[1b400a4] ACDC tip notifs: encode hash id (#8101) alecsavvy
[e19037a] [PAY-2597] Test migration of a single endpoint from apiclient -> SDK (#8091) Randy Schott
[2da0d76] [PROTO-1515] Hide modification buttons for ddex tracks and albums (#8097) Theo Ilie
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants