ci(release): publish latest release

parent cd6e81be
IPFS hash of the deployment: IPFS hash of the deployment:
- CIDv0: `QmNseCQM3gjdY5cnH16fzEDwnaik9pnuLDaAXAWbET2gef` - CIDv0: `QmTHCMo5RJfwvTbGVNppipkh5CmXYx9SPkyJM7qzyP4uLM`
- CIDv1: `bafybeiah6bwq7dezzdlgk22o5nbiel2t73ev5tpo75mqebz5f4p5dw5v5q` - CIDv1: `bafybeicjm7s57co32yesjceb5zxpmrmzex4qqxt5ynyw57nov7xo46kwzi`
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,10 @@ You can also access the Uniswap Interface from an IPFS gateway. ...@@ -10,15 +10,10 @@ 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://bafybeiah6bwq7dezzdlgk22o5nbiel2t73ev5tpo75mqebz5f4p5dw5v5q.ipfs.dweb.link/ - https://bafybeicjm7s57co32yesjceb5zxpmrmzex4qqxt5ynyw57nov7xo46kwzi.ipfs.dweb.link/
- https://bafybeiah6bwq7dezzdlgk22o5nbiel2t73ev5tpo75mqebz5f4p5dw5v5q.ipfs.cf-ipfs.com/ - https://bafybeicjm7s57co32yesjceb5zxpmrmzex4qqxt5ynyw57nov7xo46kwzi.ipfs.cf-ipfs.com/
- [ipfs://QmNseCQM3gjdY5cnH16fzEDwnaik9pnuLDaAXAWbET2gef/](ipfs://QmNseCQM3gjdY5cnH16fzEDwnaik9pnuLDaAXAWbET2gef/) - [ipfs://QmTHCMo5RJfwvTbGVNppipkh5CmXYx9SPkyJM7qzyP4uLM/](ipfs://QmTHCMo5RJfwvTbGVNppipkh5CmXYx9SPkyJM7qzyP4uLM/)
### 5.45.3 (2024-09-05) ### 5.45.4 (2024-09-09)
### Bug Fixes
* **web:** filter sugessstions if chain is undefined (#11572) f71048d
web/5.45.3 web/5.45.4
\ No newline at end of file \ No newline at end of file
...@@ -13,7 +13,7 @@ import { isDevEnv, isTestEnv } from 'utilities/src/environment' ...@@ -13,7 +13,7 @@ import { isDevEnv, isTestEnv } from 'utilities/src/environment'
const persistConfig: PersistConfig<InterfaceState> = { const persistConfig: PersistConfig<InterfaceState> = {
key: 'interface', key: 'interface',
version: 16, // see migrations.ts for more details about this version version: 17, // see migrations.ts for more details about this version
storage: localForage.createInstance({ storage: localForage.createInstance({
name: INDEXED_DB_REDUX_TABLE_NAME, name: INDEXED_DB_REDUX_TABLE_NAME,
driver: localForage.LOCALSTORAGE, driver: localForage.LOCALSTORAGE,
......
...@@ -13,7 +13,7 @@ const defaultState = { ...@@ -13,7 +13,7 @@ const defaultState = {
user: {}, user: {},
_persist: { _persist: {
rehydrated: true, rehydrated: true,
version: 16, version: 17,
}, },
application: { application: {
chainId: null, chainId: null,
......
...@@ -10,6 +10,7 @@ import { migration13 } from 'state/migrations/13' ...@@ -10,6 +10,7 @@ import { migration13 } from 'state/migrations/13'
import { migration14 } from 'state/migrations/14' import { migration14 } from 'state/migrations/14'
import { migration15 } from 'state/migrations/15' import { migration15 } from 'state/migrations/15'
import { migration16 } from 'state/migrations/16' import { migration16 } from 'state/migrations/16'
import { migration17 } from 'state/migrations/17'
import { migration2 } from 'state/migrations/2' import { migration2 } from 'state/migrations/2'
import { migration3 } from 'state/migrations/3' import { migration3 } from 'state/migrations/3'
import { migration4 } from 'state/migrations/4' import { migration4 } from 'state/migrations/4'
...@@ -47,6 +48,7 @@ export const migrations: MigrationManifest = { ...@@ -47,6 +48,7 @@ export const migrations: MigrationManifest = {
14: migration14, 14: migration14,
15: migration15, 15: migration15,
16: migration16, 16: migration16,
17: migration17,
} as const } as const
export const INDEXED_DB_REDUX_TABLE_NAME = 'redux' export const INDEXED_DB_REDUX_TABLE_NAME = 'redux'
......
...@@ -58,7 +58,7 @@ const migrator = createMigrate( ...@@ -58,7 +58,7 @@ const migrator = createMigrate(
{ debug: false }, { debug: false },
) )
describe('migration to v15', () => { describe('migration to v16', () => {
it('migrates from user.tokens to shared tokens slice', async () => { it('migrates from user.tokens to shared tokens slice', async () => {
const result: any = await migrator(previousState, 16) const result: any = await migrator(previousState, 16)
expect(result.user.tokens).toBe(undefined) expect(result.user.tokens).toBe(undefined)
......
import { createMigrate } from 'redux-persist'
import { migration1 } from 'state/migrations/1'
import { migration10 } from 'state/migrations/10'
import { migration11 } from 'state/migrations/11'
import { migration12 } from 'state/migrations/12'
import { migration13 } from 'state/migrations/13'
import { migration14 } from 'state/migrations/14'
import { migration15 } from 'state/migrations/15'
import { migration16 } from 'state/migrations/16'
import { PersistAppStateV17, migration17 } from 'state/migrations/17'
import { migration2 } from 'state/migrations/2'
import { migration3 } from 'state/migrations/3'
import { migration4 } from 'state/migrations/4'
import { migration5 } from 'state/migrations/5'
import { migration6 } from 'state/migrations/6'
import { migration7 } from 'state/migrations/7'
import { migration8 } from 'state/migrations/8'
import { migration9 } from 'state/migrations/9'
import { SafetyLevel } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks'
import { SearchResultType } from 'uniswap/src/features/search/SearchResult'
const previousState: PersistAppStateV17 = {
_persist: {
version: 16,
rehydrated: true,
},
searchHistory: {
results: [
// token selector saved native asset
{
type: SearchResultType.Token,
chainId: 1,
address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
name: 'Ethereum',
symbol: 'ETH',
logoUrl: 'https://token-icons.s3.amazonaws.com/eth.png',
safetyLevel: SafetyLevel.Verified,
searchId: 'token-1-0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
},
// navbar saved native asset
{
type: SearchResultType.Token,
chainId: 1,
symbol: 'ETH',
address: null,
name: 'Ethereum',
logoUrl: 'https://token-icons.s3.amazonaws.com/eth.png',
safetyLevel: SafetyLevel.Verified,
searchId: 'token-1-null',
},
// token selector saved token
{
type: SearchResultType.Token,
chainId: 42161,
symbol: 'USDC',
address: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
name: 'USD Coin',
logoUrl: 'https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694',
safetyLevel: SafetyLevel.Verified,
searchId: 'token-42161-0xaf88d065e77c8cc2239327c5edb3a432268e5831',
},
// navbar saved nft collection
{
type: SearchResultType.NFTCollection,
chainId: 1,
address: '0xbd3531da5cf5857e7cfaa92426877b022e612cf8',
name: 'Pudgy Penguins',
imageUrl:
'https://i.seadn.io/gae/yNi-XdGxsgQCPpqSio4o31ygAV6wURdIdInWRcFIl46UjUQ1eV7BEndGe8L661OoG-clRi7EgInLX4LPu9Jfw4fq0bnVYHqg7RFi?w=500&auto=format',
isVerified: true,
searchId: 'nftCollection-1-0xbd3531da5cf5857e7cfaa92426877b022e612cf8',
},
],
},
}
const migrator = createMigrate(
{
1: migration1,
2: migration2,
3: migration3,
4: migration4,
5: migration5,
6: migration6,
7: migration7,
8: migration8,
9: migration9,
10: migration10,
11: migration11,
12: migration12,
13: migration13,
14: migration14,
15: migration15,
16: migration16,
17: migration17,
},
{ debug: false },
)
describe('migration to v17', () => {
it('migrates potentially invalid searchHistory', async () => {
const result: any = await migrator(previousState, 17)
expect(result.searchHistory.results).toEqual([
{
type: SearchResultType.Token,
chainId: 1,
symbol: 'ETH',
address: null,
name: 'Ethereum',
logoUrl: 'https://token-icons.s3.amazonaws.com/eth.png',
safetyLevel: SafetyLevel.Verified,
searchId: 'token-1-null',
},
{
type: SearchResultType.Token,
chainId: 42161,
symbol: 'USDC',
address: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
name: 'USD Coin',
logoUrl: 'https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694',
safetyLevel: SafetyLevel.Verified,
searchId: 'token-42161-0xaf88d065e77c8cc2239327c5edb3a432268e5831',
},
{
type: SearchResultType.NFTCollection,
chainId: 1,
address: '0xbd3531da5cf5857e7cfaa92426877b022e612cf8',
name: 'Pudgy Penguins',
imageUrl:
'https://i.seadn.io/gae/yNi-XdGxsgQCPpqSio4o31ygAV6wURdIdInWRcFIl46UjUQ1eV7BEndGe8L661OoG-clRi7EgInLX4LPu9Jfw4fq0bnVYHqg7RFi?w=500&auto=format',
isVerified: true,
searchId: 'nftCollection-1-0xbd3531da5cf5857e7cfaa92426877b022e612cf8',
},
])
})
})
import { PersistState } from 'redux-persist'
import { SearchResult, SearchResultType } from 'uniswap/src/features/search/SearchResult'
import { searchResultId } from 'uniswap/src/features/search/searchHistorySlice'
import { tokenAddressOrNativeAddress } from 'uniswap/src/features/search/utils'
export type PersistAppStateV17 = {
_persist: PersistState
searchHistory?: {
results: SearchResult[]
}
}
/**
* Move potentially invalid native asset search history items to valid format
*/
export const migration17 = (state: PersistAppStateV17 | undefined) => {
if (!state) {
return
}
const newState: any = { ...state }
// amend existing recently searched native assets that were saved with
// an address when they should not have been
newState.searchHistory.results.forEach((result: SearchResult) => {
if (result.type === SearchResultType.Token && result.address) {
const nativeAddress = tokenAddressOrNativeAddress(result.address, result.chainId)
if (result.address !== nativeAddress) {
result.address = nativeAddress
result.searchId = searchResultId(result)
}
}
})
// dedupe search history
const dedupedSearchHistory = newState.searchHistory.results.filter(
(result: SearchResult, index: number, self: SearchResult[]) =>
self.findIndex((t) => t.searchId === result.searchId) === index,
)
newState.searchHistory.results = dedupedSearchHistory
return { ...newState, _persist: { ...state._persist, version: 17 } }
}
...@@ -5,10 +5,11 @@ import { buildCurrencyId, currencyIdToGraphQLAddress } from 'uniswap/src/utils/c ...@@ -5,10 +5,11 @@ import { buildCurrencyId, currencyIdToGraphQLAddress } from 'uniswap/src/utils/c
export const BACKEND_NATIVE_CHAIN_ADDRESS_STRING = 'NATIVE' export const BACKEND_NATIVE_CHAIN_ADDRESS_STRING = 'NATIVE'
export function tokenAddressOrNativeAddress(address: string, chainId: UniverseChainId): string | null { export function tokenAddressOrNativeAddress(address: string, chainId: UniverseChainId): string | null {
if (address !== BACKEND_NATIVE_CHAIN_ADDRESS_STRING) { const nativeAddress = getNativeAddress(chainId)
if (address !== BACKEND_NATIVE_CHAIN_ADDRESS_STRING && address !== nativeAddress) {
return address return address
} }
const nativeAddress = getNativeAddress(chainId)
return currencyIdToGraphQLAddress(buildCurrencyId(chainId, nativeAddress)) return currencyIdToGraphQLAddress(buildCurrencyId(chainId, nativeAddress))
} }
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