@xyo-network/crypto-nft-collection-witness-plugin 2.78.1 → 2.78.3
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/browser/Plugin.d.cts +2 -0
- package/dist/browser/Plugin.d.cts.map +1 -1
- package/dist/browser/Plugin.d.mts +2 -0
- package/dist/browser/Plugin.d.mts.map +1 -1
- package/dist/browser/Plugin.d.ts +2 -0
- package/dist/browser/Plugin.d.ts.map +1 -1
- package/dist/browser/Witness.d.cts +6 -1
- package/dist/browser/Witness.d.cts.map +1 -1
- package/dist/browser/Witness.d.mts +6 -1
- package/dist/browser/Witness.d.mts.map +1 -1
- package/dist/browser/Witness.d.ts +6 -1
- package/dist/browser/Witness.d.ts.map +1 -1
- package/dist/browser/index.cjs +100 -91
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +98 -89
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/lib/getNftCollectionNfts.d.cts +3 -2
- package/dist/browser/lib/getNftCollectionNfts.d.cts.map +1 -1
- package/dist/browser/lib/getNftCollectionNfts.d.mts +3 -2
- package/dist/browser/lib/getNftCollectionNfts.d.mts.map +1 -1
- package/dist/browser/lib/getNftCollectionNfts.d.ts +3 -2
- package/dist/browser/lib/getNftCollectionNfts.d.ts.map +1 -1
- package/dist/browser/lib/{getProvider.d.cts → getProviderFromEnv.d.cts} +1 -1
- package/dist/browser/lib/getProviderFromEnv.d.cts.map +1 -0
- package/dist/browser/lib/{getProvider.d.mts → getProviderFromEnv.d.mts} +1 -1
- package/dist/browser/lib/getProviderFromEnv.d.mts.map +1 -0
- package/dist/browser/lib/{getProvider.d.ts → getProviderFromEnv.d.ts} +1 -1
- package/dist/browser/lib/getProviderFromEnv.d.ts.map +1 -0
- package/dist/browser/lib/index.d.cts +2 -2
- package/dist/browser/lib/index.d.cts.map +1 -1
- package/dist/browser/lib/index.d.mts +2 -2
- package/dist/browser/lib/index.d.mts.map +1 -1
- package/dist/browser/lib/index.d.ts +2 -2
- package/dist/browser/lib/index.d.ts.map +1 -1
- package/dist/browser/lib/tokenTypes.d.cts +8 -0
- package/dist/browser/lib/tokenTypes.d.cts.map +1 -0
- package/dist/browser/lib/tokenTypes.d.mts +8 -0
- package/dist/browser/lib/tokenTypes.d.mts.map +1 -0
- package/dist/browser/lib/tokenTypes.d.ts +8 -0
- package/dist/browser/lib/tokenTypes.d.ts.map +1 -0
- package/dist/node/Plugin.d.cts +2 -0
- package/dist/node/Plugin.d.cts.map +1 -1
- package/dist/node/Plugin.d.mts +2 -0
- package/dist/node/Plugin.d.mts.map +1 -1
- package/dist/node/Plugin.d.ts +2 -0
- package/dist/node/Plugin.d.ts.map +1 -1
- package/dist/node/Witness.d.cts +6 -1
- package/dist/node/Witness.d.cts.map +1 -1
- package/dist/node/Witness.d.mts +6 -1
- package/dist/node/Witness.d.mts.map +1 -1
- package/dist/node/Witness.d.ts +6 -1
- package/dist/node/Witness.d.ts.map +1 -1
- package/dist/node/index.js +106 -95
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +98 -89
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/lib/getNftCollectionNfts.d.cts +3 -2
- package/dist/node/lib/getNftCollectionNfts.d.cts.map +1 -1
- package/dist/node/lib/getNftCollectionNfts.d.mts +3 -2
- package/dist/node/lib/getNftCollectionNfts.d.mts.map +1 -1
- package/dist/node/lib/getNftCollectionNfts.d.ts +3 -2
- package/dist/node/lib/getNftCollectionNfts.d.ts.map +1 -1
- package/dist/node/lib/{getProvider.d.cts → getProviderFromEnv.d.cts} +1 -1
- package/dist/node/lib/getProviderFromEnv.d.cts.map +1 -0
- package/dist/node/lib/getProviderFromEnv.d.mts +3 -0
- package/dist/node/lib/getProviderFromEnv.d.mts.map +1 -0
- package/dist/node/lib/getProviderFromEnv.d.ts +3 -0
- package/dist/node/lib/getProviderFromEnv.d.ts.map +1 -0
- package/dist/node/lib/index.d.cts +2 -2
- package/dist/node/lib/index.d.cts.map +1 -1
- package/dist/node/lib/index.d.mts +2 -2
- package/dist/node/lib/index.d.mts.map +1 -1
- package/dist/node/lib/index.d.ts +2 -2
- package/dist/node/lib/index.d.ts.map +1 -1
- package/dist/node/lib/tokenTypes.d.cts +8 -0
- package/dist/node/lib/tokenTypes.d.cts.map +1 -0
- package/dist/node/lib/tokenTypes.d.mts +8 -0
- package/dist/node/lib/tokenTypes.d.mts.map +1 -0
- package/dist/node/lib/tokenTypes.d.ts +8 -0
- package/dist/node/lib/tokenTypes.d.ts.map +1 -0
- package/package.json +15 -11
- package/src/Witness.ts +51 -9
- package/src/lib/getNftCollectionNfts.ts +15 -13
- package/src/lib/index.ts +2 -2
- package/src/lib/tokenTypes.ts +36 -0
- package/dist/browser/lib/getNftCollectionCount.d.cts +0 -2
- package/dist/browser/lib/getNftCollectionCount.d.cts.map +0 -1
- package/dist/browser/lib/getNftCollectionCount.d.mts +0 -2
- package/dist/browser/lib/getNftCollectionCount.d.mts.map +0 -1
- package/dist/browser/lib/getNftCollectionCount.d.ts +0 -2
- package/dist/browser/lib/getNftCollectionCount.d.ts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.cts +0 -5
- package/dist/browser/lib/getNftCollectionMetadata.d.cts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.mts +0 -5
- package/dist/browser/lib/getNftCollectionMetadata.d.mts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.ts +0 -5
- package/dist/browser/lib/getNftCollectionMetadata.d.ts.map +0 -1
- package/dist/browser/lib/getProvider.d.cts.map +0 -1
- package/dist/browser/lib/getProvider.d.mts.map +0 -1
- package/dist/browser/lib/getProvider.d.ts.map +0 -1
- package/dist/node/lib/getNftCollectionCount.d.cts +0 -2
- package/dist/node/lib/getNftCollectionCount.d.cts.map +0 -1
- package/dist/node/lib/getNftCollectionCount.d.mts +0 -2
- package/dist/node/lib/getNftCollectionCount.d.mts.map +0 -1
- package/dist/node/lib/getNftCollectionCount.d.ts +0 -2
- package/dist/node/lib/getNftCollectionCount.d.ts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.cts +0 -5
- package/dist/node/lib/getNftCollectionMetadata.d.cts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.mts +0 -5
- package/dist/node/lib/getNftCollectionMetadata.d.mts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.ts +0 -5
- package/dist/node/lib/getNftCollectionMetadata.d.ts.map +0 -1
- package/dist/node/lib/getProvider.d.cts.map +0 -1
- package/dist/node/lib/getProvider.d.mts +0 -3
- package/dist/node/lib/getProvider.d.mts.map +0 -1
- package/dist/node/lib/getProvider.d.ts +0 -3
- package/dist/node/lib/getProvider.d.ts.map +0 -1
- package/src/lib/getNftCollectionCount.ts +0 -22
- package/src/lib/getNftCollectionMetadata.ts +0 -58
- /package/src/lib/{getProvider.ts → getProviderFromEnv.ts} +0 -0
package/src/Witness.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { InfuraProvider, Provider, WebSocketProvider } from '@ethersproject/providers'
|
|
1
2
|
import { assertEx } from '@xylabs/assert'
|
|
2
3
|
import { EthAddress } from '@xylabs/eth-address'
|
|
3
4
|
import { AbstractWitness } from '@xyo-network/abstract-witness'
|
|
@@ -11,11 +12,17 @@ import {
|
|
|
11
12
|
NftCollectionWitnessQuery,
|
|
12
13
|
} from '@xyo-network/crypto-nft-collection-payload-plugin'
|
|
13
14
|
import { AnyConfigSchema } from '@xyo-network/module-model'
|
|
15
|
+
import { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'
|
|
14
16
|
import { WitnessParams } from '@xyo-network/witness-model'
|
|
15
17
|
|
|
16
|
-
import {
|
|
18
|
+
import { getNftCollectionMetrics, getNftCollectionNfts, getProviderFromEnv, tokenTypes } from './lib'
|
|
17
19
|
|
|
18
|
-
export type CryptoNftCollectionWitnessParams = WitnessParams<
|
|
20
|
+
export type CryptoNftCollectionWitnessParams = WitnessParams<
|
|
21
|
+
AnyConfigSchema<NftCollectionWitnessConfig>,
|
|
22
|
+
{
|
|
23
|
+
provider: Provider
|
|
24
|
+
}
|
|
25
|
+
>
|
|
19
26
|
|
|
20
27
|
const defaultMaxNfts = 100
|
|
21
28
|
|
|
@@ -26,6 +33,15 @@ const defaultMaxNfts = 100
|
|
|
26
33
|
*/
|
|
27
34
|
const NoOp = Promise.resolve()
|
|
28
35
|
|
|
36
|
+
function resolvedValue<T>(settled: PromiseSettledResult<T>, assert: true): T
|
|
37
|
+
function resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: false): T | undefined
|
|
38
|
+
function resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: boolean) {
|
|
39
|
+
if (assert && settled.status === 'rejected') {
|
|
40
|
+
throw settled.reason
|
|
41
|
+
}
|
|
42
|
+
return settled.status === 'fulfilled' ? settled.value : undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
29
45
|
export class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractWitness<
|
|
30
46
|
TParams,
|
|
31
47
|
NftCollectionWitnessQuery,
|
|
@@ -33,31 +49,57 @@ export class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitne
|
|
|
33
49
|
> {
|
|
34
50
|
static override configSchemas = [NftCollectionWitnessConfigSchema]
|
|
35
51
|
|
|
52
|
+
protected providers: Record<number, WebSocketProvider | InfuraProvider> = {}
|
|
53
|
+
|
|
54
|
+
protected getProvider(chainId: number) {
|
|
55
|
+
this.providers[chainId] = this.providers[chainId] ?? getProviderFromEnv(chainId)
|
|
56
|
+
return this.providers[chainId]
|
|
57
|
+
}
|
|
58
|
+
|
|
36
59
|
protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {
|
|
37
60
|
await this.started('throw')
|
|
38
61
|
const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? []
|
|
39
62
|
const observations = await Promise.all(
|
|
40
63
|
queries.map<Promise<NftCollectionInfo>>(async (query) => {
|
|
64
|
+
const chainId = assertEx(query?.chainId || this.config.chainId, 'params.chainId is required')
|
|
65
|
+
const provider = this.getProvider(chainId)
|
|
41
66
|
const address = assertEx(
|
|
42
67
|
EthAddress.parse(assertEx(query?.address || this.config.address, 'params.address is required')),
|
|
43
68
|
'Failed to parse params.address',
|
|
44
69
|
).toString()
|
|
45
|
-
|
|
70
|
+
|
|
71
|
+
const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)
|
|
72
|
+
|
|
46
73
|
const maxNfts = query?.maxNfts || defaultMaxNfts
|
|
47
|
-
const [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
74
|
+
const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
|
|
75
|
+
await erc721Enumerable.name(),
|
|
76
|
+
await erc721Enumerable.symbol(),
|
|
77
|
+
(await erc721Enumerable.totalSupply()).toNumber(),
|
|
78
|
+
await tokenTypes(erc721Enumerable),
|
|
79
|
+
await this.writeArchivist(),
|
|
52
80
|
])
|
|
81
|
+
const types = resolvedValue(typesSettled, true)
|
|
82
|
+
const nfts = await getNftCollectionNfts(address, provider, types, maxNfts)
|
|
53
83
|
const metrics = getNftCollectionMetrics(nfts)
|
|
84
|
+
const archivist = resolvedValue(archivistSettled)
|
|
54
85
|
const [sources] = await Promise.all([
|
|
55
86
|
// Hash all the payloads
|
|
56
87
|
Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),
|
|
57
88
|
// Insert them into the archivist if we have one
|
|
58
89
|
archivist ? archivist.insert(nfts) : NoOp,
|
|
59
90
|
])
|
|
60
|
-
const payload: NftCollectionInfo = {
|
|
91
|
+
const payload: NftCollectionInfo = {
|
|
92
|
+
address,
|
|
93
|
+
chainId,
|
|
94
|
+
metrics,
|
|
95
|
+
name: resolvedValue(name, true),
|
|
96
|
+
schema: NftCollectionSchema,
|
|
97
|
+
sources,
|
|
98
|
+
symbol: resolvedValue(symbol, true),
|
|
99
|
+
total: resolvedValue(total, true),
|
|
100
|
+
type: types.at(0),
|
|
101
|
+
types,
|
|
102
|
+
}
|
|
61
103
|
return payload
|
|
62
104
|
}),
|
|
63
105
|
)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { JsonRpcProvider } from '@ethersproject/providers'
|
|
1
2
|
import { AxiosJson } from '@xyo-network/axios'
|
|
2
|
-
import { NftInfo, NftMetadata, NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'
|
|
3
|
+
import { NftInfo, NftMetadata, NftSchema, TokenType, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'
|
|
3
4
|
import { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'
|
|
4
5
|
|
|
5
|
-
import { getNftCollectionMetadata } from './getNftCollectionMetadata'
|
|
6
|
-
import { getProviderFromEnv } from './getProvider'
|
|
7
6
|
import { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'
|
|
7
|
+
import { tokenTypes } from './tokenTypes'
|
|
8
8
|
|
|
9
9
|
const ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'
|
|
10
10
|
|
|
@@ -39,7 +39,8 @@ export const getNftCollectionNfts = async (
|
|
|
39
39
|
/**
|
|
40
40
|
* The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on
|
|
41
41
|
*/
|
|
42
|
-
|
|
42
|
+
provider: JsonRpcProvider,
|
|
43
|
+
types?: TokenType[],
|
|
43
44
|
/**
|
|
44
45
|
* The maximum number of NFTs to return. Configurable to prevent
|
|
45
46
|
* large wallets from exhausting Infura API credits. Ideally a
|
|
@@ -50,19 +51,19 @@ export const getNftCollectionNfts = async (
|
|
|
50
51
|
if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
|
|
51
52
|
throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)
|
|
52
53
|
}
|
|
53
|
-
const axios = new AxiosJson({ timeout:
|
|
54
|
-
const provider = getProviderFromEnv(chainId)
|
|
54
|
+
const axios = new AxiosJson({ timeout: 2000 })
|
|
55
55
|
const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider)
|
|
56
56
|
const storage = ERC721URIStorage__factory.connect(contractAddress, provider)
|
|
57
57
|
const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider)
|
|
58
|
+
const finalTypes = types ?? (await tokenTypes(enumerable))
|
|
58
59
|
const result: NftInfo[] = []
|
|
59
|
-
const { type: nftType } = await getNftCollectionMetadata(contractAddress, chainId)
|
|
60
60
|
|
|
61
61
|
for (let i = 0; i < maxNfts; i++) {
|
|
62
|
+
console.log(`Getting Token [${i}]`)
|
|
62
63
|
const tokenId = (await enumerable.tokenByIndex(i)).toHexString()
|
|
63
|
-
const supply =
|
|
64
|
-
const
|
|
65
|
-
const checkedMetaDataUri = checkIpfsUrl(
|
|
64
|
+
const supply = finalTypes.includes(toTokenType('ERC1155')) ? (await supply1155.totalSupply(tokenId)).toHexString() : '0x01'
|
|
65
|
+
const metadataUri = await storage.tokenURI(tokenId)
|
|
66
|
+
const checkedMetaDataUri = checkIpfsUrl(metadataUri, ipfsGateway)
|
|
66
67
|
let metadata: NftMetadata | undefined = undefined
|
|
67
68
|
try {
|
|
68
69
|
metadata = (await axios.get(checkedMetaDataUri)).data
|
|
@@ -73,13 +74,14 @@ export const getNftCollectionNfts = async (
|
|
|
73
74
|
|
|
74
75
|
const info: NftInfo = {
|
|
75
76
|
address: contractAddress,
|
|
76
|
-
chainId,
|
|
77
|
-
metaDataUri,
|
|
77
|
+
chainId: provider.network.chainId,
|
|
78
78
|
metadata,
|
|
79
|
+
metadataUri,
|
|
79
80
|
schema: NftSchema,
|
|
80
81
|
supply,
|
|
81
82
|
tokenId,
|
|
82
|
-
type:
|
|
83
|
+
type: finalTypes.at(0),
|
|
84
|
+
types,
|
|
83
85
|
}
|
|
84
86
|
result.push(info)
|
|
85
87
|
}
|
package/src/lib/index.ts
CHANGED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Interface } from '@ethersproject/abi'
|
|
2
|
+
import { Contract } from '@ethersproject/contracts'
|
|
3
|
+
import { TokenType } from '@xyo-network/crypto-nft-payload-plugin'
|
|
4
|
+
import { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'
|
|
5
|
+
|
|
6
|
+
export const isErc1155 = async (contract: Contract) => {
|
|
7
|
+
return await hasFunctions(contract, ERC1155URIStorage__factory.createInterface(), ['uri'])
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const isErc721 = async (contract: Contract) => {
|
|
11
|
+
return await hasFunctions(contract, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const hasFunctions = async (contract: Contract, contractInterface: Interface, functionNames: string[]) => {
|
|
15
|
+
const bytecode = await contract.provider.getCode(contract.address)
|
|
16
|
+
for (let i = 0; i < functionNames.length; i++) {
|
|
17
|
+
const nameSig = contractInterface.getSighash(functionNames[i]).substring(2)
|
|
18
|
+
if (!bytecode.includes(nameSig)) {
|
|
19
|
+
return false
|
|
20
|
+
}
|
|
21
|
+
return true
|
|
22
|
+
}
|
|
23
|
+
return false
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const tokenTypes = async (contract: Contract) => {
|
|
27
|
+
const [erc721, erc1155] = await Promise.all([isErc721(contract), isErc1155(contract)])
|
|
28
|
+
const result: TokenType[] = []
|
|
29
|
+
if (erc721) {
|
|
30
|
+
result.push('ERC721')
|
|
31
|
+
}
|
|
32
|
+
if (erc1155) {
|
|
33
|
+
result.push('ERC1155')
|
|
34
|
+
}
|
|
35
|
+
return result
|
|
36
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionCount.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionCount.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,oBAIf,MAAM,WAId,MAAM,KACd,QAAQ,MAAM,CAOhB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionCount.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionCount.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,oBAIf,MAAM,WAId,MAAM,KACd,QAAQ,MAAM,CAOhB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionCount.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionCount.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,oBAIf,MAAM,WAId,MAAM,KACd,QAAQ,MAAM,CAOhB,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { Interface } from '@ethersproject/abi';
|
|
2
|
-
import { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
|
-
export declare function getInterfaceID(contractInterface: Interface): string;
|
|
4
|
-
export declare const getNftCollectionMetadata: (contractAddress: string, chainId: number) => Promise<Omit<NftCollectionMetadata, 'total'>>;
|
|
5
|
-
//# sourceMappingURL=getNftCollectionMetadata.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionMetadata.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AAOzF,wBAAgB,cAAc,CAAC,iBAAiB,EAAE,SAAS,UAQ1D;AAED,eAAO,MAAM,wBAAwB,oBAIlB,MAAM,WAId,MAAM,KACd,QAAQ,KAAK,qBAAqB,EAAE,OAAO,CAAC,CA8B9C,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { Interface } from '@ethersproject/abi';
|
|
2
|
-
import { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
|
-
export declare function getInterfaceID(contractInterface: Interface): string;
|
|
4
|
-
export declare const getNftCollectionMetadata: (contractAddress: string, chainId: number) => Promise<Omit<NftCollectionMetadata, 'total'>>;
|
|
5
|
-
//# sourceMappingURL=getNftCollectionMetadata.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionMetadata.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AAOzF,wBAAgB,cAAc,CAAC,iBAAiB,EAAE,SAAS,UAQ1D;AAED,eAAO,MAAM,wBAAwB,oBAIlB,MAAM,WAId,MAAM,KACd,QAAQ,KAAK,qBAAqB,EAAE,OAAO,CAAC,CA8B9C,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { Interface } from '@ethersproject/abi';
|
|
2
|
-
import { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
|
-
export declare function getInterfaceID(contractInterface: Interface): string;
|
|
4
|
-
export declare const getNftCollectionMetadata: (contractAddress: string, chainId: number) => Promise<Omit<NftCollectionMetadata, 'total'>>;
|
|
5
|
-
//# sourceMappingURL=getNftCollectionMetadata.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionMetadata.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AAOzF,wBAAgB,cAAc,CAAC,iBAAiB,EAAE,SAAS,UAQ1D;AAED,eAAO,MAAM,wBAAwB,oBAIlB,MAAM,WAId,MAAM,KACd,QAAQ,KAAK,qBAAqB,EAAE,OAAO,CAAC,CA8B9C,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/getProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/getProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/getProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionCount.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionCount.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,oBAIf,MAAM,WAId,MAAM,KACd,QAAQ,MAAM,CAOhB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionCount.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionCount.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,oBAIf,MAAM,WAId,MAAM,KACd,QAAQ,MAAM,CAOhB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionCount.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionCount.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,oBAIf,MAAM,WAId,MAAM,KACd,QAAQ,MAAM,CAOhB,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { Interface } from '@ethersproject/abi';
|
|
2
|
-
import { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
|
-
export declare function getInterfaceID(contractInterface: Interface): string;
|
|
4
|
-
export declare const getNftCollectionMetadata: (contractAddress: string, chainId: number) => Promise<Omit<NftCollectionMetadata, 'total'>>;
|
|
5
|
-
//# sourceMappingURL=getNftCollectionMetadata.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionMetadata.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AAOzF,wBAAgB,cAAc,CAAC,iBAAiB,EAAE,SAAS,UAQ1D;AAED,eAAO,MAAM,wBAAwB,oBAIlB,MAAM,WAId,MAAM,KACd,QAAQ,KAAK,qBAAqB,EAAE,OAAO,CAAC,CA8B9C,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { Interface } from '@ethersproject/abi';
|
|
2
|
-
import { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
|
-
export declare function getInterfaceID(contractInterface: Interface): string;
|
|
4
|
-
export declare const getNftCollectionMetadata: (contractAddress: string, chainId: number) => Promise<Omit<NftCollectionMetadata, 'total'>>;
|
|
5
|
-
//# sourceMappingURL=getNftCollectionMetadata.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionMetadata.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AAOzF,wBAAgB,cAAc,CAAC,iBAAiB,EAAE,SAAS,UAQ1D;AAED,eAAO,MAAM,wBAAwB,oBAIlB,MAAM,WAId,MAAM,KACd,QAAQ,KAAK,qBAAqB,EAAE,OAAO,CAAC,CA8B9C,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { Interface } from '@ethersproject/abi';
|
|
2
|
-
import { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
|
-
export declare function getInterfaceID(contractInterface: Interface): string;
|
|
4
|
-
export declare const getNftCollectionMetadata: (contractAddress: string, chainId: number) => Promise<Omit<NftCollectionMetadata, 'total'>>;
|
|
5
|
-
//# sourceMappingURL=getNftCollectionMetadata.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNftCollectionMetadata.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AAOzF,wBAAgB,cAAc,CAAC,iBAAiB,EAAE,SAAS,UAQ1D;AAED,eAAO,MAAM,wBAAwB,oBAIlB,MAAM,WAId,MAAM,KACd,QAAQ,KAAK,qBAAqB,EAAE,OAAO,CAAC,CA8B9C,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/getProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/getProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/getProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'
|
|
2
|
-
|
|
3
|
-
import { getProviderFromEnv } from './getProvider'
|
|
4
|
-
import { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'
|
|
5
|
-
|
|
6
|
-
export const getNftCollectionCount = async (
|
|
7
|
-
/**
|
|
8
|
-
* The address of the NFT contract to search for
|
|
9
|
-
*/
|
|
10
|
-
contractAddress: string,
|
|
11
|
-
/**
|
|
12
|
-
* The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on
|
|
13
|
-
*/
|
|
14
|
-
chainId: number,
|
|
15
|
-
): Promise<number> => {
|
|
16
|
-
if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
|
|
17
|
-
throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)
|
|
18
|
-
}
|
|
19
|
-
const provider = getProviderFromEnv(chainId)
|
|
20
|
-
const contract = ERC721Enumerable__factory.connect(contractAddress, provider)
|
|
21
|
-
return (await contract.totalSupply()).toNumber()
|
|
22
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { Interface } from '@ethersproject/abi'
|
|
2
|
-
import { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin'
|
|
3
|
-
import { ERC721Enumerable__factory, ERC1155__factory } from '@xyo-network/open-zeppelin-typechain'
|
|
4
|
-
import { constants } from 'ethers'
|
|
5
|
-
|
|
6
|
-
import { getProviderFromEnv } from './getProvider'
|
|
7
|
-
import { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'
|
|
8
|
-
|
|
9
|
-
export function getInterfaceID(contractInterface: Interface) {
|
|
10
|
-
let interfaceID = constants.Zero
|
|
11
|
-
const functions: string[] = Object.keys(contractInterface.functions)
|
|
12
|
-
for (let i = 0; i < functions.length; i++) {
|
|
13
|
-
interfaceID = interfaceID.xor(contractInterface.getSighash(functions[i]))
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return interfaceID.toHexString()
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const getNftCollectionMetadata = async (
|
|
20
|
-
/**
|
|
21
|
-
* The address of the NFT contract to search for
|
|
22
|
-
*/
|
|
23
|
-
contractAddress: string,
|
|
24
|
-
/**
|
|
25
|
-
* The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on
|
|
26
|
-
*/
|
|
27
|
-
chainId: number,
|
|
28
|
-
): Promise<Omit<NftCollectionMetadata, 'total'>> => {
|
|
29
|
-
if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
|
|
30
|
-
throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)
|
|
31
|
-
}
|
|
32
|
-
const provider = getProviderFromEnv(chainId)
|
|
33
|
-
const contract721 = ERC721Enumerable__factory.connect(contractAddress, provider)
|
|
34
|
-
const contract1155 = ERC1155__factory.connect(contractAddress, provider)
|
|
35
|
-
let name: string = ''
|
|
36
|
-
try {
|
|
37
|
-
name = await contract721.name()
|
|
38
|
-
} catch (ex) {
|
|
39
|
-
const error = ex as Error
|
|
40
|
-
console.log(`name: ${error.message}`)
|
|
41
|
-
}
|
|
42
|
-
let symbol: string = ''
|
|
43
|
-
try {
|
|
44
|
-
symbol = await contract721.symbol()
|
|
45
|
-
} catch (ex) {
|
|
46
|
-
const error = ex as Error
|
|
47
|
-
console.log(`symbol: ${error.message}`)
|
|
48
|
-
}
|
|
49
|
-
let is1155: boolean = false
|
|
50
|
-
try {
|
|
51
|
-
is1155 = await contract1155.supportsInterface(getInterfaceID(ERC1155__factory.getInterface(ERC1155__factory.abi)))
|
|
52
|
-
} catch (ex) {
|
|
53
|
-
const error = ex as Error
|
|
54
|
-
console.log(`is1155: ${error.message}`)
|
|
55
|
-
is1155 = false
|
|
56
|
-
}
|
|
57
|
-
return { address: contractAddress, chainId, name, symbol, type: is1155 ? 'ERC1155' : 'ERC721' }
|
|
58
|
-
}
|
|
File without changes
|