@xyo-network/crypto-nft-witness-wallet-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.
- package/dist/browser/Plugin.d.cts +1 -1
- package/dist/browser/Plugin.d.mts +1 -1
- package/dist/browser/Plugin.d.ts +1 -1
- package/dist/browser/Witness.d.cts +3 -3
- package/dist/browser/Witness.d.cts.map +1 -1
- package/dist/browser/Witness.d.mts +3 -3
- package/dist/browser/Witness.d.mts.map +1 -1
- package/dist/browser/Witness.d.ts +3 -3
- package/dist/browser/Witness.d.ts.map +1 -1
- package/dist/browser/index.cjs +121 -97
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +123 -99
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/lib/contractHasFunctions.d.cts +4 -0
- package/dist/browser/lib/contractHasFunctions.d.cts.map +1 -0
- package/dist/browser/lib/contractHasFunctions.d.mts +4 -0
- package/dist/browser/lib/contractHasFunctions.d.mts.map +1 -0
- package/dist/browser/lib/contractHasFunctions.d.ts +4 -0
- package/dist/browser/lib/contractHasFunctions.d.ts.map +1 -0
- package/dist/browser/lib/getNftMetadata.d.cts +2 -2
- package/dist/browser/lib/getNftMetadata.d.cts.map +1 -1
- package/dist/browser/lib/getNftMetadata.d.mts +2 -2
- package/dist/browser/lib/getNftMetadata.d.mts.map +1 -1
- package/dist/browser/lib/getNftMetadata.d.ts +2 -2
- package/dist/browser/lib/getNftMetadata.d.ts.map +1 -1
- package/dist/browser/lib/getNftsOwnedByAddress.d.cts +2 -2
- package/dist/browser/lib/getNftsOwnedByAddress.d.cts.map +1 -1
- package/dist/browser/lib/getNftsOwnedByAddress.d.mts +2 -2
- package/dist/browser/lib/getNftsOwnedByAddress.d.mts.map +1 -1
- package/dist/browser/lib/getNftsOwnedByAddress.d.ts +2 -2
- package/dist/browser/lib/getNftsOwnedByAddress.d.ts.map +1 -1
- package/dist/browser/lib/getProvider.d.cts +3 -2
- package/dist/browser/lib/getProvider.d.cts.map +1 -1
- package/dist/browser/lib/getProvider.d.mts +3 -2
- package/dist/browser/lib/getProvider.d.mts.map +1 -1
- package/dist/browser/lib/getProvider.d.ts +3 -2
- package/dist/browser/lib/getProvider.d.ts.map +1 -1
- package/dist/browser/lib/index.d.cts +1 -0
- package/dist/browser/lib/index.d.cts.map +1 -1
- package/dist/browser/lib/index.d.mts +1 -0
- package/dist/browser/lib/index.d.mts.map +1 -1
- package/dist/browser/lib/index.d.ts +1 -0
- package/dist/browser/lib/index.d.ts.map +1 -1
- package/dist/browser/lib/tokenTypes.d.cts +4 -6
- package/dist/browser/lib/tokenTypes.d.cts.map +1 -1
- package/dist/browser/lib/tokenTypes.d.mts +4 -6
- package/dist/browser/lib/tokenTypes.d.mts.map +1 -1
- package/dist/browser/lib/tokenTypes.d.ts +4 -6
- package/dist/browser/lib/tokenTypes.d.ts.map +1 -1
- package/dist/browser/lib/tryCall.d.cts +2 -0
- package/dist/browser/lib/tryCall.d.cts.map +1 -0
- package/dist/browser/lib/tryCall.d.mts +2 -0
- package/dist/browser/lib/tryCall.d.mts.map +1 -0
- package/dist/browser/lib/tryCall.d.ts +2 -0
- package/dist/browser/lib/tryCall.d.ts.map +1 -0
- package/dist/node/Plugin.d.cts +1 -1
- package/dist/node/Plugin.d.mts +1 -1
- package/dist/node/Plugin.d.ts +1 -1
- package/dist/node/Witness.d.cts +3 -3
- package/dist/node/Witness.d.cts.map +1 -1
- package/dist/node/Witness.d.mts +3 -3
- package/dist/node/Witness.d.mts.map +1 -1
- package/dist/node/Witness.d.ts +3 -3
- package/dist/node/Witness.d.ts.map +1 -1
- package/dist/node/index.js +123 -99
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +123 -100
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/lib/contractHasFunctions.d.cts +4 -0
- package/dist/node/lib/contractHasFunctions.d.cts.map +1 -0
- package/dist/node/lib/contractHasFunctions.d.mts +4 -0
- package/dist/node/lib/contractHasFunctions.d.mts.map +1 -0
- package/dist/node/lib/contractHasFunctions.d.ts +4 -0
- package/dist/node/lib/contractHasFunctions.d.ts.map +1 -0
- package/dist/node/lib/getNftMetadata.d.cts +2 -2
- package/dist/node/lib/getNftMetadata.d.cts.map +1 -1
- package/dist/node/lib/getNftMetadata.d.mts +2 -2
- package/dist/node/lib/getNftMetadata.d.mts.map +1 -1
- package/dist/node/lib/getNftMetadata.d.ts +2 -2
- package/dist/node/lib/getNftMetadata.d.ts.map +1 -1
- package/dist/node/lib/getNftsOwnedByAddress.d.cts +2 -2
- package/dist/node/lib/getNftsOwnedByAddress.d.cts.map +1 -1
- package/dist/node/lib/getNftsOwnedByAddress.d.mts +2 -2
- package/dist/node/lib/getNftsOwnedByAddress.d.mts.map +1 -1
- package/dist/node/lib/getNftsOwnedByAddress.d.ts +2 -2
- package/dist/node/lib/getNftsOwnedByAddress.d.ts.map +1 -1
- package/dist/node/lib/getProvider.d.cts +3 -2
- package/dist/node/lib/getProvider.d.cts.map +1 -1
- package/dist/node/lib/getProvider.d.mts +3 -2
- package/dist/node/lib/getProvider.d.mts.map +1 -1
- package/dist/node/lib/getProvider.d.ts +3 -2
- package/dist/node/lib/getProvider.d.ts.map +1 -1
- package/dist/node/lib/index.d.cts +1 -0
- package/dist/node/lib/index.d.cts.map +1 -1
- package/dist/node/lib/index.d.mts +1 -0
- package/dist/node/lib/index.d.mts.map +1 -1
- package/dist/node/lib/index.d.ts +1 -0
- package/dist/node/lib/index.d.ts.map +1 -1
- package/dist/node/lib/tokenTypes.d.cts +4 -6
- package/dist/node/lib/tokenTypes.d.cts.map +1 -1
- package/dist/node/lib/tokenTypes.d.mts +4 -6
- package/dist/node/lib/tokenTypes.d.mts.map +1 -1
- package/dist/node/lib/tokenTypes.d.ts +4 -6
- package/dist/node/lib/tokenTypes.d.ts.map +1 -1
- package/dist/node/lib/tryCall.d.cts +2 -0
- package/dist/node/lib/tryCall.d.cts.map +1 -0
- package/dist/node/lib/tryCall.d.mts +2 -0
- package/dist/node/lib/tryCall.d.mts.map +1 -0
- package/dist/node/lib/tryCall.d.ts +2 -0
- package/dist/node/lib/tryCall.d.ts.map +1 -0
- package/package.json +14 -14
- package/src/Witness.ts +30 -24
- package/src/lib/contractHasFunctions.ts +20 -0
- package/src/lib/getNftMetadata.ts +4 -4
- package/src/lib/getNftsOwnedByAddress.ts +62 -60
- package/src/lib/getProvider.ts +19 -7
- package/src/lib/index.ts +1 -0
- package/src/lib/tokenTypes.ts +8 -19
- package/src/lib/tryCall.ts +11 -0
|
@@ -53,6 +53,6 @@ export declare const CryptoWalletNftWitnessPlugin: () => import("@xyo-network/pa
|
|
|
53
53
|
ephemeralQueryAccountEnabled?: boolean | undefined;
|
|
54
54
|
wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
|
|
55
55
|
} & {
|
|
56
|
-
provider: import("@ethersproject/
|
|
56
|
+
provider: import("@ethersproject/providers").JsonRpcProvider | import("@ethersproject/providers").WebSocketProvider;
|
|
57
57
|
}>>;
|
|
58
58
|
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -53,6 +53,6 @@ export declare const CryptoWalletNftWitnessPlugin: () => import("@xyo-network/pa
|
|
|
53
53
|
ephemeralQueryAccountEnabled?: boolean | undefined;
|
|
54
54
|
wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
|
|
55
55
|
} & {
|
|
56
|
-
provider: import("@ethersproject/
|
|
56
|
+
provider: import("@ethersproject/providers").JsonRpcProvider | import("@ethersproject/providers").WebSocketProvider;
|
|
57
57
|
}>>;
|
|
58
58
|
//# sourceMappingURL=Plugin.d.ts.map
|
package/dist/browser/Plugin.d.ts
CHANGED
|
@@ -53,6 +53,6 @@ export declare const CryptoWalletNftWitnessPlugin: () => import("@xyo-network/pa
|
|
|
53
53
|
ephemeralQueryAccountEnabled?: boolean | undefined;
|
|
54
54
|
wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
|
|
55
55
|
} & {
|
|
56
|
-
provider: import("@ethersproject/
|
|
56
|
+
provider: import("@ethersproject/providers").JsonRpcProvider | import("@ethersproject/providers").WebSocketProvider;
|
|
57
57
|
}>>;
|
|
58
58
|
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers';
|
|
2
2
|
import { AbstractWitness } from '@xyo-network/abstract-witness';
|
|
3
3
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
4
4
|
import { AnyConfigSchema } from '@xyo-network/module-model';
|
|
5
5
|
import { WitnessParams } from '@xyo-network/witness-model';
|
|
6
6
|
export type CryptoWalletNftWitnessParams = WitnessParams<AnyConfigSchema<CryptoWalletNftWitnessConfig>, {
|
|
7
|
-
provider:
|
|
7
|
+
provider: JsonRpcProvider | WebSocketProvider;
|
|
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 provider():
|
|
11
|
+
get provider(): JsonRpcProvider | WebSocketProvider;
|
|
12
12
|
get timeout(): number;
|
|
13
13
|
protected observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]>;
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers';
|
|
2
2
|
import { AbstractWitness } from '@xyo-network/abstract-witness';
|
|
3
3
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
4
4
|
import { AnyConfigSchema } from '@xyo-network/module-model';
|
|
5
5
|
import { WitnessParams } from '@xyo-network/witness-model';
|
|
6
6
|
export type CryptoWalletNftWitnessParams = WitnessParams<AnyConfigSchema<CryptoWalletNftWitnessConfig>, {
|
|
7
|
-
provider:
|
|
7
|
+
provider: JsonRpcProvider | WebSocketProvider;
|
|
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 provider():
|
|
11
|
+
get provider(): JsonRpcProvider | WebSocketProvider;
|
|
12
12
|
get timeout(): number;
|
|
13
13
|
protected observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]>;
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers';
|
|
2
2
|
import { AbstractWitness } from '@xyo-network/abstract-witness';
|
|
3
3
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
4
4
|
import { AnyConfigSchema } from '@xyo-network/module-model';
|
|
5
5
|
import { WitnessParams } from '@xyo-network/witness-model';
|
|
6
6
|
export type CryptoWalletNftWitnessParams = WitnessParams<AnyConfigSchema<CryptoWalletNftWitnessConfig>, {
|
|
7
|
-
provider:
|
|
7
|
+
provider: JsonRpcProvider | WebSocketProvider;
|
|
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 provider():
|
|
11
|
+
get provider(): JsonRpcProvider | WebSocketProvider;
|
|
12
12
|
get timeout(): number;
|
|
13
13
|
protected observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]>;
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -23,13 +23,14 @@ __export(src_exports, {
|
|
|
23
23
|
CryptoWalletNftWitness: () => CryptoWalletNftWitness,
|
|
24
24
|
CryptoWalletNftWitnessPlugin: () => CryptoWalletNftWitnessPlugin,
|
|
25
25
|
checkIpfsUrl: () => checkIpfsUrl2,
|
|
26
|
+
contractHasFunctions: () => contractHasFunctions,
|
|
26
27
|
default: () => src_default,
|
|
27
28
|
getErc1155MetadataUri: () => getErc1155MetadataUri,
|
|
28
29
|
getErc721MetadataUri: () => getErc721MetadataUri,
|
|
29
30
|
getNftMetadataUri: () => getNftMetadataUri,
|
|
30
31
|
getNftsOwnedByAddress: () => getNftsOwnedByAddress,
|
|
31
32
|
getProviderFromEnv: () => getProviderFromEnv,
|
|
32
|
-
|
|
33
|
+
getProviderFromEnvInternal: () => getProviderFromEnvInternal,
|
|
33
34
|
isErc1155: () => isErc1155,
|
|
34
35
|
isErc721: () => isErc721,
|
|
35
36
|
tokenTypes: () => tokenTypes
|
|
@@ -47,10 +48,28 @@ var import_eth_address = require("@xylabs/eth-address");
|
|
|
47
48
|
var import_abstract_witness = require("@xyo-network/abstract-witness");
|
|
48
49
|
var import_crypto_nft_payload_plugin = require("@xyo-network/crypto-nft-payload-plugin");
|
|
49
50
|
|
|
51
|
+
// src/lib/contractHasFunctions.ts
|
|
52
|
+
var contractHasFunctions = async (provider, address, contractInterface, functionNames) => {
|
|
53
|
+
try {
|
|
54
|
+
const bytecode = await provider.getCode(address, "latest");
|
|
55
|
+
for (let i = 0; i < functionNames.length; i++) {
|
|
56
|
+
const nameSig = contractInterface.getSighash(functionNames[i]).substring(2);
|
|
57
|
+
if (!bytecode.includes(nameSig)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
} catch (ex) {
|
|
64
|
+
const error = ex;
|
|
65
|
+
console.log(error);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
50
70
|
// src/lib/getNftsOwnedByAddress.ts
|
|
51
71
|
var import_assert2 = require("@xylabs/assert");
|
|
52
|
-
var
|
|
53
|
-
var import_api_graphql_plugin = require("@xyo-network/api-graphql-plugin");
|
|
72
|
+
var import_axios2 = require("@xyo-network/axios");
|
|
54
73
|
var import_open_zeppelin_typechain3 = require("@xyo-network/open-zeppelin-typechain");
|
|
55
74
|
|
|
56
75
|
// src/lib/getInfuraProvider.ts
|
|
@@ -76,25 +95,14 @@ var import_open_zeppelin_typechain2 = require("@xyo-network/open-zeppelin-typech
|
|
|
76
95
|
|
|
77
96
|
// src/lib/tokenTypes.ts
|
|
78
97
|
var import_open_zeppelin_typechain = require("@xyo-network/open-zeppelin-typechain");
|
|
79
|
-
var isErc1155 = async (
|
|
80
|
-
return await
|
|
81
|
-
};
|
|
82
|
-
var isErc721 = async (contract) => {
|
|
83
|
-
return await hasFunctions(contract, import_open_zeppelin_typechain.IERC721Metadata__factory.createInterface(), ["name", "symbol", "tokenURI"]);
|
|
98
|
+
var isErc1155 = async (provider, address) => {
|
|
99
|
+
return await contractHasFunctions(provider, address, import_open_zeppelin_typechain.ERC1155URIStorage__factory.createInterface(), ["uri"]);
|
|
84
100
|
};
|
|
85
|
-
var
|
|
86
|
-
|
|
87
|
-
for (let i = 0; i < functionNames.length; i++) {
|
|
88
|
-
const nameSig = contractInterface.getSighash(functionNames[i]).substring(2);
|
|
89
|
-
if (!bytecode.includes(nameSig)) {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
return false;
|
|
101
|
+
var isErc721 = async (provider, address) => {
|
|
102
|
+
return await contractHasFunctions(provider, address, import_open_zeppelin_typechain.IERC721Metadata__factory.createInterface(), ["name", "symbol", "tokenURI"]);
|
|
95
103
|
};
|
|
96
|
-
var tokenTypes = async (
|
|
97
|
-
const [erc721, erc1155] = await Promise.all([isErc721(
|
|
104
|
+
var tokenTypes = async (provider, address) => {
|
|
105
|
+
const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)]);
|
|
98
106
|
const result = [];
|
|
99
107
|
if (erc721) {
|
|
100
108
|
result.push("ERC721");
|
|
@@ -128,7 +136,7 @@ var getNftMetadata = async (contractAddress, provider, tokenId) => {
|
|
|
128
136
|
const enumerable721 = import_open_zeppelin_typechain2.ERC721Enumerable__factory.connect(contractAddress, provider);
|
|
129
137
|
const storage721 = import_open_zeppelin_typechain2.ERC721URIStorage__factory.connect(contractAddress, provider);
|
|
130
138
|
const storage1155 = import_open_zeppelin_typechain2.ERC1155URIStorage__factory.connect(contractAddress, provider);
|
|
131
|
-
const is1155 = await isErc1155(
|
|
139
|
+
const is1155 = await isErc1155(provider, contractAddress);
|
|
132
140
|
let uri1155;
|
|
133
141
|
if (is1155) {
|
|
134
142
|
try {
|
|
@@ -136,7 +144,7 @@ var getNftMetadata = async (contractAddress, provider, tokenId) => {
|
|
|
136
144
|
} catch (ex) {
|
|
137
145
|
}
|
|
138
146
|
}
|
|
139
|
-
const is721 = await isErc721(
|
|
147
|
+
const is721 = await isErc721(provider, contractAddress);
|
|
140
148
|
let metadataUri;
|
|
141
149
|
if (is721) {
|
|
142
150
|
try {
|
|
@@ -158,6 +166,19 @@ var getNftMetadata = async (contractAddress, provider, tokenId) => {
|
|
|
158
166
|
return [tokenMetadataUri, metadata];
|
|
159
167
|
};
|
|
160
168
|
|
|
169
|
+
// src/lib/tryCall.ts
|
|
170
|
+
var tryCall = async (func, name) => {
|
|
171
|
+
try {
|
|
172
|
+
return await func();
|
|
173
|
+
} catch (ex) {
|
|
174
|
+
if (name) {
|
|
175
|
+
const error = ex;
|
|
176
|
+
console.log(`tryCall failed [${name}]: ${error.message}`);
|
|
177
|
+
}
|
|
178
|
+
return void 0;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
161
182
|
// src/lib/getNftsOwnedByAddress.ts
|
|
162
183
|
var checkIpfsUrl2 = (urlToCheck, ipfsGateway2) => {
|
|
163
184
|
const url = new URL(urlToCheck);
|
|
@@ -195,66 +216,54 @@ var getNftMetadataUri = async (address, tokenId) => {
|
|
|
195
216
|
const results = await Promise.all([getErc721MetadataUri(address, tokenId), getErc1155MetadataUri(address, tokenId)]);
|
|
196
217
|
return results[0][0] ?? results[1][0];
|
|
197
218
|
};
|
|
198
|
-
var getNftsOwnedByAddress = async (publicAddress, provider, maxNfts = 1e3, timeout =
|
|
199
|
-
const endpoint =
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
externalUrl
|
|
217
|
-
name
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
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
|
|
222
237
|
}
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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
|
+
}
|
|
230
245
|
const nftResult = await Promise.all(
|
|
231
246
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
232
|
-
|
|
247
|
+
assets.map(async (nft) => {
|
|
233
248
|
try {
|
|
234
|
-
const {
|
|
249
|
+
const { collectionAddress, collectionTokenId } = nft;
|
|
235
250
|
let supply = "0x01";
|
|
236
|
-
const
|
|
237
|
-
const storage1155 = import_open_zeppelin_typechain3.ERC1155URIStorage__factory.connect(contractAddress, provider);
|
|
238
|
-
const types = await tokenTypes(storage1155);
|
|
251
|
+
const types = await tokenTypes(provider, collectionAddress);
|
|
239
252
|
if (types.includes("ERC1155")) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
} catch (ex) {
|
|
243
|
-
}
|
|
253
|
+
const supply1155 = import_open_zeppelin_typechain3.ERC1155Supply__factory.connect(collectionAddress, provider);
|
|
254
|
+
supply = await tryCall(async () => (await supply1155.totalSupply(collectionTokenId)).toHexString()) ?? "0x01";
|
|
244
255
|
}
|
|
245
256
|
const fields = {
|
|
246
|
-
address:
|
|
247
|
-
chainId:
|
|
248
|
-
metadata,
|
|
249
|
-
metadataUri: externalUrl,
|
|
257
|
+
address: collectionAddress,
|
|
258
|
+
chainId: provider.network.chainId,
|
|
250
259
|
supply,
|
|
251
|
-
tokenId,
|
|
260
|
+
tokenId: collectionTokenId,
|
|
252
261
|
type: types.at(0),
|
|
253
262
|
types
|
|
254
263
|
};
|
|
255
264
|
if (!fields.metadataUri || !fields.metadata) {
|
|
256
|
-
const [metadataUri,
|
|
257
|
-
fields.metadata =
|
|
265
|
+
const [metadataUri, metadata] = await getNftMetadata(collectionAddress, provider, fields.tokenId);
|
|
266
|
+
fields.metadata = metadata;
|
|
258
267
|
fields.metadataUri = metadataUri;
|
|
259
268
|
}
|
|
260
269
|
return fields;
|
|
@@ -271,18 +280,27 @@ var getNftsOwnedByAddress = async (publicAddress, provider, maxNfts = 1e3, timeo
|
|
|
271
280
|
|
|
272
281
|
// src/lib/getProvider.ts
|
|
273
282
|
var import_providers2 = require("@ethersproject/providers");
|
|
274
|
-
var
|
|
283
|
+
var getProviderFromEnvInternal = (chainId = 1) => {
|
|
284
|
+
console.log(`getProviderFromEnvInternal: ${chainId}`);
|
|
275
285
|
const infuraWssUri = process.env.INFURA_WSS_URI;
|
|
276
|
-
const infuraProvider = new import_providers2.InfuraProvider(
|
|
286
|
+
const infuraProvider = new import_providers2.InfuraProvider(chainId, {
|
|
277
287
|
projectId: process.env.INFURA_PROJECT_ID,
|
|
278
288
|
projectSecret: process.env.INFURA_PROJECT_SECRET
|
|
279
289
|
});
|
|
280
|
-
const
|
|
281
|
-
const
|
|
282
|
-
const
|
|
283
|
-
const
|
|
290
|
+
const infuraGenericWebsocketProvider = infuraWssUri ? new import_providers2.WebSocketProvider(infuraWssUri, chainId) : void 0;
|
|
291
|
+
const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI;
|
|
292
|
+
const quickNodeWebSocketProvider = quickNodeWSSUri ? new import_providers2.WebSocketProvider(quickNodeWSSUri, chainId) : void 0;
|
|
293
|
+
const quickNodeHttpsUri = process.env.QUICKNODE_WSS_URI;
|
|
294
|
+
const quickRpcProvider = quickNodeHttpsUri ? new import_providers2.JsonRpcProvider(quickNodeHttpsUri, chainId) : void 0;
|
|
295
|
+
const provider = infuraProvider ?? quickNodeWebSocketProvider ?? infuraProvider ?? infuraGenericWebsocketProvider ?? quickRpcProvider;
|
|
284
296
|
return provider;
|
|
285
297
|
};
|
|
298
|
+
var providers = {};
|
|
299
|
+
var getProviderFromEnv = (chainId = 1) => {
|
|
300
|
+
console.log(`getProviderFromEnv: ${chainId}`);
|
|
301
|
+
providers[chainId] = providers[chainId] ?? getProviderFromEnvInternal(chainId);
|
|
302
|
+
return providers[chainId];
|
|
303
|
+
};
|
|
286
304
|
|
|
287
305
|
// src/Witness.ts
|
|
288
306
|
var schema = import_crypto_nft_payload_plugin.NftSchema;
|
|
@@ -293,32 +311,38 @@ var CryptoWalletNftWitness = class extends import_abstract_witness.AbstractWitne
|
|
|
293
311
|
return this.params.provider;
|
|
294
312
|
}
|
|
295
313
|
get timeout() {
|
|
296
|
-
return this.config.timeout ??
|
|
314
|
+
return this.config.timeout ?? 1e4;
|
|
297
315
|
}
|
|
298
316
|
async observeHandler(payloads) {
|
|
299
317
|
await this.started("throw");
|
|
300
318
|
const queries = payloads?.filter(import_crypto_nft_payload_plugin.isNftWitnessQuery) ?? [];
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
319
|
+
try {
|
|
320
|
+
const observations = await Promise.all(
|
|
321
|
+
queries.map(async (query) => {
|
|
322
|
+
const addressValue = (0, import_assert3.assertEx)(query?.address ?? this.config.address, "params.address is required");
|
|
323
|
+
const parsedAddressValue = import_eth_address.EthAddress.parse(addressValue);
|
|
324
|
+
const address = (0, import_assert3.assertEx)(parsedAddressValue?.toString(), "Failed to parse params.address");
|
|
325
|
+
const network = this.provider.network;
|
|
326
|
+
const chainId = (0, import_assert3.assertEx)(network.chainId, "params.chainId is required");
|
|
327
|
+
const maxNfts = query?.maxNfts || defaultMaxNfts;
|
|
328
|
+
try {
|
|
329
|
+
const nfts = await getNftsOwnedByAddress(address, this.provider, maxNfts, this.timeout);
|
|
330
|
+
const observation = nfts.map((nft) => {
|
|
331
|
+
return { ...nft, schema };
|
|
332
|
+
});
|
|
333
|
+
return observation;
|
|
334
|
+
} catch (ex) {
|
|
335
|
+
const error = ex;
|
|
336
|
+
throw Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`);
|
|
337
|
+
}
|
|
338
|
+
})
|
|
339
|
+
);
|
|
340
|
+
return observations.flat();
|
|
341
|
+
} catch (ex) {
|
|
342
|
+
const error = ex;
|
|
343
|
+
console.error(error);
|
|
344
|
+
return [];
|
|
345
|
+
}
|
|
322
346
|
}
|
|
323
347
|
};
|
|
324
348
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/getNftsOwnedByAddress.ts","../../src/lib/getInfuraProvider.ts","../../src/lib/getNftMetadata.ts","../../src/lib/tokenTypes.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 { Provider } 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: Provider\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 ?? 2000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n const observations = await Promise.all(\n queries.map(async (query) => {\n const address = assertEx(\n EthAddress.parse(assertEx(query?.address || this.config.address, 'params.address is required')),\n 'Failed to parse params.address',\n ).toString()\n const network = await this.provider.getNetwork()\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 (error) {\n throw new Error(`Failed to get nfts for address ${address} on chainId ${chainId}`)\n }\n }),\n )\n return observations.flat()\n }\n}\n","import { Provider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\nimport { Account } from '@xyo-network/account'\nimport { ApiGraphqlWitness, ApiGraphqlWitnessConfigSchema, GraphqlQuery, GraphqlQuerySchema, GraphqlResult } from '@xyo-network/api-graphql-plugin'\nimport { NftInfoFields, NftMetadata } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155__factory, ERC1155Supply__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { getInfuraProvider } from './getInfuraProvider'\nimport { getNftMetadata } from './getNftMetadata'\nimport { tokenTypes } from './tokenTypes'\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 QuickNodeNft {\n contractAddress: string\n externalUrl: string\n metadata: NftMetadata\n name: string\n tokenId: string\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: Provider,\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 = 2000,\n): Promise<NftInfoFields[]> => {\n const endpoint = 'https://api.quicknode.com/graphql'\n const witness = await ApiGraphqlWitness.create({\n account: Account.randomSync(),\n config: { schema: ApiGraphqlWitnessConfigSchema, timeout },\n endpoint,\n })\n const query: GraphqlQuery = {\n query: `query Query {\n ethereum {\n walletByAddress(address: \"${publicAddress}\") {\n walletNFTs (first: ${maxNfts}) {\n edges {\n node {\n nft {\n contractAddress\n metadata\n tokenId\n externalUrl\n name\n }\n }\n }\n }\n }\n }\n }`,\n schema: GraphqlQuerySchema,\n variables: {},\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const results = (await witness.observe([query])) as GraphqlResult<any>[]\n const witnessResult = assertEx(results.at(0), 'ApiGraphqlWitness failed')\n\n const nftResult = await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.values(witnessResult.result?.data?.ethereum?.walletByAddress?.walletNFTs?.edges ?? {}).map(async (nft: any) => {\n try {\n const { contractAddress, tokenId, metadata, externalUrl } = nft.node.nft as QuickNodeNft\n let supply = '0x01'\n const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n const types = await tokenTypes(storage1155)\n if (types.includes('ERC1155')) {\n try {\n supply = (await supply1155.totalSupply(tokenId)).toHexString()\n } catch (ex) {\n //const error = ex as Error\n //console.error(`supply: ${error.message}`)\n }\n }\n const fields: NftInfoFields = {\n address: contractAddress,\n chainId: (await provider.getNetwork()).chainId,\n metadata,\n metadataUri: externalUrl,\n supply,\n tokenId,\n type: types.at(0),\n types,\n }\n if (!fields.metadataUri || !fields.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(contractAddress, 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 { Provider } 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: Provider,\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(storage1155)\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(enumerable721)\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 { Interface } from '@ethersproject/abi'\nimport { Contract } from '@ethersproject/contracts'\nimport { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\n\nexport const isErc1155 = async (contract: Contract) => {\n return await hasFunctions(contract, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (contract: Contract) => {\n return await hasFunctions(contract, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const hasFunctions = async (contract: Contract, contractInterface: Interface, functionNames: string[]) => {\n const bytecode = await contract.provider.getCode(contract.address)\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}\n\nexport const tokenTypes = async (contract: Contract) => {\n const [erc721, erc1155] = await Promise.all([isErc721(contract), isErc1155(contract)])\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","import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers'\n\nexport const getProviderFromEnv = (chainId: string | number = 'homestead') => {\n const infuraWssUri = process.env.INFURA_WSS_URI\n const infuraProvider = new InfuraProvider('homestead', {\n projectId: process.env.INFURA_PROJECT_ID,\n projectSecret: process.env.INFURA_PROJECT_SECRET,\n })\n\n const infuraWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : undefined\n\n const quickNodeUri = process.env.QUICKNODE_WSS_URI\n const quickNodeProvider = quickNodeUri ? new WebSocketProvider(quickNodeUri, chainId) : undefined\n\n const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider\n return provider\n}\n"],"mappings":"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","names":["checkIpfsUrl","import_crypto_nft_payload_plugin","import_assert","import_assert","import_open_zeppelin_typechain","import_open_zeppelin_typechain","ipfsGateway","ex","checkIpfsUrl","ipfsGateway","metadata","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/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"]}
|