Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 21 additions & 31 deletions packages/dashboard/src/web3/context.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import { omit, noop } from 'lodash-es'
import type { Subscription } from 'use-subscription'
import { ChainId, PortfolioProvider, ProviderType } from '@masknet/web3-shared'
import {
ChainId,
ERC1155TokenDetailed,
ERC721TokenDetailed,
PortfolioProvider,
ProviderType,
} from '@masknet/web3-shared'
import { ERC20TokenDetailed, EthereumTokenType, NetworkType, Web3ProviderType } from '@masknet/web3-shared'
import { Messages, PluginMessages, PluginServices, Services } from '../API'

Expand Down Expand Up @@ -47,15 +53,21 @@ export const Web3Context: Web3ProviderType = {
),
walletPrimary: createSubscriptionFromAsync(getWalletPrimary, null, PluginMessages.Wallet.events.walletsUpdated.on),
wallets: createSubscriptionFromAsync(getWallets, [], PluginMessages.Wallet.events.walletsUpdated.on),
erc20Tokens: createSubscriptionFromAsync(getERC20Tokens, [], PluginMessages.Wallet.events.erc20TokensUpdated.on),
addERC20Token: PluginServices.Wallet.addERC20Token,
trustERC20Token: PluginServices.Wallet.trustERC20Token,
erc20TokensCount: createSubscriptionFromAsync(
PluginServices.Wallet.getERC20TokensCount,
0,
erc20Tokens: createSubscriptionFromAsync(
() => PluginServices.Wallet.getTokens<ERC20TokenDetailed>(EthereumTokenType.ERC20),
[],
PluginMessages.Wallet.events.erc20TokensUpdated.on,
),
getERC20TokensPaged,
erc721Tokens: createSubscriptionFromAsync(
() => PluginServices.Wallet.getTokens<ERC721TokenDetailed>(EthereumTokenType.ERC721),
[],
PluginMessages.Wallet.events.erc721TokensUpdated.on,
),
erc1155Tokens: createSubscriptionFromAsync(
() => PluginServices.Wallet.getTokens<ERC1155TokenDetailed>(EthereumTokenType.ERC1155),
[],
PluginMessages.Wallet.events.erc1155TokensUpdated.on,
),
portfolioProvider: createSubscriptionFromAsync(
Services.Settings.getCurrentPortfolioDataProvider,
PortfolioProvider.DEBANK,
Expand All @@ -64,11 +76,9 @@ export const Web3Context: Web3ProviderType = {
getAssetsList: PluginServices.Wallet.getAssetsList,
getAssetsListNFT: PluginServices.Wallet.getAssetsListNFT,
getAddressNamesList: PluginServices.Wallet.getAddressNames,
getERC721TokensPaged,
getTransactionList: PluginServices.Wallet.getTransactionList,
fetchERC20TokensFromTokenLists: Services.Ethereum.fetchERC20TokensFromTokenLists,
createMnemonicWords: PluginServices.Wallet.createMnemonicWords,
getNonce: Services.Ethereum.getNonce,
}

export function createExternalProvider() {
Expand All @@ -92,7 +102,7 @@ async function getWallets() {
}))
}

export async function getWalletPrimary() {
async function getWalletPrimary() {
const wallet = await PluginServices.Wallet.getWalletPrimary()
if (!wallet) return null
return {
Expand All @@ -102,26 +112,6 @@ export async function getWalletPrimary() {
}
}

async function getERC20Tokens() {
const raw = await PluginServices.Wallet.getERC20Tokens()
return raw.map<ERC20TokenDetailed>((x) => ({
type: EthereumTokenType.ERC20,
...x,
}))
}

async function getERC20TokensPaged(index: number, count: number, query?: string) {
const raw = await PluginServices.Wallet.getERC20TokensPaged(index, count, query)
return raw.map<ERC20TokenDetailed>((x) => ({
type: EthereumTokenType.ERC20,
...x,
}))
}

async function getERC721TokensPaged(index: number, count: number, query?: string) {
return PluginServices.Wallet.getERC721TokensPaged(index, count, query)
}

// double check
function createSubscriptionFromAsync<T>(
f: () => Promise<T>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,14 @@ export function DashboardWalletHideTokenConfirmDialog(
case EthereumTokenType.Native:
throw new Error('Unable to hide the native token.')
case EthereumTokenType.ERC20:
return WalletRPC.blockERC20Token(wallet.address, token as ERC20TokenDetailed)
return WalletRPC.updateWalletToken(wallet.address, token as ERC20TokenDetailed, {
strategy: 'block',
})
case EthereumTokenType.ERC721:
return WalletRPC.removeERC721Token(token as ERC721TokenDetailed)
return WalletRPC.removeToken(
EthereumTokenType.ERC721,
(token as ERC721TokenDetailed).contractDetailed.address,
)
default:
unreachable(type)
}
Expand Down
4 changes: 2 additions & 2 deletions packages/maskbook/src/plugins/ITO/SNSAdaptor/SwapDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,8 @@ export function SwapDialog(props: SwapDialogProps) {
const onSwap = useCallback(async () => {
await swapCallback()
if (payload.token.type !== EthereumTokenType.ERC20) return
await WalletRPC.addERC20Token(payload.token)
await WalletRPC.trustERC20Token(account, payload.token)
await WalletRPC.addToken(EthereumTokenType.ERC20, payload.token)
await WalletRPC.updateWalletToken(account, payload.token, { strategy: 'trust' })
}, [swapCallback, payload.token.address])

const { setDialog: setTransactionDialog } = useRemoteControlledDialog(
Expand Down
20 changes: 16 additions & 4 deletions packages/maskbook/src/plugins/Wallet/database/Plugin.db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,20 @@ import { PLUGIN_IDENTIFIER } from '../constants'
import { createPluginDatabase } from '../../../database/Plugin/wrap-plugin-database'
import type { AddressBookChunk } from '../services/addressBook'
import type { RecentTransactionChunk } from '../services/recentTransactions/database'
import type { SecretRecord, WalletRecord } from '../services/wallet/type'
import type {
ERC1155TokenRecord,
ERC20TokenRecord,
ERC721TokenRecord,
SecretRecord,
WalletRecord,
} from '../services/wallet/type'

export const PluginDB = createPluginDatabase<AddressBookChunk | RecentTransactionChunk | WalletRecord | SecretRecord>(
PLUGIN_IDENTIFIER,
)
export const PluginDB = createPluginDatabase<
| AddressBookChunk
| RecentTransactionChunk
| WalletRecord
| SecretRecord
| ERC20TokenRecord
| ERC721TokenRecord
| ERC1155TokenRecord
>(PLUGIN_IDENTIFIER)
51 changes: 4 additions & 47 deletions packages/maskbook/src/plugins/Wallet/services/erc1155.ts
Original file line number Diff line number Diff line change
@@ -1,69 +1,26 @@
import { createTransaction } from '../../../database/helpers/openDB'
import { createWalletDBAccess } from '../database/Wallet.db'
import { WalletMessages } from '../messages'
import { assert } from '../../../utils/utils'
import type { ERC1155TokenDetailed } from '@masknet/web3-shared'
import { formatEthereumAddress } from '@masknet/web3-shared'
import { ERC1155TokenRecordIntoDB, getWalletByAddress, LegacyWalletRecordIntoDB } from './helpers'
import { ERC1155TokenRecordIntoDB } from './helpers'

/** @deprecated */
export async function getERC1155Tokens() {
const t = createTransaction(await createWalletDBAccess(), 'readonly')('ERC1155Token', 'Wallet')
return t.objectStore('ERC1155Token').getAll()
}

/** @deprecated */
export async function addERC1155Token(token: ERC1155TokenDetailed) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC1155Token', 'Wallet')
await t.objectStore('ERC1155Token').put(ERC1155TokenRecordIntoDB(token))
WalletMessages.events.erc1155TokensUpdated.sendToAll(undefined)
}

/** @deprecated */
export async function removeERC1155Token(token: PartialRequired<ERC1155TokenDetailed, 'address'>) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC1155Token', 'Wallet')
await t.objectStore('ERC1155Token').delete(formatEthereumAddress(token.address))
WalletMessages.events.erc1155TokensUpdated.sendToAll(undefined)
}

export async function trustERC1155Token(
address: string,
token: PartialRequired<ERC1155TokenDetailed, 'address' | 'tokenId'>,
) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC1155Token', 'Wallet')
const wallet = await getWalletByAddress(t, formatEthereumAddress(address))
assert(wallet)
let updated = false
const key = `${formatEthereumAddress(token.address)}_${token.tokenId}`
if (!wallet.erc1155_token_whitelist.has(key)) {
wallet.erc1155_token_whitelist.add(key)
updated = true
}
if (wallet.erc1155_token_blacklist.has(key)) {
wallet.erc1155_token_blacklist.delete(key)
updated = true
}
if (!updated) return false
await t.objectStore('Wallet').put(LegacyWalletRecordIntoDB(wallet))
WalletMessages.events.walletsUpdated.sendToAll(undefined)
return updated
}

export async function blockERC1155Token(
address: string,
token: PartialRequired<ERC1155TokenDetailed, 'address' | 'tokenId'>,
) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC1155Token', 'Wallet')
const wallet = await getWalletByAddress(t, formatEthereumAddress(address))
assert(wallet)
let updated = false
const key = `${formatEthereumAddress(token.address)}_${token.tokenId}`
if (wallet.erc1155_token_whitelist.has(key)) {
wallet.erc1155_token_whitelist.delete(key)
updated = true
}
if (!wallet.erc1155_token_blacklist.has(key)) {
wallet.erc1155_token_blacklist.add(key)
updated = true
}
if (!updated) return
await t.objectStore('Wallet').put(LegacyWalletRecordIntoDB(wallet))
WalletMessages.events.walletsUpdated.sendToAll(undefined)
}
46 changes: 6 additions & 40 deletions packages/maskbook/src/plugins/Wallet/services/erc20.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@ import { EthereumAddress } from 'wallet.ts'
import { createTransaction } from '../../../database/helpers/openDB'
import { createWalletDBAccess } from '../database/Wallet.db'
import { WalletMessages } from '../messages'
import { assert } from '../../../utils/utils'
import { ERC20TokenRecordIntoDB, getWalletByAddress, LegacyWalletRecordIntoDB } from './helpers'
import { ERC20TokenRecordIntoDB } from './helpers'
import type { ERC20TokenRecord } from '../database/types'
import { ERC20TokenDetailed, formatEthereumAddress, isSameAddress } from '@masknet/web3-shared'
import { queryTransactionPaged } from '../../../database/helpers/pagination'

/** @deprecated */
export async function getERC20TokensCount() {
const t = createTransaction(await createWalletDBAccess(), 'readonly')('ERC20Token', 'Wallet')
return t.objectStore('ERC20Token').count()
}

/** @deprecated */
export async function getERC20Tokens() {
const t = createTransaction(await createWalletDBAccess(), 'readonly')('ERC20Token', 'Wallet')
return t.objectStore('ERC20Token').getAll()
Expand All @@ -29,6 +30,7 @@ const fuse = new Fuse([] as ERC20TokenRecord[], {
],
})

/** @deprecated */
export async function getERC20TokensPaged(index: number, count: number, query?: string) {
const t = createTransaction(await createWalletDBAccess(), 'readonly')('ERC20Token')
return queryTransactionPaged(t, 'ERC20Token', {
Expand All @@ -43,6 +45,7 @@ export async function getERC20TokensPaged(index: number, count: number, query?:
})
}

/** @deprecated */
export async function addERC20Token(token: ERC20TokenDetailed) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC20Token', 'Wallet')
await t.objectStore('ERC20Token').put(
Expand All @@ -56,46 +59,9 @@ export async function addERC20Token(token: ERC20TokenDetailed) {
WalletMessages.events.erc20TokensUpdated.sendToAll(undefined)
}

/** @deprecated */
export async function removeERC20Token(token: PartialRequired<ERC20TokenDetailed, 'address'>) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC20Token', 'Wallet')
await t.objectStore('ERC20Token').delete(formatEthereumAddress(token.address))
WalletMessages.events.erc20TokensUpdated.sendToAll(undefined)
}

export async function trustERC20Token(address: string, token: ERC20TokenDetailed) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC20Token', 'Wallet')
const wallet = await getWalletByAddress(t, formatEthereumAddress(address))
assert(wallet)
const tokenAddressChecksummed = formatEthereumAddress(token.address)
let updated = false
if (!wallet.erc20_token_whitelist.has(tokenAddressChecksummed)) {
wallet.erc20_token_whitelist.add(tokenAddressChecksummed)
updated = true
}
if (wallet.erc20_token_blacklist.has(tokenAddressChecksummed)) {
wallet.erc20_token_blacklist.delete(tokenAddressChecksummed)
updated = true
}
if (!updated) return
await t.objectStore('Wallet').put(LegacyWalletRecordIntoDB(wallet))
WalletMessages.events.walletsUpdated.sendToAll(undefined)
}

export async function blockERC20Token(address: string, token: PartialRequired<ERC20TokenDetailed, 'address'>) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC20Token', 'Wallet')
const wallet = await getWalletByAddress(t, formatEthereumAddress(address))
assert(wallet)
let updated = false
const tokenAddressChecksummed = formatEthereumAddress(token.address)
if (wallet.erc20_token_whitelist.has(tokenAddressChecksummed)) {
wallet.erc20_token_whitelist.delete(tokenAddressChecksummed)
updated = true
}
if (!wallet.erc20_token_blacklist.has(tokenAddressChecksummed)) {
wallet.erc20_token_blacklist.add(tokenAddressChecksummed)
updated = true
}
if (!updated) return
await t.objectStore('Wallet').put(LegacyWalletRecordIntoDB(wallet))
WalletMessages.events.walletsUpdated.sendToAll(undefined)
}
55 changes: 7 additions & 48 deletions packages/maskbook/src/plugins/Wallet/services/erc721.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,19 @@
import Fuse from 'fuse.js'
import { EthereumAddress } from 'wallet.ts'
import { ERC721TokenDetailed, formatEthereumAddress, isSameAddress } from '@masknet/web3-shared'
import { ERC721TokenDetailed, isSameAddress } from '@masknet/web3-shared'
import { createTransaction } from '../../../database/helpers/openDB'
import { createWalletDBAccess } from '../database/Wallet.db'
import { WalletMessages } from '../messages'
import { assert } from '../../../utils/utils'
import {
ERC721TokenRecordIntoDB,
ERC721TokenRecordOutDB,
getERC721TokenRecordIntoDBKey,
getWalletByAddress,
LegacyWalletRecordIntoDB,
} from './helpers'
import { ERC721TokenRecordIntoDB, ERC721TokenRecordOutDB, getERC721TokenRecordIntoDBKey } from './helpers'
import { queryTransactionPaged } from '../../../database/helpers/pagination'

/** @deprecated */
export async function getERC721Tokens() {
const t = createTransaction(await createWalletDBAccess(), 'readonly')('ERC721Token')
return t.objectStore('ERC721Token').getAll()
}

/** @deprecated */
export async function getERC721Token(address: string, tokenId: string) {
const t = createTransaction(await createWalletDBAccess(), 'readonly')('ERC721Token')
return t.objectStore('ERC721Token').get(getERC721TokenRecordIntoDBKey(address, tokenId))
Expand All @@ -34,6 +29,7 @@ const fuse = new Fuse([] as ERC721TokenDetailed[], {
],
})

/** @deprecated */
export async function getERC721TokensPaged(index: number, count: number, query?: string) {
const t = createTransaction(await createWalletDBAccess(), 'readonly')('ERC721Token')
const records = await queryTransactionPaged(t, 'ERC721Token', {
Expand All @@ -49,53 +45,16 @@ export async function getERC721TokensPaged(index: number, count: number, query?:
return records.map(ERC721TokenRecordOutDB)
}

/** @deprecated */
export async function addERC721Token(token: ERC721TokenDetailed) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC721Token', 'Wallet')
await t.objectStore('ERC721Token').put(ERC721TokenRecordIntoDB(token))
WalletMessages.events.erc721TokensUpdated.sendToAll(undefined)
}

/** @deprecated */
export async function removeERC721Token(token: ERC721TokenDetailed) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC721Token', 'Wallet')
await t.objectStore('ERC721Token').delete(ERC721TokenRecordIntoDB(token).record_id)
WalletMessages.events.erc721TokensUpdated.sendToAll(undefined)
}

export async function trustERC721Token(address: string, token: ERC721TokenDetailed) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC721Token', 'Wallet')
const wallet = await getWalletByAddress(t, formatEthereumAddress(address))
assert(wallet)
let updated = false
const key = `${formatEthereumAddress(token.contractDetailed.address)}_${token.tokenId}`
if (!wallet.erc721_token_whitelist.has(key)) {
wallet.erc721_token_whitelist.add(key)
updated = true
}
if (wallet.erc721_token_blacklist.has(key)) {
wallet.erc721_token_blacklist.delete(key)
updated = true
}
if (!updated) return false
await t.objectStore('Wallet').put(LegacyWalletRecordIntoDB(wallet))
WalletMessages.events.walletsUpdated.sendToAll(undefined)
return updated
}

export async function blockERC721Token(address: string, token: ERC721TokenDetailed) {
const t = createTransaction(await createWalletDBAccess(), 'readwrite')('ERC721Token', 'Wallet')
const wallet = await getWalletByAddress(t, formatEthereumAddress(address))
assert(wallet)
let updated = false
const key = `${formatEthereumAddress(token.contractDetailed.address)}_${token.tokenId}`
if (wallet.erc721_token_whitelist.has(key)) {
wallet.erc721_token_whitelist.delete(key)
updated = true
}
if (!wallet.erc721_token_blacklist.has(key)) {
wallet.erc721_token_blacklist.add(key)
updated = true
}
if (!updated) return
await t.objectStore('Wallet').put(LegacyWalletRecordIntoDB(wallet))
WalletMessages.events.walletsUpdated.sendToAll(undefined)
}
Loading