ci(release): publish latest release

parent 830fbd6c
IPFS hash of the deployment: IPFS hash of the deployment:
- CIDv0: `QmQY8h9hoqVp2nqyiK9W1VSqyFij9yG2UzMfZGbVR9hcfq` - CIDv0: `QmTQqr7ckQqN7ncCEsymtg82FzqqLErWZtxrNqYbZWrhw6`
- CIDv1: `bafybeibavbtwbt67v3e6xufqkwzfhb47pyuavqudshfmqxp33zuvx5efpa` - CIDv1: `bafybeicllvnavu3b6ygl2dqoi7z2hj4lsdeilowenblayhvxvprpsyzcle`
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,97 +10,14 @@ You can also access the Uniswap Interface from an IPFS gateway. ...@@ -10,97 +10,14 @@ 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://bafybeibavbtwbt67v3e6xufqkwzfhb47pyuavqudshfmqxp33zuvx5efpa.ipfs.dweb.link/ - https://bafybeicllvnavu3b6ygl2dqoi7z2hj4lsdeilowenblayhvxvprpsyzcle.ipfs.dweb.link/
- [ipfs://QmQY8h9hoqVp2nqyiK9W1VSqyFij9yG2UzMfZGbVR9hcfq/](ipfs://QmQY8h9hoqVp2nqyiK9W1VSqyFij9yG2UzMfZGbVR9hcfq/) - [ipfs://QmTQqr7ckQqN7ncCEsymtg82FzqqLErWZtxrNqYbZWrhw6/](ipfs://QmTQqr7ckQqN7ncCEsymtg82FzqqLErWZtxrNqYbZWrhw6/)
## 5.83.0 (2025-05-07) ### 5.83.1 (2025-05-07)
### Features
* **web:** add analytics event for embedded wallet sign in (#18908) 4258201
* **web:** add batched capability to legacy swap tx and gas info (#19139) 7e98a92
* **web:** add feature flags for permit mismatch (#19007) 0890576
* **web:** add pools to recent searches (#17403) 5ffc92b
* **web:** allow slippage in create, increase, and decrease (#18674) 0a37dcc
* **web:** batch analytics [staging mirror] (#19335) b59b8de
* **web:** batched swap feature flag (#19169) fd30fb3
* **web:** clean up web state, smartWallet reducer, hooks, etc (#18961) 0e3840e
* **web:** create toast component for mismatch case (#18962) 8cbd058
* **web:** create useMismatchAccount (#18870) f2ce7ed
* **web:** delegation mismatch modal (#18980) 301a7de
* **web:** disable uniswapx on quote args if mismatch account (#18907) 185d1a4
* **web:** gate limit order feature for mismatched delegation (#18979) 840d1f8
* **web:** implement permit tx step in UI / saga (#18898) 8b7362d
* **web:** limited support ui in mini p (#18990) daff0c4
* **web:** multi mismatch calls (#18955) 737f851
* **web:** mweb sign in connector polish (#18968) 2928718
* **web:** pass uniquote enabled to trading api requests (#18984) d3ea833
* **web:** poll 5792 txs (#19138) 36f8910
* **web:** prevent passkey sign in/up when iframed (#19015) f4174c5
* **web:** Recently connected modal polish (#18790) f1291d6
* **web:** retry with standard swap if batched fails (#19303) 8a774d3
* **web:** Sign In UX polish (#18798) 5805f2d
* **web:** submit batched transactions (#19079) 8c769ec
* **web:** track atomic supported chains (#19163) abda850
* **web:** track delegate status as user properties (#19331) d71c1ac
* **web:** track user prop delegate status (#19286) (#19308) 8168cfa
* **web:** update activity type and relevant UI (#19130) f0a6e65
### Bug Fixes ### Bug Fixes
* **web:** add additional statsig api urls to our csp.json file (#19034) ce2b43a * **web:** downgrade two errors to warnings (#19345) 88caf96
* **web:** add uniquote to ff modal (#19032) 073bf6c
* **web:** Adjust layout of TDP Stats (#18034) 747daed
* **web:** allow .env.defaults in the public repo (#19164) ed9e9f7
* **web:** allow access to testnet or mainnet tdps (#19166) 1dec896
* **web:** change colors of Slippage Input border when in a warning state (#18013) e04838e
* **web:** change numbers on the landing page (#18431) 7588d1b
* **web:** Change tooltip shadow color to black and align styling with Spore style (#18028) b531277
* **web:** check against all chains for mismatch (#19027) 08df5c7
* **web:** consistent delta arrow for amts close to zero (#18954) b55f4fb
* **web:** default to eth on mainnet for buy form (#18976) 6cb69dd
* **web:** display helper modal when token or pool not found (#18801) ff3a040
* **web:** don't fetch approvals when smartWallet or batched enabled (#19140) ba4a3b6
* **web:** fix approval call for create + increase (#19224) ffb2f62
* **web:** Fix styling of outage banner (#19113) 74318ed
* **web:** fix username in header via Web3Status (#18885) 97e6ed6
* **web:** Get The App playwright test (#19099) 4c9fa04
* **web:** improve lp page performance - extraneous quote requests (#18958) 0c8e6e2
* **web:** log statsig events to datadog (#19042) 72a7bac
* **web:** missing permit tx (#19327) 4358581
* **web:** more code splitting (#19086) a137af7
* **web:** parse both number and hex from getCapabilities (#19200) 9041a85
* **web:** persist toast forever (#19067) e52c747
* **web:** revert - track user prop delegate status [staging only] (#19311) c57a266
* **web:** tick tooltip overlap with graph boundary (#18971) 5e2e849
* **web:** Update app icon SVG so it renders properly in Safari (#18031) 01c0e75
* **web:** Update opacify util (#19037) 6dddf59
* **web:** update tx toast styles (#17640) 57d23a1
* **web:** use neutral1 color as the default text color for NumericalInputSymbol (#18901) 0e324f2
### Continuous Integration
* **web:** update sitemaps 6462060
### Tests
* **web:** improved slack reporter (#19107) a828bf4
* **web:** remaining swap tests (#19090) b52a122
* **web:** stub gql SearchTokens in LP e2e test (#18964) b754a4a
* **web:** swap settings e2e tests (#19087) d757545
* **web:** test statsig flags (#19127) f15d67c
* **web:** wrap tests (#19091) 2036ab5
### Code Refactoring
* **web:** break out fn and useMutation (#18869) 0b940c7
* **web:** break out what vs how of useRoutingApiAruguments (#18905) 0d1c4d4
* **web:** clean up routing type condition (#18906) ba8be91
* **web:** move createGetRoutingAPIArguments to file (#18909) d58014c
web/5.83.0 web/5.83.1
\ No newline at end of file \ No newline at end of file
...@@ -18,6 +18,7 @@ jest.mock('components/Web3Provider/wagmiConfig', () => ({ ...@@ -18,6 +18,7 @@ jest.mock('components/Web3Provider/wagmiConfig', () => ({
jest.mock('utilities/src/logger/logger', () => ({ jest.mock('utilities/src/logger/logger', () => ({
getLogger: jest.fn(() => ({ getLogger: jest.fn(() => ({
error: jest.fn(), error: jest.fn(),
warn: jest.fn(),
})), })),
})) }))
...@@ -41,14 +42,14 @@ describe('walletCapabilities', () => { ...@@ -41,14 +42,14 @@ describe('walletCapabilities', () => {
it('returns null for invalid response', async () => { it('returns null for invalid response', async () => {
// Make sure the logger is properly mocked before the test // Make sure the logger is properly mocked before the test
const mockLoggerError = jest.fn() const mockLoggerWarn = jest.fn()
;(getLogger as jest.Mock).mockReturnValue({ error: mockLoggerError }) ;(getLogger as jest.Mock).mockReturnValue({ error: jest.fn(), warn: mockLoggerWarn })
// Invalid mock response (missing 0x prefix) // Invalid mock response (missing 0x prefix)
;(wagmi_getCapabilities as jest.Mock).mockResolvedValue({ asdada: { atomic: { status: 'supported' } } }) ;(wagmi_getCapabilities as jest.Mock).mockResolvedValue({ asdada: { atomic: { status: 'supported' } } })
expect(await handleGetCapabilities()).toBeNull() expect(await handleGetCapabilities()).toBeNull()
expect(mockLoggerError).toHaveBeenCalled() expect(mockLoggerWarn).toHaveBeenCalled()
}) })
it('returns null on timeout', async () => { it('returns null on timeout', async () => {
...@@ -60,12 +61,12 @@ describe('walletCapabilities', () => { ...@@ -60,12 +61,12 @@ describe('walletCapabilities', () => {
it('returns null on error', async () => { it('returns null on error', async () => {
// Make sure the logger is properly mocked before the test // Make sure the logger is properly mocked before the test
const mockLoggerError = jest.fn() const mockLoggerWarn = jest.fn()
;(getLogger as jest.Mock).mockReturnValue({ error: mockLoggerError }) ;(getLogger as jest.Mock).mockReturnValue({ error: jest.fn(), warn: mockLoggerWarn })
;(wagmi_getCapabilities as jest.Mock).mockRejectedValue(new Error('API error')) ;(wagmi_getCapabilities as jest.Mock).mockRejectedValue(new Error('API error'))
expect(await handleGetCapabilities()).toBeNull() expect(await handleGetCapabilities()).toBeNull()
expect(mockLoggerError).toHaveBeenCalled() expect(mockLoggerWarn).toHaveBeenCalled()
}) })
}) })
......
...@@ -30,12 +30,7 @@ export async function handleGetCapabilities(): Promise<GetCapabilitiesResult | n ...@@ -30,12 +30,7 @@ export async function handleGetCapabilities(): Promise<GetCapabilitiesResult | n
if (error instanceof Error && error.message.includes('getCapabilities timeout')) { if (error instanceof Error && error.message.includes('getCapabilities timeout')) {
return null return null
} }
getLogger().error(error || new Error('Unknown error getting capabilities'), { getLogger().warn('useWalletCapabilities', 'handleGetCapabilities', `Error getting capabilities: ${error}`)
tags: {
file: 'useWalletCapabilities.ts',
function: 'handleGetCapabilities',
},
})
return null return null
} finally { } finally {
// prevent memory leaks // prevent memory leaks
......
...@@ -3,6 +3,7 @@ import { opacifyRaw } from 'ui/src/theme' ...@@ -3,6 +3,7 @@ import { opacifyRaw } from 'ui/src/theme'
jest.mock('utilities/src/logger/logger', () => ({ jest.mock('utilities/src/logger/logger', () => ({
logger: { logger: {
error: jest.fn(), error: jest.fn(),
warn: jest.fn(),
}, },
})) }))
...@@ -34,26 +35,27 @@ describe(opacifyRaw, () => { ...@@ -34,26 +35,27 @@ describe(opacifyRaw, () => {
it.each` it.each`
amount | color | expectedError amount | color | expectedError
${110} | ${'#aaaaaa'} | ${'provided opacity 110 should be between 0 and 100'} ${110} | ${'#aaaaaa'} | ${'Error: provided opacity 110 should be between 0 and 100'}
${110.99} | ${'#aaaaaa'} | ${'provided opacity 110.99 should be between 0 and 100'} ${110.99} | ${'#aaaaaa'} | ${'Error: provided opacity 110.99 should be between 0 and 100'}
${-10} | ${'#123456'} | ${'provided opacity -10 should be between 0 and 100'} ${-10} | ${'#123456'} | ${'Error: provided opacity -10 should be between 0 and 100'}
${-10.11} | ${'#123456'} | ${'provided opacity -10.11 should be between 0 and 100'} ${-10.11} | ${'#123456'} | ${'Error: provided opacity -10.11 should be between 0 and 100'}
${undefined} | ${'123456'} | ${'provided opacity undefined should be between 0 and 100'} ${undefined} | ${'123456'} | ${'Error: provided opacity undefined should be between 0 and 100'}
${50} | ${undefined} | ${"Cannot read properties of undefined (reading 'startsWith')"} ${50} | ${undefined} | ${"TypeError: Cannot read properties of undefined (reading 'startsWith')"}
${50} | ${'123456'} | ${'provided color 123456 is neither a hex nor an rgb color'} ${50} | ${'123456'} | ${'Error: provided color 123456 is neither a hex nor an rgb color'}
${50} | ${'#12'} | ${'provided color #12 was not in hexadecimal format (e.g. #000000)'} ${50} | ${'#12'} | ${'Error: provided color #12 was not in hexadecimal format (e.g. #000000)'}
${50} | ${'#gggggg'} | ${'provided color #gggggg contains invalid characters, should be a valid hex (e.g. #000000)'} ${50} | ${'#gggggg'} | ${'Error: provided color #gggggg contains invalid characters, should be a valid hex (e.g. #000000)'}
${50} | ${'rgb(1,1,'} | ${'provided color rgb(1,1, is invalid rgb format'} ${50} | ${'rgb(1,1,'} | ${'Error: provided color rgb(1,1, is invalid rgb format'}
${50} | ${'rgb(1,1)'} | ${'provided color rgb(1,1) does not have enough components'} ${50} | ${'rgb(1,1)'} | ${'Error: provided color rgb(1,1) does not have enough components'}
${50} | ${'rgbv(1,1,1,1)'} | ${'provided color rgbv(1,1,1,1) is neither a hex nor an rgb color'} ${50} | ${'rgbv(1,1,1,1)'} | ${'Error: provided color rgbv(1,1,1,1) is neither a hex nor an rgb color'}
${100} | ${'rgba(255, 255, 255, 0.5)'} | ${'provided color rgba(255, 255, 255, 0.5) is neither a hex nor an rgb color'} ${100} | ${'rgba(255, 255, 255, 0.5)'} | ${'Error: provided color rgba(255, 255, 255, 0.5) is neither a hex nor an rgb color'}
${30} | ${'rgba(255, 255, 255, 0.5)'} | ${'provided color rgba(255, 255, 255, 0.5) is neither a hex nor an rgb color'} ${30} | ${'rgba(255, 255, 255, 0.5)'} | ${'Error: provided color rgba(255, 255, 255, 0.5) is neither a hex nor an rgb color'}
${33.111111} | ${'rgba(255, 255, 255, 0.5)'} | ${'provided color rgba(255, 255, 255, 0.5) is neither a hex nor an rgb color'} ${33.111111} | ${'rgba(255, 255, 255, 0.5)'} | ${'Error: provided color rgba(255, 255, 255, 0.5) is neither a hex nor an rgb color'}
`('should throw an error when (amount=$amount, color=$color)', async ({ amount, color, expectedError }) => { `('should throw an error when (amount=$amount, color=$color)', async ({ amount, color, expectedError }) => {
opacifyRaw(amount, color) opacifyRaw(amount, color)
expect(logger.error).toHaveBeenCalledWith(new Error(expectedError), { expect(logger.warn).toHaveBeenCalledWith(
tags: { file: 'color/utils', function: 'opacifyRaw' }, 'color/utils',
extra: { args: [amount, color] }, 'opacifyRaw',
}) `Error opacifying color ${color} with opacity ${amount}: ${expectedError}`,
)
}) })
}) })
...@@ -36,10 +36,7 @@ export function opacifyRaw(opacity: number, color: string): string { ...@@ -36,10 +36,7 @@ export function opacifyRaw(opacity: number, color: string): string {
} }
throw new Error(`provided color ${color} is neither a hex nor an rgb color`) throw new Error(`provided color ${color} is neither a hex nor an rgb color`)
} catch (e) { } catch (e) {
logger.error(e, { logger.warn('color/utils', 'opacifyRaw', `Error opacifying color ${color} with opacity ${opacity}: ${e}`)
tags: { file: 'color/utils', function: 'opacifyRaw' },
extra: { args: [opacity, color] },
})
} }
return color return color
} }
......
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