@xyo-network/crypto-nft-witness-wallet-plugin 2.78.4 → 2.79.0

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 (73) hide show
  1. package/dist/browser/Plugin.d.cts +1 -0
  2. package/dist/browser/Plugin.d.cts.map +1 -1
  3. package/dist/browser/Plugin.d.mts +1 -0
  4. package/dist/browser/Plugin.d.mts.map +1 -1
  5. package/dist/browser/Plugin.d.ts +1 -0
  6. package/dist/browser/Plugin.d.ts.map +1 -1
  7. package/dist/browser/Witness.d.cts +1 -0
  8. package/dist/browser/Witness.d.cts.map +1 -1
  9. package/dist/browser/Witness.d.mts +1 -0
  10. package/dist/browser/Witness.d.mts.map +1 -1
  11. package/dist/browser/Witness.d.ts +1 -0
  12. package/dist/browser/Witness.d.ts.map +1 -1
  13. package/dist/browser/index.cjs +64 -45
  14. package/dist/browser/index.cjs.map +1 -1
  15. package/dist/browser/index.js +64 -45
  16. package/dist/browser/index.js.map +1 -1
  17. package/dist/browser/lib/getAssetsFromWallet.d.cts +13 -0
  18. package/dist/browser/lib/getAssetsFromWallet.d.cts.map +1 -0
  19. package/dist/browser/lib/getAssetsFromWallet.d.mts +13 -0
  20. package/dist/browser/lib/getAssetsFromWallet.d.mts.map +1 -0
  21. package/dist/browser/lib/getAssetsFromWallet.d.ts +13 -0
  22. package/dist/browser/lib/getAssetsFromWallet.d.ts.map +1 -0
  23. package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.cts +17 -0
  24. package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.cts.map +1 -0
  25. package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.mts +17 -0
  26. package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.mts.map +1 -0
  27. package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.ts +17 -0
  28. package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.ts.map +1 -0
  29. package/dist/browser/lib/getNftsOwnedByAddress.d.cts +4 -2
  30. package/dist/browser/lib/getNftsOwnedByAddress.d.cts.map +1 -1
  31. package/dist/browser/lib/getNftsOwnedByAddress.d.mts +4 -2
  32. package/dist/browser/lib/getNftsOwnedByAddress.d.mts.map +1 -1
  33. package/dist/browser/lib/getNftsOwnedByAddress.d.ts +4 -2
  34. package/dist/browser/lib/getNftsOwnedByAddress.d.ts.map +1 -1
  35. package/dist/node/Plugin.d.cts +1 -0
  36. package/dist/node/Plugin.d.cts.map +1 -1
  37. package/dist/node/Plugin.d.mts +1 -0
  38. package/dist/node/Plugin.d.mts.map +1 -1
  39. package/dist/node/Plugin.d.ts +1 -0
  40. package/dist/node/Plugin.d.ts.map +1 -1
  41. package/dist/node/Witness.d.cts +1 -0
  42. package/dist/node/Witness.d.cts.map +1 -1
  43. package/dist/node/Witness.d.mts +1 -0
  44. package/dist/node/Witness.d.mts.map +1 -1
  45. package/dist/node/Witness.d.ts +1 -0
  46. package/dist/node/Witness.d.ts.map +1 -1
  47. package/dist/node/index.js +66 -45
  48. package/dist/node/index.js.map +1 -1
  49. package/dist/node/index.mjs +64 -45
  50. package/dist/node/index.mjs.map +1 -1
  51. package/dist/node/lib/getAssetsFromWallet.d.cts +13 -0
  52. package/dist/node/lib/getAssetsFromWallet.d.cts.map +1 -0
  53. package/dist/node/lib/getAssetsFromWallet.d.mts +13 -0
  54. package/dist/node/lib/getAssetsFromWallet.d.mts.map +1 -0
  55. package/dist/node/lib/getAssetsFromWallet.d.ts +13 -0
  56. package/dist/node/lib/getAssetsFromWallet.d.ts.map +1 -0
  57. package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.cts +17 -0
  58. package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.cts.map +1 -0
  59. package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.mts +17 -0
  60. package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.mts.map +1 -0
  61. package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.ts +17 -0
  62. package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.ts.map +1 -0
  63. package/dist/node/lib/getNftsOwnedByAddress.d.cts +4 -2
  64. package/dist/node/lib/getNftsOwnedByAddress.d.cts.map +1 -1
  65. package/dist/node/lib/getNftsOwnedByAddress.d.mts +4 -2
  66. package/dist/node/lib/getNftsOwnedByAddress.d.mts.map +1 -1
  67. package/dist/node/lib/getNftsOwnedByAddress.d.ts +4 -2
  68. package/dist/node/lib/getNftsOwnedByAddress.d.ts.map +1 -1
  69. package/package.json +11 -13
  70. package/src/Witness.ts +9 -3
  71. package/src/lib/getAssetsFromWallet.ts +56 -0
  72. package/src/lib/getAssetsFromWalletFromOpenSea.ts +27 -0
  73. package/src/lib/getNftsOwnedByAddress.ts +59 -65
@@ -41,6 +41,7 @@ export declare const CryptoWalletNftWitnessPlugin: () => import("@xyo-network/pa
41
41
  }) | undefined;
42
42
  } & {
43
43
  address?: string | undefined;
44
+ loadMetadata?: boolean | undefined;
44
45
  schema: "network.xyo.crypto.nft.witness.config";
45
46
  timeout?: number | undefined;
46
47
  }, "schema"> & {
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAStC,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAStC,CAAA"}
@@ -41,6 +41,7 @@ export declare const CryptoWalletNftWitnessPlugin: () => import("@xyo-network/pa
41
41
  }) | undefined;
42
42
  } & {
43
43
  address?: string | undefined;
44
+ loadMetadata?: boolean | undefined;
44
45
  schema: "network.xyo.crypto.nft.witness.config";
45
46
  timeout?: number | undefined;
46
47
  }, "schema"> & {
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAStC,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAStC,CAAA"}
@@ -41,6 +41,7 @@ export declare const CryptoWalletNftWitnessPlugin: () => import("@xyo-network/pa
41
41
  }) | undefined;
42
42
  } & {
43
43
  address?: string | undefined;
44
+ loadMetadata?: boolean | undefined;
44
45
  schema: "network.xyo.crypto.nft.witness.config";
45
46
  timeout?: number | undefined;
46
47
  }, "schema"> & {
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAStC,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAStC,CAAA"}
@@ -8,6 +8,7 @@ export type CryptoWalletNftWitnessParams = WitnessParams<AnyConfigSchema<CryptoW
8
8
  }>;
9
9
  export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractWitness<TParams, NftWitnessQuery, NftInfo> {
10
10
  static configSchemas: "network.xyo.crypto.nft.witness.config"[];
11
+ get loadMetadata(): boolean;
11
12
  get provider(): JsonRpcProvider | WebSocketProvider;
12
13
  get timeout(): number;
13
14
  protected observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAY,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAGvF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,4BAA4B,GAAG,aAAa,CACtD,eAAe,CAAC,4BAA4B,CAAC,EAC7C;IACE,QAAQ,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC9C,CACF,CAAA;AAMD,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,eAAe,CACtI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,QAAQ,wCAEX;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA+B1F"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,4BAA4B,GAAG,aAAa,CACtD,eAAe,CAAC,4BAA4B,CAAC,EAC7C;IACE,QAAQ,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC9C,CACF,CAAA;AAMD,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,eAAe,CACtI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,QAAQ,wCAEX;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAiC1F"}
@@ -8,6 +8,7 @@ export type CryptoWalletNftWitnessParams = WitnessParams<AnyConfigSchema<CryptoW
8
8
  }>;
9
9
  export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractWitness<TParams, NftWitnessQuery, NftInfo> {
10
10
  static configSchemas: "network.xyo.crypto.nft.witness.config"[];
11
+ get loadMetadata(): boolean;
11
12
  get provider(): JsonRpcProvider | WebSocketProvider;
12
13
  get timeout(): number;
13
14
  protected observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAY,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAGvF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,4BAA4B,GAAG,aAAa,CACtD,eAAe,CAAC,4BAA4B,CAAC,EAC7C;IACE,QAAQ,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC9C,CACF,CAAA;AAMD,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,eAAe,CACtI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,QAAQ,wCAEX;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA+B1F"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,4BAA4B,GAAG,aAAa,CACtD,eAAe,CAAC,4BAA4B,CAAC,EAC7C;IACE,QAAQ,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC9C,CACF,CAAA;AAMD,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,eAAe,CACtI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,QAAQ,wCAEX;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAiC1F"}
@@ -8,6 +8,7 @@ export type CryptoWalletNftWitnessParams = WitnessParams<AnyConfigSchema<CryptoW
8
8
  }>;
9
9
  export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractWitness<TParams, NftWitnessQuery, NftInfo> {
10
10
  static configSchemas: "network.xyo.crypto.nft.witness.config"[];
11
+ get loadMetadata(): boolean;
11
12
  get provider(): JsonRpcProvider | WebSocketProvider;
12
13
  get timeout(): number;
13
14
  protected observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAY,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAGvF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,4BAA4B,GAAG,aAAa,CACtD,eAAe,CAAC,4BAA4B,CAAC,EAC7C;IACE,QAAQ,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC9C,CACF,CAAA;AAMD,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,eAAe,CACtI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,QAAQ,wCAEX;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA+B1F"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,4BAA4B,GAAG,aAAa,CACtD,eAAe,CAAC,4BAA4B,CAAC,EAC7C;IACE,QAAQ,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC9C,CACF,CAAA;AAMD,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,eAAe,CACtI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,QAAQ,wCAEX;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAiC1F"}
@@ -29,8 +29,10 @@ __export(src_exports, {
29
29
  getErc721MetadataUri: () => getErc721MetadataUri,
30
30
  getNftMetadataUri: () => getNftMetadataUri,
31
31
  getNftsOwnedByAddress: () => getNftsOwnedByAddress,
32
+ getNftsOwnedByAddressWithMetadata: () => getNftsOwnedByAddressWithMetadata,
32
33
  getProviderFromEnv: () => getProviderFromEnv,
33
34
  getProviderFromEnvInternal: () => getProviderFromEnvInternal,
35
+ getTokenTypes: () => getTokenTypes,
34
36
  isErc1155: () => isErc1155,
35
37
  isErc721: () => isErc721,
36
38
  tokenTypes: () => tokenTypes
@@ -68,13 +70,22 @@ var contractHasFunctions = async (provider, address, contractInterface, function
68
70
  };
69
71
 
70
72
  // src/lib/getNftsOwnedByAddress.ts
71
- var import_assert2 = require("@xylabs/assert");
72
- var import_axios2 = require("@xyo-network/axios");
73
73
  var import_open_zeppelin_typechain3 = require("@xyo-network/open-zeppelin-typechain");
74
+ var import_lru_cache = require("lru-cache");
75
+
76
+ // src/lib/getAssetsFromWalletFromOpenSea.ts
77
+ var import_assert = require("@xylabs/assert");
78
+ var import_axios = require("@xyo-network/axios");
79
+ var getNftsFromWalletFromOpenSea = async (chainId, address, maxNfts = 200, timeout = 2e3) => {
80
+ const apiKey = (0, import_assert.assertEx)(process.env.OPENSEA_API_KEY, "No opensea key found");
81
+ const axios = new import_axios.AxiosJson({ headers: { "x-api-key": apiKey }, timeout });
82
+ const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
83
+ return nfts;
84
+ };
74
85
 
75
86
  // src/lib/getInfuraProvider.ts
76
87
  var import_providers = require("@ethersproject/providers");
77
- var import_assert = require("@xylabs/assert");
88
+ var import_assert2 = require("@xylabs/assert");
78
89
  var instance = void 0;
79
90
  var getInfuraProvider = () => {
80
91
  if (instance)
@@ -84,13 +95,13 @@ var getInfuraProvider = () => {
84
95
  return instance;
85
96
  };
86
97
  var getInfuraProviderConfig = () => {
87
- const projectId = (0, import_assert.assertEx)(process.env.INFURA_PROJECT_ID, "Missing INFURA_PROJECT_ID ENV VAR");
88
- const projectSecret = (0, import_assert.assertEx)(process.env.INFURA_PROJECT_SECRET, "Missing INFURA_PROJECT_SECRET ENV VAR");
98
+ const projectId = (0, import_assert2.assertEx)(process.env.INFURA_PROJECT_ID, "Missing INFURA_PROJECT_ID ENV VAR");
99
+ const projectSecret = (0, import_assert2.assertEx)(process.env.INFURA_PROJECT_SECRET, "Missing INFURA_PROJECT_SECRET ENV VAR");
89
100
  return { projectId, projectSecret };
90
101
  };
91
102
 
92
103
  // src/lib/getNftMetadata.ts
93
- var import_axios = require("@xyo-network/axios");
104
+ var import_axios2 = require("@xyo-network/axios");
94
105
  var import_open_zeppelin_typechain2 = require("@xyo-network/open-zeppelin-typechain");
95
106
 
96
107
  // src/lib/tokenTypes.ts
@@ -132,7 +143,7 @@ var checkIpfsUrl = (urlToCheck, ipfsGateway2) => {
132
143
  }
133
144
  };
134
145
  var getNftMetadata = async (contractAddress, provider, tokenId) => {
135
- const axios = new import_axios.AxiosJson({ timeout: 2e3 });
146
+ const axios = new import_axios2.AxiosJson({ timeout: 2e3 });
136
147
  const enumerable721 = import_open_zeppelin_typechain2.ERC721Enumerable__factory.connect(contractAddress, provider);
137
148
  const storage721 = import_open_zeppelin_typechain2.ERC721URIStorage__factory.connect(contractAddress, provider);
138
149
  const storage1155 = import_open_zeppelin_typechain2.ERC1155URIStorage__factory.connect(contractAddress, provider);
@@ -196,6 +207,18 @@ var checkIpfsUrl2 = (urlToCheck, ipfsGateway2) => {
196
207
  return urlToCheck;
197
208
  }
198
209
  };
210
+ var tokenTypeCache = new import_lru_cache.LRUCache({ max: 100 });
211
+ var getTokenTypes = async (provider, address) => {
212
+ const key = `${address}|${(await provider.getNetwork()).chainId}`;
213
+ const currentValue = tokenTypeCache.get(key);
214
+ if (currentValue) {
215
+ return currentValue;
216
+ } else {
217
+ const types = await tokenTypes(provider, address);
218
+ tokenTypeCache.set(key, types);
219
+ return types;
220
+ }
221
+ };
199
222
  var getErc721MetadataUri = async (address, tokenId) => {
200
223
  try {
201
224
  const contract = import_open_zeppelin_typechain3.ERC721__factory.connect(address, getInfuraProvider());
@@ -216,56 +239,49 @@ var getNftMetadataUri = async (address, tokenId) => {
216
239
  const results = await Promise.all([getErc721MetadataUri(address, tokenId), getErc1155MetadataUri(address, tokenId)]);
217
240
  return results[0][0] ?? results[1][0];
218
241
  };
219
- var getNftsOwnedByAddress = async (publicAddress, provider, maxNfts = 1e3, timeout = 5e3) => {
220
- const endpoint = (0, import_assert2.assertEx)(process.env.QUICKNODE_API_URI, "No endpoint found");
221
- const axios = new import_axios2.AxiosJson({ timeout });
222
- const assets = [];
223
- let done = false;
224
- let currentPage = 0;
225
- const id = Date.now();
226
- while (!done && assets.length < maxNfts) {
227
- const query = {
228
- id,
229
- jsonrpc: "2.0",
230
- method: "qn_fetchNFTs",
231
- params: [
232
- {
233
- omitFields: ["traits"],
234
- page: currentPage + 1,
235
- perPage: 10,
236
- wallet: publicAddress
242
+ var getNftsOwnedByAddressWithMetadata = async (publicAddress, provider, maxNfts = 200, timeout = 5e3) => {
243
+ const nfts = await getNftsOwnedByAddress(publicAddress, provider, maxNfts, timeout);
244
+ const nftResult = await Promise.all(
245
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
246
+ nfts.map(async (nft) => {
247
+ try {
248
+ if (!nft.metadataUri || !nft.metadata) {
249
+ const [metadataUri, metadata] = await getNftMetadata(nft.address, provider, nft.tokenId);
250
+ nft.metadata = metadata;
251
+ nft.metadataUri = metadataUri;
237
252
  }
238
- ]
239
- };
240
- const results = (await axios.post(endpoint, query)).data.result;
241
- assets.push(...results.assets ?? []);
242
- currentPage = results.pageNumber;
243
- done = results.pageNumber === results.totalPages;
244
- }
253
+ return nft;
254
+ } catch (ex) {
255
+ const error = ex;
256
+ console.error(`Error: ${error.message}`);
257
+ console.error(`${error.stack}`);
258
+ throw ex;
259
+ }
260
+ })
261
+ );
262
+ return nftResult;
263
+ };
264
+ var getNftsOwnedByAddress = async (publicAddress, provider, maxNfts = 100, timeout = 5e3) => {
265
+ const nfts = await getNftsFromWalletFromOpenSea(provider.network.chainId, publicAddress, maxNfts, timeout);
245
266
  const nftResult = await Promise.all(
246
267
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
247
- assets.map(async (nft) => {
268
+ nfts.map(async (nft) => {
248
269
  try {
249
- const { collectionAddress, collectionTokenId } = nft;
270
+ const { contract, identifier } = nft;
250
271
  let supply = "0x01";
251
- const types = await tokenTypes(provider, collectionAddress);
272
+ const types = await getTokenTypes(provider, contract);
252
273
  if (types.includes("ERC1155")) {
253
- const supply1155 = import_open_zeppelin_typechain3.ERC1155Supply__factory.connect(collectionAddress, provider);
254
- supply = await tryCall(async () => (await supply1155.totalSupply(collectionTokenId)).toHexString()) ?? "0x01";
274
+ const supply1155 = import_open_zeppelin_typechain3.ERC1155Supply__factory.connect(contract, provider);
275
+ supply = await tryCall(async () => (await supply1155.totalSupply(contract)).toHexString()) ?? "0x01";
255
276
  }
256
277
  const fields = {
257
- address: collectionAddress,
278
+ address: contract,
258
279
  chainId: provider.network.chainId,
259
280
  supply,
260
- tokenId: collectionTokenId,
281
+ tokenId: identifier,
261
282
  type: types.at(0),
262
283
  types
263
284
  };
264
- if (!fields.metadataUri || !fields.metadata) {
265
- const [metadataUri, metadata] = await getNftMetadata(collectionAddress, provider, fields.tokenId);
266
- fields.metadata = metadata;
267
- fields.metadataUri = metadataUri;
268
- }
269
285
  return fields;
270
286
  } catch (ex) {
271
287
  const error = ex;
@@ -307,6 +323,9 @@ var schema = import_crypto_nft_payload_plugin.NftSchema;
307
323
  var defaultMaxNfts = 100;
308
324
  var CryptoWalletNftWitness = class extends import_abstract_witness.AbstractWitness {
309
325
  static configSchemas = [import_crypto_nft_payload_plugin.NftWitnessConfigSchema];
326
+ get loadMetadata() {
327
+ return this.config.loadMetadata ?? true;
328
+ }
310
329
  get provider() {
311
330
  return this.params.provider;
312
331
  }
@@ -326,7 +345,7 @@ var CryptoWalletNftWitness = class extends import_abstract_witness.AbstractWitne
326
345
  const chainId = (0, import_assert3.assertEx)(network.chainId, "params.chainId is required");
327
346
  const maxNfts = query?.maxNfts || defaultMaxNfts;
328
347
  try {
329
- const nfts = await getNftsOwnedByAddress(address, this.provider, maxNfts, this.timeout);
348
+ const nfts = this.loadMetadata ? await getNftsOwnedByAddressWithMetadata(address, this.provider, maxNfts, this.timeout) : await getNftsOwnedByAddress(address, this.provider, maxNfts, this.timeout);
330
349
  const observation = nfts.map((nft) => {
331
350
  return { ...nft, schema };
332
351
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftsOwnedByAddress.ts","../../src/lib/getInfuraProvider.ts","../../src/lib/getNftMetadata.ts","../../src/lib/tokenTypes.ts","../../src/lib/tryCall.ts","../../src/lib/getProvider.ts"],"sourcesContent":["import { CryptoWalletNftWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoWalletNftWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoWalletNftWitnessPlugin\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoWalletNftWitness } from './Witness'\n\nexport const CryptoWalletNftWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoWalletNftWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoWalletNftWitness.create(params)\n return result\n },\n },\n )\n","import { JsonRpcProvider, Provider, WebSocketProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport {\n CryptoWalletNftWitnessConfig,\n isNftWitnessQuery,\n NftInfo,\n NftSchema,\n NftWitnessConfigSchema,\n NftWitnessQuery,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { WitnessParams } from '@xyo-network/witness-model'\n\nimport { getNftsOwnedByAddress } from './lib'\n\nexport type CryptoWalletNftWitnessParams = WitnessParams<\n AnyConfigSchema<CryptoWalletNftWitnessConfig>,\n {\n provider: JsonRpcProvider | WebSocketProvider\n }\n>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 100\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractWitness<\n TParams,\n NftWitnessQuery,\n NftInfo\n> {\n static override configSchemas = [NftWitnessConfigSchema]\n\n get provider() {\n return this.params.provider\n }\n\n get timeout() {\n return this.config.timeout ?? 10000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n try {\n const observations = await Promise.all(\n queries.map(async (query) => {\n const addressValue = assertEx(query?.address ?? this.config.address, 'params.address is required')\n const parsedAddressValue = EthAddress.parse(addressValue)\n const address = assertEx(parsedAddressValue?.toString(), 'Failed to parse params.address')\n const network = this.provider.network\n const chainId = assertEx(network.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n try {\n const nfts = await getNftsOwnedByAddress(address, this.provider, maxNfts, this.timeout)\n const observation = nfts.map<NftInfo>((nft) => {\n return { ...nft, schema }\n })\n return observation\n } catch (ex) {\n const error = ex as Error\n throw Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`)\n }\n }),\n )\n return observations.flat()\n } catch (ex) {\n const error = ex as Error\n console.error(error)\n return []\n }\n }\n}\n","import { Interface } from '@ethersproject/abi'\nimport { Provider } from '@ethersproject/providers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (let i = 0; i < functionNames.length; i++) {\n const nameSig = contractInterface.getSighash(functionNames[i]).substring(2)\n if (!bytecode.includes(nameSig)) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\nimport { AxiosJson } from '@xyo-network/axios'\nimport { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { getInfuraProvider } from './getInfuraProvider'\nimport { getNftMetadata } from './getNftMetadata'\nimport { tokenTypes } from './tokenTypes'\nimport { tryCall } from './tryCall'\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n}\n\nexport const getErc721MetadataUri = async (address: string, tokenId: string): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC721__factory.connect(address, getInfuraProvider())\n return [await contract.tokenURI(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getErc1155MetadataUri = async (address: string, tokenId: string): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC1155__factory.connect(address, getInfuraProvider())\n return [await contract.uri(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getNftMetadataUri = async (address: string, tokenId: string) => {\n const results = await Promise.all([getErc721MetadataUri(address, tokenId), getErc1155MetadataUri(address, tokenId)])\n return results[0][0] ?? results[1][0]\n}\n\ninterface QuickNodeAsset {\n chain: string\n collectionAddress: string\n collectionName: string\n collectionTokenId: string\n description: string\n imageUrl: string\n name: string\n network: string\n}\n\ninterface QuickNodeFetchNftsResult {\n assets: QuickNodeAsset[]\n id: number\n jsonrpc: string\n owner: string\n pageNumber: number\n totalItems: number\n totalPages: number\n}\n\nexport const getNftsOwnedByAddress = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n provider: JsonRpcProvider | WebSocketProvider,\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 1000,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n const endpoint = assertEx(process.env.QUICKNODE_API_URI, 'No endpoint found')\n\n const axios = new AxiosJson({ timeout })\n\n const assets: QuickNodeAsset[] = []\n let done = false\n let currentPage = 0\n\n const id = Date.now()\n\n while (!done && assets.length < maxNfts) {\n const query = {\n id,\n jsonrpc: '2.0',\n method: 'qn_fetchNFTs',\n params: [\n {\n omitFields: ['traits'],\n page: currentPage + 1,\n perPage: 10,\n wallet: publicAddress,\n },\n ],\n }\n const results = (await axios.post<{ result: QuickNodeFetchNftsResult }>(endpoint, query)).data.result\n assets.push(...(results.assets ?? []))\n currentPage = results.pageNumber\n done = results.pageNumber === results.totalPages\n }\n\n const nftResult = await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n assets.map(async (nft) => {\n try {\n const { collectionAddress, collectionTokenId } = nft\n let supply = '0x01'\n const types = await tokenTypes(provider, collectionAddress)\n if (types.includes('ERC1155')) {\n const supply1155 = ERC1155Supply__factory.connect(collectionAddress, provider)\n supply = (await tryCall(async () => (await supply1155.totalSupply(collectionTokenId)).toHexString())) ?? '0x01'\n }\n const fields: NftInfoFields = {\n address: collectionAddress,\n chainId: provider.network.chainId,\n supply,\n tokenId: collectionTokenId,\n type: types.at(0),\n types,\n }\n if (!fields.metadataUri || !fields.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(collectionAddress, provider, fields.tokenId)\n fields.metadata = metadata\n fields.metadataUri = metadataUri\n }\n return fields\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n\n return nftResult\n}\n","import { InfuraProvider, Provider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\n\nexport interface InfuraProviderConfig {\n projectId: string\n projectSecret: string\n}\n\nlet instance: InfuraProvider | undefined = undefined\n\nexport const getInfuraProvider = (): Provider => {\n if (instance) return instance\n const config = getInfuraProviderConfig()\n instance = new InfuraProvider('homestead', config)\n return instance\n}\n\nexport const canUseInfuraProvider = (): boolean => {\n return !!process.env.INFURA_PROJECT_ID && !!process.env.INFURA_PROJECT_SECRET ? true : false\n}\n\nexport const getInfuraProviderConfig = (): InfuraProviderConfig => {\n const projectId = assertEx(process.env.INFURA_PROJECT_ID, 'Missing INFURA_PROJECT_ID ENV VAR')\n const projectSecret = assertEx(process.env.INFURA_PROJECT_SECRET, 'Missing INFURA_PROJECT_SECRET ENV VAR')\n return { projectId, projectSecret }\n}\n","import { JsonRpcProvider, Provider, WebSocketProvider } from '@ethersproject/providers'\nimport { AxiosJson } from '@xyo-network/axios'\nimport { NftMetadata } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { isErc721, isErc1155 } from './tokenTypes'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n}\n\nexport const getNftMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: JsonRpcProvider | WebSocketProvider,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n tokenId: string,\n): Promise<[string | undefined, NftMetadata | undefined]> => {\n const axios = new AxiosJson({ timeout: 2000 })\n const enumerable721 = ERC721Enumerable__factory.connect(contractAddress, provider)\n const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n\n const is1155 = await isErc1155(provider, contractAddress)\n let uri1155: string | undefined\n if (is1155) {\n try {\n uri1155 = await storage1155.uri(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri: ${error.message}`)\n }\n }\n\n const is721 = await isErc721(provider, contractAddress)\n let metadataUri: string | undefined\n if (is721) {\n try {\n metadataUri = await enumerable721.tokenURI(tokenId)\n } catch (ex) {\n try {\n metadataUri = await storage721.tokenURI(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metadataUri[${contractAddress}][${error.name}]: ${error.message}`)\n }\n }\n }\n\n const tokenMetadataUri = metadataUri ?? uri1155\n\n const checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri\n let metadata: NftMetadata | undefined = undefined\n try {\n metadata = checkedMetaDataUri ? (await axios.get(checkedMetaDataUri)).data : undefined\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metadata: ${error.message}`)\n }\n\n return [tokenMetadataUri, metadata]\n}\n","import { Provider } from '@ethersproject/providers'\nimport { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { contractHasFunctions } from './contractHasFunctions'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n","import { InfuraProvider, JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers'\n\nexport const getProviderFromEnvInternal = (chainId: number = 0x01) => {\n console.log(`getProviderFromEnvInternal: ${chainId}`)\n const infuraWssUri = process.env.INFURA_WSS_URI\n const infuraProvider = new InfuraProvider(chainId, {\n projectId: process.env.INFURA_PROJECT_ID,\n projectSecret: process.env.INFURA_PROJECT_SECRET,\n })\n\n const infuraGenericWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : undefined\n\n const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI\n const quickNodeWebSocketProvider = quickNodeWSSUri ? new WebSocketProvider(quickNodeWSSUri, chainId) : undefined\n\n const quickNodeHttpsUri = process.env.QUICKNODE_WSS_URI\n const quickRpcProvider = quickNodeHttpsUri ? new JsonRpcProvider(quickNodeHttpsUri, chainId) : undefined\n\n const provider = infuraProvider ?? quickNodeWebSocketProvider ?? infuraProvider ?? infuraGenericWebsocketProvider ?? quickRpcProvider\n return provider\n}\n\nconst providers: Record<number, JsonRpcProvider | WebSocketProvider> = {}\n\nexport const getProviderFromEnv = (chainId: number = 0x01) => {\n console.log(`getProviderFromEnv: ${chainId}`)\n providers[chainId] = providers[chainId] ?? getProviderFromEnvInternal(chainId)\n return providers[chainId]\n}\n"],"mappings":"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","names":["checkIpfsUrl","import_crypto_nft_payload_plugin","import_assert","import_assert","import_axios","import_open_zeppelin_typechain","import_open_zeppelin_typechain","ipfsGateway","ex","checkIpfsUrl","ipfsGateway","import_providers"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftsOwnedByAddress.ts","../../src/lib/getAssetsFromWalletFromOpenSea.ts","../../src/lib/getInfuraProvider.ts","../../src/lib/getNftMetadata.ts","../../src/lib/tokenTypes.ts","../../src/lib/tryCall.ts","../../src/lib/getProvider.ts"],"sourcesContent":["import { CryptoWalletNftWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoWalletNftWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoWalletNftWitnessPlugin\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoWalletNftWitness } from './Witness'\n\nexport const CryptoWalletNftWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoWalletNftWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoWalletNftWitness.create(params)\n return result\n },\n },\n )\n","import { JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport {\n CryptoWalletNftWitnessConfig,\n isNftWitnessQuery,\n NftInfo,\n NftSchema,\n NftWitnessConfigSchema,\n NftWitnessQuery,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { WitnessParams } from '@xyo-network/witness-model'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = WitnessParams<\n AnyConfigSchema<CryptoWalletNftWitnessConfig>,\n {\n provider: JsonRpcProvider | WebSocketProvider\n }\n>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 100\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractWitness<\n TParams,\n NftWitnessQuery,\n NftInfo\n> {\n static override configSchemas = [NftWitnessConfigSchema]\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get provider() {\n return this.params.provider\n }\n\n get timeout() {\n return this.config.timeout ?? 10000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n try {\n const observations = await Promise.all(\n queries.map(async (query) => {\n const addressValue = assertEx(query?.address ?? this.config.address, 'params.address is required')\n const parsedAddressValue = EthAddress.parse(addressValue)\n const address = assertEx(parsedAddressValue?.toString(), 'Failed to parse params.address')\n const network = this.provider.network\n const chainId = assertEx(network.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n try {\n const nfts = this.loadMetadata\n ? await getNftsOwnedByAddressWithMetadata(address, this.provider, maxNfts, this.timeout)\n : await getNftsOwnedByAddress(address, this.provider, maxNfts, this.timeout)\n const observation = nfts.map<NftInfo>((nft) => {\n return { ...nft, schema }\n })\n return observation\n } catch (ex) {\n const error = ex as Error\n throw Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`)\n }\n }),\n )\n return observations.flat()\n } catch (ex) {\n const error = ex as Error\n console.error(error)\n return []\n }\n }\n}\n","import { Interface } from '@ethersproject/abi'\nimport { Provider } from '@ethersproject/providers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (let i = 0; i < functionNames.length; i++) {\n const nameSig = contractInterface.getSighash(functionNames[i]).substring(2)\n if (!bytecode.includes(nameSig)) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { JsonRpcProvider, Provider, WebSocketProvider } from '@ethersproject/providers'\nimport { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { LRUCache } from 'lru-cache'\n\nimport { getAssetsFromWallet } from './getAssetsFromWallet'\nimport { getNftsFromWalletFromOpenSea } from './getAssetsFromWalletFromOpenSea'\nimport { getInfuraProvider } from './getInfuraProvider'\nimport { getNftMetadata } from './getNftMetadata'\nimport { tokenTypes } from './tokenTypes'\nimport { tryCall } from './tryCall'\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n}\n\nconst tokenTypeCache = new LRUCache<string, TokenType[]>({ max: 100 })\n\nexport const getTokenTypes = async (provider: Provider, address: string) => {\n const key = `${address}|${(await provider.getNetwork()).chainId}`\n const currentValue = tokenTypeCache.get(key)\n if (currentValue) {\n return currentValue\n } else {\n const types = await tokenTypes(provider, address)\n tokenTypeCache.set(key, types)\n return types\n }\n}\n\nexport const getErc721MetadataUri = async (address: string, tokenId: string): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC721__factory.connect(address, getInfuraProvider())\n return [await contract.tokenURI(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getErc1155MetadataUri = async (address: string, tokenId: string): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC1155__factory.connect(address, getInfuraProvider())\n return [await contract.uri(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getNftMetadataUri = async (address: string, tokenId: string) => {\n const results = await Promise.all([getErc721MetadataUri(address, tokenId), getErc1155MetadataUri(address, tokenId)])\n return results[0][0] ?? results[1][0]\n}\n\nexport const getNftsOwnedByAddressWithMetadata = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n provider: JsonRpcProvider | WebSocketProvider,\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 200,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n const nfts = await getNftsOwnedByAddress(publicAddress, provider, maxNfts, timeout)\n const nftResult = await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nfts.map(async (nft) => {\n try {\n if (!nft.metadataUri || !nft.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(nft.address, provider, nft.tokenId)\n nft.metadata = metadata\n nft.metadataUri = metadataUri\n }\n return nft\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n return nftResult\n}\n\nexport const getNftsOwnedByAddress = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n provider: JsonRpcProvider | WebSocketProvider,\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 100,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n //const assets = await getAssetsFromWallet(publicAddress, maxNfts, timeout)\n const nfts = await getNftsFromWalletFromOpenSea(provider.network.chainId, publicAddress, maxNfts, timeout)\n\n const nftResult = await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nfts.map(async (nft) => {\n try {\n const { contract, identifier } = nft\n let supply = '0x01'\n const types = await getTokenTypes(provider, contract)\n if (types.includes('ERC1155')) {\n const supply1155 = ERC1155Supply__factory.connect(contract, provider)\n supply = (await tryCall(async () => (await supply1155.totalSupply(contract)).toHexString())) ?? '0x01'\n }\n const fields: NftInfoFields = {\n address: contract,\n chainId: provider.network.chainId,\n supply,\n tokenId: identifier,\n type: types.at(0),\n types,\n }\n return fields\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n\n return nftResult\n}\n","import { assertEx } from '@xylabs/assert'\nimport { AxiosJson } from '@xyo-network/axios'\n\ninterface OpenSeaNFT {\n collection: string\n contract: string\n created_at: string\n description: string | null\n identifier: string\n image_url: string | null\n is_disabled: boolean\n is_nsfw: boolean\n metadata_url: string | null\n name: string | null\n token_standard: string\n updated_at: string\n}\n\nexport const getNftsFromWalletFromOpenSea = async (chainId: number, address: string, maxNfts = 200, timeout = 2000) => {\n const apiKey = assertEx(process.env.OPENSEA_API_KEY, 'No opensea key found')\n\n const axios = new AxiosJson({ headers: { 'x-api-key': apiKey }, timeout })\n\n const nfts = (await axios.get<{ nfts: OpenSeaNFT[] }>(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data\n .nfts\n return nfts\n}\n","import { InfuraProvider, Provider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\n\nexport interface InfuraProviderConfig {\n projectId: string\n projectSecret: string\n}\n\nlet instance: InfuraProvider | undefined = undefined\n\nexport const getInfuraProvider = (): Provider => {\n if (instance) return instance\n const config = getInfuraProviderConfig()\n instance = new InfuraProvider('homestead', config)\n return instance\n}\n\nexport const canUseInfuraProvider = (): boolean => {\n return !!process.env.INFURA_PROJECT_ID && !!process.env.INFURA_PROJECT_SECRET ? true : false\n}\n\nexport const getInfuraProviderConfig = (): InfuraProviderConfig => {\n const projectId = assertEx(process.env.INFURA_PROJECT_ID, 'Missing INFURA_PROJECT_ID ENV VAR')\n const projectSecret = assertEx(process.env.INFURA_PROJECT_SECRET, 'Missing INFURA_PROJECT_SECRET ENV VAR')\n return { projectId, projectSecret }\n}\n","import { JsonRpcProvider, Provider, WebSocketProvider } from '@ethersproject/providers'\nimport { AxiosJson } from '@xyo-network/axios'\nimport { NftMetadata } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { isErc721, isErc1155 } from './tokenTypes'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n}\n\nexport const getNftMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: JsonRpcProvider | WebSocketProvider,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n tokenId: string,\n): Promise<[string | undefined, NftMetadata | undefined]> => {\n const axios = new AxiosJson({ timeout: 2000 })\n const enumerable721 = ERC721Enumerable__factory.connect(contractAddress, provider)\n const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n\n const is1155 = await isErc1155(provider, contractAddress)\n let uri1155: string | undefined\n if (is1155) {\n try {\n uri1155 = await storage1155.uri(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri: ${error.message}`)\n }\n }\n\n const is721 = await isErc721(provider, contractAddress)\n let metadataUri: string | undefined\n if (is721) {\n try {\n metadataUri = await enumerable721.tokenURI(tokenId)\n } catch (ex) {\n try {\n metadataUri = await storage721.tokenURI(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metadataUri[${contractAddress}][${error.name}]: ${error.message}`)\n }\n }\n }\n\n const tokenMetadataUri = metadataUri ?? uri1155\n\n const checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri\n let metadata: NftMetadata | undefined = undefined\n try {\n metadata = checkedMetaDataUri ? (await axios.get(checkedMetaDataUri)).data : undefined\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metadata: ${error.message}`)\n }\n\n return [tokenMetadataUri, metadata]\n}\n","import { Provider } from '@ethersproject/providers'\nimport { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { contractHasFunctions } from './contractHasFunctions'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n","import { InfuraProvider, JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers'\n\nexport const getProviderFromEnvInternal = (chainId: number = 0x01) => {\n console.log(`getProviderFromEnvInternal: ${chainId}`)\n const infuraWssUri = process.env.INFURA_WSS_URI\n const infuraProvider = new InfuraProvider(chainId, {\n projectId: process.env.INFURA_PROJECT_ID,\n projectSecret: process.env.INFURA_PROJECT_SECRET,\n })\n\n const infuraGenericWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : undefined\n\n const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI\n const quickNodeWebSocketProvider = quickNodeWSSUri ? new WebSocketProvider(quickNodeWSSUri, chainId) : undefined\n\n const quickNodeHttpsUri = process.env.QUICKNODE_WSS_URI\n const quickRpcProvider = quickNodeHttpsUri ? new JsonRpcProvider(quickNodeHttpsUri, chainId) : undefined\n\n const provider = infuraProvider ?? quickNodeWebSocketProvider ?? infuraProvider ?? infuraGenericWebsocketProvider ?? quickRpcProvider\n return provider\n}\n\nconst providers: Record<number, JsonRpcProvider | WebSocketProvider> = {}\n\nexport const getProviderFromEnv = (chainId: number = 0x01) => {\n console.log(`getProviderFromEnv: ${chainId}`)\n providers[chainId] = providers[chainId] ?? getProviderFromEnvInternal(chainId)\n return providers[chainId]\n}\n"],"mappings":"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","names":["checkIpfsUrl","import_crypto_nft_payload_plugin","import_assert","import_open_zeppelin_typechain","import_assert","import_axios","import_open_zeppelin_typechain","ipfsGateway","ex","checkIpfsUrl","ipfsGateway","import_providers"]}
@@ -33,13 +33,22 @@ var contractHasFunctions = async (provider, address, contractInterface, function
33
33
  };
34
34
 
35
35
  // src/lib/getNftsOwnedByAddress.ts
36
- import { assertEx as assertEx2 } from "@xylabs/assert";
37
- import { AxiosJson as AxiosJson2 } from "@xyo-network/axios";
38
36
  import { ERC721__factory, ERC1155__factory, ERC1155Supply__factory } from "@xyo-network/open-zeppelin-typechain";
37
+ import { LRUCache } from "lru-cache";
38
+
39
+ // src/lib/getAssetsFromWalletFromOpenSea.ts
40
+ import { assertEx } from "@xylabs/assert";
41
+ import { AxiosJson } from "@xyo-network/axios";
42
+ var getNftsFromWalletFromOpenSea = async (chainId, address, maxNfts = 200, timeout = 2e3) => {
43
+ const apiKey = assertEx(process.env.OPENSEA_API_KEY, "No opensea key found");
44
+ const axios = new AxiosJson({ headers: { "x-api-key": apiKey }, timeout });
45
+ const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
46
+ return nfts;
47
+ };
39
48
 
40
49
  // src/lib/getInfuraProvider.ts
41
50
  import { InfuraProvider } from "@ethersproject/providers";
42
- import { assertEx } from "@xylabs/assert";
51
+ import { assertEx as assertEx2 } from "@xylabs/assert";
43
52
  var instance = void 0;
44
53
  var getInfuraProvider = () => {
45
54
  if (instance)
@@ -49,13 +58,13 @@ var getInfuraProvider = () => {
49
58
  return instance;
50
59
  };
51
60
  var getInfuraProviderConfig = () => {
52
- const projectId = assertEx(process.env.INFURA_PROJECT_ID, "Missing INFURA_PROJECT_ID ENV VAR");
53
- const projectSecret = assertEx(process.env.INFURA_PROJECT_SECRET, "Missing INFURA_PROJECT_SECRET ENV VAR");
61
+ const projectId = assertEx2(process.env.INFURA_PROJECT_ID, "Missing INFURA_PROJECT_ID ENV VAR");
62
+ const projectSecret = assertEx2(process.env.INFURA_PROJECT_SECRET, "Missing INFURA_PROJECT_SECRET ENV VAR");
54
63
  return { projectId, projectSecret };
55
64
  };
56
65
 
57
66
  // src/lib/getNftMetadata.ts
58
- import { AxiosJson } from "@xyo-network/axios";
67
+ import { AxiosJson as AxiosJson2 } from "@xyo-network/axios";
59
68
  import { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155URIStorage__factory as ERC1155URIStorage__factory2 } from "@xyo-network/open-zeppelin-typechain";
60
69
 
61
70
  // src/lib/tokenTypes.ts
@@ -97,7 +106,7 @@ var checkIpfsUrl = (urlToCheck, ipfsGateway2) => {
97
106
  }
98
107
  };
99
108
  var getNftMetadata = async (contractAddress, provider, tokenId) => {
100
- const axios = new AxiosJson({ timeout: 2e3 });
109
+ const axios = new AxiosJson2({ timeout: 2e3 });
101
110
  const enumerable721 = ERC721Enumerable__factory.connect(contractAddress, provider);
102
111
  const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider);
103
112
  const storage1155 = ERC1155URIStorage__factory2.connect(contractAddress, provider);
@@ -161,6 +170,18 @@ var checkIpfsUrl2 = (urlToCheck, ipfsGateway2) => {
161
170
  return urlToCheck;
162
171
  }
163
172
  };
173
+ var tokenTypeCache = new LRUCache({ max: 100 });
174
+ var getTokenTypes = async (provider, address) => {
175
+ const key = `${address}|${(await provider.getNetwork()).chainId}`;
176
+ const currentValue = tokenTypeCache.get(key);
177
+ if (currentValue) {
178
+ return currentValue;
179
+ } else {
180
+ const types = await tokenTypes(provider, address);
181
+ tokenTypeCache.set(key, types);
182
+ return types;
183
+ }
184
+ };
164
185
  var getErc721MetadataUri = async (address, tokenId) => {
165
186
  try {
166
187
  const contract = ERC721__factory.connect(address, getInfuraProvider());
@@ -181,56 +202,49 @@ var getNftMetadataUri = async (address, tokenId) => {
181
202
  const results = await Promise.all([getErc721MetadataUri(address, tokenId), getErc1155MetadataUri(address, tokenId)]);
182
203
  return results[0][0] ?? results[1][0];
183
204
  };
184
- var getNftsOwnedByAddress = async (publicAddress, provider, maxNfts = 1e3, timeout = 5e3) => {
185
- const endpoint = assertEx2(process.env.QUICKNODE_API_URI, "No endpoint found");
186
- const axios = new AxiosJson2({ timeout });
187
- const assets = [];
188
- let done = false;
189
- let currentPage = 0;
190
- const id = Date.now();
191
- while (!done && assets.length < maxNfts) {
192
- const query = {
193
- id,
194
- jsonrpc: "2.0",
195
- method: "qn_fetchNFTs",
196
- params: [
197
- {
198
- omitFields: ["traits"],
199
- page: currentPage + 1,
200
- perPage: 10,
201
- wallet: publicAddress
205
+ var getNftsOwnedByAddressWithMetadata = async (publicAddress, provider, maxNfts = 200, timeout = 5e3) => {
206
+ const nfts = await getNftsOwnedByAddress(publicAddress, provider, maxNfts, timeout);
207
+ const nftResult = await Promise.all(
208
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
+ nfts.map(async (nft) => {
210
+ try {
211
+ if (!nft.metadataUri || !nft.metadata) {
212
+ const [metadataUri, metadata] = await getNftMetadata(nft.address, provider, nft.tokenId);
213
+ nft.metadata = metadata;
214
+ nft.metadataUri = metadataUri;
202
215
  }
203
- ]
204
- };
205
- const results = (await axios.post(endpoint, query)).data.result;
206
- assets.push(...results.assets ?? []);
207
- currentPage = results.pageNumber;
208
- done = results.pageNumber === results.totalPages;
209
- }
216
+ return nft;
217
+ } catch (ex) {
218
+ const error = ex;
219
+ console.error(`Error: ${error.message}`);
220
+ console.error(`${error.stack}`);
221
+ throw ex;
222
+ }
223
+ })
224
+ );
225
+ return nftResult;
226
+ };
227
+ var getNftsOwnedByAddress = async (publicAddress, provider, maxNfts = 100, timeout = 5e3) => {
228
+ const nfts = await getNftsFromWalletFromOpenSea(provider.network.chainId, publicAddress, maxNfts, timeout);
210
229
  const nftResult = await Promise.all(
211
230
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
212
- assets.map(async (nft) => {
231
+ nfts.map(async (nft) => {
213
232
  try {
214
- const { collectionAddress, collectionTokenId } = nft;
233
+ const { contract, identifier } = nft;
215
234
  let supply = "0x01";
216
- const types = await tokenTypes(provider, collectionAddress);
235
+ const types = await getTokenTypes(provider, contract);
217
236
  if (types.includes("ERC1155")) {
218
- const supply1155 = ERC1155Supply__factory.connect(collectionAddress, provider);
219
- supply = await tryCall(async () => (await supply1155.totalSupply(collectionTokenId)).toHexString()) ?? "0x01";
237
+ const supply1155 = ERC1155Supply__factory.connect(contract, provider);
238
+ supply = await tryCall(async () => (await supply1155.totalSupply(contract)).toHexString()) ?? "0x01";
220
239
  }
221
240
  const fields = {
222
- address: collectionAddress,
241
+ address: contract,
223
242
  chainId: provider.network.chainId,
224
243
  supply,
225
- tokenId: collectionTokenId,
244
+ tokenId: identifier,
226
245
  type: types.at(0),
227
246
  types
228
247
  };
229
- if (!fields.metadataUri || !fields.metadata) {
230
- const [metadataUri, metadata] = await getNftMetadata(collectionAddress, provider, fields.tokenId);
231
- fields.metadata = metadata;
232
- fields.metadataUri = metadataUri;
233
- }
234
248
  return fields;
235
249
  } catch (ex) {
236
250
  const error = ex;
@@ -272,6 +286,9 @@ var schema = NftSchema;
272
286
  var defaultMaxNfts = 100;
273
287
  var CryptoWalletNftWitness = class extends AbstractWitness {
274
288
  static configSchemas = [NftWitnessConfigSchema];
289
+ get loadMetadata() {
290
+ return this.config.loadMetadata ?? true;
291
+ }
275
292
  get provider() {
276
293
  return this.params.provider;
277
294
  }
@@ -291,7 +308,7 @@ var CryptoWalletNftWitness = class extends AbstractWitness {
291
308
  const chainId = assertEx3(network.chainId, "params.chainId is required");
292
309
  const maxNfts = query?.maxNfts || defaultMaxNfts;
293
310
  try {
294
- const nfts = await getNftsOwnedByAddress(address, this.provider, maxNfts, this.timeout);
311
+ const nfts = this.loadMetadata ? await getNftsOwnedByAddressWithMetadata(address, this.provider, maxNfts, this.timeout) : await getNftsOwnedByAddress(address, this.provider, maxNfts, this.timeout);
295
312
  const observation = nfts.map((nft) => {
296
313
  return { ...nft, schema };
297
314
  });
@@ -334,8 +351,10 @@ export {
334
351
  getErc721MetadataUri,
335
352
  getNftMetadataUri,
336
353
  getNftsOwnedByAddress,
354
+ getNftsOwnedByAddressWithMetadata,
337
355
  getProviderFromEnv,
338
356
  getProviderFromEnvInternal,
357
+ getTokenTypes,
339
358
  isErc1155,
340
359
  isErc721,
341
360
  tokenTypes