@xyo-network/crypto-nft-collection-witness-plugin 2.78.2 → 2.78.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/Plugin.d.cts +2 -0
- package/dist/browser/Plugin.d.cts.map +1 -1
- package/dist/browser/Plugin.d.mts +2 -0
- package/dist/browser/Plugin.d.mts.map +1 -1
- package/dist/browser/Plugin.d.ts +2 -0
- package/dist/browser/Plugin.d.ts.map +1 -1
- package/dist/browser/Witness.d.cts +6 -1
- package/dist/browser/Witness.d.cts.map +1 -1
- package/dist/browser/Witness.d.mts +6 -1
- package/dist/browser/Witness.d.mts.map +1 -1
- package/dist/browser/Witness.d.ts +6 -1
- package/dist/browser/Witness.d.ts.map +1 -1
- package/dist/browser/index.cjs +96 -87
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +94 -85
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/lib/getNftCollectionNfts.d.cts +3 -2
- package/dist/browser/lib/getNftCollectionNfts.d.cts.map +1 -1
- package/dist/browser/lib/getNftCollectionNfts.d.mts +3 -2
- package/dist/browser/lib/getNftCollectionNfts.d.mts.map +1 -1
- package/dist/browser/lib/getNftCollectionNfts.d.ts +3 -2
- package/dist/browser/lib/getNftCollectionNfts.d.ts.map +1 -1
- package/dist/browser/lib/{getProvider.d.cts → getProviderFromEnv.d.cts} +1 -1
- package/dist/browser/lib/getProviderFromEnv.d.cts.map +1 -0
- package/dist/browser/lib/{getProvider.d.mts → getProviderFromEnv.d.mts} +1 -1
- package/dist/browser/lib/getProviderFromEnv.d.mts.map +1 -0
- package/dist/browser/lib/{getProvider.d.ts → getProviderFromEnv.d.ts} +1 -1
- package/dist/browser/lib/getProviderFromEnv.d.ts.map +1 -0
- package/dist/browser/lib/index.d.cts +2 -2
- package/dist/browser/lib/index.d.cts.map +1 -1
- package/dist/browser/lib/index.d.mts +2 -2
- package/dist/browser/lib/index.d.mts.map +1 -1
- package/dist/browser/lib/index.d.ts +2 -2
- package/dist/browser/lib/index.d.ts.map +1 -1
- package/dist/browser/lib/tokenTypes.d.cts +8 -0
- package/dist/browser/lib/tokenTypes.d.cts.map +1 -0
- package/dist/browser/lib/tokenTypes.d.mts +8 -0
- package/dist/browser/lib/tokenTypes.d.mts.map +1 -0
- package/dist/browser/lib/tokenTypes.d.ts +8 -0
- package/dist/browser/lib/tokenTypes.d.ts.map +1 -0
- package/dist/node/Plugin.d.cts +2 -0
- package/dist/node/Plugin.d.cts.map +1 -1
- package/dist/node/Plugin.d.mts +2 -0
- package/dist/node/Plugin.d.mts.map +1 -1
- package/dist/node/Plugin.d.ts +2 -0
- package/dist/node/Plugin.d.ts.map +1 -1
- package/dist/node/Witness.d.cts +6 -1
- package/dist/node/Witness.d.cts.map +1 -1
- package/dist/node/Witness.d.mts +6 -1
- package/dist/node/Witness.d.mts.map +1 -1
- package/dist/node/Witness.d.ts +6 -1
- package/dist/node/Witness.d.ts.map +1 -1
- package/dist/node/index.js +102 -91
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +94 -85
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/lib/getNftCollectionNfts.d.cts +3 -2
- package/dist/node/lib/getNftCollectionNfts.d.cts.map +1 -1
- package/dist/node/lib/getNftCollectionNfts.d.mts +3 -2
- package/dist/node/lib/getNftCollectionNfts.d.mts.map +1 -1
- package/dist/node/lib/getNftCollectionNfts.d.ts +3 -2
- package/dist/node/lib/getNftCollectionNfts.d.ts.map +1 -1
- package/dist/node/lib/{getProvider.d.cts → getProviderFromEnv.d.cts} +1 -1
- package/dist/node/lib/getProviderFromEnv.d.cts.map +1 -0
- package/dist/node/lib/getProviderFromEnv.d.mts +3 -0
- package/dist/node/lib/getProviderFromEnv.d.mts.map +1 -0
- package/dist/node/lib/getProviderFromEnv.d.ts +3 -0
- package/dist/node/lib/getProviderFromEnv.d.ts.map +1 -0
- package/dist/node/lib/index.d.cts +2 -2
- package/dist/node/lib/index.d.cts.map +1 -1
- package/dist/node/lib/index.d.mts +2 -2
- package/dist/node/lib/index.d.mts.map +1 -1
- package/dist/node/lib/index.d.ts +2 -2
- package/dist/node/lib/index.d.ts.map +1 -1
- package/dist/node/lib/tokenTypes.d.cts +8 -0
- package/dist/node/lib/tokenTypes.d.cts.map +1 -0
- package/dist/node/lib/tokenTypes.d.mts +8 -0
- package/dist/node/lib/tokenTypes.d.mts.map +1 -0
- package/dist/node/lib/tokenTypes.d.ts +8 -0
- package/dist/node/lib/tokenTypes.d.ts.map +1 -0
- package/package.json +15 -11
- package/src/Witness.ts +51 -9
- package/src/lib/getNftCollectionNfts.ts +11 -9
- package/src/lib/index.ts +2 -2
- package/src/lib/tokenTypes.ts +36 -0
- package/dist/browser/lib/getNftCollectionCount.d.cts +0 -2
- package/dist/browser/lib/getNftCollectionCount.d.cts.map +0 -1
- package/dist/browser/lib/getNftCollectionCount.d.mts +0 -2
- package/dist/browser/lib/getNftCollectionCount.d.mts.map +0 -1
- package/dist/browser/lib/getNftCollectionCount.d.ts +0 -2
- package/dist/browser/lib/getNftCollectionCount.d.ts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.cts +0 -5
- package/dist/browser/lib/getNftCollectionMetadata.d.cts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.mts +0 -5
- package/dist/browser/lib/getNftCollectionMetadata.d.mts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.ts +0 -5
- package/dist/browser/lib/getNftCollectionMetadata.d.ts.map +0 -1
- package/dist/browser/lib/getProvider.d.cts.map +0 -1
- package/dist/browser/lib/getProvider.d.mts.map +0 -1
- package/dist/browser/lib/getProvider.d.ts.map +0 -1
- package/dist/node/lib/getNftCollectionCount.d.cts +0 -2
- package/dist/node/lib/getNftCollectionCount.d.cts.map +0 -1
- package/dist/node/lib/getNftCollectionCount.d.mts +0 -2
- package/dist/node/lib/getNftCollectionCount.d.mts.map +0 -1
- package/dist/node/lib/getNftCollectionCount.d.ts +0 -2
- package/dist/node/lib/getNftCollectionCount.d.ts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.cts +0 -5
- package/dist/node/lib/getNftCollectionMetadata.d.cts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.mts +0 -5
- package/dist/node/lib/getNftCollectionMetadata.d.mts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.ts +0 -5
- package/dist/node/lib/getNftCollectionMetadata.d.ts.map +0 -1
- package/dist/node/lib/getProvider.d.cts.map +0 -1
- package/dist/node/lib/getProvider.d.mts +0 -3
- package/dist/node/lib/getProvider.d.mts.map +0 -1
- package/dist/node/lib/getProvider.d.ts +0 -3
- package/dist/node/lib/getProvider.d.ts.map +0 -1
- package/src/lib/getNftCollectionCount.ts +0 -22
- package/src/lib/getNftCollectionMetadata.ts +0 -58
- /package/src/lib/{getProvider.ts → getProviderFromEnv.ts} +0 -0
|
@@ -52,5 +52,7 @@ export declare const CryptoNftCollectionWitnessPlugin: () => import("@xyo-networ
|
|
|
52
52
|
};
|
|
53
53
|
ephemeralQueryAccountEnabled?: boolean | undefined;
|
|
54
54
|
wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
|
|
55
|
+
} & {
|
|
56
|
+
provider: import("@ethersproject/abstract-provider").Provider;
|
|
55
57
|
}>>;
|
|
56
58
|
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC
|
|
1
|
+
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}
|
|
@@ -52,5 +52,7 @@ export declare const CryptoNftCollectionWitnessPlugin: () => import("@xyo-networ
|
|
|
52
52
|
};
|
|
53
53
|
ephemeralQueryAccountEnabled?: boolean | undefined;
|
|
54
54
|
wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
|
|
55
|
+
} & {
|
|
56
|
+
provider: import("@ethersproject/abstract-provider").Provider;
|
|
55
57
|
}>>;
|
|
56
58
|
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC
|
|
1
|
+
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}
|
package/dist/browser/Plugin.d.ts
CHANGED
|
@@ -52,5 +52,7 @@ export declare const CryptoNftCollectionWitnessPlugin: () => import("@xyo-networ
|
|
|
52
52
|
};
|
|
53
53
|
ephemeralQueryAccountEnabled?: boolean | undefined;
|
|
54
54
|
wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
|
|
55
|
+
} & {
|
|
56
|
+
provider: import("@ethersproject/abstract-provider").Provider;
|
|
55
57
|
}>>;
|
|
56
58
|
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC
|
|
1
|
+
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { InfuraProvider, Provider, WebSocketProvider } from '@ethersproject/providers';
|
|
1
2
|
import { AbstractWitness } from '@xyo-network/abstract-witness';
|
|
2
3
|
import { NftCollectionInfo, NftCollectionWitnessConfig, NftCollectionWitnessQuery } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
4
|
import { AnyConfigSchema } from '@xyo-network/module-model';
|
|
4
5
|
import { WitnessParams } from '@xyo-network/witness-model';
|
|
5
|
-
export type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig
|
|
6
|
+
export type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig>, {
|
|
7
|
+
provider: Provider;
|
|
8
|
+
}>;
|
|
6
9
|
export declare class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {
|
|
7
10
|
static configSchemas: "network.xyo.crypto.nft.collection.witness.config"[];
|
|
11
|
+
protected providers: Record<number, WebSocketProvider | InfuraProvider>;
|
|
12
|
+
protected getProvider(chainId: number): WebSocketProvider | InfuraProvider;
|
|
8
13
|
protected observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]>;
|
|
9
14
|
}
|
|
10
15
|
//# sourceMappingURL=Witness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAGtF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAEL,iBAAiB,EAEjB,0BAA0B,EAE1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,gCAAgC,GAAG,aAAa,CAC1D,eAAe,CAAC,0BAA0B,CAAC,EAC3C;IACE,QAAQ,EAAE,QAAQ,CAAA;CACnB,CACF,CAAA;AAoBD,qBAAa,0BAA0B,CAAC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CAAE,SAAQ,eAAe,CAClJ,OAAO,EACP,yBAAyB,EACzB,iBAAiB,CAClB;IACC,OAAgB,aAAa,uDAAqC;IAElE,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,CAAC,CAAK;IAE5E,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM;cAKZ,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAiD9G"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { InfuraProvider, Provider, WebSocketProvider } from '@ethersproject/providers';
|
|
1
2
|
import { AbstractWitness } from '@xyo-network/abstract-witness';
|
|
2
3
|
import { NftCollectionInfo, NftCollectionWitnessConfig, NftCollectionWitnessQuery } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
4
|
import { AnyConfigSchema } from '@xyo-network/module-model';
|
|
4
5
|
import { WitnessParams } from '@xyo-network/witness-model';
|
|
5
|
-
export type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig
|
|
6
|
+
export type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig>, {
|
|
7
|
+
provider: Provider;
|
|
8
|
+
}>;
|
|
6
9
|
export declare class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {
|
|
7
10
|
static configSchemas: "network.xyo.crypto.nft.collection.witness.config"[];
|
|
11
|
+
protected providers: Record<number, WebSocketProvider | InfuraProvider>;
|
|
12
|
+
protected getProvider(chainId: number): WebSocketProvider | InfuraProvider;
|
|
8
13
|
protected observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]>;
|
|
9
14
|
}
|
|
10
15
|
//# sourceMappingURL=Witness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAGtF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAEL,iBAAiB,EAEjB,0BAA0B,EAE1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,gCAAgC,GAAG,aAAa,CAC1D,eAAe,CAAC,0BAA0B,CAAC,EAC3C;IACE,QAAQ,EAAE,QAAQ,CAAA;CACnB,CACF,CAAA;AAoBD,qBAAa,0BAA0B,CAAC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CAAE,SAAQ,eAAe,CAClJ,OAAO,EACP,yBAAyB,EACzB,iBAAiB,CAClB;IACC,OAAgB,aAAa,uDAAqC;IAElE,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,CAAC,CAAK;IAE5E,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM;cAKZ,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAiD9G"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { InfuraProvider, Provider, WebSocketProvider } from '@ethersproject/providers';
|
|
1
2
|
import { AbstractWitness } from '@xyo-network/abstract-witness';
|
|
2
3
|
import { NftCollectionInfo, NftCollectionWitnessConfig, NftCollectionWitnessQuery } from '@xyo-network/crypto-nft-collection-payload-plugin';
|
|
3
4
|
import { AnyConfigSchema } from '@xyo-network/module-model';
|
|
4
5
|
import { WitnessParams } from '@xyo-network/witness-model';
|
|
5
|
-
export type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig
|
|
6
|
+
export type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig>, {
|
|
7
|
+
provider: Provider;
|
|
8
|
+
}>;
|
|
6
9
|
export declare class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {
|
|
7
10
|
static configSchemas: "network.xyo.crypto.nft.collection.witness.config"[];
|
|
11
|
+
protected providers: Record<number, WebSocketProvider | InfuraProvider>;
|
|
12
|
+
protected getProvider(chainId: number): WebSocketProvider | InfuraProvider;
|
|
8
13
|
protected observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]>;
|
|
9
14
|
}
|
|
10
15
|
//# sourceMappingURL=Witness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAGtF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAEL,iBAAiB,EAEjB,0BAA0B,EAE1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI1D,MAAM,MAAM,gCAAgC,GAAG,aAAa,CAC1D,eAAe,CAAC,0BAA0B,CAAC,EAC3C;IACE,QAAQ,EAAE,QAAQ,CAAA;CACnB,CACF,CAAA;AAoBD,qBAAa,0BAA0B,CAAC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CAAE,SAAQ,eAAe,CAClJ,OAAO,EACP,yBAAyB,EACzB,iBAAiB,CAClB;IACC,OAAgB,aAAa,uDAAqC;IAElE,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,CAAC,CAAK;IAE5E,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM;cAKZ,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAiD9G"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -24,11 +24,13 @@ __export(src_exports, {
|
|
|
24
24
|
CryptoNftCollectionWitnessPlugin: () => CryptoNftCollectionWitnessPlugin,
|
|
25
25
|
checkIpfsUrl: () => checkIpfsUrl,
|
|
26
26
|
default: () => src_default,
|
|
27
|
-
getInterfaceID: () => getInterfaceID,
|
|
28
|
-
getNftCollectionCount: () => getNftCollectionCount,
|
|
29
|
-
getNftCollectionMetadata: () => getNftCollectionMetadata,
|
|
30
27
|
getNftCollectionMetrics: () => getNftCollectionMetrics,
|
|
31
|
-
getNftCollectionNfts: () => getNftCollectionNfts
|
|
28
|
+
getNftCollectionNfts: () => getNftCollectionNfts,
|
|
29
|
+
getProviderFromEnv: () => getProviderFromEnv,
|
|
30
|
+
hasFunctions: () => hasFunctions,
|
|
31
|
+
isErc1155: () => isErc1155,
|
|
32
|
+
isErc721: () => isErc721,
|
|
33
|
+
tokenTypes: () => tokenTypes
|
|
32
34
|
});
|
|
33
35
|
module.exports = __toCommonJS(src_exports);
|
|
34
36
|
|
|
@@ -43,6 +45,7 @@ var import_eth_address = require("@xylabs/eth-address");
|
|
|
43
45
|
var import_abstract_witness = require("@xyo-network/abstract-witness");
|
|
44
46
|
var import_core = require("@xyo-network/core");
|
|
45
47
|
var import_crypto_nft_collection_payload_plugin = require("@xyo-network/crypto-nft-collection-payload-plugin");
|
|
48
|
+
var import_open_zeppelin_typechain3 = require("@xyo-network/open-zeppelin-typechain");
|
|
46
49
|
|
|
47
50
|
// src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
|
|
48
51
|
var calculateAllPropertiesDistribution = (array) => {
|
|
@@ -101,23 +104,10 @@ var getNftCollectionMetrics = (nfts) => {
|
|
|
101
104
|
return { metadata: { attributes } };
|
|
102
105
|
};
|
|
103
106
|
|
|
104
|
-
// src/lib/
|
|
105
|
-
var
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
var import_providers = require("@ethersproject/providers");
|
|
109
|
-
var getProviderFromEnv = (chainId = "homestead") => {
|
|
110
|
-
const infuraWssUri = process.env.INFURA_WSS_URI;
|
|
111
|
-
const infuraProvider = new import_providers.InfuraProvider("homestead", {
|
|
112
|
-
projectId: process.env.INFURA_PROJECT_ID,
|
|
113
|
-
projectSecret: process.env.INFURA_PROJECT_SECRET
|
|
114
|
-
});
|
|
115
|
-
const infuraWebsocketProvider = infuraWssUri ? new import_providers.WebSocketProvider(infuraWssUri, chainId) : void 0;
|
|
116
|
-
const quickNodeUri = process.env.QUICKNODE_WSS_URI;
|
|
117
|
-
const quickNodeProvider = quickNodeUri ? new import_providers.WebSocketProvider(quickNodeUri, chainId) : void 0;
|
|
118
|
-
const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider;
|
|
119
|
-
return provider;
|
|
120
|
-
};
|
|
107
|
+
// src/lib/getNftCollectionNfts.ts
|
|
108
|
+
var import_axios = require("@xyo-network/axios");
|
|
109
|
+
var import_crypto_nft_payload_plugin = require("@xyo-network/crypto-nft-payload-plugin");
|
|
110
|
+
var import_open_zeppelin_typechain2 = require("@xyo-network/open-zeppelin-typechain");
|
|
121
111
|
|
|
122
112
|
// src/lib/nonEvaluableContractAddresses.ts
|
|
123
113
|
var nonEvaluableContractAddresses = [
|
|
@@ -125,63 +115,38 @@ var nonEvaluableContractAddresses = [
|
|
|
125
115
|
"0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72"
|
|
126
116
|
].map((address) => address.toUpperCase());
|
|
127
117
|
|
|
128
|
-
// src/lib/
|
|
129
|
-
var
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
const provider = getProviderFromEnv(chainId);
|
|
134
|
-
const contract = import_open_zeppelin_typechain.ERC721Enumerable__factory.connect(contractAddress, provider);
|
|
135
|
-
return (await contract.totalSupply()).toNumber();
|
|
118
|
+
// src/lib/tokenTypes.ts
|
|
119
|
+
var import_open_zeppelin_typechain = require("@xyo-network/open-zeppelin-typechain");
|
|
120
|
+
var isErc1155 = async (contract) => {
|
|
121
|
+
return await hasFunctions(contract, import_open_zeppelin_typechain.ERC1155URIStorage__factory.createInterface(), ["uri"]);
|
|
136
122
|
};
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
var
|
|
141
|
-
|
|
142
|
-
let
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
var getNftCollectionMetadata = async (contractAddress, chainId) => {
|
|
150
|
-
if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
|
|
151
|
-
throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`);
|
|
152
|
-
}
|
|
153
|
-
const provider = getProviderFromEnv(chainId);
|
|
154
|
-
const contract721 = import_open_zeppelin_typechain2.ERC721Enumerable__factory.connect(contractAddress, provider);
|
|
155
|
-
const contract1155 = import_open_zeppelin_typechain2.ERC1155__factory.connect(contractAddress, provider);
|
|
156
|
-
let name = "";
|
|
157
|
-
try {
|
|
158
|
-
name = await contract721.name();
|
|
159
|
-
} catch (ex) {
|
|
160
|
-
const error = ex;
|
|
161
|
-
console.log(`name: ${error.message}`);
|
|
123
|
+
var isErc721 = async (contract) => {
|
|
124
|
+
return await hasFunctions(contract, import_open_zeppelin_typechain.IERC721Metadata__factory.createInterface(), ["name", "symbol", "tokenURI"]);
|
|
125
|
+
};
|
|
126
|
+
var hasFunctions = async (contract, contractInterface, functionNames) => {
|
|
127
|
+
const bytecode = await contract.provider.getCode(contract.address);
|
|
128
|
+
for (let i = 0; i < functionNames.length; i++) {
|
|
129
|
+
const nameSig = contractInterface.getSighash(functionNames[i]).substring(2);
|
|
130
|
+
if (!bytecode.includes(nameSig)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
162
134
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
135
|
+
return false;
|
|
136
|
+
};
|
|
137
|
+
var tokenTypes = async (contract) => {
|
|
138
|
+
const [erc721, erc1155] = await Promise.all([isErc721(contract), isErc1155(contract)]);
|
|
139
|
+
const result = [];
|
|
140
|
+
if (erc721) {
|
|
141
|
+
result.push("ERC721");
|
|
169
142
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
is1155 = await contract1155.supportsInterface(getInterfaceID(import_open_zeppelin_typechain2.ERC1155__factory.getInterface(import_open_zeppelin_typechain2.ERC1155__factory.abi)));
|
|
173
|
-
} catch (ex) {
|
|
174
|
-
const error = ex;
|
|
175
|
-
console.log(`is1155: ${error.message}`);
|
|
176
|
-
is1155 = false;
|
|
143
|
+
if (erc1155) {
|
|
144
|
+
result.push("ERC1155");
|
|
177
145
|
}
|
|
178
|
-
return
|
|
146
|
+
return result;
|
|
179
147
|
};
|
|
180
148
|
|
|
181
149
|
// src/lib/getNftCollectionNfts.ts
|
|
182
|
-
var import_axios = require("@xyo-network/axios");
|
|
183
|
-
var import_crypto_nft_payload_plugin = require("@xyo-network/crypto-nft-payload-plugin");
|
|
184
|
-
var import_open_zeppelin_typechain3 = require("@xyo-network/open-zeppelin-typechain");
|
|
185
150
|
var ipfsGateway = "5d7b6582.beta.decentralnetworkservices.com";
|
|
186
151
|
var checkIpfsUrl = (urlToCheck, ipfsGateway2) => {
|
|
187
152
|
const url = new URL(urlToCheck);
|
|
@@ -199,20 +164,20 @@ var checkIpfsUrl = (urlToCheck, ipfsGateway2) => {
|
|
|
199
164
|
return urlToCheck;
|
|
200
165
|
}
|
|
201
166
|
};
|
|
202
|
-
var getNftCollectionNfts = async (contractAddress,
|
|
167
|
+
var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 100) => {
|
|
203
168
|
if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
|
|
204
169
|
throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`);
|
|
205
170
|
}
|
|
206
171
|
const axios = new import_axios.AxiosJson({ timeout: 2e3 });
|
|
207
|
-
const
|
|
208
|
-
const
|
|
209
|
-
const
|
|
210
|
-
const
|
|
172
|
+
const enumerable = import_open_zeppelin_typechain2.ERC721Enumerable__factory.connect(contractAddress, provider);
|
|
173
|
+
const storage = import_open_zeppelin_typechain2.ERC721URIStorage__factory.connect(contractAddress, provider);
|
|
174
|
+
const supply1155 = import_open_zeppelin_typechain2.ERC1155Supply__factory.connect(contractAddress, provider);
|
|
175
|
+
const finalTypes = types ?? await tokenTypes(enumerable);
|
|
211
176
|
const result = [];
|
|
212
|
-
const { type: nftType } = await getNftCollectionMetadata(contractAddress, chainId);
|
|
213
177
|
for (let i = 0; i < maxNfts; i++) {
|
|
178
|
+
console.log(`Getting Token [${i}]`);
|
|
214
179
|
const tokenId = (await enumerable.tokenByIndex(i)).toHexString();
|
|
215
|
-
const supply =
|
|
180
|
+
const supply = finalTypes.includes((0, import_crypto_nft_payload_plugin.toTokenType)("ERC1155")) ? (await supply1155.totalSupply(tokenId)).toHexString() : "0x01";
|
|
216
181
|
const metadataUri = await storage.tokenURI(tokenId);
|
|
217
182
|
const checkedMetaDataUri = checkIpfsUrl(metadataUri, ipfsGateway);
|
|
218
183
|
let metadata = void 0;
|
|
@@ -224,49 +189,93 @@ var getNftCollectionNfts = async (contractAddress, chainId, maxNfts = 100) => {
|
|
|
224
189
|
}
|
|
225
190
|
const info = {
|
|
226
191
|
address: contractAddress,
|
|
227
|
-
chainId,
|
|
192
|
+
chainId: provider.network.chainId,
|
|
228
193
|
metadata,
|
|
229
194
|
metadataUri,
|
|
230
195
|
schema: import_crypto_nft_payload_plugin.NftSchema,
|
|
231
196
|
supply,
|
|
232
197
|
tokenId,
|
|
233
|
-
type:
|
|
198
|
+
type: finalTypes.at(0),
|
|
199
|
+
types
|
|
234
200
|
};
|
|
235
201
|
result.push(info);
|
|
236
202
|
}
|
|
237
203
|
return result;
|
|
238
204
|
};
|
|
239
205
|
|
|
206
|
+
// src/lib/getProviderFromEnv.ts
|
|
207
|
+
var import_providers = require("@ethersproject/providers");
|
|
208
|
+
var getProviderFromEnv = (chainId = "homestead") => {
|
|
209
|
+
const infuraWssUri = process.env.INFURA_WSS_URI;
|
|
210
|
+
const infuraProvider = new import_providers.InfuraProvider("homestead", {
|
|
211
|
+
projectId: process.env.INFURA_PROJECT_ID,
|
|
212
|
+
projectSecret: process.env.INFURA_PROJECT_SECRET
|
|
213
|
+
});
|
|
214
|
+
const infuraWebsocketProvider = infuraWssUri ? new import_providers.WebSocketProvider(infuraWssUri, chainId) : void 0;
|
|
215
|
+
const quickNodeUri = process.env.QUICKNODE_WSS_URI;
|
|
216
|
+
const quickNodeProvider = quickNodeUri ? new import_providers.WebSocketProvider(quickNodeUri, chainId) : void 0;
|
|
217
|
+
const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider;
|
|
218
|
+
return provider;
|
|
219
|
+
};
|
|
220
|
+
|
|
240
221
|
// src/Witness.ts
|
|
241
222
|
var defaultMaxNfts = 100;
|
|
242
223
|
var NoOp = Promise.resolve();
|
|
224
|
+
function resolvedValue(settled, assert) {
|
|
225
|
+
if (assert && settled.status === "rejected") {
|
|
226
|
+
throw settled.reason;
|
|
227
|
+
}
|
|
228
|
+
return settled.status === "fulfilled" ? settled.value : void 0;
|
|
229
|
+
}
|
|
243
230
|
var CryptoNftCollectionWitness = class extends import_abstract_witness.AbstractWitness {
|
|
244
231
|
static configSchemas = [import_crypto_nft_collection_payload_plugin.NftCollectionWitnessConfigSchema];
|
|
232
|
+
providers = {};
|
|
233
|
+
getProvider(chainId) {
|
|
234
|
+
this.providers[chainId] = this.providers[chainId] ?? getProviderFromEnv(chainId);
|
|
235
|
+
return this.providers[chainId];
|
|
236
|
+
}
|
|
245
237
|
async observeHandler(payloads) {
|
|
246
238
|
await this.started("throw");
|
|
247
239
|
const queries = payloads?.filter(import_crypto_nft_collection_payload_plugin.isNftCollectionWitnessQuery) ?? [];
|
|
248
240
|
const observations = await Promise.all(
|
|
249
241
|
queries.map(async (query) => {
|
|
242
|
+
const chainId = (0, import_assert.assertEx)(query?.chainId || this.config.chainId, "params.chainId is required");
|
|
243
|
+
const provider = this.getProvider(chainId);
|
|
250
244
|
const address = (0, import_assert.assertEx)(
|
|
251
245
|
import_eth_address.EthAddress.parse((0, import_assert.assertEx)(query?.address || this.config.address, "params.address is required")),
|
|
252
246
|
"Failed to parse params.address"
|
|
253
247
|
).toString();
|
|
254
|
-
const
|
|
248
|
+
const erc721Enumerable = import_open_zeppelin_typechain3.ERC721Enumerable__factory.connect(address, provider);
|
|
255
249
|
const maxNfts = query?.maxNfts || defaultMaxNfts;
|
|
256
|
-
const [
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
250
|
+
const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
|
|
251
|
+
await erc721Enumerable.name(),
|
|
252
|
+
await erc721Enumerable.symbol(),
|
|
253
|
+
(await erc721Enumerable.totalSupply()).toNumber(),
|
|
254
|
+
await tokenTypes(erc721Enumerable),
|
|
255
|
+
await this.writeArchivist()
|
|
261
256
|
]);
|
|
257
|
+
const types = resolvedValue(typesSettled, true);
|
|
258
|
+
const nfts = await getNftCollectionNfts(address, provider, types, maxNfts);
|
|
262
259
|
const metrics = getNftCollectionMetrics(nfts);
|
|
260
|
+
const archivist = resolvedValue(archivistSettled);
|
|
263
261
|
const [sources] = await Promise.all([
|
|
264
262
|
// Hash all the payloads
|
|
265
263
|
Promise.all(nfts.map((nft) => import_core.PayloadHasher.hashAsync(nft))),
|
|
266
264
|
// Insert them into the archivist if we have one
|
|
267
265
|
archivist ? archivist.insert(nfts) : NoOp
|
|
268
266
|
]);
|
|
269
|
-
const payload = {
|
|
267
|
+
const payload = {
|
|
268
|
+
address,
|
|
269
|
+
chainId,
|
|
270
|
+
metrics,
|
|
271
|
+
name: resolvedValue(name, true),
|
|
272
|
+
schema: import_crypto_nft_collection_payload_plugin.NftCollectionSchema,
|
|
273
|
+
sources,
|
|
274
|
+
symbol: resolvedValue(symbol, true),
|
|
275
|
+
total: resolvedValue(total, true),
|
|
276
|
+
type: types.at(0),
|
|
277
|
+
types
|
|
278
|
+
};
|
|
270
279
|
return payload;
|
|
271
280
|
})
|
|
272
281
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/getNftCollectionCount.ts","../../src/lib/getProvider.ts","../../src/lib/nonEvaluableContractAddresses.ts","../../src/lib/getNftCollectionMetadata.ts","../../src/lib/getNftCollectionNfts.ts"],"sourcesContent":["import { CryptoNftCollectionWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoNftCollectionWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoNftCollectionWitnessPlugin\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 { CryptoNftCollectionWitness } from './Witness'\n\nexport const CryptoNftCollectionWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoNftCollectionWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoNftCollectionWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { PayloadHasher } from '@xyo-network/core'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { WitnessParams } from '@xyo-network/witness-model'\n\nimport { getNftCollectionCount, getNftCollectionMetadata, getNftCollectionMetrics, getNftCollectionNfts } from './lib'\n\nexport type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig>>\n\nconst defaultMaxNfts = 100\n\n/**\n * A \"no operation\" Promise to be used\n * when no action is desired but a Promise\n * is required to be returned\n */\nconst NoOp = Promise.resolve()\n\nexport class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractWitness<\n TParams,\n NftCollectionWitnessQuery,\n NftCollectionInfo\n> {\n static override configSchemas = [NftCollectionWitnessConfigSchema]\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? []\n const observations = await Promise.all(\n queries.map<Promise<NftCollectionInfo>>(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 chainId = assertEx(query?.chainId || this.config.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n const [info, total, nfts, archivist] = await Promise.all([\n getNftCollectionMetadata(address, chainId),\n getNftCollectionCount(address, chainId),\n getNftCollectionNfts(address, chainId, maxNfts),\n this.writeArchivist(),\n ])\n const metrics = getNftCollectionMetrics(nfts)\n const [sources] = await Promise.all([\n // Hash all the payloads\n Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: NftCollectionInfo = { ...info, metrics, schema: NftCollectionSchema, sources, total }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n","import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n","import { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { getProviderFromEnv } from './getProvider'\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\n\nexport const getNftCollectionCount = 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 chainId: number,\n): Promise<number> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const provider = getProviderFromEnv(chainId)\n const contract = ERC721Enumerable__factory.connect(contractAddress, provider)\n return (await contract.totalSupply()).toNumber()\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","/**\n * These contracts are not evaluable for some\n * reason (too large, nonsensical, etc.)\n */\nexport const nonEvaluableContractAddresses = [\n // ENS\n '0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72',\n].map((address) => address.toUpperCase())\n","import { Interface } from '@ethersproject/abi'\nimport { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory, ERC1155__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { constants } from 'ethers'\n\nimport { getProviderFromEnv } from './getProvider'\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\n\nexport function getInterfaceID(contractInterface: Interface) {\n let interfaceID = constants.Zero\n const functions: string[] = Object.keys(contractInterface.functions)\n for (let i = 0; i < functions.length; i++) {\n interfaceID = interfaceID.xor(contractInterface.getSighash(functions[i]))\n }\n\n return interfaceID.toHexString()\n}\n\nexport const getNftCollectionMetadata = 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 chainId: number,\n): Promise<Omit<NftCollectionMetadata, 'total'>> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const provider = getProviderFromEnv(chainId)\n const contract721 = ERC721Enumerable__factory.connect(contractAddress, provider)\n const contract1155 = ERC1155__factory.connect(contractAddress, provider)\n let name: string = ''\n try {\n name = await contract721.name()\n } catch (ex) {\n const error = ex as Error\n console.log(`name: ${error.message}`)\n }\n let symbol: string = ''\n try {\n symbol = await contract721.symbol()\n } catch (ex) {\n const error = ex as Error\n console.log(`symbol: ${error.message}`)\n }\n let is1155: boolean = false\n try {\n is1155 = await contract1155.supportsInterface(getInterfaceID(ERC1155__factory.getInterface(ERC1155__factory.abi)))\n } catch (ex) {\n const error = ex as Error\n console.log(`is1155: ${error.message}`)\n is1155 = false\n }\n return { address: contractAddress, chainId, name, symbol, type: is1155 ? 'ERC1155' : 'ERC721' }\n}\n","import { AxiosJson } from '@xyo-network/axios'\nimport { NftInfo, NftMetadata, NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { getNftCollectionMetadata } from './getNftCollectionMetadata'\nimport { getProviderFromEnv } from './getProvider'\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\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 getNftCollectionNfts = 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 chainId: number,\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 maxNfts = 100,\n): Promise<NftInfo[]> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const axios = new AxiosJson({ timeout: 2000 })\n const provider = getProviderFromEnv(chainId)\n const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider)\n const storage = ERC721URIStorage__factory.connect(contractAddress, provider)\n const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider)\n const result: NftInfo[] = []\n const { type: nftType } = await getNftCollectionMetadata(contractAddress, chainId)\n\n for (let i = 0; i < maxNfts; i++) {\n const tokenId = (await enumerable.tokenByIndex(i)).toHexString()\n const supply = nftType === toTokenType('ERC11155') ? (await supply1155.totalSupply(tokenId)).toHexString() : '0x01'\n const metadataUri = await storage.tokenURI(tokenId)\n const checkedMetaDataUri = checkIpfsUrl(metadataUri, ipfsGateway)\n let metadata: NftMetadata | undefined = undefined\n try {\n metadata = (await axios.get(checkedMetaDataUri)).data\n } catch (ex) {\n const error = ex as Error\n console.error(error.message)\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId,\n metadata,\n metadataUri,\n schema: NftSchema,\n supply,\n tokenId,\n type: nftType,\n }\n result.push(info)\n }\n return result\n}\n"],"mappings":"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","names":["import_crypto_nft_payload_plugin","attributes","p","import_open_zeppelin_typechain","import_open_zeppelin_typechain","ipfsGateway"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/getNftCollectionNfts.ts","../../src/lib/nonEvaluableContractAddresses.ts","../../src/lib/tokenTypes.ts","../../src/lib/getProviderFromEnv.ts"],"sourcesContent":["import { CryptoNftCollectionWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoNftCollectionWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoNftCollectionWitnessPlugin\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 { CryptoNftCollectionWitness } from './Witness'\n\nexport const CryptoNftCollectionWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoNftCollectionWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoNftCollectionWitness.create(params)\n return result\n },\n },\n )\n","import { InfuraProvider, Provider, WebSocketProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { PayloadHasher } from '@xyo-network/core'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { WitnessParams } from '@xyo-network/witness-model'\n\nimport { getNftCollectionMetrics, getNftCollectionNfts, getProviderFromEnv, tokenTypes } from './lib'\n\nexport type CryptoNftCollectionWitnessParams = WitnessParams<\n AnyConfigSchema<NftCollectionWitnessConfig>,\n {\n provider: Provider\n }\n>\n\nconst defaultMaxNfts = 100\n\n/**\n * A \"no operation\" Promise to be used\n * when no action is desired but a Promise\n * is required to be returned\n */\nconst NoOp = Promise.resolve()\n\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert: true): T\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: false): T | undefined\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: boolean) {\n if (assert && settled.status === 'rejected') {\n throw settled.reason\n }\n return settled.status === 'fulfilled' ? settled.value : undefined\n}\n\nexport class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractWitness<\n TParams,\n NftCollectionWitnessQuery,\n NftCollectionInfo\n> {\n static override configSchemas = [NftCollectionWitnessConfigSchema]\n\n protected providers: Record<number, WebSocketProvider | InfuraProvider> = {}\n\n protected getProvider(chainId: number) {\n this.providers[chainId] = this.providers[chainId] ?? getProviderFromEnv(chainId)\n return this.providers[chainId]\n }\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? []\n const observations = await Promise.all(\n queries.map<Promise<NftCollectionInfo>>(async (query) => {\n const chainId = assertEx(query?.chainId || this.config.chainId, 'params.chainId is required')\n const provider = this.getProvider(chainId)\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\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts || defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n await erc721Enumerable.name(),\n await erc721Enumerable.symbol(),\n (await erc721Enumerable.totalSupply()).toNumber(),\n await tokenTypes(erc721Enumerable),\n await this.writeArchivist(),\n ])\n const types = resolvedValue(typesSettled, true)\n const nfts = await getNftCollectionNfts(address, provider, types, maxNfts)\n const metrics = getNftCollectionMetrics(nfts)\n const archivist = resolvedValue(archivistSettled)\n const [sources] = await Promise.all([\n // Hash all the payloads\n Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: NftCollectionInfo = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n sources,\n symbol: resolvedValue(symbol, true),\n total: resolvedValue(total, true),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n","import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n","import { JsonRpcProvider } from '@ethersproject/providers'\nimport { AxiosJson } from '@xyo-network/axios'\nimport { NftInfo, NftMetadata, NftSchema, TokenType, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\nimport { tokenTypes } 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 getNftCollectionNfts = 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,\n types?: TokenType[],\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 maxNfts = 100,\n): Promise<NftInfo[]> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const axios = new AxiosJson({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider)\n const storage = ERC721URIStorage__factory.connect(contractAddress, provider)\n const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider)\n const finalTypes = types ?? (await tokenTypes(enumerable))\n const result: NftInfo[] = []\n\n for (let i = 0; i < maxNfts; i++) {\n console.log(`Getting Token [${i}]`)\n const tokenId = (await enumerable.tokenByIndex(i)).toHexString()\n const supply = finalTypes.includes(toTokenType('ERC1155')) ? (await supply1155.totalSupply(tokenId)).toHexString() : '0x01'\n const metadataUri = await storage.tokenURI(tokenId)\n const checkedMetaDataUri = checkIpfsUrl(metadataUri, ipfsGateway)\n let metadata: NftMetadata | undefined = undefined\n try {\n metadata = (await axios.get(checkedMetaDataUri)).data\n } catch (ex) {\n const error = ex as Error\n console.error(error.message)\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: provider.network.chainId,\n metadata,\n metadataUri,\n schema: NftSchema,\n supply,\n tokenId,\n type: finalTypes.at(0),\n types,\n }\n result.push(info)\n }\n return result\n}\n","/**\n * These contracts are not evaluable for some\n * reason (too large, nonsensical, etc.)\n */\nexport const nonEvaluableContractAddresses = [\n // ENS\n '0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72',\n].map((address) => address.toUpperCase())\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":["import_crypto_nft_payload_plugin","import_open_zeppelin_typechain","attributes","p","import_open_zeppelin_typechain","ipfsGateway"]}
|