@xyo-network/crypto-nft-collection-witness-plugin 5.5.2 → 6.0.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAEzD,eAAO,MAAM,gCAAgC,QAAO,uBAAuB,CAAC,0BAA0B,CASnG,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAEzD,eAAO,MAAM,gCAAgC,QAAO,uBAAuB,CAAC,0BAA0B,CASnG,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import type { NftCollectionInfo, NftCollectionWitnessConfig, NftCollectionWitnessQuery } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Schema } from '@xyo-network/payload-model';
2
+ import type { Schema } from '@xyo-network/sdk-js';
3
3
  import type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
4
4
  import { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract';
5
5
  export type CryptoNftCollectionWitnessParams = EvmWitnessParams<NftCollectionWitnessConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,4BAA4B,CAAA;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
@@ -188,8 +188,7 @@ var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 10
188
188
 
189
189
  // src/Plugin.ts
190
190
  import { NftSchema as NftSchema2 } from "@xyo-network/crypto-nft-payload-plugin";
191
- import { PayloadSetSchema } from "@xyo-network/payload-model";
192
- import { createPayloadSetWitnessPlugin } from "@xyo-network/sdk-js";
191
+ import { createPayloadSetWitnessPlugin, PayloadSetSchema } from "@xyo-network/sdk-js";
193
192
 
194
193
  // src/Witness.ts
195
194
  import {
@@ -217,19 +216,19 @@ var CryptoNftCollectionWitness = class extends AbstractEvmWitness {
217
216
  static configSchemas = [...super.configSchemas, NftCollectionWitnessConfigSchema];
218
217
  static defaultConfigSchema = NftCollectionWitnessConfigSchema;
219
218
  async observeHandler(payloads) {
220
- await this.started("throw");
219
+ await this.startedAsync("throw");
221
220
  await this.getProviders();
222
221
  const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? [];
223
222
  const observations = await Promise.all(
224
223
  queries.map(async (query) => {
225
- const chainId = assertEx2(query?.chainId || this.config.chainId, () => "params.chainId is required");
224
+ const chainId = assertEx2(query?.chainId ?? this.config.chainId, () => "params.chainId is required");
226
225
  const provider = await this.getProvider(true, true);
227
226
  const address = asEthAddress(assertEx2(
228
- EthAddressWrapper.parse(assertEx2(query?.address || this.config.address, () => "params.address is required")),
227
+ EthAddressWrapper.parse(assertEx2(query?.address ?? this.config.address, () => "params.address is required")),
229
228
  () => "Failed to parse params.address"
230
229
  ).toString(), true);
231
230
  const erc721Enumerable = ERC721Enumerable__factory2.connect(address, provider);
232
- const maxNfts = query?.maxNfts || defaultMaxNfts;
231
+ const maxNfts = query?.maxNfts && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts;
233
232
  const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
234
233
  erc721Enumerable.name(),
235
234
  erc721Enumerable.symbol(),
@@ -287,4 +286,4 @@ export {
287
286
  isErc721,
288
287
  tokenTypes
289
288
  };
290
- //# sourceMappingURL=index.mjs.map
289
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftCollectionNfts.ts","../../src/lib/tokenTypes.ts","../../src/lib/tryCall.ts","../../src/Plugin.ts","../../src/Witness.ts"],"sourcesContent":["import type { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\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 type { 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 {\n mean, p, stdDev, variance,\n }\n}\n","import type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, Record<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 { assertEx } from '@xylabs/sdk-js'\nimport type { Interface, Provider } from 'ethers'\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 (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n return (bytecode.includes(selector.slice(2)))\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import type { EthAddress } from '@xylabs/sdk-js'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@xylabs/sdk-js'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt = 0): readonly number[] {\n return [...Array(size).keys()].map(i => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: EthAddress,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\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 try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n const client = new FetchJsonClient({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await client.get<NftMetadata>(checkedMetaDataUri)).data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n","import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\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, ERC721__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 { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\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 {\n asEthAddress, assertEx, EthAddressWrapper,\n} from '@xylabs/sdk-js'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Schema, WithSources } from '@xyo-network/payload-model'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport {\n getNftCollectionMetrics, getNftCollectionNfts, tokenTypes,\n} from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<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\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<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n await this.getProviders() // make sure cache clears\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 = await this.getProvider(true, true)\n const address = asEthAddress(assertEx(\n EthAddressWrapper.parse(assertEx(query?.address || this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString(), true)\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 erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\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 => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: WithSources<NftCollectionInfo> = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n $sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],"mappings":"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","names":["attributes","p","NftSchema","assertEx","ERC721Enumerable__factory","assertEx","ERC721Enumerable__factory","NftSchema"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts", "../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts", "../../src/lib/collectionMetrics/getNftCollectionMetrics.ts", "../../src/lib/contractHasFunctions.ts", "../../src/lib/getNftCollectionNfts.ts", "../../src/lib/tokenTypes.ts", "../../src/lib/tryCall.ts", "../../src/Plugin.ts", "../../src/Witness.ts"],
4
+ "sourcesContent": ["import type { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\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 type { 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 (\u00B5)\n const mean = n * p\n\n // Variance (\u03C3^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (\u03C3)\n const stdDev = Math.sqrt(variance)\n\n return {\n mean, p, stdDev, variance,\n }\n}\n", "import type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, Record<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 { assertEx } from '@xylabs/sdk-js'\nimport type { Interface, Provider } from 'ethers'\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 (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n return (bytecode.includes(selector.slice(2)))\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n", "import type { EthAddress } from '@xylabs/sdk-js'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@xylabs/sdk-js'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt = 0): readonly number[] {\n return [...Array(size).keys()].map(i => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: EthAddress,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\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 try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n const client = new FetchJsonClient({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await client.get<NftMetadata>(checkedMetaDataUri)).data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n", "import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\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, ERC721__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 { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\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 {\n asEthAddress, assertEx, EthAddressWrapper,\n} from '@xylabs/sdk-js'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Schema, WithSources } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport {\n getNftCollectionMetrics, getNftCollectionNfts, tokenTypes,\n} from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<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\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<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.startedAsync('throw')\n await this.getProviders() // make sure cache clears\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 = await this.getProvider(true, true)\n const address = asEthAddress(assertEx(\n EthAddressWrapper.parse(assertEx(query?.address ?? this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString(), true)\n\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\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 => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: WithSources<NftCollectionInfo> = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n $sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["attributes", "p", "NftSchema", "assertEx", "ERC721Enumerable__factory", "assertEx", "ERC721Enumerable__factory", "NftSchema"]
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAEzD,eAAO,MAAM,gCAAgC,QAAO,uBAAuB,CAAC,0BAA0B,CASnG,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAEzD,eAAO,MAAM,gCAAgC,QAAO,uBAAuB,CAAC,0BAA0B,CASnG,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import type { NftCollectionInfo, NftCollectionWitnessConfig, NftCollectionWitnessQuery } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Schema } from '@xyo-network/payload-model';
2
+ import type { Schema } from '@xyo-network/sdk-js';
3
3
  import type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
4
4
  import { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract';
5
5
  export type CryptoNftCollectionWitnessParams = EvmWitnessParams<NftCollectionWitnessConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,4BAA4B,CAAA;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
@@ -188,8 +188,7 @@ var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 10
188
188
 
189
189
  // src/Plugin.ts
190
190
  import { NftSchema as NftSchema2 } from "@xyo-network/crypto-nft-payload-plugin";
191
- import { PayloadSetSchema } from "@xyo-network/payload-model";
192
- import { createPayloadSetWitnessPlugin } from "@xyo-network/sdk-js";
191
+ import { createPayloadSetWitnessPlugin, PayloadSetSchema } from "@xyo-network/sdk-js";
193
192
 
194
193
  // src/Witness.ts
195
194
  import {
@@ -217,19 +216,19 @@ var CryptoNftCollectionWitness = class extends AbstractEvmWitness {
217
216
  static configSchemas = [...super.configSchemas, NftCollectionWitnessConfigSchema];
218
217
  static defaultConfigSchema = NftCollectionWitnessConfigSchema;
219
218
  async observeHandler(payloads) {
220
- await this.started("throw");
219
+ await this.startedAsync("throw");
221
220
  await this.getProviders();
222
221
  const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? [];
223
222
  const observations = await Promise.all(
224
223
  queries.map(async (query) => {
225
- const chainId = assertEx2(query?.chainId || this.config.chainId, () => "params.chainId is required");
224
+ const chainId = assertEx2(query?.chainId ?? this.config.chainId, () => "params.chainId is required");
226
225
  const provider = await this.getProvider(true, true);
227
226
  const address = asEthAddress(assertEx2(
228
- EthAddressWrapper.parse(assertEx2(query?.address || this.config.address, () => "params.address is required")),
227
+ EthAddressWrapper.parse(assertEx2(query?.address ?? this.config.address, () => "params.address is required")),
229
228
  () => "Failed to parse params.address"
230
229
  ).toString(), true);
231
230
  const erc721Enumerable = ERC721Enumerable__factory2.connect(address, provider);
232
- const maxNfts = query?.maxNfts || defaultMaxNfts;
231
+ const maxNfts = query?.maxNfts && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts;
233
232
  const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
234
233
  erc721Enumerable.name(),
235
234
  erc721Enumerable.symbol(),
@@ -287,4 +286,4 @@ export {
287
286
  isErc721,
288
287
  tokenTypes
289
288
  };
290
- //# sourceMappingURL=index.mjs.map
289
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftCollectionNfts.ts","../../src/lib/tokenTypes.ts","../../src/lib/tryCall.ts","../../src/Plugin.ts","../../src/Witness.ts"],"sourcesContent":["import type { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\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 type { 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 {\n mean, p, stdDev, variance,\n }\n}\n","import type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, Record<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 { assertEx } from '@xylabs/sdk-js'\nimport type { Interface, Provider } from 'ethers'\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 (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n return (bytecode.includes(selector.slice(2)))\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import type { EthAddress } from '@xylabs/sdk-js'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@xylabs/sdk-js'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt = 0): readonly number[] {\n return [...Array(size).keys()].map(i => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: EthAddress,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\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 try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n const client = new FetchJsonClient({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await client.get<NftMetadata>(checkedMetaDataUri)).data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n","import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\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, ERC721__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 { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\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 {\n asEthAddress, assertEx, EthAddressWrapper,\n} from '@xylabs/sdk-js'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Schema, WithSources } from '@xyo-network/payload-model'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport {\n getNftCollectionMetrics, getNftCollectionNfts, tokenTypes,\n} from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<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\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<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n await this.getProviders() // make sure cache clears\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 = await this.getProvider(true, true)\n const address = asEthAddress(assertEx(\n EthAddressWrapper.parse(assertEx(query?.address || this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString(), true)\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 erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\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 => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: WithSources<NftCollectionInfo> = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n $sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],"mappings":"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","names":["attributes","p","NftSchema","assertEx","ERC721Enumerable__factory","assertEx","ERC721Enumerable__factory","NftSchema"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts", "../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts", "../../src/lib/collectionMetrics/getNftCollectionMetrics.ts", "../../src/lib/contractHasFunctions.ts", "../../src/lib/getNftCollectionNfts.ts", "../../src/lib/tokenTypes.ts", "../../src/lib/tryCall.ts", "../../src/Plugin.ts", "../../src/Witness.ts"],
4
+ "sourcesContent": ["import type { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\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 type { 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 (\u00B5)\n const mean = n * p\n\n // Variance (\u03C3^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (\u03C3)\n const stdDev = Math.sqrt(variance)\n\n return {\n mean, p, stdDev, variance,\n }\n}\n", "import type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, Record<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 { assertEx } from '@xylabs/sdk-js'\nimport type { Interface, Provider } from 'ethers'\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 (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n return (bytecode.includes(selector.slice(2)))\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n", "import type { EthAddress } from '@xylabs/sdk-js'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@xylabs/sdk-js'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt = 0): readonly number[] {\n return [...Array(size).keys()].map(i => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: EthAddress,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\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 try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n const client = new FetchJsonClient({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await client.get<NftMetadata>(checkedMetaDataUri)).data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n", "import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\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, ERC721__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 { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\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 {\n asEthAddress, assertEx, EthAddressWrapper,\n} from '@xylabs/sdk-js'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Schema, WithSources } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport {\n getNftCollectionMetrics, getNftCollectionNfts, tokenTypes,\n} from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<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\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<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.startedAsync('throw')\n await this.getProviders() // make sure cache clears\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 = await this.getProvider(true, true)\n const address = asEthAddress(assertEx(\n EthAddressWrapper.parse(assertEx(query?.address ?? this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString(), true)\n\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\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 => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: WithSources<NftCollectionInfo> = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n $sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["attributes", "p", "NftSchema", "assertEx", "ERC721Enumerable__factory", "assertEx", "ERC721Enumerable__factory", "NftSchema"]
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAEzD,eAAO,MAAM,gCAAgC,QAAO,uBAAuB,CAAC,0BAA0B,CASnG,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAEzD,eAAO,MAAM,gCAAgC,QAAO,uBAAuB,CAAC,0BAA0B,CASnG,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import type { NftCollectionInfo, NftCollectionWitnessConfig, NftCollectionWitnessQuery } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Schema } from '@xyo-network/payload-model';
2
+ import type { Schema } from '@xyo-network/sdk-js';
3
3
  import type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
4
4
  import { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract';
5
5
  export type CryptoNftCollectionWitnessParams = EvmWitnessParams<NftCollectionWitnessConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,4BAA4B,CAAA;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
@@ -188,8 +188,7 @@ var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 10
188
188
 
189
189
  // src/Plugin.ts
190
190
  import { NftSchema as NftSchema2 } from "@xyo-network/crypto-nft-payload-plugin";
191
- import { PayloadSetSchema } from "@xyo-network/payload-model";
192
- import { createPayloadSetWitnessPlugin } from "@xyo-network/sdk-js";
191
+ import { createPayloadSetWitnessPlugin, PayloadSetSchema } from "@xyo-network/sdk-js";
193
192
 
194
193
  // src/Witness.ts
195
194
  import {
@@ -217,19 +216,19 @@ var CryptoNftCollectionWitness = class extends AbstractEvmWitness {
217
216
  static configSchemas = [...super.configSchemas, NftCollectionWitnessConfigSchema];
218
217
  static defaultConfigSchema = NftCollectionWitnessConfigSchema;
219
218
  async observeHandler(payloads) {
220
- await this.started("throw");
219
+ await this.startedAsync("throw");
221
220
  await this.getProviders();
222
221
  const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? [];
223
222
  const observations = await Promise.all(
224
223
  queries.map(async (query) => {
225
- const chainId = assertEx2(query?.chainId || this.config.chainId, () => "params.chainId is required");
224
+ const chainId = assertEx2(query?.chainId ?? this.config.chainId, () => "params.chainId is required");
226
225
  const provider = await this.getProvider(true, true);
227
226
  const address = asEthAddress(assertEx2(
228
- EthAddressWrapper.parse(assertEx2(query?.address || this.config.address, () => "params.address is required")),
227
+ EthAddressWrapper.parse(assertEx2(query?.address ?? this.config.address, () => "params.address is required")),
229
228
  () => "Failed to parse params.address"
230
229
  ).toString(), true);
231
230
  const erc721Enumerable = ERC721Enumerable__factory2.connect(address, provider);
232
- const maxNfts = query?.maxNfts || defaultMaxNfts;
231
+ const maxNfts = query?.maxNfts && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts;
233
232
  const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
234
233
  erc721Enumerable.name(),
235
234
  erc721Enumerable.symbol(),
@@ -287,4 +286,4 @@ export {
287
286
  isErc721,
288
287
  tokenTypes
289
288
  };
290
- //# sourceMappingURL=index.mjs.map
289
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftCollectionNfts.ts","../../src/lib/tokenTypes.ts","../../src/lib/tryCall.ts","../../src/Plugin.ts","../../src/Witness.ts"],"sourcesContent":["import type { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\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 type { 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 {\n mean, p, stdDev, variance,\n }\n}\n","import type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, Record<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 { assertEx } from '@xylabs/sdk-js'\nimport type { Interface, Provider } from 'ethers'\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 (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n return (bytecode.includes(selector.slice(2)))\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import type { EthAddress } from '@xylabs/sdk-js'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@xylabs/sdk-js'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt = 0): readonly number[] {\n return [...Array(size).keys()].map(i => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: EthAddress,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\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 try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n const client = new FetchJsonClient({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await client.get<NftMetadata>(checkedMetaDataUri)).data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n","import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\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, ERC721__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 { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\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 {\n asEthAddress, assertEx, EthAddressWrapper,\n} from '@xylabs/sdk-js'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Schema, WithSources } from '@xyo-network/payload-model'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport {\n getNftCollectionMetrics, getNftCollectionNfts, tokenTypes,\n} from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<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\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<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n await this.getProviders() // make sure cache clears\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 = await this.getProvider(true, true)\n const address = asEthAddress(assertEx(\n EthAddressWrapper.parse(assertEx(query?.address || this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString(), true)\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 erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\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 => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: WithSources<NftCollectionInfo> = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n $sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],"mappings":"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","names":["attributes","p","NftSchema","assertEx","ERC721Enumerable__factory","assertEx","ERC721Enumerable__factory","NftSchema"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts", "../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts", "../../src/lib/collectionMetrics/getNftCollectionMetrics.ts", "../../src/lib/contractHasFunctions.ts", "../../src/lib/getNftCollectionNfts.ts", "../../src/lib/tokenTypes.ts", "../../src/lib/tryCall.ts", "../../src/Plugin.ts", "../../src/Witness.ts"],
4
+ "sourcesContent": ["import type { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\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 type { 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 (\u00B5)\n const mean = n * p\n\n // Variance (\u03C3^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (\u03C3)\n const stdDev = Math.sqrt(variance)\n\n return {\n mean, p, stdDev, variance,\n }\n}\n", "import type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, Record<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 { assertEx } from '@xylabs/sdk-js'\nimport type { Interface, Provider } from 'ethers'\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 (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n return (bytecode.includes(selector.slice(2)))\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n", "import type { EthAddress } from '@xylabs/sdk-js'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@xylabs/sdk-js'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt = 0): readonly number[] {\n return [...Array(size).keys()].map(i => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: EthAddress,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\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 try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n const client = new FetchJsonClient({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await client.get<NftMetadata>(checkedMetaDataUri)).data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n", "import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\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, ERC721__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 { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\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 {\n asEthAddress, assertEx, EthAddressWrapper,\n} from '@xylabs/sdk-js'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Schema, WithSources } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport {\n getNftCollectionMetrics, getNftCollectionNfts, tokenTypes,\n} from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<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\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<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.startedAsync('throw')\n await this.getProviders() // make sure cache clears\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 = await this.getProvider(true, true)\n const address = asEthAddress(assertEx(\n EthAddressWrapper.parse(assertEx(query?.address ?? this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString(), true)\n\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\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 => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: WithSources<NftCollectionInfo> = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n $sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["attributes", "p", "NftSchema", "assertEx", "ERC721Enumerable__factory", "assertEx", "ERC721Enumerable__factory", "NftSchema"]
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/crypto-nft-collection-witness-plugin",
3
- "version": "5.5.2",
3
+ "version": "6.0.1",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -31,66 +31,65 @@
31
31
  "README.md"
32
32
  ],
33
33
  "dependencies": {
34
- "@xyo-network/crypto-nft-payload-plugin": "~5.5.2",
35
- "@xyo-network/crypto-nft-collection-payload-plugin": "~5.5.2",
36
- "@xyo-network/erc1967-witness": "~5.5.2",
37
- "@xyo-network/erc1822-witness": "~5.5.2"
34
+ "@xyo-network/crypto-nft-collection-payload-plugin": "~6.0.1",
35
+ "@xyo-network/erc1967-witness": "~6.0.1",
36
+ "@xyo-network/erc1822-witness": "~6.0.1",
37
+ "@xyo-network/crypto-nft-payload-plugin": "~6.0.1"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@bitauth/libauth": "~3.0.0",
41
41
  "@metamask/providers": "^22.1.1",
42
+ "@noble/post-quantum": "~0.6.1",
42
43
  "@opentelemetry/api": "^1.9.1",
43
44
  "@opentelemetry/sdk-trace-base": "^2.7.1",
44
45
  "@scure/base": "^2.2.0",
45
46
  "@scure/bip39": "~2.2.0",
46
- "@xylabs/geo": "^5.1.2",
47
- "@xylabs/sdk-js": "^5.1.2",
48
- "@xylabs/threads": "^5.1.2",
49
- "@xylabs/toolchain": "~7.13.15",
50
- "@xylabs/tsconfig": "~7.13.15",
51
- "@xylabs/vitest-extended": "~5.1.2",
52
- "@xyo-network/account": "~5.6.2",
53
- "@xyo-network/account-model": "^5.6.3",
54
- "@xyo-network/api": "~5.6.2",
55
- "@xyo-network/api-models": "~5.6.3",
56
- "@xyo-network/boundwitness-builder": "~5.6.2",
57
- "@xyo-network/boundwitness-model": "^5.6.3",
58
- "@xyo-network/boundwitness-wrapper": "~5.6.2",
59
- "@xyo-network/config-payload-plugin": "~5.6.3",
60
- "@xyo-network/diviner-model": "^5.6.4",
61
- "@xyo-network/huri": "~5.6.2",
62
- "@xyo-network/manifest-model": "~5.6.3",
47
+ "@xylabs/geo": "^6.0.2",
48
+ "@xylabs/sdk-js": "^6.0.2",
49
+ "@xylabs/threads": "^6.0.2",
50
+ "@xylabs/toolchain": "~8.1.4",
51
+ "@xylabs/tsconfig": "~8.1.4",
52
+ "@xylabs/vitest-extended": "~6.0.2",
53
+ "@xyo-network/account": "~6.0.4",
54
+ "@xyo-network/account-model": "^6.0.4",
55
+ "@xyo-network/api": "~6.0.4",
56
+ "@xyo-network/api-models": "~6.0.4",
57
+ "@xyo-network/boundwitness-builder": "~6.0.4",
58
+ "@xyo-network/boundwitness-model": "^6.0.4",
59
+ "@xyo-network/boundwitness-wrapper": "~6.0.4",
60
+ "@xyo-network/config-payload-plugin": "~6.0.4",
61
+ "@xyo-network/huri": "~6.0.4",
62
+ "@xyo-network/manifest-model": "~6.0.4",
63
63
  "@xyo-network/open-zeppelin-typechain": "^4.1.3",
64
- "@xyo-network/payload-builder": "~5.6.2",
65
- "@xyo-network/payload-model": "^5.6.3",
66
- "@xyo-network/payload-plugin": "~5.6.3",
67
- "@xyo-network/payload-wrapper": "~5.6.2",
68
- "@xyo-network/query-payload-plugin": "~5.6.3",
69
- "@xyo-network/sdk-js": "^5.6.4",
70
- "@xyo-network/sdk-protocol-js": "~5.6.3",
71
- "@xyo-network/wallet": "~5.6.2",
72
- "@xyo-network/wallet-model": "~5.6.3",
73
- "@xyo-network/witness-blockchain-abstract": "^5.6.4",
74
- "@xyo-network/witness-evm-abstract": "^5.6.4",
75
- "@xyo-network/witness-model": "^5.6.4",
64
+ "@xyo-network/payload-builder": "~6.0.4",
65
+ "@xyo-network/payload-model": "^6.0.4",
66
+ "@xyo-network/payload-plugin": "~6.0.4",
67
+ "@xyo-network/payload-wrapper": "~6.0.4",
68
+ "@xyo-network/query-payload-plugin": "~6.0.4",
69
+ "@xyo-network/sdk-js": "^6.0.0",
70
+ "@xyo-network/sdk-protocol-js": "~6.0.4",
71
+ "@xyo-network/wallet": "~6.0.4",
72
+ "@xyo-network/wallet-model": "~6.0.4",
73
+ "@xyo-network/witness-blockchain-abstract": "^6.0.0",
74
+ "@xyo-network/witness-evm-abstract": "~6.0",
76
75
  "ajv": "^8.20.0",
77
76
  "async-mutex": "^0.5.0",
78
77
  "bn.js": "^5.2.3",
79
78
  "buffer": "^6.0.3",
80
79
  "chalk": "^5.6.2",
81
80
  "debug": "~4.4.3",
82
- "eslint": "^10.3.0",
81
+ "eslint": "^10.4.0",
83
82
  "ethers": "^6.16.0",
84
83
  "hash-wasm": "^4.12.0",
85
84
  "idb": "^8.0.3",
86
85
  "lru-cache": "^11.3.6",
87
- "mapbox-gl": "~3.23.1",
86
+ "mapbox-gl": "^3.23.1",
88
87
  "observable-fns": "~0.6.1",
89
88
  "pako": "~2.1.0",
90
89
  "store2": "~2.14.4",
91
- "typescript": "~5.9.3",
92
- "vite": "^8.0.10",
93
- "vitest": "^4.1.5",
90
+ "typescript": "~6.0.3",
91
+ "vite": "^8.0.14",
92
+ "vitest": "^4.1.7",
94
93
  "wasm-feature-detect": "~1.8.0",
95
94
  "webextension-polyfill": "^0.12.0",
96
95
  "zod": "^4.4.3"
@@ -98,37 +97,36 @@
98
97
  "peerDependencies": {
99
98
  "@bitauth/libauth": "~3.0",
100
99
  "@metamask/providers": "^22.1",
100
+ "@noble/post-quantum": "~0.6.1",
101
101
  "@opentelemetry/api": "^1.9",
102
102
  "@opentelemetry/sdk-trace-base": "^2.7",
103
103
  "@scure/base": "^2.2",
104
104
  "@scure/bip39": "~2.2",
105
- "@xylabs/geo": "^5.1",
106
- "@xylabs/sdk-js": "^5.1",
107
- "@xylabs/threads": "^5.1",
108
- "@xyo-network/account": "~5.6",
109
- "@xyo-network/account-model": "^5.6",
110
- "@xyo-network/api": "~5.6",
111
- "@xyo-network/api-models": "~5.6",
112
- "@xyo-network/boundwitness-builder": "~5.6",
113
- "@xyo-network/boundwitness-model": "^5.6",
114
- "@xyo-network/boundwitness-wrapper": "~5.6",
115
- "@xyo-network/config-payload-plugin": "~5.6",
116
- "@xyo-network/diviner-model": "^5.6",
117
- "@xyo-network/huri": "~5.6",
118
- "@xyo-network/manifest-model": "~5.6",
105
+ "@xylabs/geo": "^6.0",
106
+ "@xylabs/sdk-js": "^6.0",
107
+ "@xylabs/threads": "^6.0",
108
+ "@xyo-network/account": "~6.0",
109
+ "@xyo-network/account-model": "^6.0",
110
+ "@xyo-network/api": "~6.0",
111
+ "@xyo-network/api-models": "~6.0",
112
+ "@xyo-network/boundwitness-builder": "~6.0",
113
+ "@xyo-network/boundwitness-model": "^6.0",
114
+ "@xyo-network/boundwitness-wrapper": "~6.0",
115
+ "@xyo-network/config-payload-plugin": "~6.0",
116
+ "@xyo-network/huri": "~6.0",
117
+ "@xyo-network/manifest-model": "~6.0",
119
118
  "@xyo-network/open-zeppelin-typechain": "^4.1",
120
- "@xyo-network/payload-builder": "~5.6",
121
- "@xyo-network/payload-model": "^5.6",
122
- "@xyo-network/payload-plugin": "~5.6",
123
- "@xyo-network/payload-wrapper": "~5.6",
124
- "@xyo-network/query-payload-plugin": "~5.6",
125
- "@xyo-network/sdk-js": "^5.6",
126
- "@xyo-network/sdk-protocol-js": "~5.6",
127
- "@xyo-network/wallet": "~5.6",
128
- "@xyo-network/wallet-model": "~5.6",
129
- "@xyo-network/witness-blockchain-abstract": "^5.6",
130
- "@xyo-network/witness-evm-abstract": "^5.6",
131
- "@xyo-network/witness-model": "^5.6",
119
+ "@xyo-network/payload-builder": "~6.0",
120
+ "@xyo-network/payload-model": "^6.0",
121
+ "@xyo-network/payload-plugin": "~6.0",
122
+ "@xyo-network/payload-wrapper": "~6.0",
123
+ "@xyo-network/query-payload-plugin": "~6.0",
124
+ "@xyo-network/sdk-js": "^6.0",
125
+ "@xyo-network/sdk-protocol-js": "~6.0",
126
+ "@xyo-network/wallet": "~6.0",
127
+ "@xyo-network/wallet-model": "~6.0",
128
+ "@xyo-network/witness-blockchain-abstract": "^6.0",
129
+ "@xyo-network/witness-evm-abstract": "^6.0",
132
130
  "ajv": "^8.20",
133
131
  "async-mutex": "^0.5",
134
132
  "bn.js": "^5.2",
@@ -139,7 +137,7 @@
139
137
  "hash-wasm": "^4.12",
140
138
  "idb": "^8.0",
141
139
  "lru-cache": "^11.3",
142
- "mapbox-gl": "~3.23",
140
+ "mapbox-gl": "^3.23",
143
141
  "observable-fns": "~0.6",
144
142
  "pako": "~2.1",
145
143
  "store2": "~2.14",