@xyo-network/crypto-nft-collection-witness-plugin 2.70.5 → 2.70.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Witness.js +23 -2
- package/dist/cjs/Witness.js.map +1 -1
- package/dist/cjs/lib/collectionMetrics/getNftCollectionMetrics.js +21 -0
- package/dist/cjs/lib/collectionMetrics/getNftCollectionMetrics.js.map +1 -0
- package/dist/cjs/lib/collectionMetrics/index.js +5 -0
- package/dist/cjs/lib/collectionMetrics/index.js.map +1 -0
- package/dist/cjs/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.js +30 -0
- package/dist/cjs/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.js.map +1 -0
- package/dist/cjs/lib/collectionMetrics/lib/calculatePropertyDistribution.js +26 -0
- package/dist/cjs/lib/collectionMetrics/lib/calculatePropertyDistribution.js.map +1 -0
- package/dist/cjs/lib/collectionMetrics/lib/distribution.js +3 -0
- package/dist/cjs/lib/collectionMetrics/lib/distribution.js.map +1 -0
- package/dist/cjs/lib/collectionMetrics/lib/index.js +6 -0
- package/dist/cjs/lib/collectionMetrics/lib/index.js.map +1 -0
- package/dist/cjs/lib/getNftCollectionInfo.js +6 -32
- package/dist/cjs/lib/getNftCollectionInfo.js.map +1 -1
- package/dist/cjs/lib/getNftCollectionNfts.js +51 -0
- package/dist/cjs/lib/getNftCollectionNfts.js.map +1 -0
- package/dist/cjs/lib/getNftCollectionTotalNfts.js +33 -0
- package/dist/cjs/lib/getNftCollectionTotalNfts.js.map +1 -0
- package/dist/cjs/lib/index.js +3 -0
- package/dist/cjs/lib/index.js.map +1 -1
- package/dist/cjs/lib/nonEvaluableContractAddresses.js +12 -0
- package/dist/cjs/lib/nonEvaluableContractAddresses.js.map +1 -0
- package/dist/docs.json +2167 -1627
- package/dist/esm/Witness.js +25 -4
- package/dist/esm/Witness.js.map +1 -1
- package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js +17 -0
- package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js.map +1 -0
- package/dist/esm/lib/collectionMetrics/index.js +2 -0
- package/dist/esm/lib/collectionMetrics/index.js.map +1 -0
- package/dist/esm/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.js +26 -0
- package/dist/esm/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.js.map +1 -0
- package/dist/esm/lib/collectionMetrics/lib/calculatePropertyDistribution.js +22 -0
- package/dist/esm/lib/collectionMetrics/lib/calculatePropertyDistribution.js.map +1 -0
- package/dist/esm/lib/collectionMetrics/lib/distribution.js +2 -0
- package/dist/esm/lib/collectionMetrics/lib/distribution.js.map +1 -0
- package/dist/esm/lib/collectionMetrics/lib/index.js +3 -0
- package/dist/esm/lib/collectionMetrics/lib/index.js.map +1 -0
- package/dist/esm/lib/getNftCollectionInfo.js +4 -30
- package/dist/esm/lib/getNftCollectionInfo.js.map +1 -1
- package/dist/esm/lib/getNftCollectionNfts.js +46 -0
- package/dist/esm/lib/getNftCollectionNfts.js.map +1 -0
- package/dist/esm/lib/getNftCollectionTotalNfts.js +28 -0
- package/dist/esm/lib/getNftCollectionTotalNfts.js.map +1 -0
- package/dist/esm/lib/index.js +3 -0
- package/dist/esm/lib/index.js.map +1 -1
- package/dist/esm/lib/nonEvaluableContractAddresses.js +9 -0
- package/dist/esm/lib/nonEvaluableContractAddresses.js.map +1 -0
- package/dist/types/Witness.d.ts.map +1 -1
- package/dist/types/lib/collectionMetrics/getNftCollectionMetrics.d.ts +13 -0
- package/dist/types/lib/collectionMetrics/getNftCollectionMetrics.d.ts.map +1 -0
- package/dist/types/lib/collectionMetrics/index.d.ts +2 -0
- package/dist/types/lib/collectionMetrics/index.d.ts.map +1 -0
- package/dist/types/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts +3 -0
- package/dist/types/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts.map +1 -0
- package/dist/types/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts +3 -0
- package/dist/types/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts.map +1 -0
- package/dist/types/lib/collectionMetrics/lib/distribution.d.ts +6 -0
- package/dist/types/lib/collectionMetrics/lib/distribution.d.ts.map +1 -0
- package/dist/types/lib/collectionMetrics/lib/index.d.ts +3 -0
- package/dist/types/lib/collectionMetrics/lib/index.d.ts.map +1 -0
- package/dist/types/lib/getNftCollectionInfo.d.ts +2 -7
- package/dist/types/lib/getNftCollectionInfo.d.ts.map +1 -1
- package/dist/types/lib/getNftCollectionNfts.d.ts +3 -0
- package/dist/types/lib/getNftCollectionNfts.d.ts.map +1 -0
- package/dist/types/lib/getNftCollectionTotalNfts.d.ts +2 -0
- package/dist/types/lib/getNftCollectionTotalNfts.d.ts.map +1 -0
- package/dist/types/lib/index.d.ts +3 -0
- package/dist/types/lib/index.d.ts.map +1 -1
- package/dist/types/lib/nonEvaluableContractAddresses.d.ts +6 -0
- package/dist/types/lib/nonEvaluableContractAddresses.d.ts.map +1 -0
- package/package.json +8 -7
- package/src/Witness.ts +29 -4
- package/src/lib/collectionMetrics/getNftCollectionMetrics.ts +29 -0
- package/src/lib/collectionMetrics/index.ts +1 -0
- package/src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts +25 -0
- package/src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts +19 -0
- package/src/lib/collectionMetrics/lib/distribution.ts +3 -0
- package/src/lib/collectionMetrics/lib/index.ts +2 -0
- package/src/lib/getNftCollectionInfo.ts +5 -32
- package/src/lib/getNftCollectionNfts.ts +52 -0
- package/src/lib/getNftCollectionTotalNfts.ts +35 -0
- package/src/lib/index.ts +3 -0
- package/src/lib/nonEvaluableContractAddresses.ts +8 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Distribution } from './distribution'
|
|
2
|
+
|
|
3
|
+
export const calculatePropertyDistribution = <T>(array: T[], property: keyof T): Distribution<T> => {
|
|
4
|
+
const distribution: Distribution<T> = {}
|
|
5
|
+
array.forEach((item) => {
|
|
6
|
+
const value = item[property]
|
|
7
|
+
if (value !== undefined && value !== null) {
|
|
8
|
+
const valueString = value.toString()
|
|
9
|
+
if (!distribution[property]) {
|
|
10
|
+
distribution[property] = { [valueString]: 1 }
|
|
11
|
+
} else if (!distribution[property]![valueString]) {
|
|
12
|
+
;(distribution[property] as Record<string, number>)[valueString] = 1
|
|
13
|
+
} else {
|
|
14
|
+
;(distribution[property] as Record<string, number>)[valueString] += 1
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
return distribution
|
|
19
|
+
}
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import { Auth, SDK } from '@infura/sdk'
|
|
2
|
-
import {
|
|
2
|
+
import { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
* These contracts are not evaluable for some
|
|
6
|
-
* reason (too large, nonsensical, etc.)
|
|
7
|
-
*/
|
|
8
|
-
export const nonEvaluableContractAddresses = [
|
|
9
|
-
// ENS
|
|
10
|
-
'0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72',
|
|
11
|
-
].map((address) => address.toUpperCase())
|
|
4
|
+
import { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'
|
|
12
5
|
|
|
13
6
|
type ContractAddressOptions = {
|
|
14
7
|
contractAddress: string
|
|
@@ -32,32 +25,12 @@ export const getNftCollectionInfo = async (
|
|
|
32
25
|
* The private key of the wallet to use to search for NFTs
|
|
33
26
|
*/
|
|
34
27
|
privateKey: string,
|
|
35
|
-
|
|
36
|
-
* The maximum number of NFTs to return. Configurable to prevent
|
|
37
|
-
* large wallets from exhausting Infura API credits.
|
|
38
|
-
*/
|
|
39
|
-
maxNftCount = 20000,
|
|
40
|
-
): Promise<NftCollectionInfoPayload> => {
|
|
28
|
+
): Promise<Omit<NftCollectionInfo, 'total'>> => {
|
|
41
29
|
if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
|
|
42
30
|
throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)
|
|
43
31
|
}
|
|
44
|
-
|
|
45
|
-
const sdk = new SDK(
|
|
46
|
-
new Auth({
|
|
47
|
-
chainId,
|
|
48
|
-
privateKey,
|
|
49
|
-
projectId: process.env.INFURA_PROJECT_ID,
|
|
50
|
-
// ipfs: {
|
|
51
|
-
// apiKeySecret: process.env.INFURA_IPFS_PROJECT_SECRET,
|
|
52
|
-
// projectId: process.env.INFURA_IPFS_PROJECT_ID,
|
|
53
|
-
// },
|
|
54
|
-
// provider,
|
|
55
|
-
// NOTE: rpcUrl is not required if chainId & projectId are provided
|
|
56
|
-
// rpcUrl: process.env.EVM_RPC_URL,
|
|
57
|
-
secretId: process.env.INFURA_PROJECT_SECRET,
|
|
58
|
-
}),
|
|
59
|
-
)
|
|
32
|
+
const sdk = new SDK(new Auth({ chainId, privateKey, projectId: process.env.INFURA_PROJECT_ID, secretId: process.env.INFURA_PROJECT_SECRET }))
|
|
60
33
|
const opts: ContractAddressOptions = { contractAddress }
|
|
61
34
|
const { name, symbol, tokenType } = await sdk.api.getContractMetadata(opts)
|
|
62
|
-
return { address: contractAddress, chainId, name,
|
|
35
|
+
return { address: contractAddress, chainId, name, symbol, tokenType }
|
|
63
36
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Auth, SDK } from '@infura/sdk'
|
|
2
|
+
import { NftInfo, NftInfoPayload, NftSchema } from '@xyo-network/crypto-nft-payload-plugin'
|
|
3
|
+
|
|
4
|
+
import { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'
|
|
5
|
+
|
|
6
|
+
type ContractAddressOptions = {
|
|
7
|
+
contractAddress: string
|
|
8
|
+
cursor?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const getNftCollectionNfts = async (
|
|
12
|
+
/**
|
|
13
|
+
* The address of the NFT contract to search for
|
|
14
|
+
*/
|
|
15
|
+
contractAddress: string,
|
|
16
|
+
/**
|
|
17
|
+
* The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on
|
|
18
|
+
*/
|
|
19
|
+
chainId: number,
|
|
20
|
+
// /**
|
|
21
|
+
// * The ethers provider to use to search for NFTs
|
|
22
|
+
// */
|
|
23
|
+
// provider: ExternalProvider | JsonRpcFetchFunc,
|
|
24
|
+
/**
|
|
25
|
+
* The private key of the wallet to use to search for NFTs
|
|
26
|
+
*/
|
|
27
|
+
privateKey: string,
|
|
28
|
+
/**
|
|
29
|
+
* The maximum number of NFTs to return. Configurable to prevent
|
|
30
|
+
* large wallets from exhausting Infura API credits. Ideally a
|
|
31
|
+
* multiple of 100 as that appears to be the default page size.
|
|
32
|
+
*/
|
|
33
|
+
maxNftSampleSize = 100,
|
|
34
|
+
): Promise<NftInfoPayload[]> => {
|
|
35
|
+
if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
|
|
36
|
+
throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)
|
|
37
|
+
}
|
|
38
|
+
const sdk = new SDK(new Auth({ chainId, privateKey, projectId: process.env.INFURA_PROJECT_ID, secretId: process.env.INFURA_PROJECT_SECRET }))
|
|
39
|
+
const nfts: NftInfo[] = []
|
|
40
|
+
let cursor: string | undefined = undefined
|
|
41
|
+
do {
|
|
42
|
+
const opts: ContractAddressOptions = { contractAddress, cursor }
|
|
43
|
+
const { cursor: nextCursor, pageSize, total, assets } = await sdk.api.getNFTsForCollection(opts)
|
|
44
|
+
const batch: NftInfo[] = assets.slice(0, Math.min(pageSize, total - nfts.length))
|
|
45
|
+
nfts.push(...batch)
|
|
46
|
+
cursor = nextCursor
|
|
47
|
+
if (nfts.length >= total || !cursor) break
|
|
48
|
+
} while (nfts.length < maxNftSampleSize)
|
|
49
|
+
return nfts.map((nft) => {
|
|
50
|
+
return { ...nft, schema: NftSchema }
|
|
51
|
+
})
|
|
52
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Auth, SDK } from '@infura/sdk'
|
|
2
|
+
|
|
3
|
+
import { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'
|
|
4
|
+
|
|
5
|
+
type ContractAddressOptions = {
|
|
6
|
+
contractAddress: string
|
|
7
|
+
cursor?: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const getNftCollectionTotalNfts = async (
|
|
11
|
+
/**
|
|
12
|
+
* The address of the NFT contract to search for
|
|
13
|
+
*/
|
|
14
|
+
contractAddress: string,
|
|
15
|
+
/**
|
|
16
|
+
* The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on
|
|
17
|
+
*/
|
|
18
|
+
chainId: number,
|
|
19
|
+
// /**
|
|
20
|
+
// * The ethers provider to use to search for NFTs
|
|
21
|
+
// */
|
|
22
|
+
// provider: ExternalProvider | JsonRpcFetchFunc,
|
|
23
|
+
/**
|
|
24
|
+
* The private key of the wallet to use to search for NFTs
|
|
25
|
+
*/
|
|
26
|
+
privateKey: string,
|
|
27
|
+
): Promise<number> => {
|
|
28
|
+
if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
|
|
29
|
+
throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)
|
|
30
|
+
}
|
|
31
|
+
const sdk = new SDK(new Auth({ chainId, privateKey, projectId: process.env.INFURA_PROJECT_ID, secretId: process.env.INFURA_PROJECT_SECRET }))
|
|
32
|
+
const opts: ContractAddressOptions = { contractAddress }
|
|
33
|
+
const { total } = await sdk.api.getNFTsForCollection(opts)
|
|
34
|
+
return total
|
|
35
|
+
}
|
package/src/lib/index.ts
CHANGED