ci(release): publish latest release

parent 830fbd6c
IPFS hash of the deployment:
- CIDv0: `QmQY8h9hoqVp2nqyiK9W1VSqyFij9yG2UzMfZGbVR9hcfq`
- CIDv1: `bafybeibavbtwbt67v3e6xufqkwzfhb47pyuavqudshfmqxp33zuvx5efpa`
- CIDv0: `QmTQqr7ckQqN7ncCEsymtg82FzqqLErWZtxrNqYbZWrhw6`
- CIDv1: `bafybeicllvnavu3b6ygl2dqoi7z2hj4lsdeilowenblayhvxvprpsyzcle`
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.
Your Uniswap settings are never remembered across different URLs.
IPFS gateways:
- https://bafybeibavbtwbt67v3e6xufqkwzfhb47pyuavqudshfmqxp33zuvx5efpa.ipfs.dweb.link/
- [ipfs://QmQY8h9hoqVp2nqyiK9W1VSqyFij9yG2UzMfZGbVR9hcfq/](ipfs://QmQY8h9hoqVp2nqyiK9W1VSqyFij9yG2UzMfZGbVR9hcfq/)
- https://bafybeicllvnavu3b6ygl2dqoi7z2hj4lsdeilowenblayhvxvprpsyzcle.ipfs.dweb.link/
- [ipfs://QmTQqr7ckQqN7ncCEsymtg82FzqqLErWZtxrNqYbZWrhw6/](ipfs://QmTQqr7ckQqN7ncCEsymtg82FzqqLErWZtxrNqYbZWrhw6/)
## 5.83.0 (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
### 5.83.1 (2025-05-07)
### Bug Fixes
* **web:** add additional statsig api urls to our csp.json file (#19034) ce2b43a
* **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:** downgrade two errors to warnings (#19345) 88caf96
web/5.83.0
\ No newline at end of file
web/5.83.1
\ No newline at end of file
......@@ -18,6 +18,7 @@ jest.mock('components/Web3Provider/wagmiConfig', () => ({
jest.mock('utilities/src/logger/logger', () => ({
getLogger: jest.fn(() => ({
error: jest.fn(),
warn: jest.fn(),
})),
}))
......@@ -41,14 +42,14 @@ describe('walletCapabilities', () => {
it('returns null for invalid response', async () => {
// Make sure the logger is properly mocked before the test
const mockLoggerError = jest.fn()
;(getLogger as jest.Mock).mockReturnValue({ error: mockLoggerError })
const mockLoggerWarn = jest.fn()
;(getLogger as jest.Mock).mockReturnValue({ error: jest.fn(), warn: mockLoggerWarn })
// Invalid mock response (missing 0x prefix)
;(wagmi_getCapabilities as jest.Mock).mockResolvedValue({ asdada: { atomic: { status: 'supported' } } })
expect(await handleGetCapabilities()).toBeNull()
expect(mockLoggerError).toHaveBeenCalled()
expect(mockLoggerWarn).toHaveBeenCalled()
})
it('returns null on timeout', async () => {
......@@ -60,12 +61,12 @@ describe('walletCapabilities', () => {
it('returns null on error', async () => {
// Make sure the logger is properly mocked before the test
const mockLoggerError = jest.fn()
;(getLogger as jest.Mock).mockReturnValue({ error: mockLoggerError })
const mockLoggerWarn = jest.fn()
;(getLogger as jest.Mock).mockReturnValue({ error: jest.fn(), warn: mockLoggerWarn })
;(wagmi_getCapabilities as jest.Mock).mockRejectedValue(new Error('API error'))
expect(await handleGetCapabilities()).toBeNull()
expect(mockLoggerError).toHaveBeenCalled()
expect(mockLoggerWarn).toHaveBeenCalled()
})
})
......
......@@ -30,12 +30,7 @@ export async function handleGetCapabilities(): Promise<GetCapabilitiesResult | n
if (error instanceof Error && error.message.includes('getCapabilities timeout')) {
return null
}
getLogger().error(error || new Error('Unknown error getting capabilities'), {
tags: {
file: 'useWalletCapabilities.ts',
function: 'handleGetCapabilities',
},
})
getLogger().warn('useWalletCapabilities', 'handleGetCapabilities', `Error getting capabilities: ${error}`)
return null
} finally {
// prevent memory leaks
......
......@@ -3,6 +3,7 @@ import { opacifyRaw } from 'ui/src/theme'
jest.mock('utilities/src/logger/logger', () => ({
logger: {
error: jest.fn(),
warn: jest.fn(),
},
}))
......@@ -34,26 +35,27 @@ describe(opacifyRaw, () => {
it.each`
amount | color | expectedError
${110} | ${'#aaaaaa'} | ${'provided opacity 110 should be between 0 and 100'}
${110.99} | ${'#aaaaaa'} | ${'provided opacity 110.99 should be between 0 and 100'}
${-10} | ${'#123456'} | ${'provided opacity -10 should be between 0 and 100'}
${-10.11} | ${'#123456'} | ${'provided opacity -10.11 should be between 0 and 100'}
${undefined} | ${'123456'} | ${'provided opacity undefined should be between 0 and 100'}
${50} | ${undefined} | ${"Cannot read properties of undefined (reading 'startsWith')"}
${50} | ${'123456'} | ${'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} | ${'#gggggg'} | ${'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)'} | ${'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'}
${100} | ${'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)'} | ${'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'}
${110} | ${'#aaaaaa'} | ${'Error: provided opacity 110 should be between 0 and 100'}
${110.99} | ${'#aaaaaa'} | ${'Error: provided opacity 110.99 should be between 0 and 100'}
${-10} | ${'#123456'} | ${'Error: provided opacity -10 should be between 0 and 100'}
${-10.11} | ${'#123456'} | ${'Error: provided opacity -10.11 should be between 0 and 100'}
${undefined} | ${'123456'} | ${'Error: provided opacity undefined should be between 0 and 100'}
${50} | ${undefined} | ${"TypeError: Cannot read properties of undefined (reading 'startsWith')"}
${50} | ${'123456'} | ${'Error: provided color 123456 is neither a hex nor an rgb color'}
${50} | ${'#12'} | ${'Error: provided color #12 was not in hexadecimal format (e.g. #000000)'}
${50} | ${'#gggggg'} | ${'Error: provided color #gggggg contains invalid characters, should be a valid hex (e.g. #000000)'}
${50} | ${'rgb(1,1,'} | ${'Error: provided color rgb(1,1, is invalid rgb format'}
${50} | ${'rgb(1,1)'} | ${'Error: provided color rgb(1,1) does not have enough components'}
${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)'} | ${'Error: 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)'} | ${'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 }) => {
opacifyRaw(amount, color)
expect(logger.error).toHaveBeenCalledWith(new Error(expectedError), {
tags: { file: 'color/utils', function: 'opacifyRaw' },
extra: { args: [amount, color] },
})
expect(logger.warn).toHaveBeenCalledWith(
'color/utils',
'opacifyRaw',
`Error opacifying color ${color} with opacity ${amount}: ${expectedError}`,
)
})
})
......@@ -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`)
} catch (e) {
logger.error(e, {
tags: { file: 'color/utils', function: 'opacifyRaw' },
extra: { args: [opacity, color] },
})
logger.warn('color/utils', 'opacifyRaw', `Error opacifying color ${color} with opacity ${opacity}: ${e}`)
}
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