ci(release): publish latest release

parent 24d4a410
IPFS hash of the deployment: IPFS hash of the deployment:
- CIDv0: `Qma7JPknjeioxNgRPRcWs7UWvV6VJduMgmNMJ6GdxsvYJt` - CIDv0: `QmWaBTFEnY4LqKBdeyyRBmwhCuphBhe3p3CKmxnnuNhY5z`
- CIDv1: `bafybeifo4c4ij3unqr3bgji2gbqmnnb5vs52mopawwu7irbfppk7aoenwe` - CIDv1: `bafybeid2kthnxmhk5tcm2ogpsjzooeo3dj6bt2oh6tk3vbrsqf4sc2ogju`
The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org).
...@@ -10,15 +10,15 @@ You can also access the Uniswap Interface from an IPFS gateway. ...@@ -10,15 +10,15 @@ You can also access the Uniswap Interface from an IPFS gateway.
Your Uniswap settings are never remembered across different URLs. Your Uniswap settings are never remembered across different URLs.
IPFS gateways: IPFS gateways:
- https://bafybeifo4c4ij3unqr3bgji2gbqmnnb5vs52mopawwu7irbfppk7aoenwe.ipfs.dweb.link/ - https://bafybeid2kthnxmhk5tcm2ogpsjzooeo3dj6bt2oh6tk3vbrsqf4sc2ogju.ipfs.dweb.link/
- https://bafybeifo4c4ij3unqr3bgji2gbqmnnb5vs52mopawwu7irbfppk7aoenwe.ipfs.cf-ipfs.com/ - https://bafybeid2kthnxmhk5tcm2ogpsjzooeo3dj6bt2oh6tk3vbrsqf4sc2ogju.ipfs.cf-ipfs.com/
- [ipfs://Qma7JPknjeioxNgRPRcWs7UWvV6VJduMgmNMJ6GdxsvYJt/](ipfs://Qma7JPknjeioxNgRPRcWs7UWvV6VJduMgmNMJ6GdxsvYJt/) - [ipfs://QmWaBTFEnY4LqKBdeyyRBmwhCuphBhe3p3CKmxnnuNhY5z/](ipfs://QmWaBTFEnY4LqKBdeyyRBmwhCuphBhe3p3CKmxnnuNhY5z/)
### 5.63.3 (2024-12-23) ### 5.63.4 (2025-01-02)
### Bug Fixes ### Bug Fixes
* **web:** change default rpc url (#14764) 153ffd9 * **web:** set duped events as executed to prevent retry - prod (#14781) 35193b4
web/5.63.3 web/5.63.4
\ No newline at end of file \ No newline at end of file
...@@ -23,9 +23,13 @@ const buildTwitterProxyRequest = ({ ...@@ -23,9 +23,13 @@ const buildTwitterProxyRequest = ({
method: RequestType.POST, method: RequestType.POST,
headers: DEFAULT_HEADERS, headers: DEFAULT_HEADERS,
body: JSON.stringify({ body: JSON.stringify({
conversions: [
{
conversion_time: addJitter(new Date()), conversion_time: addJitter(new Date()),
event_id: eventId, event_id: eventId,
identifiers: [{ [PlatformIdType.Twitter]: lead.id }], identifiers: [{ [PlatformIdType.Twitter]: lead.id }],
},
],
}), }),
}) })
......
import { ConnectError } from '@connectrpc/connect'
import { useAtom } from 'jotai' import { useAtom } from 'jotai'
import { atomWithStorage } from 'jotai/utils' import { atomWithStorage } from 'jotai/utils'
import { parse } from 'qs' import { parse } from 'qs'
...@@ -46,6 +47,7 @@ export function useConversionTracking(): UseConversionTracking { ...@@ -46,6 +47,7 @@ export function useConversionTracking(): UseConversionTracking {
const trackConversion = useCallback( const trackConversion = useCallback(
async ({ platformIdType, eventId, eventName }: TrackConversionArgs) => { async ({ platformIdType, eventId, eventName }: TrackConversionArgs) => {
const lead = conversionLeads.find(({ type }) => type === platformIdType) const lead = conversionLeads.find(({ type }) => type === platformIdType)
let setAsExecuted: boolean = false
// Prevent triggering events under the following conditions: // Prevent triggering events under the following conditions:
// - No corresponding lead // - No corresponding lead
...@@ -74,13 +76,7 @@ export function useConversionTracking(): UseConversionTracking { ...@@ -74,13 +76,7 @@ export function useConversionTracking(): UseConversionTracking {
throw new Error() throw new Error()
} }
setConversionLeads((leads: ConversionLead[]) => [ setAsExecuted = true
...leads.filter(({ id }) => lead.id !== id),
{
...lead,
executedEvents: lead.executedEvents.concat([eventId]),
},
])
sendAnalyticsEvent(UniswapEventName.ConversionEventSubmitted, { sendAnalyticsEvent(UniswapEventName.ConversionEventSubmitted, {
id: lead.id, id: lead.id,
...@@ -88,13 +84,36 @@ export function useConversionTracking(): UseConversionTracking { ...@@ -88,13 +84,36 @@ export function useConversionTracking(): UseConversionTracking {
eventName, eventName,
platformIdType, platformIdType,
}) })
} catch (e) { } catch (error) {
// Note: The request will be retried until it exists in executedEvents // Note: The request will be retried until it exists in executedEvents
// If the event has already been executed, but doesn't exist in executedEvents, this will ensure we don't retry errors
if (error instanceof ConnectError) {
if (error.message.includes('limit for this (user, event)')) {
setAsExecuted = true
}
}
} finally {
if (setAsExecuted) {
setConversionLeads((leads: ConversionLead[]) => [
...leads.filter(({ id }) => lead.id !== id),
{
...lead,
executedEvents: lead.executedEvents.concat([eventId]),
},
])
}
} }
}, },
// TODO: Investigate why conversionProxy as a dependency causes a rendering loop // TODO: Investigate why conversionProxy as a dependency causes a rendering loop
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
[account.address, conversionLeads, setConversionLeads], [
account.address,
conversionLeads,
isConversionTrackingEnabled,
isGoogleConversionTrackingEnabled,
isTwitterConversionTrackingEnabled,
setConversionLeads,
],
) )
const trackConversions = useCallback( const trackConversions = useCallback(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment