@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.
Files changed (120) hide show
  1. package/dist/browser/Plugin.d.cts +2 -0
  2. package/dist/browser/Plugin.d.cts.map +1 -1
  3. package/dist/browser/Plugin.d.mts +2 -0
  4. package/dist/browser/Plugin.d.mts.map +1 -1
  5. package/dist/browser/Plugin.d.ts +2 -0
  6. package/dist/browser/Plugin.d.ts.map +1 -1
  7. package/dist/browser/Witness.d.cts +6 -1
  8. package/dist/browser/Witness.d.cts.map +1 -1
  9. package/dist/browser/Witness.d.mts +6 -1
  10. package/dist/browser/Witness.d.mts.map +1 -1
  11. package/dist/browser/Witness.d.ts +6 -1
  12. package/dist/browser/Witness.d.ts.map +1 -1
  13. package/dist/browser/index.cjs +100 -91
  14. package/dist/browser/index.cjs.map +1 -1
  15. package/dist/browser/index.js +98 -89
  16. package/dist/browser/index.js.map +1 -1
  17. package/dist/browser/lib/getNftCollectionNfts.d.cts +3 -2
  18. package/dist/browser/lib/getNftCollectionNfts.d.cts.map +1 -1
  19. package/dist/browser/lib/getNftCollectionNfts.d.mts +3 -2
  20. package/dist/browser/lib/getNftCollectionNfts.d.mts.map +1 -1
  21. package/dist/browser/lib/getNftCollectionNfts.d.ts +3 -2
  22. package/dist/browser/lib/getNftCollectionNfts.d.ts.map +1 -1
  23. package/dist/browser/lib/{getProvider.d.cts → getProviderFromEnv.d.cts} +1 -1
  24. package/dist/browser/lib/getProviderFromEnv.d.cts.map +1 -0
  25. package/dist/browser/lib/{getProvider.d.mts → getProviderFromEnv.d.mts} +1 -1
  26. package/dist/browser/lib/getProviderFromEnv.d.mts.map +1 -0
  27. package/dist/browser/lib/{getProvider.d.ts → getProviderFromEnv.d.ts} +1 -1
  28. package/dist/browser/lib/getProviderFromEnv.d.ts.map +1 -0
  29. package/dist/browser/lib/index.d.cts +2 -2
  30. package/dist/browser/lib/index.d.cts.map +1 -1
  31. package/dist/browser/lib/index.d.mts +2 -2
  32. package/dist/browser/lib/index.d.mts.map +1 -1
  33. package/dist/browser/lib/index.d.ts +2 -2
  34. package/dist/browser/lib/index.d.ts.map +1 -1
  35. package/dist/browser/lib/tokenTypes.d.cts +8 -0
  36. package/dist/browser/lib/tokenTypes.d.cts.map +1 -0
  37. package/dist/browser/lib/tokenTypes.d.mts +8 -0
  38. package/dist/browser/lib/tokenTypes.d.mts.map +1 -0
  39. package/dist/browser/lib/tokenTypes.d.ts +8 -0
  40. package/dist/browser/lib/tokenTypes.d.ts.map +1 -0
  41. package/dist/node/Plugin.d.cts +2 -0
  42. package/dist/node/Plugin.d.cts.map +1 -1
  43. package/dist/node/Plugin.d.mts +2 -0
  44. package/dist/node/Plugin.d.mts.map +1 -1
  45. package/dist/node/Plugin.d.ts +2 -0
  46. package/dist/node/Plugin.d.ts.map +1 -1
  47. package/dist/node/Witness.d.cts +6 -1
  48. package/dist/node/Witness.d.cts.map +1 -1
  49. package/dist/node/Witness.d.mts +6 -1
  50. package/dist/node/Witness.d.mts.map +1 -1
  51. package/dist/node/Witness.d.ts +6 -1
  52. package/dist/node/Witness.d.ts.map +1 -1
  53. package/dist/node/index.js +106 -95
  54. package/dist/node/index.js.map +1 -1
  55. package/dist/node/index.mjs +98 -89
  56. package/dist/node/index.mjs.map +1 -1
  57. package/dist/node/lib/getNftCollectionNfts.d.cts +3 -2
  58. package/dist/node/lib/getNftCollectionNfts.d.cts.map +1 -1
  59. package/dist/node/lib/getNftCollectionNfts.d.mts +3 -2
  60. package/dist/node/lib/getNftCollectionNfts.d.mts.map +1 -1
  61. package/dist/node/lib/getNftCollectionNfts.d.ts +3 -2
  62. package/dist/node/lib/getNftCollectionNfts.d.ts.map +1 -1
  63. package/dist/node/lib/{getProvider.d.cts → getProviderFromEnv.d.cts} +1 -1
  64. package/dist/node/lib/getProviderFromEnv.d.cts.map +1 -0
  65. package/dist/node/lib/getProviderFromEnv.d.mts +3 -0
  66. package/dist/node/lib/getProviderFromEnv.d.mts.map +1 -0
  67. package/dist/node/lib/getProviderFromEnv.d.ts +3 -0
  68. package/dist/node/lib/getProviderFromEnv.d.ts.map +1 -0
  69. package/dist/node/lib/index.d.cts +2 -2
  70. package/dist/node/lib/index.d.cts.map +1 -1
  71. package/dist/node/lib/index.d.mts +2 -2
  72. package/dist/node/lib/index.d.mts.map +1 -1
  73. package/dist/node/lib/index.d.ts +2 -2
  74. package/dist/node/lib/index.d.ts.map +1 -1
  75. package/dist/node/lib/tokenTypes.d.cts +8 -0
  76. package/dist/node/lib/tokenTypes.d.cts.map +1 -0
  77. package/dist/node/lib/tokenTypes.d.mts +8 -0
  78. package/dist/node/lib/tokenTypes.d.mts.map +1 -0
  79. package/dist/node/lib/tokenTypes.d.ts +8 -0
  80. package/dist/node/lib/tokenTypes.d.ts.map +1 -0
  81. package/package.json +15 -11
  82. package/src/Witness.ts +51 -9
  83. package/src/lib/getNftCollectionNfts.ts +15 -13
  84. package/src/lib/index.ts +2 -2
  85. package/src/lib/tokenTypes.ts +36 -0
  86. package/dist/browser/lib/getNftCollectionCount.d.cts +0 -2
  87. package/dist/browser/lib/getNftCollectionCount.d.cts.map +0 -1
  88. package/dist/browser/lib/getNftCollectionCount.d.mts +0 -2
  89. package/dist/browser/lib/getNftCollectionCount.d.mts.map +0 -1
  90. package/dist/browser/lib/getNftCollectionCount.d.ts +0 -2
  91. package/dist/browser/lib/getNftCollectionCount.d.ts.map +0 -1
  92. package/dist/browser/lib/getNftCollectionMetadata.d.cts +0 -5
  93. package/dist/browser/lib/getNftCollectionMetadata.d.cts.map +0 -1
  94. package/dist/browser/lib/getNftCollectionMetadata.d.mts +0 -5
  95. package/dist/browser/lib/getNftCollectionMetadata.d.mts.map +0 -1
  96. package/dist/browser/lib/getNftCollectionMetadata.d.ts +0 -5
  97. package/dist/browser/lib/getNftCollectionMetadata.d.ts.map +0 -1
  98. package/dist/browser/lib/getProvider.d.cts.map +0 -1
  99. package/dist/browser/lib/getProvider.d.mts.map +0 -1
  100. package/dist/browser/lib/getProvider.d.ts.map +0 -1
  101. package/dist/node/lib/getNftCollectionCount.d.cts +0 -2
  102. package/dist/node/lib/getNftCollectionCount.d.cts.map +0 -1
  103. package/dist/node/lib/getNftCollectionCount.d.mts +0 -2
  104. package/dist/node/lib/getNftCollectionCount.d.mts.map +0 -1
  105. package/dist/node/lib/getNftCollectionCount.d.ts +0 -2
  106. package/dist/node/lib/getNftCollectionCount.d.ts.map +0 -1
  107. package/dist/node/lib/getNftCollectionMetadata.d.cts +0 -5
  108. package/dist/node/lib/getNftCollectionMetadata.d.cts.map +0 -1
  109. package/dist/node/lib/getNftCollectionMetadata.d.mts +0 -5
  110. package/dist/node/lib/getNftCollectionMetadata.d.mts.map +0 -1
  111. package/dist/node/lib/getNftCollectionMetadata.d.ts +0 -5
  112. package/dist/node/lib/getNftCollectionMetadata.d.ts.map +0 -1
  113. package/dist/node/lib/getProvider.d.cts.map +0 -1
  114. package/dist/node/lib/getProvider.d.mts +0 -3
  115. package/dist/node/lib/getProvider.d.mts.map +0 -1
  116. package/dist/node/lib/getProvider.d.ts +0 -3
  117. package/dist/node/lib/getProvider.d.ts.map +0 -1
  118. package/src/lib/getNftCollectionCount.ts +0 -22
  119. package/src/lib/getNftCollectionMetadata.ts +0 -58
  120. /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 { getNftCollectionCount, getNftCollectionMetadata, getNftCollectionMetrics, getNftCollectionNfts } from './lib'
18
+ import { getNftCollectionMetrics, getNftCollectionNfts, getProviderFromEnv, tokenTypes } from './lib'
17
19
 
18
- export type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig>>
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
- const chainId = assertEx(query?.chainId || this.config.chainId, 'params.chainId is required')
70
+
71
+ const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)
72
+
46
73
  const maxNfts = query?.maxNfts || defaultMaxNfts
47
- const [info, total, nfts, archivist] = await Promise.all([
48
- getNftCollectionMetadata(address, chainId),
49
- getNftCollectionCount(address, chainId),
50
- getNftCollectionNfts(address, chainId, maxNfts),
51
- this.writeArchivist(),
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 = { ...info, metrics, schema: NftCollectionSchema, sources, total }
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
- chainId: number,
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: 500 })
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 = nftType === toTokenType('ERC11155') ? (await supply1155.totalSupply(tokenId)).toHexString() : '0x01'
64
- const metaDataUri = await storage.tokenURI(tokenId)
65
- const checkedMetaDataUri = checkIpfsUrl(metaDataUri, ipfsGateway)
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: nftType,
83
+ type: finalTypes.at(0),
84
+ types,
83
85
  }
84
86
  result.push(info)
85
87
  }
package/src/lib/index.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from './collectionMetrics'
2
- export * from './getNftCollectionCount'
3
- export * from './getNftCollectionMetadata'
4
2
  export * from './getNftCollectionNfts'
3
+ export * from './getProviderFromEnv'
4
+ export * from './tokenTypes'
@@ -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,2 +0,0 @@
1
- export declare const getNftCollectionCount: (contractAddress: string, chainId: number) => Promise<number>;
2
- //# sourceMappingURL=getNftCollectionCount.d.ts.map
@@ -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,2 +0,0 @@
1
- export declare const getNftCollectionCount: (contractAddress: string, chainId: number) => Promise<number>;
2
- //# sourceMappingURL=getNftCollectionCount.d.ts.map
@@ -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,2 +0,0 @@
1
- export declare const getNftCollectionCount: (contractAddress: string, chainId: number) => Promise<number>;
2
- //# sourceMappingURL=getNftCollectionCount.d.ts.map
@@ -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,2 +0,0 @@
1
- export declare const getNftCollectionCount: (contractAddress: string, chainId: number) => Promise<number>;
2
- //# sourceMappingURL=getNftCollectionCount.d.ts.map
@@ -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,2 +0,0 @@
1
- export declare const getNftCollectionCount: (contractAddress: string, chainId: number) => Promise<number>;
2
- //# sourceMappingURL=getNftCollectionCount.d.ts.map
@@ -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,2 +0,0 @@
1
- export declare const getNftCollectionCount: (contractAddress: string, chainId: number) => Promise<number>;
2
- //# sourceMappingURL=getNftCollectionCount.d.ts.map
@@ -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,3 +0,0 @@
1
- import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers';
2
- export declare const getProviderFromEnv: (chainId?: string | number) => WebSocketProvider | InfuraProvider;
3
- //# sourceMappingURL=getProvider.d.ts.map
@@ -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,3 +0,0 @@
1
- import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers';
2
- export declare const getProviderFromEnv: (chainId?: string | number) => WebSocketProvider | InfuraProvider;
3
- //# sourceMappingURL=getProvider.d.ts.map
@@ -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
- }