Skip to content

Commit

Permalink
Merge pull request #112 from alephium/upgrade-token-schema
Browse files Browse the repository at this point in the history
Migrate token schema
  • Loading branch information
h0ngcha0 authored Jul 28, 2023
2 parents 242a50b + 91506eb commit 50df465
Show file tree
Hide file tree
Showing 16 changed files with 73 additions and 37 deletions.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"packages": ["packages/*"],
"version": "0.8.0",
"version": "0.8.1",
"npmClient": "yarn",
"useWorkspaces": true
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "0.8.0",
"version": "0.8.1",
"private": true,
"name": "alephium-browser-extension-wallet",
"repository": "github:alephium/extension-wallet",
Expand Down
2 changes: 1 addition & 1 deletion packages/dapp/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@alephium/dapp",
"version": "0.8.0",
"version": "0.8.1",
"private": true,
"scripts": {
"dev": "next dev",
Expand Down
2 changes: 1 addition & 1 deletion packages/dapp/src/services/wallet.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export const addToken = async (id: string): Promise<boolean> => {
type: "AddNewToken",
params: {
id: id,
networkId: '',
networkId: 'devnet',
symbol: '',
decimals: 0,
name: '',
Expand Down
2 changes: 1 addition & 1 deletion packages/extension/manifest/v2.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "https://json.schemastore.org/chrome-manifest.json",
"name": "Alephium Extension Wallet",
"description": "Alephium's official extension wallet with powerful features and a clean UI.",
"version": "0.8.0",
"version": "0.8.1",
"manifest_version": 2,
"browser_action": {
"default_icon": {
Expand Down
2 changes: 1 addition & 1 deletion packages/extension/manifest/v3.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "https://json.schemastore.org/chrome-manifest.json",
"name": "Alephium Extension Wallet",
"description": "Alephium's official extension wallet with powerful features and a clean UI.",
"version": "0.8.0",
"version": "0.8.1",
"manifest_version": 3,
"action": {
"default_icon": {
Expand Down
2 changes: 1 addition & 1 deletion packages/extension/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@alephium/extension",
"version": "0.8.0",
"version": "0.8.1",
"main": "index.js",
"license": "MIT",
"devDependencies": {
Expand Down
14 changes: 10 additions & 4 deletions packages/extension/src/shared/token/storage.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import * as yup from "yup"

import { ArrayStorage } from "../storage"
import { assertSchema } from "../utils/schema"
import { BaseToken, Token } from "./type"
import { equalToken, knownAlephiumTokens } from "./utils"
import { equalToken, tokensFromAlephiumTokenList } from "./utils"

export const tokenStore = new ArrayStorage(knownAlephiumTokens, {
export const tokenStore = new ArrayStorage([] as Token[], {
namespace: "core:tokens",
areaName: "local",
compare: equalToken,
Expand All @@ -28,15 +27,22 @@ export const tokenSchema: yup.Schema<Token> = baseTokenSchema
decimals: yup.number().required("Decimals is required"),
logoURI: yup.string().url(),
showAlways: yup.boolean(),
description: yup.string(),
verified: yup.boolean()
})

export async function addToken(token: Token) {
await assertSchema(tokenSchema, token)
return tokenStore.push(token)
return tokenStore.push({ verified: true, ...token })
}

export async function hasToken(token: BaseToken) {
await assertSchema(baseTokenSchema, token)
const tokenListHit = tokensFromAlephiumTokenList.find((t) => equalToken(t, token))
if (tokenListHit) {
return Boolean(tokenListHit)
}

const [hit] = await tokenStore.get((t) => equalToken(t, token))
return Boolean(hit)
}
Expand Down
16 changes: 16 additions & 0 deletions packages/extension/src/shared/token/storeMigration.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { removeToken, tokenStore } from "./storage"
import { equalToken, tokensFromAlephiumTokenList } from "./utils"
import { Token } from "./type"

export async function migrateTokens() {
try {
const allTokens: Token[] = await tokenStore.get()
for (const token of allTokens) {
if (tokensFromAlephiumTokenList.findIndex((knownToken) => equalToken(knownToken, token)) !== -1) {
removeToken(token)
}
}
} catch (e) {
console.error(e)
}
}
8 changes: 4 additions & 4 deletions packages/extension/src/shared/token/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { defaultNetworkIds } from "../network/defaults"
export const equalToken = (a: BaseToken, b: BaseToken) =>
a.networkId === b.networkId && isEqualTokenId(a.id, b.id)

const alphTokens: Token[] = defaultNetworkIds.map((networkId) => {
export const alphTokens: Token[] = defaultNetworkIds.map((networkId) => {
return {
...ALPH,
"networkId": networkId,
Expand All @@ -17,9 +17,9 @@ const alphTokens: Token[] = defaultNetworkIds.map((networkId) => {
}
})

const knownTokensFromAlephiumTokenList: Token[] = [mainnetTokensMetadata, testnetTokensMetadata].flatMap(convertTokenList)

export const knownAlephiumTokens = alphTokens.concat(knownTokensFromAlephiumTokenList)
export const tokensFromAlephiumTokenList: Token[] = alphTokens.concat(
[mainnetTokensMetadata, testnetTokensMetadata].flatMap(convertTokenList)
)

export const dustALPHAmount = BigInt(1000000000000000)

Expand Down
2 changes: 2 additions & 0 deletions packages/extension/src/shared/wallet/storeMigration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import browser from "webextension-polyfill"
import { Wallet } from "../../background/wallet"
import { walletStore } from "../../shared/wallet/walletStore"
import { migrateWalletAccounts } from "../account/storeMigration"
import { migrateTokens } from "../token/storeMigration"

export async function migrateWallet() {
await Promise.allSettled([
migrateBackup(),
migrateDiscoveredOnce(),
migrateSelected(),
migrateWalletAccounts(),
migrateTokens()
])
}

Expand Down
42 changes: 27 additions & 15 deletions packages/extension/src/ui/features/accountTokens/tokens.state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import useSWRImmutable from 'swr/immutable'
import { getNetwork, Network } from "../../../shared/network"

import { useArrayStorage } from "../../../shared/storage/hooks"
import { addToken, tokenStore } from "../../../shared/token/storage"
import { addToken, removeToken, tokenStore } from "../../../shared/token/storage"
import { BaseToken, Token } from "../../../shared/token/type"
import { equalToken } from "../../../shared/token/utils"
import { alphTokens, equalToken, tokensFromAlephiumTokenList } from "../../../shared/token/utils"
import { BaseWalletAccount } from "../../../shared/wallet.model"
import { getAccountIdentifier } from "../../../shared/wallet.service"
import { useAccount } from "../accounts/accounts.state"
Expand All @@ -32,21 +32,13 @@ const networkIdSelector = memoize(
(networkId: string) => (token: Token) => token.networkId === networkId,
)

const feeTokenSelector = memoize(
(networkId: string) => (token: Token) =>
token.networkId === networkId && token.symbol === "ALPH",
)

export const getNetworkFeeToken = async (networkId: string) => {
const [feeToken] = await tokenStore.get(feeTokenSelector(networkId))
const feeToken = alphTokens.find((token) => token.networkId === networkId)
return feeToken ?? null
}

export const useNetworkFeeToken = (networkId?: string) => {
const [feeToken] = useArrayStorage(
tokenStore,
networkId ? feeTokenSelector(networkId) : () => false,
)
const feeToken = alphTokens.find((token) => token.networkId === networkId)
return feeToken ?? null
}

Expand All @@ -55,8 +47,22 @@ const tokenSelector = memoize(
(baseToken) => getAccountIdentifier({ networkId: baseToken.networkId, address: baseToken.id }),
)

export const useTokensInNetwork = (networkId: string) =>
useArrayStorage(tokenStore, networkIdSelector(networkId))
export const useTokensInNetwork = (networkId: string) => {
const tokensFromTokenList: Token[] = tokensFromAlephiumTokenList.filter(networkIdSelector(networkId))
const tokens: Token[] = useArrayStorage(tokenStore, networkIdSelector(networkId))

const result: Token[] = tokensFromTokenList
for (const token of tokens) {
if (tokensFromTokenList.findIndex((t) => equalToken(t, token)) === -1) {
result.push(token)
} else {
// Remove manually added token when it is already in the token list
removeToken(token)
}
}
return result
}


export const devnetTokenSymbol = (baseToken: { id: string }): string => {
return baseToken.id.replace(/[^a-zA-Z]/gi, '').slice(0, 4).toUpperCase()
Expand All @@ -74,7 +80,13 @@ export const devnetToken = (baseToken: BaseToken): Token => {
}

export const useToken = (baseToken: BaseToken): Token | undefined => {
const tokenFromTokenList = tokensFromAlephiumTokenList.find((t) => equalToken(t, baseToken))
const [token] = useArrayStorage(tokenStore, tokenSelector(baseToken))

if (tokenFromTokenList) {
return tokenFromTokenList
}

if (token === undefined && baseToken.networkId === 'devnet') {
return devnetToken(baseToken)
}
Expand Down Expand Up @@ -218,13 +230,13 @@ export const useFungibleTokens = (
}, [selectedAccount?.networkId])

const cachedTokens = useTokensInNetwork(networkId)

const {
data: fungibleTokens
} = useSWRImmutable(
selectedAccount && [
getAccountIdentifier(selectedAccount),
allUserTokens,
cachedTokens,
"accountFungibleTokens",
],
async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ export const AddTokenScreen: FC<AddTokenScreenProps> = ({
setTokenDecimals(found.decimals || 0)
setLogoURI(found.logoURI || "")
}
}, [tokenId, tokensInNetwork])
}, [tokenId])

const compiledData = {
id: tokenId,
Expand Down
4 changes: 2 additions & 2 deletions packages/stack-router/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@argent/stack-router",
"version": "0.8.0",
"version": "0.8.1",
"license": "MIT",
"private": true,
"files": [
Expand Down Expand Up @@ -32,7 +32,7 @@
"lodash-es": "^4.17.21"
},
"devDependencies": {
"@argent/ui": "^0.8.0",
"@argent/ui": "^0.8.1",
"@types/lodash-es": "^4.17.6",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
Expand Down
6 changes: 3 additions & 3 deletions packages/storybook/package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "@argent-x/storybook",
"version": "0.8.0",
"version": "0.8.1",
"private": true,
"devDependencies": {
"@alephium/extension": "^0.8.0",
"@argent/ui": "^0.8.0",
"@alephium/extension": "^0.8.1",
"@argent/ui": "^0.8.1",
"@babel/core": "^7.18.5",
"@chakra-ui/storybook-addon": "^4.0.12",
"@storybook/addon-actions": "^6.5.9",
Expand Down
2 changes: 1 addition & 1 deletion packages/ui/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@argent/ui",
"version": "0.8.0",
"version": "0.8.1",
"license": "MIT",
"private": true,
"files": [
Expand Down

0 comments on commit 50df465

Please sign in to comment.