Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
f229d0e
feat: an united nft service
lelenei Dec 5, 2021
2c5ea24
Merge remote-tracking branch 'origin/develop' into lelenei/fix-4557
lelenei Dec 5, 2021
b931609
fix: read rarible
lelenei Dec 5, 2021
9a327a9
Merge remote-tracking branch 'origin/develop' into lelenei/fix-4557
lelenei Dec 11, 2021
28dbffb
fix: typo
lelenei Dec 11, 2021
ef5723e
fix: reply review
lelenei Dec 13, 2021
eeef5d5
Merge remote-tracking branch 'origin/develop' into lelenei/fix-4557
lelenei Dec 13, 2021
438b371
fix: reply review
lelenei Dec 15, 2021
452603a
Merge remote-tracking branch 'origin/develop' into lelenei/fix-4557
lelenei Dec 15, 2021
c089e37
fix: reply review
lelenei Dec 15, 2021
a93b79a
fix: reply review
lelenei Dec 15, 2021
4bd06c8
fix: image path
lelenei Dec 16, 2021
c2fe85c
fix: reply review
lelenei Dec 17, 2021
858ab9e
fix: typo
lelenei Dec 18, 2021
fd3ea79
fix: typo
lelenei Dec 20, 2021
930492a
Merge branch 'develop' into lelenei/fix-4557
septs Dec 20, 2021
786037e
chore: improve code style
septs Dec 20, 2021
1fe9566
chore: improve code style
septs Dec 20, 2021
f56803d
chore: improve code style
septs Dec 20, 2021
7beb20c
fix: spellcheck
septs Dec 20, 2021
6fe429c
Merge branch 'develop' of github.com:DimensionDev/Maskbook into lelen…
septs Dec 21, 2021
5ba83d3
fix: revert NonFungibleAssetProvider
septs Dec 22, 2021
67c07c1
fix: settings
guanbinrui Dec 22, 2021
856f536
refactor: web3 providers (#5274)
guanbinrui Dec 22, 2021
ad4ded6
refactor: utils
guanbinrui Dec 22, 2021
0537dba
fix: bugs
lelenei Dec 24, 2021
1b3e967
fix: getOrders API
lelenei Dec 24, 2021
35c4127
fix: getHistory API
lelenei Dec 24, 2021
d0794e9
Merge remote-tracking branch 'origin/develop' into lelenei/fix-4557
lelenei Dec 27, 2021
142e912
Merge remote-tracking branch 'origin/develop' into lelenei/fix-4557
lelenei Dec 27, 2021
e4489e2
fix: use BigNumber
lelenei Dec 27, 2021
8da7b5f
fix: getOrderUnitPrice
lelenei Dec 27, 2021
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
1 change: 1 addition & 0 deletions cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@
"CANFT",
"Kodav",
"koda",
"Enjin",
"poap",
"irss",
"CELO"
Expand Down
2 changes: 1 addition & 1 deletion packages/mask/.webpack/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export function createConfiguration(rawFlags: BuildFlags): Configuration {
'@masknet/theme': join(__dirname, '../../theme/src/'),
'@masknet/icons': join(__dirname, '../../icons/index.ts'),
'@masknet/web3-kit': join(__dirname, '../../web3-kit/src/'),
'@masknet/web3-providers': join(__dirname, '../../web3-providers/src/'),
'@masknet/web3-providers': join(__dirname, '../../web3-providers/src'),
'@masknet/web3-shared-evm': join(__dirname, '../../web3-shared/evm/'),
'@masknet/web3-shared-flow': join(__dirname, '../../web3-shared/flow/'),
'@masknet/web3-shared-solana': join(__dirname, '../../web3-shared/solana/'),
Expand Down
1 change: 1 addition & 0 deletions packages/mask/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"@masknet/web3-contracts": "workspace:*",
"@masknet/web3-shared-base": "workspace:*",
"@masknet/web3-shared-evm": "workspace:*",
"@masknet/web3-providers": "workspace:*",
"@msgpack/msgpack": "^2.7.1",
"@servie/events": "^3.0.0",
"@sinonjs/text-encoding": "^0.7.1",
Expand Down
13 changes: 2 additions & 11 deletions packages/mask/src/extension/popups/pages/Swap/SwapBox/index.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
import type { TradeProvider } from '@masknet/public-api'
import { useChainId } from '@masknet/web3-shared-evm'
import { useCallback, useMemo } from 'react'
import { useMemo } from 'react'
import { useHistory, useLocation } from 'react-router-dom'
import { useUpdateEffect } from 'react-use'
import { currentTradeProviderSettings } from '../../../../../plugins/Trader/settings'
import type { FootnoteMenuOption } from '../../../../../plugins/Trader/SNSAdaptor/trader/FootnoteMenu'
import { Trader } from '../../../../../plugins/Trader/SNSAdaptor/trader/Trader'
import { TradeContext, useTradeContext } from '../../../../../plugins/Trader/trader/useTradeContext'
import { useAvailableTraderProviders } from '../../../../../plugins/Trader/trending/useAvailableTraderProviders'
import { useCurrentTradeProvider } from '../../../../../plugins/Trader/trending/useCurrentTradeProvider'
import { Coin, TagType } from '../../../../../plugins/Trader/types'
import type { Coin } from '../../../../../plugins/Trader/types'
import { PopupRoutes } from '@masknet/shared-base'

export function SwapBox() {
Expand All @@ -18,7 +14,6 @@ export function SwapBox() {
const chainId = useChainId()
const tradeProvider = useCurrentTradeProvider(chainId)
const tradeContext = useTradeContext(tradeProvider)
const { value: tradeProviders = [] } = useAvailableTraderProviders(TagType.CASH, 'MASK')

const coin = useMemo(() => {
if (!location.search) return undefined
Expand All @@ -36,10 +31,6 @@ export function SwapBox() {
history.replace(PopupRoutes.Swap)
}, [chainId])

const onTradeProviderChange = useCallback((option: FootnoteMenuOption) => {
currentTradeProviderSettings.value = option.value as TradeProvider
}, [])

return (
<TradeContext.Provider value={tradeContext}>
<Trader coin={coin} chainId={chainId} />
Expand Down
2 changes: 1 addition & 1 deletion packages/mask/src/plugins/Avatar/SNSAdaptor/AddNFT.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export function AddNFT(props: AddNFTProps) {

createNFT(address, tokenId)
.then((token) => {
if (!isSameAddress(token.info.owner, account)) {
if (!token || !isSameAddress(token?.info.owner, account)) {
setMessage(t('nft_owner_hint'))
return
}
Expand Down
87 changes: 23 additions & 64 deletions packages/mask/src/plugins/Avatar/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,75 +1,34 @@
import BigNumber from 'bignumber.js'
import { head, isNull } from 'lodash-unified'
import { PluginCollectibleRPC } from '../../Collectible/messages'
import { getLastSalePrice, getOrderUnitPrice, getOrderUSDPrice } from '../../Collectible/utils'
import { ChainId, createERC721Token, EthereumTokenType } from '@masknet/web3-shared-evm'
import type { AssetOrder } from '../../Collectible/types'
import { isNull } from 'lodash-unified'
import { ChainId, NonFungibleAssetProvider } from '@masknet/web3-shared-evm'
import { EVM_RPC } from '../../EVM/messages'
import Services from '../../../extension/service'
import { getOrderUnitPrice } from '@masknet/web3-providers'
import { ONE } from '@masknet/web3-shared-base'

export async function getNFT(address: string, tokenId: string) {
const asset = await PluginCollectibleRPC.getAsset(address, tokenId, ChainId.Mainnet)

let orders: AssetOrder[] = []
if (asset.sell_orders?.length) {
orders = asset.sell_orders
} else if (asset.orders?.length) {
orders = asset.orders
} else if (asset.buy_orders?.length) {
orders = asset.buy_orders
}

const order = head(
orders.sort((a, b) =>
new BigNumber(
getOrderUSDPrice(
b.current_price,
b.payment_token_contract?.usd_price,
b.payment_token_contract?.decimals,
) ?? 0,
)
.minus(
getOrderUSDPrice(
a.current_price,
a.payment_token_contract?.usd_price,
a.payment_token_contract?.decimals,
) ?? 0,
)
.toNumber(),
),
)

const asset = await EVM_RPC.getAsset({
address,
tokenId,
chainId: ChainId.Mainnet,
provider: NonFungibleAssetProvider.OPENSEA,
})
const amount =
getOrderUnitPrice(
asset?.desktopOrder?.current_price,
asset?.desktopOrder?.payment_token_contract?.decimals ?? 0,
asset?.desktopOrder?.quantity ?? '1',
) ?? ONE
return {
amount: order
? new BigNumber(
getOrderUnitPrice(order.current_price, order.payment_token_contract?.decimals, order.quantity) ?? 0,
).toFixed()
: getLastSalePrice(asset.last_sale) ?? '0',
name: asset.name,
symbol: order?.payment_token_contract?.symbol ?? asset.last_sale?.payment_token?.symbol ?? 'ETH',
image: asset.image_url ?? asset.image_preview_url ?? '',
owner: asset.owner.address,
amount: amount.toFixed(),
name: asset?.name ?? '',
symbol: asset?.desktopOrder?.payment_token_contract?.symbol ?? 'ETH',
image: asset?.image_url ?? '',
owner: asset?.top_ownerships[0].owner.address ?? '',
}
}

export async function createNFT(address: string, tokenId: string) {
const asset = await PluginCollectibleRPC.getAsset(address, tokenId, ChainId.Mainnet)
const token = createERC721Token(
{
chainId: ChainId.Mainnet,
type: EthereumTokenType.ERC721,
name: asset.asset_contract.name,
symbol: asset.asset_contract.token_symbol,
address: asset.asset_contract.address,
},
{
name: asset.name,
description: asset.description,
mediaUrl: asset.image_url ?? asset.image_preview_url ?? '',
owner: asset.top_ownerships[0].owner.address,
},
tokenId,
)
return token
return EVM_RPC.getNFT({ address, tokenId, chainId: ChainId.Mainnet, provider: NonFungibleAssetProvider.OPENSEA })
}

export async function getImage(image: string): Promise<string> {
Expand Down
13 changes: 7 additions & 6 deletions packages/mask/src/plugins/Collectible/SNSAdaptor/ActionBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ export interface ActionBarProps {}
export function ActionBar(props: ActionBarProps) {
const { t } = useI18N()
const { classes } = useStyles()
const { asset, token, assetOrder } = CollectibleState.useContainer()
const { asset, assetOrder } = CollectibleState.useContainer()
const assets = asset.value

const {
open: openCheckoutDialog,
Expand All @@ -43,7 +44,7 @@ export function ActionBar(props: ActionBarProps) {
if (!asset.value) return null
return (
<Box className={classes.root} sx={{ marginTop: 1 }} display="flex" justifyContent="center">
{!asset.value.is_owner && asset.value.is_auction && assetOrder.value ? (
{!asset.value.isOwner && asset.value.is_auction && assetOrder.value ? (
<ActionButton
className={classes.button}
color="primary"
Expand All @@ -52,7 +53,7 @@ export function ActionBar(props: ActionBarProps) {
{t('plugin_collectible_buy_now')}
</ActionButton>
) : null}
{!asset.value.is_owner && asset.value.is_auction ? (
{!asset.value.isOwner && asset.value.is_auction ? (
<ActionButton
className={classes.button}
color="primary"
Expand All @@ -63,7 +64,7 @@ export function ActionBar(props: ActionBarProps) {
</ActionButton>
) : null}

{!asset.value.is_owner && !asset.value.is_auction ? (
{!asset.value.isOwner && !asset.value.is_auction ? (
<ActionButton
className={classes.button}
color="primary"
Expand All @@ -72,7 +73,7 @@ export function ActionBar(props: ActionBarProps) {
{t('plugin_collectible_make_offer')}
</ActionButton>
) : null}
{asset.value.is_owner ? (
{assets?.isOwner ? (
<ActionButton
className={classes.button}
color="primary"
Expand All @@ -82,8 +83,8 @@ export function ActionBar(props: ActionBarProps) {
</ActionButton>
) : null}
<CheckoutDialog
assetOrder={assetOrder}
asset={asset}
order={assetOrder}
open={openCheckoutDialog}
onClose={onCloseCheckoutDialog}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ export function ArticleTab(props: ArticleTabProps) {
<div className={classes.body}>
{asset.value.animation_url ? (
<Link href={asset.value.animation_url} target="_blank" rel="noopener noreferrer">
<AssetPlayer src={resourceUrl} alt={asset.value.name} />
<AssetPlayer src={resourceUrl} alt={asset.value?.name ?? ''} />
</Link>
) : (
<AssetPlayer src={resourceUrl} alt={asset.value.name} />
<AssetPlayer src={resourceUrl} alt={asset.value?.name ?? ''} />
)}
</div>
</CollectibleTab>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ import { useI18N } from '../../../utils'
import { useRemoteControlledDialog } from '@masknet/shared'
import ActionButton, { ActionButtonPromise } from '../../../extension/options-page/DashboardComponents/ActionButton'
import { EthereumWalletConnectedBoundary } from '../../../web3/UI/EthereumWalletConnectedBoundary'
import type { useAsset } from '../hooks/useAsset'
import { PluginCollectibleRPC } from '../messages'
import { PluginTraderMessages } from '../../Trader/messages'
import { CheckoutOrder } from './CheckoutOrder'
import type { useAsset } from '../../EVM/hooks/useAsset'
import type { useAssetOrder } from '../hooks/useAssetOrder'

const useStyles = makeStyles()((theme) => {
Expand Down Expand Up @@ -55,16 +55,15 @@ const useStyles = makeStyles()((theme) => {

export interface CheckoutDialogProps {
asset?: ReturnType<typeof useAsset>
assetOrder?: ReturnType<typeof useAssetOrder>
order: ReturnType<typeof useAssetOrder>
open: boolean
onClose: () => void
}

export function CheckoutDialog(props: CheckoutDialogProps) {
const { asset, open, onClose, assetOrder } = props
const { asset, open, onClose, order } = props
const isAuction = asset?.value?.is_auction ?? false
const isVerified = asset?.value?.is_verified ?? false

const { t } = useI18N()
const { classes } = useStyles()

Expand All @@ -76,13 +75,14 @@ export function CheckoutDialog(props: CheckoutDialogProps) {
const onCheckout = useCallback(async () => {
if (!asset?.value) return
if (!asset.value.token_id || !asset.value.token_address) return
if (!assetOrder?.value) return
if (!order.value) return

await PluginCollectibleRPC.fulfillOrder({
order: assetOrder.value,
order: order.value,
accountAddress: account,
recipientAddress: account,
})
}, [asset?.value, account, assetOrder?.value])
}, [asset?.value, account, order?.value])

const { openDialog: openSwapDialog } = useRemoteControlledDialog(PluginTraderMessages.swapDialogUpdated)

Expand All @@ -103,7 +103,7 @@ export function CheckoutDialog(props: CheckoutDialogProps) {
</Box>
)}
<Box sx={{ padding: 2 }}>
<CheckoutOrder asset={asset} assetOrder={assetOrder} />
<CheckoutOrder asset={asset} assetOrder={order} />
{isVerified ? null : (
<>
<FormControlLabel
Expand Down Expand Up @@ -172,7 +172,7 @@ export function CheckoutDialog(props: CheckoutDialogProps) {
completeOnClick={onClose}
failedOnClick="use executor"
/>
{asset?.value?.is_order_weth ? (
{asset?.value?.isOrderWeth ? (
<ActionButton
className={classes.button}
variant="contained"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import { Table, TableHead, TableBody, TableRow, TableCell, Typography, Link } from '@mui/material'
import { makeStyles } from '@masknet/theme'
import type { Order } from 'opensea-js/lib/types'
import { Image } from '../../../components/shared/Image'
import { useChainId } from '@masknet/web3-shared-evm'
import type { useAsset } from '../hooks/useAsset'
import { resolveAssetLinkOnOpenSea } from '../pipes'
import { useI18N } from '../../../utils'
import type { useAsset } from '../../EVM/hooks/useAsset'
import type { useAssetOrder } from '../hooks/useAssetOrder'

const useStyles = makeStyles()((theme) => ({
Expand All @@ -25,8 +24,8 @@ export interface CheckoutOrderProps {

export function CheckoutOrder(props: CheckoutOrderProps) {
const { t } = useI18N()
const { asset, assetOrder } = props
const order = assetOrder?.value as Order | undefined
const { asset } = props
const order = asset?.value?.desktopOrder
const { classes } = useStyles()
const chainId = useChainId()

Expand All @@ -45,7 +44,7 @@ export function CheckoutOrder(props: CheckoutOrderProps) {
<TableRow>
<TableCell>
<div className={classes.itemInfo}>
<Image height={80} width={80} src={asset.value.image_url} />
<Image height={80} width={80} src={asset.value?.image_url ?? ''} />
<div className={classes.texts}>
<Typography>{asset.value.collection_name ?? ''}</Typography>
{asset.value.token_address && asset.value.token_id ? (
Expand Down
16 changes: 8 additions & 8 deletions packages/mask/src/plugins/Collectible/SNSAdaptor/Collectible.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,16 @@ import { HistoryTab } from './HistoryTab'
import { CollectibleState } from '../hooks/useCollectibleState'
import { CollectibleCard } from './CollectibleCard'
import { CollectibleProviderIcon } from './CollectibleProviderIcon'
import { CollectibleProvider, CollectibleTab } from '../types'
import { currentCollectibleProviderSettings } from '../settings'
import { CollectibleTab } from '../types'
import { MaskTextIcon } from '../../../resources/MaskIcon'
import { resolveAssetLinkOnOpenSea, resolveCollectibleProviderName } from '../pipes'
import { ActionBar } from './ActionBar'
import { useChainId } from '@masknet/web3-shared-evm'
import { NonFungibleAssetProvider, useChainId } from '@masknet/web3-shared-evm'
import { getEnumAsArray } from '@dimensiondev/kit'
import { FootnoteMenu, FootnoteMenuOption } from '../../Trader/SNSAdaptor/trader/FootnoteMenu'
import { LoadingAnimation } from '@masknet/shared'
import { Markdown } from '../../Snapshot/SNSAdaptor/Markdown'
import { currentNonFungibleAssetProviderSettings } from '../settings'

const useStyles = makeStyles()((theme) => {
return {
Expand Down Expand Up @@ -156,16 +156,16 @@ export function Collectible(props: CollectibleProps) {
const { asset, provider, tabIndex, setTabIndex } = CollectibleState.useContainer()

//#region sync with settings
const collectibleProviderOptions = getEnumAsArray(CollectibleProvider)
const collectibleProviderOptions = getEnumAsArray(NonFungibleAssetProvider)
const onDataProviderChange = useCallback((option: FootnoteMenuOption) => {
currentCollectibleProviderSettings.value = option.value as CollectibleProvider
currentNonFungibleAssetProviderSettings.value = option.value as NonFungibleAssetProvider
}, [])
//#endregion

//#region provider switcher
const CollectibleProviderSwitcher = useSettingsSwitcher(
currentCollectibleProviderSettings,
getEnumAsArray(CollectibleProvider).map((x) => x.value),
currentNonFungibleAssetProviderSettings,
getEnumAsArray(NonFungibleAssetProvider).map((x) => x.value),
resolveCollectibleProviderName,
)
//#endregion
Expand Down Expand Up @@ -337,7 +337,7 @@ export function Collectible(props: CollectibleProps) {
</Typography>
</Box>
)}
{provider === CollectibleProvider.OPENSEA ? <ActionBar /> : null}
{provider === NonFungibleAssetProvider.OPENSEA ? <ActionBar /> : null}
</>
)
}
Loading