From 0b3a05e7e52e296920d9f713068e998e022560e1 Mon Sep 17 00:00:00 2001 From: Dylan Audius Date: Thu, 21 May 2026 12:12:49 -0700 Subject: [PATCH 1/3] fix(web): use relative paths when navigating after contest submit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The host-contest page passed full absolute URLs (fullContestPage, fullTrackPage) to react-router's navigate(), which treats them as relative path segments — producing blank pages at URLs like /host-contest/https:/audius.co//contest/. Switch to the relative-path helpers so submit, cancel, and delete navigate to a real route. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../host-remix-contest-page/HostRemixContestPage.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/web/src/pages/host-remix-contest-page/HostRemixContestPage.tsx b/packages/web/src/pages/host-remix-contest-page/HostRemixContestPage.tsx index 893801b874c..7972f7ee3c7 100644 --- a/packages/web/src/pages/host-remix-contest-page/HostRemixContestPage.tsx +++ b/packages/web/src/pages/host-remix-contest-page/HostRemixContestPage.tsx @@ -48,7 +48,7 @@ import Page from 'components/page/Page' import { useRequiresAccount } from 'hooks/useRequiresAccount' import { useTrackCoverArt } from 'hooks/useTrackCoverArt' import { track, make } from 'services/analytics' -import { fullContestPage, fullTrackPage } from 'utils/route' +import { contestPage } from 'utils/route' import { TimeInput, @@ -442,11 +442,7 @@ export const HostRemixContestPage = () => { navigate(CONTESTS_PAGE) return } - navigate( - isEdit - ? fullContestPage(primaryPermalink) - : fullTrackPage(primaryPermalink) - ) + navigate(isEdit ? contestPage(primaryPermalink) : primaryPermalink) }, [clearDraft, isEdit, navigate, primaryPermalink]) const handleSubmit = useCallback(() => { @@ -519,7 +515,7 @@ export const HostRemixContestPage = () => { clearDraft() if (effectivePermalink) { - navigate(fullContestPage(effectivePermalink)) + navigate(contestPage(effectivePermalink)) } else { navigate(CONTESTS_PAGE) } @@ -561,7 +557,7 @@ export const HostRemixContestPage = () => { } clearDraft() if (primaryPermalink) { - navigate(fullTrackPage(primaryPermalink)) + navigate(primaryPermalink) } }, [ clearDraft, From 98102f2120ddeaaeee5bf0c3446ef30c2e545b88 Mon Sep 17 00:00:00 2001 From: Dylan Audius Date: Thu, 21 May 2026 12:53:39 -0700 Subject: [PATCH 2/3] fix(web): await createEvent before navigating to the new contest page useCreateEvent's onMutate awaits sdk.events.generateEventId() before priming the optimistic cache. The previous fire-and-forget mutate() meant handleSubmit kept going and navigated to the contest page while the optimistic write was still pending, so the contest query found nothing in cache and the page stuck on its skeleton until the indexer caught up. Switch to mutateAsync and await it so the optimistic event is in the cache (and the SDK call has landed on the server) before we redirect. On error we now bail out of navigation so the user can retry from the form instead of landing on a half-created contest page. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../HostRemixContestPage.tsx | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/web/src/pages/host-remix-contest-page/HostRemixContestPage.tsx b/packages/web/src/pages/host-remix-contest-page/HostRemixContestPage.tsx index 7972f7ee3c7..2037abf9dbe 100644 --- a/packages/web/src/pages/host-remix-contest-page/HostRemixContestPage.tsx +++ b/packages/web/src/pages/host-remix-contest-page/HostRemixContestPage.tsx @@ -161,7 +161,7 @@ export const HostRemixContestPage = () => { isContestEntry: true }) - const { mutate: createEvent } = useCreateEvent() + const { mutateAsync: createEvent } = useCreateEvent() const { mutate: updateEvent } = useUpdateEvent() const { mutate: deleteEvent } = useDeleteEvent() @@ -445,7 +445,7 @@ export const HostRemixContestPage = () => { navigate(isEdit ? contestPage(primaryPermalink) : primaryPermalink) }, [clearDraft, isEdit, navigate, primaryPermalink]) - const handleSubmit = useCallback(() => { + const handleSubmit = useCallback(async () => { const parsedTime = parseTime(timeValue) if (!parsedTime) return @@ -496,14 +496,21 @@ export const HostRemixContestPage = () => { }) ) } else { - createEvent({ - eventType: EventEventTypeEnum.RemixContest, - entityType: EventEntityTypeEnum.Track, - entityId: entityTrackId, - eventData, - endDate, - userId: currentUserId - }) + try { + await createEvent({ + eventType: EventEventTypeEnum.RemixContest, + entityType: EventEntityTypeEnum.Track, + entityId: entityTrackId, + eventData, + endDate, + userId: currentUserId + }) + } catch { + // Mutation's onError already surfaces a toast; stay on the form so + // the user can retry instead of navigating to a half-created + // contest page. + return + } track( make({ From a068342bf143945f1747d32b8f1c5aba9c195481 Mon Sep 17 00:00:00 2001 From: Dylan Audius Date: Thu, 21 May 2026 15:40:38 -0700 Subject: [PATCH 3/3] chore: point anti-abuse oracle endpoint at anti-abuse-oracle.audius.engineering Update the AAO endpoint config across web, mobile, identity service, SDK services config, and the AAO pedalboard plugin to use the new audius.engineering host. Discovery / validator node URLs are unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) --- .changeset/aao-endpoint-engineering.md | 5 +++++ .../pedalboard/apps/anti-abuse-oracle/src/actionLog.ts | 2 +- packages/identity-service/src/utils/antiAbuse.js | 2 +- packages/mobile/src/services/env/env.prod.ts | 2 +- packages/sdk/src/sdk/config/production.ts | 2 +- packages/sdk/src/sdk/scripts/generateServicesConfig.ts | 2 +- packages/web/src/services/env/env.prod.ts | 2 +- 7 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/aao-endpoint-engineering.md diff --git a/.changeset/aao-endpoint-engineering.md b/.changeset/aao-endpoint-engineering.md new file mode 100644 index 00000000000..f6f46b611d7 --- /dev/null +++ b/.changeset/aao-endpoint-engineering.md @@ -0,0 +1,5 @@ +--- +'@audius/sdk': patch +--- + +Point the production anti-abuse oracle endpoint at `https://anti-abuse-oracle.audius.engineering`, replacing the old `https://discoveryprovider.audius.co` host in the SDK services config and supporting clients/services. diff --git a/packages/discovery-provider/plugins/pedalboard/apps/anti-abuse-oracle/src/actionLog.ts b/packages/discovery-provider/plugins/pedalboard/apps/anti-abuse-oracle/src/actionLog.ts index e5e41a43550..5cea14bbf02 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/anti-abuse-oracle/src/actionLog.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/anti-abuse-oracle/src/actionLog.ts @@ -185,7 +185,7 @@ export async function getUserNormalizedScore(userId: number, wallet: string) { } export async function getAAOAttestation(handle: string) { - const url = `https://antiabuseoracle.audius.co/abuse/${handle}` + const url = `https://anti-abuse-oracle.audius.engineering/abuse/${handle}` try { const response = await fetch(url) if (!response.ok) { diff --git a/packages/identity-service/src/utils/antiAbuse.js b/packages/identity-service/src/utils/antiAbuse.js index 9fcbdcba64b..452390cdc06 100644 --- a/packages/identity-service/src/utils/antiAbuse.js +++ b/packages/identity-service/src/utils/antiAbuse.js @@ -4,7 +4,7 @@ const { logger } = require('../logging') const models = require('../models') const aaoEndpoint = - config.get('aaoEndpoint') || 'https://antiabuseoracle.audius.co' + config.get('aaoEndpoint') || 'https://anti-abuse-oracle.audius.engineering' const allowRules = new Set([-17, -18]) const blockRelayAbuseErrorCodes = new Set([0, 8, 10, 13, 15, 18]) diff --git a/packages/mobile/src/services/env/env.prod.ts b/packages/mobile/src/services/env/env.prod.ts index 1e30fbec222..635251d6c8f 100644 --- a/packages/mobile/src/services/env/env.prod.ts +++ b/packages/mobile/src/services/env/env.prod.ts @@ -2,7 +2,7 @@ import type { Env } from '@audius/common/services' import Config from 'react-native-config' export const env: Env = { - AAO_ENDPOINT: 'https://discoveryprovider.audius.co', + AAO_ENDPOINT: 'https://anti-abuse-oracle.audius.engineering', AMPLITUDE_API_KEY: '86760558b8bb1b3aae61656efd4ddacb', AMPLITUDE_PROXY: 'https://gain2.audius.co/2/httpapi', API_KEY: '8acf5eb7436ea403ee536a7334faa5e9ada4b50f', diff --git a/packages/sdk/src/sdk/config/production.ts b/packages/sdk/src/sdk/config/production.ts index 567703b1f58..f65973133dc 100644 --- a/packages/sdk/src/sdk/config/production.ts +++ b/packages/sdk/src/sdk/config/production.ts @@ -24,7 +24,7 @@ export const productionConfig: SdkServicesConfig = { ], "antiAbuseOracleNodes": { "endpoints": [ - "https://discoveryprovider.audius.co", + "https://anti-abuse-oracle.audius.engineering", "https://audius-oracle.creatorseed.com", "https://oracle.audius.endl.net" ], diff --git a/packages/sdk/src/sdk/scripts/generateServicesConfig.ts b/packages/sdk/src/sdk/scripts/generateServicesConfig.ts index b48d17e2cb1..d796ab6f1a0 100644 --- a/packages/sdk/src/sdk/scripts/generateServicesConfig.ts +++ b/packages/sdk/src/sdk/scripts/generateServicesConfig.ts @@ -23,7 +23,7 @@ const productionConfig: SdkServicesConfig = { storageNodes: [], antiAbuseOracleNodes: { endpoints: [ - 'https://discoveryprovider.audius.co', + 'https://anti-abuse-oracle.audius.engineering', 'https://audius-oracle.creatorseed.com', 'https://oracle.audius.endl.net' ], diff --git a/packages/web/src/services/env/env.prod.ts b/packages/web/src/services/env/env.prod.ts index c75332381a1..9bfbe73845c 100644 --- a/packages/web/src/services/env/env.prod.ts +++ b/packages/web/src/services/env/env.prod.ts @@ -1,7 +1,7 @@ import { Env } from '@audius/common/services' export const env: Env = { - AAO_ENDPOINT: 'https://discoveryprovider.audius.co', + AAO_ENDPOINT: 'https://anti-abuse-oracle.audius.engineering', AMPLITUDE_API_KEY: '86760558b8bb1b3aae61656efd4ddacb', AMPLITUDE_PROXY: 'https://gain2.audius.co/2/httpapi', API_KEY: '8acf5eb7436ea403ee536a7334faa5e9ada4b50f',