Skip to content
This repository has been archived by the owner on Jun 15, 2023. It is now read-only.

Commit

Permalink
feat(assets): add metadata providers
Browse files Browse the repository at this point in the history
  • Loading branch information
DIYgod committed May 9, 2022
1 parent 72d3151 commit 44c3563
Show file tree
Hide file tree
Showing 10 changed files with 83 additions and 20 deletions.
58 changes: 45 additions & 13 deletions docs/.vuepress/components/Assets.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,29 @@
<h5>View</h5>
<div class="loading-wrap" v-loading="loading">
<el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange"
>Check all networks ({{ assets.total }})</el-checkbox
>Check all networks and providers ({{ assets.total }})</el-checkbox
>
<el-checkbox-group v-model="checked" @change="handleCheckedChange">
<el-checkbox v-for="(value, network) in networks" :key="network" :label="network"
>{{ network }} ({{
assets.list.filter((asset) => asset.metadata.network === network).length
}})</el-checkbox
>
</el-checkbox-group>
<div>
<div class="check-type">Networks:</div>
<el-checkbox-group v-model="networkChecked" @change="handleCheckedChange">
<el-checkbox v-for="(value, network) in networks" :key="network" :label="network"
>{{ network }} ({{
assets.list.filter((asset) => asset.metadata.network === network).length
}})</el-checkbox
>
</el-checkbox-group>
</div>
<div>
<div class="check-type">Providers:</div>
<el-checkbox-group v-model="providerChecked" @change="handleCheckedChange">
<el-checkbox v-for="(value, provider) in mproviders" :key="provider" :label="provider"
>{{ provider }} ({{
assets.list.filter((asset) => asset.metadata.providers.find((pro) => pro === provider))
.length
}})</el-checkbox
>
</el-checkbox-group>
</div>
<el-row class="assets" :gutter="20">
<el-col class="asset" :span="8" v-loading="loading" v-for="asset in checkedAssets" :key="asset">
<el-card class="asset-card">
Expand Down Expand Up @@ -105,13 +119,18 @@ const checkedAssets = ref<Asset[]>([]);
const networks = ref<{
[network: string]: boolean;
}>({});
const mproviders = ref<{
[provider: string]: boolean;
}>({});
const checkAll = ref(true);
const isIndeterminate = ref(false);
const checked = ref<string[]>([]);
const networkChecked = ref<string[]>([]);
const providerChecked = ref<string[]>([]);
const handleCheckAllChange = (val: boolean) => {
checked.value = val ? Object.keys(networks.value) : [];
networkChecked.value = val ? Object.keys(networks.value) : [];
providerChecked.value = val ? Object.keys(mproviders.value) : [];
isIndeterminate.value = false;
};
const handleCheckedChange = (value: string[]) => {
Expand Down Expand Up @@ -149,16 +168,24 @@ watchEffect(async () => {
if (asset.metadata?.network) {
networks.value[asset.metadata.network] = true;
}
if (asset.metadata?.providers) {
asset.metadata.providers.forEach((provider: string) => {
mproviders.value[provider] = true;
});
}
});
checked.value = Object.keys(networks.value);
networkChecked.value = Object.keys(networks.value);
providerChecked.value = Object.keys(mproviders.value);
});
}
});
watchEffect(async () => {
checkedAssets.value = assets.value.list.filter((asset: Asset) =>
checked.value.includes(asset.metadata?.network || ''),
checkedAssets.value = assets.value.list.filter(
(asset: Asset) =>
networkChecked.value.includes(asset.metadata?.network || '') &&
providerChecked.value.find((provider: string) => asset.metadata?.providers?.includes(provider)),
);
});
Expand All @@ -171,6 +198,11 @@ document.head.appendChild(modelScript);
<style lang="less" scoped>
.loading-wrap {
min-height: 50px;
.check-type {
font-size: 14px;
margin: 5px 0;
}
}
.assets {
Expand Down
5 changes: 4 additions & 1 deletion src/assets/ethereum-nft-alchemy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Base from './base';
import { AssetsOptions } from './index';
import axios from 'axios';
import { BigNumber } from 'ethers';
import { utils } from 'ethers/lib';

class EthereumNFTAlchemy extends Base {
constructor(main: Main) {
Expand Down Expand Up @@ -30,7 +31,7 @@ class EthereumNFTAlchemy extends Base {
const tokenId = BigNumber.from(item.id.tokenId).toString();
const asset: Asset = {
tags: ['NFT'],
owners: [options.identity],
owners: [utils.getAddress(options.identity)],
name: item.title,
description: item.description,

Expand All @@ -47,6 +48,8 @@ class EthereumNFTAlchemy extends Base {
token_id: tokenId,

collection_address: item.contract.address,

providers: ['Alchemy'],
},
};

Expand Down
5 changes: 4 additions & 1 deletion src/assets/ethereum-nft-moralis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import Main from '../index';
import Base from './base';
import { AssetsOptions } from './index';
import axios from 'axios';
import { utils } from 'ethers/lib';

class EthereumNFTMoralis extends Base {
constructor(main: Main) {
Expand Down Expand Up @@ -76,7 +77,7 @@ class EthereumNFTMoralis extends Base {

const asset: Asset = {
tags: ['NFT'],
owners: [item.owner_of || options.identity],
owners: [utils.getAddress(item.owner_of || options.identity)],
name: metadata?.name || `${item.name} #${item.token_id}`,
description: metadata?.description,

Expand All @@ -95,6 +96,8 @@ class EthereumNFTMoralis extends Base {

block_number_minted: item.block_number_minted,
block_number: item.block_number,

providers: ['Moralis'],
},
};

Expand Down
5 changes: 4 additions & 1 deletion src/assets/ethereum-nft-opensea.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import Main from '../index';
import Base from './base';
import { AssetsOptions } from './index';
import axios from 'axios';
import { utils } from 'ethers/lib';

class EthereumNFTOpensea extends Base {
constructor(main: Main) {
Expand All @@ -22,7 +23,7 @@ class EthereumNFTOpensea extends Base {
const assets: Asset[] = res.data?.assets.map((item: any) => {
const asset: Asset = {
tags: ['NFT'],
owners: [item.owner.address],
owners: [utils.getAddress(item.owner.address)],
name: item.name,
description: item.description,

Expand All @@ -41,6 +42,8 @@ class EthereumNFTOpensea extends Base {

collection_address: item.asset_contract.address,
collection_name: item.asset_contract.name,

providers: ['OpenSea'],
},
};

Expand Down
5 changes: 4 additions & 1 deletion src/assets/ethereum-nft-poap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import Main from '../index';
import Base from './base';
import { AssetsOptions } from './index';
import axios from 'axios';
import { utils } from 'ethers/lib';

class EthereumNFTPOAP extends Base {
constructor(main: Main) {
Expand All @@ -13,7 +14,7 @@ class EthereumNFTPOAP extends Base {
const assets: Asset[] = res.data?.map((item: any) => {
const asset: Asset = {
tags: ['NFT', 'POAP'],
owners: [item.owner],
owners: [utils.getAddress(item.owner)],
name: item.event.name,
description: item.event.description,

Expand Down Expand Up @@ -78,6 +79,8 @@ class EthereumNFTPOAP extends Base {

collection_address: '0x22C1f6050E56d2876009903609a2cC3fEf83B415',
collection_name: 'POAP',

providers: ['POAP'],
},
};

Expand Down
2 changes: 2 additions & 0 deletions src/assets/flow-nft-alchemy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class FlowNFTAlchemy extends Base {

collection_address: item.contract.address,
collection_name: item.contract.name,

providers: ['Alchemy'],
},
};

Expand Down
18 changes: 15 additions & 3 deletions src/assets/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Main from '../index';
import Base from './base';
import unionBy from 'lodash/unionBy';
import { mergeWith, keyBy, values, uniqWith, isEqual } from 'lodash';
import EthereumNFTMoralis from './ethereum-nft-moralis';
import EthereumNFTOpenSea from './ethereum-nft-opensea';
import EthereumNFTPOAP from './ethereum-nft-poap';
Expand Down Expand Up @@ -54,8 +54,20 @@ class Assets {
return result.list;
}),
);
let assets = Array.prototype.concat(...list);
assets = unionBy(assets, (item: Asset) => item.metadata?.proof);

let merged = keyBy(list[0], (item) => item.metadata?.proof);
for (let i = 1; i < list.length; i++) {
merged = mergeWith(
merged,
keyBy(list[i], (item) => item.metadata?.proof),
(a, b) => {
if (Array.isArray(a)) {
return uniqWith(a.concat(b), isEqual);
}
},
);
}
const assets = values(merged);

return {
total: assets.length,
Expand Down
2 changes: 2 additions & 0 deletions src/assets/solana-nft-moralis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ class SolanaNFTMoralis extends Base {
token_symbol: metadata.symbol || moralisdata.symbol,

collection_name: metadata.collection?.name,

providers: ['Moralis'],
},
};

Expand Down
2 changes: 2 additions & 0 deletions src/assets/solana-nft-solscan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ class SolanaNFTSolscan extends Base {
token_symbol: data.onchainMetadata?.data.symbol,

collection_name: data.metadata?.data.collection.name,

providers: ['Solscan'],
},
};

Expand Down
1 change: 1 addition & 0 deletions types/unidata.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ type Asset = {
metadata?: {
network: Network;
proof: string;
providers: string[];

[key: string]: any;
};
Expand Down

0 comments on commit 44c3563

Please sign in to comment.