@xyo-network/crypto-nft-collection-witness-plugin 2.78.3 → 2.78.4

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 (82) hide show
  1. package/dist/browser/index.cjs +97 -65
  2. package/dist/browser/index.cjs.map +1 -1
  3. package/dist/browser/index.js +98 -66
  4. package/dist/browser/index.js.map +1 -1
  5. package/dist/browser/lib/contractHasFunctions.d.cts +4 -0
  6. package/dist/browser/lib/contractHasFunctions.d.cts.map +1 -0
  7. package/dist/browser/lib/contractHasFunctions.d.mts +4 -0
  8. package/dist/browser/lib/contractHasFunctions.d.mts.map +1 -0
  9. package/dist/browser/lib/contractHasFunctions.d.ts +4 -0
  10. package/dist/browser/lib/contractHasFunctions.d.ts.map +1 -0
  11. package/dist/browser/lib/getNftCollectionNfts.d.cts.map +1 -1
  12. package/dist/browser/lib/getNftCollectionNfts.d.mts.map +1 -1
  13. package/dist/browser/lib/getNftCollectionNfts.d.ts.map +1 -1
  14. package/dist/browser/lib/getProviderFromEnv.d.cts +3 -2
  15. package/dist/browser/lib/getProviderFromEnv.d.cts.map +1 -1
  16. package/dist/browser/lib/getProviderFromEnv.d.mts +3 -2
  17. package/dist/browser/lib/getProviderFromEnv.d.mts.map +1 -1
  18. package/dist/browser/lib/getProviderFromEnv.d.ts +3 -2
  19. package/dist/browser/lib/getProviderFromEnv.d.ts.map +1 -1
  20. package/dist/browser/lib/index.d.cts +1 -0
  21. package/dist/browser/lib/index.d.cts.map +1 -1
  22. package/dist/browser/lib/index.d.mts +1 -0
  23. package/dist/browser/lib/index.d.mts.map +1 -1
  24. package/dist/browser/lib/index.d.ts +1 -0
  25. package/dist/browser/lib/index.d.ts.map +1 -1
  26. package/dist/browser/lib/tokenTypes.d.cts +4 -6
  27. package/dist/browser/lib/tokenTypes.d.cts.map +1 -1
  28. package/dist/browser/lib/tokenTypes.d.mts +4 -6
  29. package/dist/browser/lib/tokenTypes.d.mts.map +1 -1
  30. package/dist/browser/lib/tokenTypes.d.ts +4 -6
  31. package/dist/browser/lib/tokenTypes.d.ts.map +1 -1
  32. package/dist/browser/lib/tryCall.d.cts +2 -0
  33. package/dist/browser/lib/tryCall.d.cts.map +1 -0
  34. package/dist/browser/lib/tryCall.d.mts +2 -0
  35. package/dist/browser/lib/tryCall.d.mts.map +1 -0
  36. package/dist/browser/lib/tryCall.d.ts +2 -0
  37. package/dist/browser/lib/tryCall.d.ts.map +1 -0
  38. package/dist/node/index.js +99 -66
  39. package/dist/node/index.js.map +1 -1
  40. package/dist/node/index.mjs +98 -66
  41. package/dist/node/index.mjs.map +1 -1
  42. package/dist/node/lib/contractHasFunctions.d.cts +4 -0
  43. package/dist/node/lib/contractHasFunctions.d.cts.map +1 -0
  44. package/dist/node/lib/contractHasFunctions.d.mts +4 -0
  45. package/dist/node/lib/contractHasFunctions.d.mts.map +1 -0
  46. package/dist/node/lib/contractHasFunctions.d.ts +4 -0
  47. package/dist/node/lib/contractHasFunctions.d.ts.map +1 -0
  48. package/dist/node/lib/getNftCollectionNfts.d.cts.map +1 -1
  49. package/dist/node/lib/getNftCollectionNfts.d.mts.map +1 -1
  50. package/dist/node/lib/getNftCollectionNfts.d.ts.map +1 -1
  51. package/dist/node/lib/getProviderFromEnv.d.cts +3 -2
  52. package/dist/node/lib/getProviderFromEnv.d.cts.map +1 -1
  53. package/dist/node/lib/getProviderFromEnv.d.mts +3 -2
  54. package/dist/node/lib/getProviderFromEnv.d.mts.map +1 -1
  55. package/dist/node/lib/getProviderFromEnv.d.ts +3 -2
  56. package/dist/node/lib/getProviderFromEnv.d.ts.map +1 -1
  57. package/dist/node/lib/index.d.cts +1 -0
  58. package/dist/node/lib/index.d.cts.map +1 -1
  59. package/dist/node/lib/index.d.mts +1 -0
  60. package/dist/node/lib/index.d.mts.map +1 -1
  61. package/dist/node/lib/index.d.ts +1 -0
  62. package/dist/node/lib/index.d.ts.map +1 -1
  63. package/dist/node/lib/tokenTypes.d.cts +4 -6
  64. package/dist/node/lib/tokenTypes.d.cts.map +1 -1
  65. package/dist/node/lib/tokenTypes.d.mts +4 -6
  66. package/dist/node/lib/tokenTypes.d.mts.map +1 -1
  67. package/dist/node/lib/tokenTypes.d.ts +4 -6
  68. package/dist/node/lib/tokenTypes.d.ts.map +1 -1
  69. package/dist/node/lib/tryCall.d.cts +2 -0
  70. package/dist/node/lib/tryCall.d.cts.map +1 -0
  71. package/dist/node/lib/tryCall.d.mts +2 -0
  72. package/dist/node/lib/tryCall.d.mts.map +1 -0
  73. package/dist/node/lib/tryCall.d.ts +2 -0
  74. package/dist/node/lib/tryCall.d.ts.map +1 -0
  75. package/package.json +14 -14
  76. package/src/Witness.ts +1 -1
  77. package/src/lib/contractHasFunctions.ts +20 -0
  78. package/src/lib/getNftCollectionNfts.ts +44 -35
  79. package/src/lib/getProviderFromEnv.ts +19 -7
  80. package/src/lib/index.ts +1 -0
  81. package/src/lib/tokenTypes.ts +8 -19
  82. package/src/lib/tryCall.ts +11 -0
@@ -1,8 +1,6 @@
1
- import { Interface } from '@ethersproject/abi';
2
- import { Contract } from '@ethersproject/contracts';
1
+ import { Provider } from '@ethersproject/providers';
3
2
  import { TokenType } from '@xyo-network/crypto-nft-payload-plugin';
4
- export declare const isErc1155: (contract: Contract) => Promise<boolean>;
5
- export declare const isErc721: (contract: Contract) => Promise<boolean>;
6
- export declare const hasFunctions: (contract: Contract, contractInterface: Interface, functionNames: string[]) => Promise<boolean>;
7
- export declare const tokenTypes: (contract: Contract) => Promise<TokenType[]>;
3
+ export declare const isErc1155: (provider: Provider, address: string) => Promise<boolean>;
4
+ export declare const isErc721: (provider: Provider, address: string) => Promise<boolean>;
5
+ export declare const tokenTypes: (provider: Provider, address: string) => Promise<TokenType[]>;
8
6
  //# sourceMappingURL=tokenTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAGlE,eAAO,MAAM,SAAS,aAAoB,QAAQ,qBAEjD,CAAA;AAED,eAAO,MAAM,QAAQ,aAAoB,QAAQ,qBAEhD,CAAA;AAED,eAAO,MAAM,YAAY,aAAoB,QAAQ,qBAAqB,SAAS,iBAAiB,MAAM,EAAE,qBAU3G,CAAA;AAED,eAAO,MAAM,UAAU,aAAoB,QAAQ,yBAUlD,CAAA"}
1
+ {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAKlE,eAAO,MAAM,SAAS,aAAoB,QAAQ,WAAW,MAAM,qBAElE,CAAA;AAED,eAAO,MAAM,QAAQ,aAAoB,QAAQ,WAAW,MAAM,qBAEjE,CAAA;AAED,eAAO,MAAM,UAAU,aAAoB,QAAQ,WAAW,MAAM,yBAUnE,CAAA"}
@@ -1,8 +1,6 @@
1
- import { Interface } from '@ethersproject/abi';
2
- import { Contract } from '@ethersproject/contracts';
1
+ import { Provider } from '@ethersproject/providers';
3
2
  import { TokenType } from '@xyo-network/crypto-nft-payload-plugin';
4
- export declare const isErc1155: (contract: Contract) => Promise<boolean>;
5
- export declare const isErc721: (contract: Contract) => Promise<boolean>;
6
- export declare const hasFunctions: (contract: Contract, contractInterface: Interface, functionNames: string[]) => Promise<boolean>;
7
- export declare const tokenTypes: (contract: Contract) => Promise<TokenType[]>;
3
+ export declare const isErc1155: (provider: Provider, address: string) => Promise<boolean>;
4
+ export declare const isErc721: (provider: Provider, address: string) => Promise<boolean>;
5
+ export declare const tokenTypes: (provider: Provider, address: string) => Promise<TokenType[]>;
8
6
  //# sourceMappingURL=tokenTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAGlE,eAAO,MAAM,SAAS,aAAoB,QAAQ,qBAEjD,CAAA;AAED,eAAO,MAAM,QAAQ,aAAoB,QAAQ,qBAEhD,CAAA;AAED,eAAO,MAAM,YAAY,aAAoB,QAAQ,qBAAqB,SAAS,iBAAiB,MAAM,EAAE,qBAU3G,CAAA;AAED,eAAO,MAAM,UAAU,aAAoB,QAAQ,yBAUlD,CAAA"}
1
+ {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAKlE,eAAO,MAAM,SAAS,aAAoB,QAAQ,WAAW,MAAM,qBAElE,CAAA;AAED,eAAO,MAAM,QAAQ,aAAoB,QAAQ,WAAW,MAAM,qBAEjE,CAAA;AAED,eAAO,MAAM,UAAU,aAAoB,QAAQ,WAAW,MAAM,yBAUnE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const tryCall: <T>(func: () => Promise<T>, name?: string) => Promise<T | undefined>;
2
+ //# sourceMappingURL=tryCall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,qCAA4C,MAAM,2BAUrE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const tryCall: <T>(func: () => Promise<T>, name?: string) => Promise<T | undefined>;
2
+ //# sourceMappingURL=tryCall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,qCAA4C,MAAM,2BAUrE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const tryCall: <T>(func: () => Promise<T>, name?: string) => Promise<T | undefined>;
2
+ //# sourceMappingURL=tryCall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,qCAA4C,MAAM,2BAUrE,CAAA"}
package/package.json CHANGED
@@ -15,23 +15,23 @@
15
15
  "@ethersproject/providers": "^5.7.2",
16
16
  "@xylabs/assert": "^2.13.3",
17
17
  "@xylabs/eth-address": "^2.13.3",
18
- "@xyo-network/abstract-witness": "~2.78.3",
19
- "@xyo-network/axios": "~2.78.3",
20
- "@xyo-network/core": "~2.78.3",
21
- "@xyo-network/crypto-nft-collection-payload-plugin": "~2.78.3",
22
- "@xyo-network/crypto-nft-payload-plugin": "~2.78.3",
23
- "@xyo-network/module-model": "~2.78.3",
18
+ "@xyo-network/abstract-witness": "~2.78.4",
19
+ "@xyo-network/axios": "~2.78.4",
20
+ "@xyo-network/core": "~2.78.4",
21
+ "@xyo-network/crypto-nft-collection-payload-plugin": "~2.78.4",
22
+ "@xyo-network/crypto-nft-payload-plugin": "~2.78.4",
23
+ "@xyo-network/module-model": "~2.78.4",
24
24
  "@xyo-network/open-zeppelin-typechain": "^2.2.11",
25
- "@xyo-network/payload-model": "~2.78.3",
26
- "@xyo-network/payloadset-plugin": "~2.78.3",
27
- "@xyo-network/witness-model": "~2.78.3"
25
+ "@xyo-network/payload-model": "~2.78.4",
26
+ "@xyo-network/payloadset-plugin": "~2.78.4",
27
+ "@xyo-network/witness-model": "~2.78.4"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@xylabs/jest-helpers": "^2.13.3",
31
- "@xylabs/ts-scripts-yarn3": "^3.1.13",
32
- "@xylabs/tsconfig": "^3.1.13",
33
- "@xyo-network/account": "~2.78.3",
34
- "@xyo-network/account-model": "~2.78.3",
31
+ "@xylabs/ts-scripts-yarn3": "^3.1.21",
32
+ "@xylabs/tsconfig": "^3.1.21",
33
+ "@xyo-network/account": "~2.78.4",
34
+ "@xyo-network/account-model": "~2.78.4",
35
35
  "ethers": "^5.7.2",
36
36
  "jest": "^29.7.0",
37
37
  "typescript": "^5.2.2"
@@ -76,5 +76,5 @@
76
76
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
77
77
  },
78
78
  "sideEffects": false,
79
- "version": "2.78.3"
79
+ "version": "2.78.4"
80
80
  }
package/src/Witness.ts CHANGED
@@ -75,7 +75,7 @@ export class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitne
75
75
  await erc721Enumerable.name(),
76
76
  await erc721Enumerable.symbol(),
77
77
  (await erc721Enumerable.totalSupply()).toNumber(),
78
- await tokenTypes(erc721Enumerable),
78
+ await tokenTypes(provider, address),
79
79
  await this.writeArchivist(),
80
80
  ])
81
81
  const types = resolvedValue(typesSettled, true)
@@ -0,0 +1,20 @@
1
+ import { Interface } from '@ethersproject/abi'
2
+ import { Provider } from '@ethersproject/providers'
3
+
4
+ export const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {
5
+ try {
6
+ const bytecode = await provider.getCode(address, 'latest')
7
+ for (let i = 0; i < functionNames.length; i++) {
8
+ const nameSig = contractInterface.getSighash(functionNames[i]).substring(2)
9
+ if (!bytecode.includes(nameSig)) {
10
+ return false
11
+ }
12
+ return true
13
+ }
14
+ return false
15
+ } catch (ex) {
16
+ const error = ex as Error
17
+ console.log(error)
18
+ return false
19
+ }
20
+ }
@@ -3,8 +3,8 @@ import { AxiosJson } from '@xyo-network/axios'
3
3
  import { NftInfo, NftMetadata, NftSchema, TokenType, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'
4
4
  import { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'
5
5
 
6
- import { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'
7
6
  import { tokenTypes } from './tokenTypes'
7
+ import { tryCall } from './tryCall'
8
8
 
9
9
  const ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'
10
10
 
@@ -48,42 +48,51 @@ export const getNftCollectionNfts = async (
48
48
  */
49
49
  maxNfts = 100,
50
50
  ): Promise<NftInfo[]> => {
51
- if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
52
- throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)
53
- }
54
- const axios = new AxiosJson({ timeout: 2000 })
55
- const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider)
56
- const storage = ERC721URIStorage__factory.connect(contractAddress, provider)
57
- const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider)
58
- const finalTypes = types ?? (await tokenTypes(enumerable))
59
- const result: NftInfo[] = []
51
+ try {
52
+ const axios = new AxiosJson({ timeout: 2000 })
53
+ const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider)
54
+ const storage = ERC721URIStorage__factory.connect(contractAddress, provider)
55
+ const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider)
56
+ const finalTypes = types ?? (await tokenTypes(provider, contractAddress))
57
+ const result: NftInfo[] = []
60
58
 
61
- for (let i = 0; i < maxNfts; i++) {
62
- console.log(`Getting Token [${i}]`)
63
- const tokenId = (await enumerable.tokenByIndex(i)).toHexString()
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)
67
- let metadata: NftMetadata | undefined = undefined
68
- try {
69
- metadata = (await axios.get(checkedMetaDataUri)).data
70
- } catch (ex) {
71
- const error = ex as Error
72
- console.error(error.message)
73
- }
59
+ for (let i = 0; i < maxNfts; i++) {
60
+ const tokenId = await tryCall(async () => (await enumerable.tokenByIndex(i)).toHexString())
61
+ if (tokenId !== undefined) {
62
+ const supply = finalTypes.includes(toTokenType('ERC1155'))
63
+ ? (await tryCall(async () => (await supply1155.totalSupply(tokenId)).toHexString())) ?? '0x01'
64
+ : '0x01'
65
+ const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId))
66
+ const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined
67
+ let metadata: NftMetadata | undefined = undefined
68
+ if (checkedMetaDataUri !== undefined) {
69
+ try {
70
+ metadata = (await axios.get(checkedMetaDataUri)).data
71
+ } catch (ex) {
72
+ const error = ex as Error
73
+ console.error(`Get Metadata failed: ${error.message}`)
74
+ }
75
+ }
74
76
 
75
- const info: NftInfo = {
76
- address: contractAddress,
77
- chainId: provider.network.chainId,
78
- metadata,
79
- metadataUri,
80
- schema: NftSchema,
81
- supply,
82
- tokenId,
83
- type: finalTypes.at(0),
84
- types,
77
+ const info: NftInfo = {
78
+ address: contractAddress,
79
+ chainId: provider.network.chainId,
80
+ metadata,
81
+ metadataUri,
82
+ schema: NftSchema,
83
+ supply,
84
+ tokenId,
85
+ type: finalTypes.at(0),
86
+ types: finalTypes,
87
+ }
88
+ result.push(info)
89
+ }
85
90
  }
86
- result.push(info)
91
+ return result
92
+ } catch (ex) {
93
+ const error = ex as Error
94
+ console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)
95
+ console.log(error.stack)
96
+ return []
87
97
  }
88
- return result
89
98
  }
@@ -1,17 +1,29 @@
1
- import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers'
1
+ import { InfuraProvider, JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers'
2
2
 
3
- export const getProviderFromEnv = (chainId: string | number = 'homestead') => {
3
+ export const getProviderFromEnvInternal = (chainId: number = 0x01) => {
4
+ console.log(`getProviderFromEnvInternal: ${chainId}`)
4
5
  const infuraWssUri = process.env.INFURA_WSS_URI
5
- const infuraProvider = new InfuraProvider('homestead', {
6
+ const infuraProvider = new InfuraProvider(chainId, {
6
7
  projectId: process.env.INFURA_PROJECT_ID,
7
8
  projectSecret: process.env.INFURA_PROJECT_SECRET,
8
9
  })
9
10
 
10
- const infuraWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : undefined
11
+ const infuraGenericWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : undefined
11
12
 
12
- const quickNodeUri = process.env.QUICKNODE_WSS_URI
13
- const quickNodeProvider = quickNodeUri ? new WebSocketProvider(quickNodeUri, chainId) : undefined
13
+ const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI
14
+ const quickNodeWebSocketProvider = quickNodeWSSUri ? new WebSocketProvider(quickNodeWSSUri, chainId) : undefined
14
15
 
15
- const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider
16
+ const quickNodeHttpsUri = process.env.QUICKNODE_WSS_URI
17
+ const quickRpcProvider = quickNodeHttpsUri ? new JsonRpcProvider(quickNodeHttpsUri, chainId) : undefined
18
+
19
+ const provider = infuraProvider ?? quickNodeWebSocketProvider ?? infuraProvider ?? infuraGenericWebsocketProvider ?? quickRpcProvider
16
20
  return provider
17
21
  }
22
+
23
+ const providers: Record<number, JsonRpcProvider | WebSocketProvider> = {}
24
+
25
+ export const getProviderFromEnv = (chainId: number = 0x01) => {
26
+ console.log(`getProviderFromEnv: ${chainId}`)
27
+ providers[chainId] = providers[chainId] ?? getProviderFromEnvInternal(chainId)
28
+ return providers[chainId]
29
+ }
package/src/lib/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './collectionMetrics'
2
+ export * from './contractHasFunctions'
2
3
  export * from './getNftCollectionNfts'
3
4
  export * from './getProviderFromEnv'
4
5
  export * from './tokenTypes'
@@ -1,30 +1,19 @@
1
- import { Interface } from '@ethersproject/abi'
2
- import { Contract } from '@ethersproject/contracts'
1
+ import { Provider } from '@ethersproject/providers'
3
2
  import { TokenType } from '@xyo-network/crypto-nft-payload-plugin'
4
3
  import { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'
5
4
 
6
- export const isErc1155 = async (contract: Contract) => {
7
- return await hasFunctions(contract, ERC1155URIStorage__factory.createInterface(), ['uri'])
8
- }
5
+ import { contractHasFunctions } from './contractHasFunctions'
9
6
 
10
- export const isErc721 = async (contract: Contract) => {
11
- return await hasFunctions(contract, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])
7
+ export const isErc1155 = async (provider: Provider, address: string) => {
8
+ return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])
12
9
  }
13
10
 
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
11
+ export const isErc721 = async (provider: Provider, address: string) => {
12
+ return await contractHasFunctions(provider, address, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])
24
13
  }
25
14
 
26
- export const tokenTypes = async (contract: Contract) => {
27
- const [erc721, erc1155] = await Promise.all([isErc721(contract), isErc1155(contract)])
15
+ export const tokenTypes = async (provider: Provider, address: string) => {
16
+ const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])
28
17
  const result: TokenType[] = []
29
18
  if (erc721) {
30
19
  result.push('ERC721')
@@ -0,0 +1,11 @@
1
+ export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {
2
+ try {
3
+ return await func()
4
+ } catch (ex) {
5
+ if (name) {
6
+ const error = ex as Error
7
+ console.log(`tryCall failed [${name}]: ${error.message}`)
8
+ }
9
+ return undefined
10
+ }
11
+ }