@xyo-network/payloadset-plugins 8.0.0 → 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/modules/crypto-asset/Diviner.d.ts.map +1 -1
- package/dist/browser/modules/crypto-asset/lib/divinePrices.d.ts +1 -1
- package/dist/browser/modules/crypto-asset/lib/divinePrices.d.ts.map +1 -1
- package/dist/browser/modules/crypto-asset/lib/divineUniswapPrices.d.ts +6 -1
- package/dist/browser/modules/crypto-asset/lib/divineUniswapPrices.d.ts.map +1 -1
- package/dist/browser/modules/crypto-asset/lib/uniswapQuotes.d.ts +11 -0
- package/dist/browser/modules/crypto-asset/lib/uniswapQuotes.d.ts.map +1 -0
- package/dist/browser/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts +8 -0
- package/dist/browser/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts.map +1 -0
- package/dist/browser/modules/crypto-asset/test/buildUniswapPayload.d.ts +5 -0
- package/dist/browser/modules/crypto-asset/test/buildUniswapPayload.d.ts.map +1 -0
- package/dist/browser/modules/crypto-asset/test/index.d.ts +4 -0
- package/dist/browser/modules/crypto-asset/test/index.d.ts.map +1 -1
- package/dist/browser/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts +8 -0
- package/dist/browser/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts.map +1 -0
- package/dist/browser/modules/crypto-asset/test/sampleUniswapV3.d.ts +3 -0
- package/dist/browser/modules/crypto-asset/test/sampleUniswapV3.d.ts.map +1 -0
- package/dist/browser/modules/crypto-asset/test/sampleUniswapV4.d.ts +3 -0
- package/dist/browser/modules/crypto-asset/test/sampleUniswapV4.d.ts.map +1 -0
- package/dist/browser/modules/crypto-nft-collection-witness/Witness.d.ts +2 -2
- package/dist/browser/modules/crypto-nft-collection-witness/Witness.d.ts.map +1 -1
- package/dist/browser/modules/crypto-nft-witness-wallet/Witness.d.ts +2 -2
- package/dist/browser/modules/crypto-nft-witness-wallet/Witness.d.ts.map +1 -1
- package/dist/browser/modules/erc1822-witness/Witness.d.ts +2 -2
- package/dist/browser/modules/erc1822-witness/Witness.d.ts.map +1 -1
- package/dist/browser/modules/erc1967-witness/Witness.d.ts +2 -2
- package/dist/browser/modules/erc1967-witness/Witness.d.ts.map +1 -1
- package/dist/browser/modules/evm-call-witness/Witness.d.ts +1 -1
- package/dist/browser/modules/evm-call-witness/Witness.d.ts.map +1 -1
- package/dist/browser/modules/evm-call-witness/model.d.ts +1 -1
- package/dist/browser/modules/evm-call-witness/model.d.ts.map +1 -1
- package/dist/browser/modules/evm-contract-witness/Witness.d.ts +2 -2
- package/dist/browser/modules/evm-contract-witness/Witness.d.ts.map +1 -1
- package/dist/browser/modules/evm-events-witness/Witness.d.ts +1 -1
- package/dist/browser/modules/evm-events-witness/Witness.d.ts.map +1 -1
- package/dist/browser/modules/evm-events-witness/model.d.ts +1 -1
- package/dist/browser/modules/evm-events-witness/model.d.ts.map +1 -1
- package/dist/browser/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts +7 -0
- package/dist/browser/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts.map +1 -0
- package/dist/browser/modules/uniswap-v3-crypto-market/lib/index.d.ts +1 -0
- package/dist/browser/modules/uniswap-v3-crypto-market/lib/index.d.ts.map +1 -1
- package/dist/browser/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts +4 -0
- package/dist/browser/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts.map +1 -1
- package/dist/browser/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts +2 -1
- package/dist/browser/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts.map +1 -1
- package/dist/browser/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.d.ts.map +1 -1
- package/dist/browser/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts +6 -1
- package/dist/browser/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts.map +1 -1
- package/dist/neutral/crypto-asset.mjs +115 -42
- package/dist/neutral/crypto-asset.mjs.map +4 -4
- package/dist/neutral/crypto-nft-collection-witness.mjs +2 -2
- package/dist/neutral/crypto-nft-collection-witness.mjs.map +1 -1
- package/dist/neutral/crypto-nft-witness-wallet.mjs +2 -2
- package/dist/neutral/crypto-nft-witness-wallet.mjs.map +1 -1
- package/dist/neutral/erc1822-witness.mjs +1 -1
- package/dist/neutral/erc1822-witness.mjs.map +1 -1
- package/dist/neutral/erc1967-witness.mjs +1 -1
- package/dist/neutral/erc1967-witness.mjs.map +1 -1
- package/dist/neutral/evm-call-witness.mjs +1 -1
- package/dist/neutral/evm-call-witness.mjs.map +1 -1
- package/dist/neutral/evm-contract-witness.mjs +1 -1
- package/dist/neutral/evm-contract-witness.mjs.map +1 -1
- package/dist/neutral/evm-events-witness.mjs +1 -1
- package/dist/neutral/evm-events-witness.mjs.map +1 -1
- package/dist/neutral/modules/crypto-asset/Diviner.d.ts.map +1 -1
- package/dist/neutral/modules/crypto-asset/lib/divinePrices.d.ts +1 -1
- package/dist/neutral/modules/crypto-asset/lib/divinePrices.d.ts.map +1 -1
- package/dist/neutral/modules/crypto-asset/lib/divineUniswapPrices.d.ts +6 -1
- package/dist/neutral/modules/crypto-asset/lib/divineUniswapPrices.d.ts.map +1 -1
- package/dist/neutral/modules/crypto-asset/lib/uniswapQuotes.d.ts +11 -0
- package/dist/neutral/modules/crypto-asset/lib/uniswapQuotes.d.ts.map +1 -0
- package/dist/neutral/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts +8 -0
- package/dist/neutral/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts.map +1 -0
- package/dist/neutral/modules/crypto-asset/test/buildUniswapPayload.d.ts +5 -0
- package/dist/neutral/modules/crypto-asset/test/buildUniswapPayload.d.ts.map +1 -0
- package/dist/neutral/modules/crypto-asset/test/index.d.ts +4 -0
- package/dist/neutral/modules/crypto-asset/test/index.d.ts.map +1 -1
- package/dist/neutral/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts +8 -0
- package/dist/neutral/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts.map +1 -0
- package/dist/neutral/modules/crypto-asset/test/sampleUniswapV3.d.ts +3 -0
- package/dist/neutral/modules/crypto-asset/test/sampleUniswapV3.d.ts.map +1 -0
- package/dist/neutral/modules/crypto-asset/test/sampleUniswapV4.d.ts +3 -0
- package/dist/neutral/modules/crypto-asset/test/sampleUniswapV4.d.ts.map +1 -0
- package/dist/neutral/modules/crypto-nft-collection-witness/Witness.d.ts +2 -2
- package/dist/neutral/modules/crypto-nft-collection-witness/Witness.d.ts.map +1 -1
- package/dist/neutral/modules/crypto-nft-witness-wallet/Witness.d.ts +2 -2
- package/dist/neutral/modules/crypto-nft-witness-wallet/Witness.d.ts.map +1 -1
- package/dist/neutral/modules/erc1822-witness/Witness.d.ts +2 -2
- package/dist/neutral/modules/erc1822-witness/Witness.d.ts.map +1 -1
- package/dist/neutral/modules/erc1967-witness/Witness.d.ts +2 -2
- package/dist/neutral/modules/erc1967-witness/Witness.d.ts.map +1 -1
- package/dist/neutral/modules/evm-call-witness/Witness.d.ts +1 -1
- package/dist/neutral/modules/evm-call-witness/Witness.d.ts.map +1 -1
- package/dist/neutral/modules/evm-call-witness/model.d.ts +1 -1
- package/dist/neutral/modules/evm-call-witness/model.d.ts.map +1 -1
- package/dist/neutral/modules/evm-contract-witness/Witness.d.ts +2 -2
- package/dist/neutral/modules/evm-contract-witness/Witness.d.ts.map +1 -1
- package/dist/neutral/modules/evm-events-witness/Witness.d.ts +1 -1
- package/dist/neutral/modules/evm-events-witness/Witness.d.ts.map +1 -1
- package/dist/neutral/modules/evm-events-witness/model.d.ts +1 -1
- package/dist/neutral/modules/evm-events-witness/model.d.ts.map +1 -1
- package/dist/neutral/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts +7 -0
- package/dist/neutral/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts.map +1 -0
- package/dist/neutral/modules/uniswap-v3-crypto-market/lib/index.d.ts +1 -0
- package/dist/neutral/modules/uniswap-v3-crypto-market/lib/index.d.ts.map +1 -1
- package/dist/neutral/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts +4 -0
- package/dist/neutral/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts.map +1 -1
- package/dist/neutral/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts +2 -1
- package/dist/neutral/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts.map +1 -1
- package/dist/neutral/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.d.ts.map +1 -1
- package/dist/neutral/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts +6 -1
- package/dist/neutral/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts.map +1 -1
- package/dist/neutral/uniswap-v3-crypto-market.mjs +21 -0
- package/dist/neutral/uniswap-v3-crypto-market.mjs.map +3 -3
- package/dist/neutral/uniswap-v4-crypto-market.mjs +99 -17
- package/dist/neutral/uniswap-v4-crypto-market.mjs.map +2 -2
- package/dist/node/modules/crypto-asset/Diviner.d.ts.map +1 -1
- package/dist/node/modules/crypto-asset/lib/divinePrices.d.ts +1 -1
- package/dist/node/modules/crypto-asset/lib/divinePrices.d.ts.map +1 -1
- package/dist/node/modules/crypto-asset/lib/divineUniswapPrices.d.ts +6 -1
- package/dist/node/modules/crypto-asset/lib/divineUniswapPrices.d.ts.map +1 -1
- package/dist/node/modules/crypto-asset/lib/uniswapQuotes.d.ts +11 -0
- package/dist/node/modules/crypto-asset/lib/uniswapQuotes.d.ts.map +1 -0
- package/dist/node/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts +8 -0
- package/dist/node/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts.map +1 -0
- package/dist/node/modules/crypto-asset/test/buildUniswapPayload.d.ts +5 -0
- package/dist/node/modules/crypto-asset/test/buildUniswapPayload.d.ts.map +1 -0
- package/dist/node/modules/crypto-asset/test/index.d.ts +4 -0
- package/dist/node/modules/crypto-asset/test/index.d.ts.map +1 -1
- package/dist/node/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts +8 -0
- package/dist/node/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts.map +1 -0
- package/dist/node/modules/crypto-asset/test/sampleUniswapV3.d.ts +3 -0
- package/dist/node/modules/crypto-asset/test/sampleUniswapV3.d.ts.map +1 -0
- package/dist/node/modules/crypto-asset/test/sampleUniswapV4.d.ts +3 -0
- package/dist/node/modules/crypto-asset/test/sampleUniswapV4.d.ts.map +1 -0
- package/dist/node/modules/crypto-nft-collection-witness/Witness.d.ts +2 -2
- package/dist/node/modules/crypto-nft-collection-witness/Witness.d.ts.map +1 -1
- package/dist/node/modules/crypto-nft-witness-wallet/Witness.d.ts +2 -2
- package/dist/node/modules/crypto-nft-witness-wallet/Witness.d.ts.map +1 -1
- package/dist/node/modules/erc1822-witness/Witness.d.ts +2 -2
- package/dist/node/modules/erc1822-witness/Witness.d.ts.map +1 -1
- package/dist/node/modules/erc1967-witness/Witness.d.ts +2 -2
- package/dist/node/modules/erc1967-witness/Witness.d.ts.map +1 -1
- package/dist/node/modules/evm-call-witness/Witness.d.ts +1 -1
- package/dist/node/modules/evm-call-witness/Witness.d.ts.map +1 -1
- package/dist/node/modules/evm-call-witness/model.d.ts +1 -1
- package/dist/node/modules/evm-call-witness/model.d.ts.map +1 -1
- package/dist/node/modules/evm-contract-witness/Witness.d.ts +2 -2
- package/dist/node/modules/evm-contract-witness/Witness.d.ts.map +1 -1
- package/dist/node/modules/evm-events-witness/Witness.d.ts +1 -1
- package/dist/node/modules/evm-events-witness/Witness.d.ts.map +1 -1
- package/dist/node/modules/evm-events-witness/model.d.ts +1 -1
- package/dist/node/modules/evm-events-witness/model.d.ts.map +1 -1
- package/dist/node/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts +7 -0
- package/dist/node/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts.map +1 -0
- package/dist/node/modules/uniswap-v3-crypto-market/lib/index.d.ts +1 -0
- package/dist/node/modules/uniswap-v3-crypto-market/lib/index.d.ts.map +1 -1
- package/dist/node/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts +4 -0
- package/dist/node/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts.map +1 -1
- package/dist/node/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts +2 -1
- package/dist/node/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts.map +1 -1
- package/dist/node/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.d.ts.map +1 -1
- package/dist/node/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts +6 -1
- package/dist/node/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts.map +1 -1
- package/package.json +16 -18
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/modules/crypto-asset/Diviner.ts", "../../src/modules/crypto-asset/lib/divinePrices.ts", "../../src/modules/crypto-asset/lib/average.ts", "../../src/modules/crypto-asset/lib/divineCoinGeckoPrices.ts", "../../src/modules/crypto-asset/lib/divineUniswapPrices.ts", "../../src/modules/crypto-asset/Schema.ts", "../../src/modules/crypto-asset/Plugin.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CoingeckoCryptoMarketPayload } from '@xyo-network/payload-plugins/coingecko-crypto-market'\nimport { CoingeckoCryptoMarketSchema } from '@xyo-network/payload-plugins/coingecko-crypto-market'\nimport type { CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset'\nimport { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { UniswapCryptoMarketSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type {\n AnyConfigSchema, DivinerConfig, DivinerModule, DivinerParams, Payload, QueryableModule, Schema,\n} from '@xyo-network/sdk'\nimport { AbstractDiviner } from '@xyo-network/sdk'\n\nimport { divinePrices } from './lib/index.ts'\nimport { CryptoMarketAssetDivinerConfigSchema } from './Schema.ts'\n\nexport type CryptoMarketAssetDivinerConfig = DivinerConfig<{ schema: CryptoMarketAssetDivinerConfigSchema }>\nexport type CryptoMarketAssetDivinerParams = DivinerParams<AnyConfigSchema<CryptoMarketAssetDivinerConfig>>\n\nexport class CryptoMarketAssetDiviner<TParams extends CryptoMarketAssetDivinerParams = CryptoMarketAssetDivinerParams>\n extends AbstractDiviner<TParams>\n implements DivinerModule, QueryableModule {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, CryptoMarketAssetDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = CryptoMarketAssetDivinerConfigSchema\n static override readonly targetSchema = CryptoMarketAssetSchema\n\n protected override divineHandler(payloads?: Payload[]): Payload[] {\n const coinGeckoPayload = payloads?.find(payload => payload?.schema === CoingeckoCryptoMarketSchema) as CoingeckoCryptoMarketPayload | undefined\n const uniswapPayload = payloads?.find(payload => payload?.schema === UniswapCryptoMarketSchema) as UniswapCryptoMarketPayload | undefined\n const result: CryptoMarketAssetPayload = divinePrices(coinGeckoPayload, uniswapPayload)\n return [result]\n }\n}\n", "import { exists } from '@ariestools/sdk'\nimport type { CoingeckoCryptoMarketPayload } from '@xyo-network/payload-plugins/coingecko-crypto-market'\nimport type { CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset'\nimport { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { PayloadBuilder } from '@xyo-network/sdk'\n\nimport { average } from './average.ts'\nimport { divineCoinGeckoPrices } from './divineCoinGeckoPrices.ts'\nimport { divineUniswapPrices } from './divineUniswapPrices.ts'\n\nconst schema = CryptoMarketAssetSchema\n\nexport const divinePrices = (\n coinGeckoPayload: CoingeckoCryptoMarketPayload | undefined,\n uniswapPayload: UniswapCryptoMarketPayload | undefined,\n): CryptoMarketAssetPayload => {\n const coinGeckoPrices = divineCoinGeckoPrices(coinGeckoPayload)\n const uniswapPrices = divineUniswapPrices(uniswapPayload)\n const prices = [uniswapPayload, coinGeckoPayload].some(exists)\n const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {}\n const timestamp = Date.now()\n const builder = new PayloadBuilder<CryptoMarketAssetPayload>({ schema })\n return builder.fields({ assets, timestamp }).build()\n}\n", "import { exists } from '@ariestools/sdk'\nimport type {\n AssetInfo, CryptoMarketAssetPayload, Currency, Token,\n} from '@xyo-network/payload-plugins/crypto-asset'\n\nconst isNumber = (val: number | undefined): val is number => {\n return val !== undefined\n}\n\nconst parseStringifiedNumber = (value: string | undefined): number | undefined => {\n if (value == null || value === '') return undefined\n const parsed = Number(value)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nconst averageStringifiedNumbers = (...prices: (string | undefined)[]): number | undefined => {\n const numbers = prices.map(parseStringifiedNumber).filter(isNumber)\n return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : undefined\n}\n\nexport const average = (...input: (CryptoMarketAssetPayload | undefined)[]): Record<string, AssetInfo> => {\n // Get all the assets represented\n const payloads = input.filter(exists)\n const tokens = new Set<Token>(payloads.flatMap(payload => Object.keys(payload.assets).map<Token>(t => t as Token)))\n // Get all the valuations used\n const valuations = new Set<Token | Currency>(\n [...tokens].flatMap((asset) => {\n const assetInfo = payloads.map(p => p.assets?.[asset]).filter(exists)\n const valueBasis = new Set<Currency | Token>(assetInfo.flatMap(v => Object.keys(v.value) as unknown as Currency | Token).filter(exists))\n return [...valueBasis]\n }),\n )\n // For each of the tokens, calculate the average valuation for each of valuation bases\n const assets: Record<string, AssetInfo> = Object.fromEntries(\n [...tokens].map((token) => {\n const assetInfo = payloads.map(p => p.assets?.[token]).filter(exists)\n const value = Object.fromEntries(\n [...valuations].map((valuation) => {\n const assetValuations = assetInfo.map(info => info.value?.[valuation])\n const averageAssetValuation = averageStringifiedNumbers(...assetValuations)\n return [valuation, averageAssetValuation?.toString()]\n }),\n )\n return [token, { value }]\n }),\n )\n return assets\n}\n", "import type { CoingeckoCryptoMarketPayload } from '@xyo-network/payload-plugins/coingecko-crypto-market'\nimport type { AssetInfo, CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset'\nimport { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport { PayloadBuilder } from '@xyo-network/sdk'\n\nconst schema = CryptoMarketAssetSchema\n\nconst valuationExists = (value: [string, Partial<Record<string, number>> | undefined]): value is [string, Partial<Record<string, number>>] => {\n return !!value[1]\n}\n\nconst otherValueExists = (value: [string, number | undefined]): value is [string, number] => {\n const possiblyNumber = value[1]\n return typeof possiblyNumber === 'number' && !Number.isNaN(possiblyNumber)\n}\n\nexport const divineCoinGeckoPrices = (payload: CoingeckoCryptoMarketPayload | undefined): CryptoMarketAssetPayload => {\n const assets: Record<string, AssetInfo>\n = payload?.assets\n ? Object.fromEntries(\n Object.entries(payload.assets)\n .filter(valuationExists)\n .map(([asset, valuation]) => {\n const value = Object.fromEntries(\n Object.entries(valuation)\n .filter(otherValueExists)\n .map(([symbol, price]) => [symbol.toLowerCase(), price?.toString()]),\n )\n return [asset, { value }]\n }),\n )\n : {}\n const timestamp = Date.now()\n const builder = new PayloadBuilder<CryptoMarketAssetPayload>({ schema })\n return builder.fields({ assets, timestamp }).build()\n}\n", "import { assertEx, exists } from '@ariestools/sdk'\nimport type {\n AssetInfo, CryptoMarketAssetPayload,\n Currency, Token, ValueBasis,\n} from '@xyo-network/payload-plugins/crypto-asset'\nimport { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport type {\n UniswapCryptoMarketPayload, UniswapCryptoPair, UniswapCryptoToken,\n} from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { PayloadBuilder } from '@xyo-network/sdk'\n\nconst schema = CryptoMarketAssetSchema\n\nconst mapUniswapToken = (symbol: string): Token | Currency => {\n // TODO: Actually calculate the value of the token/stablecoin based on others\n // to weed out individual fluctuations in price\n if (symbol.toLowerCase() === 'wbtc') return 'btc'\n if (symbol.toLowerCase() === 'weth') return 'eth'\n if (symbol.toLowerCase() === 'usdt') return 'usd'\n return symbol.toLowerCase() as Token\n}\n\nconst pairsContainingToken = (uniswapPayload: UniswapCryptoMarketPayload, token: Token) => {\n return uniswapPayload?.pairs\n .map(p => p.tokens)\n .filter(p => p.some(x => x.symbol.toLowerCase() === token))\n .filter(exists)\n}\n\nconst tokensFromPairs = (pairs: UniswapCryptoPair[]) => {\n return pairs.flatMap(p => p.tokens).map(t => t.symbol.toLowerCase() as Token)\n}\n\nconst valuesFromTokenPairs = (tokensPairs: UniswapCryptoToken[][], token: Token): ValueBasis => {\n return Object.fromEntries(\n tokensPairs\n .map((pair) => {\n const current = pair.find(p => p.symbol.toLowerCase() === token)\n const other = pair.find(p => p.symbol.toLowerCase() !== token)\n return [other?.symbol.toLowerCase(), current?.value.toString()]\n })\n .map(x => [mapUniswapToken(assertEx(x[0], () => 'Undefined Token')), x[1]]),\n )\n}\n\nexport const divineUniswapPrices = (uniswapPayload: UniswapCryptoMarketPayload | undefined): CryptoMarketAssetPayload => {\n let assets: Partial<Record<Token, AssetInfo | undefined>> = {}\n if (uniswapPayload) {\n const tokens = new Set<Token>(tokensFromPairs(uniswapPayload.pairs))\n assets = Object.fromEntries(\n [...tokens].map((token) => {\n const pairs = pairsContainingToken(uniswapPayload, token)\n const value: ValueBasis = valuesFromTokenPairs(pairs, token)\n const assetInfo: AssetInfo = { value }\n return [token, assetInfo]\n }),\n )\n }\n const timestamp = Date.now()\n const builder = new PayloadBuilder<CryptoMarketAssetPayload>({ schema })\n return builder.fields({ assets, timestamp }).build()\n}\n", "import { asSchema } from '@xyo-network/sdk'\n\nexport type CryptoMarketAssetDivinerQuerySchema = typeof CryptoMarketAssetDivinerQuerySchema\nexport const CryptoMarketAssetDivinerQuerySchema = asSchema('network.xyo.crypto.asset.diviner.query', true)\n\nexport type CryptoMarketAssetDivinerConfigSchema = typeof CryptoMarketAssetDivinerConfigSchema\nexport const CryptoMarketAssetDivinerConfigSchema = asSchema('network.xyo.crypto.asset.diviner.config', true)\n", "import { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport { createPayloadSetDivinerPlugin, PayloadSetSchema } from '@xyo-network/sdk'\n\nimport { CryptoMarketAssetDiviner } from './Diviner.ts'\n\nexport const CryptoMarketAssetPlugin = () =>\n createPayloadSetDivinerPlugin<CryptoMarketAssetDiviner>(\n { required: { [CryptoMarketAssetSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n return (await CryptoMarketAssetDiviner.create(params))\n },\n },\n )\n"],
|
|
5
|
-
"mappings": ";AACA,SAAS,mCAAmC;AAE5C,SAAS,2BAAAA,gCAA+B;AAExC,SAAS,iCAAiC;AAI1C,SAAS,uBAAuB;;;ACThC,SAAS,UAAAC,eAAc;AAGvB,SAAS,2BAAAC,gCAA+B;AAExC,SAAS,kBAAAC,uBAAsB;;;ACL/B,SAAS,cAAc;AAKvB,IAAM,WAAW,CAAC,QAA2C;AAC3D,SAAO,QAAQ;AACjB;AAEA,IAAM,yBAAyB,CAAC,UAAkD;AAChF,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,MAAM,MAAM,IAAI,SAAY;AAC5C;AAEA,IAAM,4BAA4B,IAAI,WAAuD;AAC3F,QAAM,UAAU,OAAO,IAAI,sBAAsB,EAAE,OAAO,QAAQ;AAClE,SAAO,QAAQ,SAAS,IAAI,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC,IAAI,QAAQ,SAAS;AACxF;AAEO,IAAM,UAAU,IAAI,UAA+E;AAExG,QAAM,WAAW,MAAM,OAAO,MAAM;AACpC,QAAM,SAAS,IAAI,IAAW,SAAS,QAAQ,aAAW,OAAO,KAAK,QAAQ,MAAM,EAAE,IAAW,OAAK,CAAU,CAAC,CAAC;AAElH,
|
|
6
|
-
"names": ["CryptoMarketAssetSchema", "exists", "CryptoMarketAssetSchema", "PayloadBuilder", "exists", "CryptoMarketAssetSchema", "PayloadBuilder", "schema", "schema", "CryptoMarketAssetSchema", "exists", "PayloadBuilder", "CryptoMarketAssetSchema", "CryptoMarketAssetSchema", "CryptoMarketAssetSchema"]
|
|
3
|
+
"sources": ["../../src/modules/crypto-asset/Diviner.ts", "../../src/modules/crypto-asset/lib/divinePrices.ts", "../../src/modules/crypto-asset/lib/average.ts", "../../src/modules/crypto-asset/lib/divineCoinGeckoPrices.ts", "../../src/modules/crypto-asset/lib/divineUniswapPrices.ts", "../../src/modules/crypto-asset/lib/uniswapQuotes.ts", "../../src/modules/crypto-asset/lib/usdPricesFromQuotes.ts", "../../src/modules/crypto-asset/Schema.ts", "../../src/modules/crypto-asset/Plugin.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CoingeckoCryptoMarketPayload } from '@xyo-network/payload-plugins/coingecko-crypto-market'\nimport { CoingeckoCryptoMarketSchema } from '@xyo-network/payload-plugins/coingecko-crypto-market'\nimport type { CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset'\nimport { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { UniswapCryptoMarketSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type {\n AnyConfigSchema, DivinerConfig, DivinerModule, DivinerParams, Payload, QueryableModule, Schema,\n} from '@xyo-network/sdk'\nimport { AbstractDiviner } from '@xyo-network/sdk'\n\nimport { divinePrices } from './lib/index.ts'\nimport { CryptoMarketAssetDivinerConfigSchema } from './Schema.ts'\n\nexport type CryptoMarketAssetDivinerConfig = DivinerConfig<{ schema: CryptoMarketAssetDivinerConfigSchema }>\nexport type CryptoMarketAssetDivinerParams = DivinerParams<AnyConfigSchema<CryptoMarketAssetDivinerConfig>>\n\nexport class CryptoMarketAssetDiviner<TParams extends CryptoMarketAssetDivinerParams = CryptoMarketAssetDivinerParams>\n extends AbstractDiviner<TParams>\n implements DivinerModule, QueryableModule {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, CryptoMarketAssetDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = CryptoMarketAssetDivinerConfigSchema\n static override readonly targetSchema = CryptoMarketAssetSchema\n\n protected override divineHandler(payloads?: Payload[]): Payload[] {\n const coinGeckoPayload = payloads?.find(payload => payload?.schema === CoingeckoCryptoMarketSchema) as CoingeckoCryptoMarketPayload | undefined\n // Uniswap V3 and V4 witnesses each report their own payload; price from all of them\n const uniswapPayloads = (payloads?.filter(payload => payload?.schema === UniswapCryptoMarketSchema) ?? []) as UniswapCryptoMarketPayload[]\n const result: CryptoMarketAssetPayload = divinePrices(coinGeckoPayload, ...uniswapPayloads)\n return [result]\n }\n}\n", "import { exists } from '@ariestools/sdk'\nimport type { CoingeckoCryptoMarketPayload } from '@xyo-network/payload-plugins/coingecko-crypto-market'\nimport type { CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset'\nimport { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { PayloadBuilder } from '@xyo-network/sdk'\n\nimport { average } from './average.ts'\nimport { divineCoinGeckoPrices } from './divineCoinGeckoPrices.ts'\nimport { divineUniswapPrices } from './divineUniswapPrices.ts'\n\nconst schema = CryptoMarketAssetSchema\n\nexport const divinePrices = (\n coinGeckoPayload: CoingeckoCryptoMarketPayload | undefined,\n ...uniswapPayloads: (UniswapCryptoMarketPayload | undefined)[]\n): CryptoMarketAssetPayload => {\n const coinGeckoPrices = divineCoinGeckoPrices(coinGeckoPayload)\n const uniswapPrices = divineUniswapPrices(...uniswapPayloads)\n const prices = [coinGeckoPayload, ...uniswapPayloads].some(exists)\n const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {}\n const timestamp = Date.now()\n const builder = new PayloadBuilder<CryptoMarketAssetPayload>({ schema })\n return builder.fields({ assets, timestamp }).build()\n}\n", "import { exists } from '@ariestools/sdk'\nimport type {\n AssetInfo, CryptoMarketAssetPayload, Currency, Token,\n} from '@xyo-network/payload-plugins/crypto-asset'\n\nconst isNumber = (val: number | undefined): val is number => {\n return val !== undefined\n}\n\nconst parseStringifiedNumber = (value: string | undefined): number | undefined => {\n if (value == null || value === '') return undefined\n const parsed = Number(value)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nconst averageStringifiedNumbers = (...prices: (string | undefined)[]): number | undefined => {\n const numbers = prices.map(parseStringifiedNumber).filter(isNumber)\n return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : undefined\n}\n\nexport const average = (...input: (CryptoMarketAssetPayload | undefined)[]): Record<string, AssetInfo> => {\n // Get all the assets represented\n const payloads = input.filter(exists)\n const tokens = new Set<Token>(payloads.flatMap(payload => Object.keys(payload.assets).map<Token>(t => t as Token)))\n // Get all the valuations used\n const valuations = new Set<Token | Currency>(\n [...tokens].flatMap((asset) => {\n const assetInfo = payloads.map(p => p.assets?.[asset]).filter(exists)\n const valueBasis = new Set<Currency | Token>(assetInfo.flatMap(v => Object.keys(v.value) as unknown as Currency | Token).filter(exists))\n return [...valueBasis]\n }),\n )\n // For each of the tokens, calculate the average valuation for each of valuation bases\n const assets: Record<string, AssetInfo> = Object.fromEntries(\n [...tokens].map((token) => {\n const assetInfo = payloads.map(p => p.assets?.[token]).filter(exists)\n const value = Object.fromEntries(\n [...valuations].map((valuation) => {\n const assetValuations = assetInfo.map(info => info.value?.[valuation])\n const averageAssetValuation = averageStringifiedNumbers(...assetValuations)\n return [valuation, averageAssetValuation?.toString()]\n }),\n )\n return [token, { value }]\n }),\n )\n return assets\n}\n", "import type { CoingeckoCryptoMarketPayload } from '@xyo-network/payload-plugins/coingecko-crypto-market'\nimport type { AssetInfo, CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset'\nimport { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport { PayloadBuilder } from '@xyo-network/sdk'\n\nconst schema = CryptoMarketAssetSchema\n\nconst valuationExists = (value: [string, Partial<Record<string, number>> | undefined]): value is [string, Partial<Record<string, number>>] => {\n return !!value[1]\n}\n\nconst otherValueExists = (value: [string, number | undefined]): value is [string, number] => {\n const possiblyNumber = value[1]\n return typeof possiblyNumber === 'number' && !Number.isNaN(possiblyNumber)\n}\n\nexport const divineCoinGeckoPrices = (payload: CoingeckoCryptoMarketPayload | undefined): CryptoMarketAssetPayload => {\n const assets: Record<string, AssetInfo>\n = payload?.assets\n ? Object.fromEntries(\n Object.entries(payload.assets)\n .filter(valuationExists)\n .map(([asset, valuation]) => {\n const value = Object.fromEntries(\n Object.entries(valuation)\n .filter(otherValueExists)\n .map(([symbol, price]) => [symbol.toLowerCase(), price?.toString()]),\n )\n return [asset, { value }]\n }),\n )\n : {}\n const timestamp = Date.now()\n const builder = new PayloadBuilder<CryptoMarketAssetPayload>({ schema })\n return builder.fields({ assets, timestamp }).build()\n}\n", "import { exists } from '@ariestools/sdk'\nimport type {\n AssetInfo, CryptoMarketAssetPayload, Token, ValueBasis,\n} from '@xyo-network/payload-plugins/crypto-asset'\nimport { CryptoMarketAssetSchema, TokenZod } from '@xyo-network/payload-plugins/crypto-asset'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { PayloadBuilder } from '@xyo-network/sdk'\n\nimport { uniswapQuotes } from './uniswapQuotes.ts'\nimport { usdPricesFromQuotes } from './usdPricesFromQuotes.ts'\n\nconst schema = CryptoMarketAssetSchema\n\n/** The currencies every asset is valued in */\ntype Valuation = Extract<keyof ValueBasis, 'btc' | 'eth' | 'eur' | 'usd'>\n\n/** Pool assets whose USD price stands in for each non-USD valuation, averaged when several */\nconst valuationReferences: Record<Exclude<Valuation, 'usd'>, string[]> = {\n btc: ['wbtc'],\n eth: ['eth'],\n eur: ['eurc', 'eurcv'],\n}\n\nfunction referencePrice(usdPrices: ReadonlyMap<string, number>, symbols: string[]): number | undefined {\n const prices = symbols.map(symbol => usdPrices.get(symbol)).filter(exists)\n return prices.length > 0 ? prices.reduce((sum, price) => sum + price, 0) / prices.length : undefined\n}\n\n// Trims floating point noise; pool prices carry fewer significant digits than this\nfunction formatValue(value: number): string {\n return Number(value.toPrecision(8)).toString()\n}\n\n/**\n * Values each asset in USD, EUR, BTC and ETH from Uniswap pool prices. Every asset is\n * priced in USD first (see usdPricesFromQuotes), then converted at the USD prices of the\n * valuationReferences. Only assets the payload schema knows are included.\n */\nexport function divineUniswapPrices(...uniswapPayloads: (UniswapCryptoMarketPayload | undefined)[]): CryptoMarketAssetPayload {\n const usdPrices = usdPricesFromQuotes(uniswapQuotes(uniswapPayloads.filter(exists)))\n const btc = referencePrice(usdPrices, valuationReferences.btc)\n // USD price of one unit of each valuation\n const valuations: [Valuation, number | undefined][] = [\n ['usd', 1],\n ['eur', referencePrice(usdPrices, valuationReferences.eur)],\n ['btc', btc],\n ['eth', referencePrice(usdPrices, valuationReferences.eth)],\n ]\n // BTC does not trade on Ethereum itself, so the asset takes its reference price\n if (btc !== undefined && !usdPrices.has('btc')) usdPrices.set('btc', btc)\n const assets: Partial<Record<Token, AssetInfo>> = {}\n for (const token of TokenZod.options) {\n const usdPrice = usdPrices.get(token)\n if (usdPrice === undefined) continue\n const value: ValueBasis = {}\n for (const [valuation, valuationPrice] of valuations) {\n if (valuationPrice !== undefined) value[valuation] = formatValue(usdPrice / valuationPrice)\n }\n assets[token] = { value }\n }\n const timestamp = Date.now()\n const builder = new PayloadBuilder<CryptoMarketAssetPayload>({ schema })\n return builder.fields({ assets, timestamp }).build()\n}\n", "import type { UniswapCryptoMarketPayload, UniswapCryptoToken } from '@xyo-network/payload-plugins/uniswap-crypto-market'\n\n/** A price read from one pool: one unit of `base` is worth `rate` units of `quote` */\nexport interface UniswapQuote {\n base: string\n quote: string\n rate: number\n}\n\n/** Pool token symbols that stand for another asset one-for-one */\nconst symbolAliases = new Map([['weth', 'eth']])\n\nexport function normalizeUniswapSymbol(symbol: string): string {\n const lower = symbol.toLowerCase()\n return symbolAliases.get(lower) ?? lower\n}\n\nfunction isPositiveFinite(value: number): boolean {\n return Number.isFinite(value) && value > 0\n}\n\n// Each token's value is its price in the other token, so either one gives the rate\nfunction rateOf(base: UniswapCryptoToken, quote: UniswapCryptoToken): number | undefined {\n if (isPositiveFinite(base.value)) return base.value\n return isPositiveFinite(quote.value) ? 1 / quote.value : undefined\n}\n\n/** Flattens the pairs of every payload into quotes between normalized asset symbols */\nexport function uniswapQuotes(payloads: UniswapCryptoMarketPayload[]): UniswapQuote[] {\n return payloads.flatMap(payload => payload.pairs).flatMap((pair) => {\n const [tokenA, tokenB] = pair.tokens\n if (tokenA === undefined || tokenB === undefined) return []\n const base = normalizeUniswapSymbol(tokenA.symbol)\n const quote = normalizeUniswapSymbol(tokenB.symbol)\n const rate = rateOf(tokenA, tokenB)\n if (base === quote || rate === undefined) return []\n return [{\n base, quote, rate,\n }]\n })\n}\n", "import type { UniswapQuote } from './uniswapQuotes.ts'\n\n/** USD stablecoins in order of preference; the first one quoted is taken as exactly 1 USD */\nconst usdAnchors = ['usdt', 'usdc']\n\n/**\n * Deeply traded assets, priced first and in this order, each from its pools against the\n * assets before it. Thinner pools priced later therefore never feed back into them.\n */\nconst pricingOrder = ['usdc', 'eth', 'wbtc']\n\nfunction median(values: number[]): number {\n const sorted = values.toSorted((a, b) => a - b)\n const middle = Math.floor(sorted.length / 2)\n return sorted.length % 2 === 0 ? (sorted[middle - 1] + sorted[middle]) / 2 : sorted[middle]\n}\n\n// The USD values of `asset` implied by its quotes against already priced assets\nfunction valuations(asset: string, quotes: UniswapQuote[], prices: ReadonlyMap<string, number>): number[] {\n return quotes.flatMap(({\n base, quote, rate,\n }) => {\n const quotePrice = base === asset ? prices.get(quote) : undefined\n if (quotePrice !== undefined) return [rate * quotePrice]\n const basePrice = quote === asset ? prices.get(base) : undefined\n return basePrice === undefined ? [] : [basePrice / rate]\n })\n}\n\n/**\n * Prices every asset reachable from a USD stablecoin through the quoted pools. Each asset\n * takes the median of its quotes against assets priced before it: first the pricingOrder,\n * then the rest in rounds, nearest to USD first.\n */\nexport function usdPricesFromQuotes(quotes: UniswapQuote[]): Map<string, number> {\n const assets = new Set(quotes.flatMap(({ base, quote }) => [base, quote]))\n const prices = new Map<string, number>()\n const anchor = usdAnchors.find(symbol => assets.has(symbol))\n if (anchor === undefined) return prices\n prices.set(anchor, 1)\n const priceFrom = (asset: string, pricedBefore: ReadonlyMap<string, number>): boolean => {\n const values = valuations(asset, quotes, pricedBefore)\n if (values.length > 0) prices.set(asset, median(values))\n return values.length > 0\n }\n for (const asset of pricingOrder) {\n if (!prices.has(asset)) priceFrom(asset, prices)\n }\n let pending = [...assets].filter(asset => !prices.has(asset))\n while (pending.length > 0) {\n const pricedBefore = new Map(prices)\n const unpriced = pending.filter(asset => !priceFrom(asset, pricedBefore))\n if (unpriced.length === pending.length) break\n pending = unpriced\n }\n return prices\n}\n", "import { asSchema } from '@xyo-network/sdk'\n\nexport type CryptoMarketAssetDivinerQuerySchema = typeof CryptoMarketAssetDivinerQuerySchema\nexport const CryptoMarketAssetDivinerQuerySchema = asSchema('network.xyo.crypto.asset.diviner.query', true)\n\nexport type CryptoMarketAssetDivinerConfigSchema = typeof CryptoMarketAssetDivinerConfigSchema\nexport const CryptoMarketAssetDivinerConfigSchema = asSchema('network.xyo.crypto.asset.diviner.config', true)\n", "import { CryptoMarketAssetSchema } from '@xyo-network/payload-plugins/crypto-asset'\nimport { createPayloadSetDivinerPlugin, PayloadSetSchema } from '@xyo-network/sdk'\n\nimport { CryptoMarketAssetDiviner } from './Diviner.ts'\n\nexport const CryptoMarketAssetPlugin = () =>\n createPayloadSetDivinerPlugin<CryptoMarketAssetDiviner>(\n { required: { [CryptoMarketAssetSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n return (await CryptoMarketAssetDiviner.create(params))\n },\n },\n )\n"],
|
|
5
|
+
"mappings": ";AACA,SAAS,mCAAmC;AAE5C,SAAS,2BAAAA,gCAA+B;AAExC,SAAS,iCAAiC;AAI1C,SAAS,uBAAuB;;;ACThC,SAAS,UAAAC,eAAc;AAGvB,SAAS,2BAAAC,gCAA+B;AAExC,SAAS,kBAAAC,uBAAsB;;;ACL/B,SAAS,cAAc;AAKvB,IAAM,WAAW,CAAC,QAA2C;AAC3D,SAAO,QAAQ;AACjB;AAEA,IAAM,yBAAyB,CAAC,UAAkD;AAChF,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,MAAM,MAAM,IAAI,SAAY;AAC5C;AAEA,IAAM,4BAA4B,IAAI,WAAuD;AAC3F,QAAM,UAAU,OAAO,IAAI,sBAAsB,EAAE,OAAO,QAAQ;AAClE,SAAO,QAAQ,SAAS,IAAI,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC,IAAI,QAAQ,SAAS;AACxF;AAEO,IAAM,UAAU,IAAI,UAA+E;AAExG,QAAM,WAAW,MAAM,OAAO,MAAM;AACpC,QAAM,SAAS,IAAI,IAAW,SAAS,QAAQ,aAAW,OAAO,KAAK,QAAQ,MAAM,EAAE,IAAW,OAAK,CAAU,CAAC,CAAC;AAElH,QAAMC,cAAa,IAAI;AAAA,IACrB,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,UAAU;AAC7B,YAAM,YAAY,SAAS,IAAI,OAAK,EAAE,SAAS,KAAK,CAAC,EAAE,OAAO,MAAM;AACpE,YAAM,aAAa,IAAI,IAAsB,UAAU,QAAQ,OAAK,OAAO,KAAK,EAAE,KAAK,CAAgC,EAAE,OAAO,MAAM,CAAC;AACvI,aAAO,CAAC,GAAG,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,QAAM,SAAoC,OAAO;AAAA,IAC/C,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,UAAU;AACzB,YAAM,YAAY,SAAS,IAAI,OAAK,EAAE,SAAS,KAAK,CAAC,EAAE,OAAO,MAAM;AACpE,YAAM,QAAQ,OAAO;AAAA,QACnB,CAAC,GAAGA,WAAU,EAAE,IAAI,CAAC,cAAc;AACjC,gBAAM,kBAAkB,UAAU,IAAI,UAAQ,KAAK,QAAQ,SAAS,CAAC;AACrE,gBAAM,wBAAwB,0BAA0B,GAAG,eAAe;AAC1E,iBAAO,CAAC,WAAW,uBAAuB,SAAS,CAAC;AAAA,QACtD,CAAC;AAAA,MACH;AACA,aAAO,CAAC,OAAO,EAAE,MAAM,CAAC;AAAA,IAC1B,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;AC7CA,SAAS,+BAA+B;AACxC,SAAS,sBAAsB;AAE/B,IAAM,SAAS;AAEf,IAAM,kBAAkB,CAAC,UAAqH;AAC5I,SAAO,CAAC,CAAC,MAAM,CAAC;AAClB;AAEA,IAAM,mBAAmB,CAAC,UAAmE;AAC3F,QAAM,iBAAiB,MAAM,CAAC;AAC9B,SAAO,OAAO,mBAAmB,YAAY,CAAC,OAAO,MAAM,cAAc;AAC3E;AAEO,IAAM,wBAAwB,CAAC,YAAgF;AACpH,QAAM,SACF,SAAS,SACP,OAAO;AAAA,IACL,OAAO,QAAQ,QAAQ,MAAM,EAC1B,OAAO,eAAe,EACtB,IAAI,CAAC,CAAC,OAAO,SAAS,MAAM;AAC3B,YAAM,QAAQ,OAAO;AAAA,QACnB,OAAO,QAAQ,SAAS,EACrB,OAAO,gBAAgB,EACvB,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,OAAO,YAAY,GAAG,OAAO,SAAS,CAAC,CAAC;AAAA,MACvE;AACA,aAAO,CAAC,OAAO,EAAE,MAAM,CAAC;AAAA,IAC1B,CAAC;AAAA,EACL,IACA,CAAC;AACP,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,UAAU,IAAI,eAAyC,EAAE,OAAO,CAAC;AACvE,SAAO,QAAQ,OAAO,EAAE,QAAQ,UAAU,CAAC,EAAE,MAAM;AACrD;;;ACnCA,SAAS,UAAAC,eAAc;AAIvB,SAAS,2BAAAC,0BAAyB,gBAAgB;AAElD,SAAS,kBAAAC,uBAAsB;;;ACI/B,IAAM,gBAAgB,oBAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;AAExC,SAAS,uBAAuB,QAAwB;AAC7D,QAAM,QAAQ,OAAO,YAAY;AACjC,SAAO,cAAc,IAAI,KAAK,KAAK;AACrC;AAEA,SAAS,iBAAiB,OAAwB;AAChD,SAAO,OAAO,SAAS,KAAK,KAAK,QAAQ;AAC3C;AAGA,SAAS,OAAO,MAA0B,OAA+C;AACvF,MAAI,iBAAiB,KAAK,KAAK,EAAG,QAAO,KAAK;AAC9C,SAAO,iBAAiB,MAAM,KAAK,IAAI,IAAI,MAAM,QAAQ;AAC3D;AAGO,SAAS,cAAc,UAAwD;AACpF,SAAO,SAAS,QAAQ,aAAW,QAAQ,KAAK,EAAE,QAAQ,CAAC,SAAS;AAClE,UAAM,CAAC,QAAQ,MAAM,IAAI,KAAK;AAC9B,QAAI,WAAW,UAAa,WAAW,OAAW,QAAO,CAAC;AAC1D,UAAM,OAAO,uBAAuB,OAAO,MAAM;AACjD,UAAM,QAAQ,uBAAuB,OAAO,MAAM;AAClD,UAAM,OAAO,OAAO,QAAQ,MAAM;AAClC,QAAI,SAAS,SAAS,SAAS,OAAW,QAAO,CAAC;AAClD,WAAO,CAAC;AAAA,MACN;AAAA,MAAM;AAAA,MAAO;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AACH;;;ACrCA,IAAM,aAAa,CAAC,QAAQ,MAAM;AAMlC,IAAM,eAAe,CAAC,QAAQ,OAAO,MAAM;AAE3C,SAAS,OAAO,QAA0B;AACxC,QAAM,SAAS,OAAO,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAC9C,QAAM,SAAS,KAAK,MAAM,OAAO,SAAS,CAAC;AAC3C,SAAO,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,CAAC,IAAI,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM;AAC5F;AAGA,SAAS,WAAW,OAAe,QAAwB,QAA+C;AACxG,SAAO,OAAO,QAAQ,CAAC;AAAA,IACrB;AAAA,IAAM;AAAA,IAAO;AAAA,EACf,MAAM;AACJ,UAAM,aAAa,SAAS,QAAQ,OAAO,IAAI,KAAK,IAAI;AACxD,QAAI,eAAe,OAAW,QAAO,CAAC,OAAO,UAAU;AACvD,UAAM,YAAY,UAAU,QAAQ,OAAO,IAAI,IAAI,IAAI;AACvD,WAAO,cAAc,SAAY,CAAC,IAAI,CAAC,YAAY,IAAI;AAAA,EACzD,CAAC;AACH;AAOO,SAAS,oBAAoB,QAA6C;AAC/E,QAAM,SAAS,IAAI,IAAI,OAAO,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AACzE,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,SAAS,WAAW,KAAK,YAAU,OAAO,IAAI,MAAM,CAAC;AAC3D,MAAI,WAAW,OAAW,QAAO;AACjC,SAAO,IAAI,QAAQ,CAAC;AACpB,QAAM,YAAY,CAAC,OAAe,iBAAuD;AACvF,UAAM,SAAS,WAAW,OAAO,QAAQ,YAAY;AACrD,QAAI,OAAO,SAAS,EAAG,QAAO,IAAI,OAAO,OAAO,MAAM,CAAC;AACvD,WAAO,OAAO,SAAS;AAAA,EACzB;AACA,aAAW,SAAS,cAAc;AAChC,QAAI,CAAC,OAAO,IAAI,KAAK,EAAG,WAAU,OAAO,MAAM;AAAA,EACjD;AACA,MAAI,UAAU,CAAC,GAAG,MAAM,EAAE,OAAO,WAAS,CAAC,OAAO,IAAI,KAAK,CAAC;AAC5D,SAAO,QAAQ,SAAS,GAAG;AACzB,UAAM,eAAe,IAAI,IAAI,MAAM;AACnC,UAAM,WAAW,QAAQ,OAAO,WAAS,CAAC,UAAU,OAAO,YAAY,CAAC;AACxE,QAAI,SAAS,WAAW,QAAQ,OAAQ;AACxC,cAAU;AAAA,EACZ;AACA,SAAO;AACT;;;AF7CA,IAAMC,UAASC;AAMf,IAAM,sBAAmE;AAAA,EACvE,KAAK,CAAC,MAAM;AAAA,EACZ,KAAK,CAAC,KAAK;AAAA,EACX,KAAK,CAAC,QAAQ,OAAO;AACvB;AAEA,SAAS,eAAe,WAAwC,SAAuC;AACrG,QAAM,SAAS,QAAQ,IAAI,YAAU,UAAU,IAAI,MAAM,CAAC,EAAE,OAAOC,OAAM;AACzE,SAAO,OAAO,SAAS,IAAI,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,OAAO,SAAS;AAC7F;AAGA,SAAS,YAAY,OAAuB;AAC1C,SAAO,OAAO,MAAM,YAAY,CAAC,CAAC,EAAE,SAAS;AAC/C;AAOO,SAAS,uBAAuB,iBAAuF;AAC5H,QAAM,YAAY,oBAAoB,cAAc,gBAAgB,OAAOA,OAAM,CAAC,CAAC;AACnF,QAAM,MAAM,eAAe,WAAW,oBAAoB,GAAG;AAE7D,QAAMC,cAAgD;AAAA,IACpD,CAAC,OAAO,CAAC;AAAA,IACT,CAAC,OAAO,eAAe,WAAW,oBAAoB,GAAG,CAAC;AAAA,IAC1D,CAAC,OAAO,GAAG;AAAA,IACX,CAAC,OAAO,eAAe,WAAW,oBAAoB,GAAG,CAAC;AAAA,EAC5D;AAEA,MAAI,QAAQ,UAAa,CAAC,UAAU,IAAI,KAAK,EAAG,WAAU,IAAI,OAAO,GAAG;AACxE,QAAM,SAA4C,CAAC;AACnD,aAAW,SAAS,SAAS,SAAS;AACpC,UAAM,WAAW,UAAU,IAAI,KAAK;AACpC,QAAI,aAAa,OAAW;AAC5B,UAAM,QAAoB,CAAC;AAC3B,eAAW,CAAC,WAAW,cAAc,KAAKA,aAAY;AACpD,UAAI,mBAAmB,OAAW,OAAM,SAAS,IAAI,YAAY,WAAW,cAAc;AAAA,IAC5F;AACA,WAAO,KAAK,IAAI,EAAE,MAAM;AAAA,EAC1B;AACA,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,UAAU,IAAIC,gBAAyC,EAAE,QAAAJ,QAAO,CAAC;AACvE,SAAO,QAAQ,OAAO,EAAE,QAAQ,UAAU,CAAC,EAAE,MAAM;AACrD;;;AHpDA,IAAMK,UAASC;AAER,IAAM,eAAe,CAC1B,qBACG,oBAC0B;AAC7B,QAAM,kBAAkB,sBAAsB,gBAAgB;AAC9D,QAAM,gBAAgB,oBAAoB,GAAG,eAAe;AAC5D,QAAM,SAAS,CAAC,kBAAkB,GAAG,eAAe,EAAE,KAAKC,OAAM;AACjE,QAAM,SAAS,SAAS,QAAQ,iBAAiB,aAAa,IAAI,CAAC;AACnE,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,UAAU,IAAIC,gBAAyC,EAAE,QAAAH,QAAO,CAAC;AACvE,SAAO,QAAQ,OAAO,EAAE,QAAQ,UAAU,CAAC,EAAE,MAAM;AACrD;;;AMxBA,SAAS,gBAAgB;AAGlB,IAAM,sCAAsC,SAAS,0CAA0C,IAAI;AAGnG,IAAM,uCAAuC,SAAS,2CAA2C,IAAI;;;APWrG,IAAM,2BAAN,cACG,gBACkC;AAAA,EAC1C,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,oCAAoC;AAAA,EAChH,OAAyB,sBAA8B;AAAA,EACvD,OAAyB,eAAeI;AAAA,EAErB,cAAc,UAAiC;AAChE,UAAM,mBAAmB,UAAU,KAAK,aAAW,SAAS,WAAW,2BAA2B;AAElG,UAAM,kBAAmB,UAAU,OAAO,aAAW,SAAS,WAAW,yBAAyB,KAAK,CAAC;AACxG,UAAM,SAAmC,aAAa,kBAAkB,GAAG,eAAe;AAC1F,WAAO,CAAC,MAAM;AAAA,EAChB;AACF;;;AQ/BA,SAAS,2BAAAC,gCAA+B;AACxC,SAAS,+BAA+B,wBAAwB;AAIzD,IAAM,0BAA0B,MACrC;AAAA,EACE,EAAE,UAAU,EAAE,CAACC,wBAAuB,GAAG,EAAE,GAAG,QAAQ,iBAAiB;AAAA,EACvE;AAAA,IACE,SAAS,OAAO,WAAW;AACzB,aAAQ,MAAM,yBAAyB,OAAO,MAAM;AAAA,IACtD;AAAA,EACF;AACF;",
|
|
6
|
+
"names": ["CryptoMarketAssetSchema", "exists", "CryptoMarketAssetSchema", "PayloadBuilder", "valuations", "exists", "CryptoMarketAssetSchema", "PayloadBuilder", "schema", "CryptoMarketAssetSchema", "exists", "valuations", "PayloadBuilder", "schema", "CryptoMarketAssetSchema", "exists", "PayloadBuilder", "CryptoMarketAssetSchema", "CryptoMarketAssetSchema", "CryptoMarketAssetSchema"]
|
|
7
7
|
}
|
|
@@ -81,7 +81,7 @@ import {
|
|
|
81
81
|
ERC1155Supply__factory
|
|
82
82
|
} from "@xyo-network/open-zeppelin-typechain";
|
|
83
83
|
import { NftSchema, toTokenType } from "@xyo-network/payload-plugins/crypto-nft";
|
|
84
|
-
import { checkIpfsUrl } from "@xyo-network/witness-blockchain
|
|
84
|
+
import { checkIpfsUrl } from "@xyo-network/witness-blockchain";
|
|
85
85
|
import { getErc1822SlotStatus } from "#erc1822-witness";
|
|
86
86
|
import { getErc1967SlotStatus } from "#erc1967-witness";
|
|
87
87
|
|
|
@@ -195,7 +195,7 @@ import {
|
|
|
195
195
|
NftCollectionWitnessConfigSchema
|
|
196
196
|
} from "@xyo-network/payload-plugins/crypto-nft-collection";
|
|
197
197
|
import { PayloadBuilder } from "@xyo-network/sdk";
|
|
198
|
-
import { AbstractEvmWitness } from "@xyo-network/witness-evm
|
|
198
|
+
import { AbstractEvmWitness } from "@xyo-network/witness-evm";
|
|
199
199
|
var defaultMaxNfts = 100;
|
|
200
200
|
var NoOp = Promise.resolve();
|
|
201
201
|
function resolvedValue(settled, assert) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/crypto-nft-collection-witness/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts", "../../src/modules/crypto-nft-collection-witness/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts", "../../src/modules/crypto-nft-collection-witness/lib/collectionMetrics/getNftCollectionMetrics.ts", "../../src/modules/crypto-nft-collection-witness/lib/contractHasFunctions.ts", "../../src/modules/crypto-nft-collection-witness/lib/getNftCollectionNfts.ts", "../../src/modules/crypto-nft-collection-witness/lib/tokenTypes.ts", "../../src/modules/crypto-nft-collection-witness/lib/tryCall.ts", "../../src/modules/crypto-nft-collection-witness/Plugin.ts", "../../src/modules/crypto-nft-collection-witness/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 of Object.keys(item as object) as (keyof T)[]) {\n const value = item[property]\n if (value !== undefined && value !== null) {\n const valueString = String(value)\n const propertyDistribution = distribution[property] ?? {}\n propertyDistribution[valueString] = (propertyDistribution[valueString] ?? 0) + 1\n distribution[property] = propertyDistribution\n }\n }\n }\n\n return distribution\n}\n", "import type { BinomialDistributionParameters } from '@xyo-network/payload-plugins/crypto-nft-collection'\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 { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/payload-plugins/crypto-nft'\nimport type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/payload-plugins/crypto-nft-collection'\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 '@ariestools/sdk'\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 '@ariestools/sdk'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@ariestools/sdk'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/payload-plugins/crypto-nft'\nimport { NftSchema, toTokenType } from '@xyo-network/payload-plugins/crypto-nft'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { getErc1822SlotStatus } from '#erc1822-witness'\nimport { getErc1967SlotStatus } from '#erc1967-witness'\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.from({ length: size }, (_value, 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 == null || isHexZero(erc1967Status.slots.implementation) === true\n ? erc1822Status\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 settledNfts = 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 != null && metadataUri !== '' ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetadataUri !== undefined) {\n try {\n const response = await client.get<NftMetadata>(checkedMetadataUri)\n metadata = response.data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const network = await provider.getNetwork()\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number(network.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 const result: NftInfo[] = settledNfts.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 { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { TokenType } from '@xyo-network/payload-plugins/crypto-nft'\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 != null && 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/payload-plugins/crypto-nft'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk'\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 { EthAddressWrapper } from '@ariestools/eth-address'\nimport { asEthAddress, assertEx } from '@ariestools/sdk'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/payload-plugins/crypto-nft-collection'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/payload-plugins/crypto-nft-collection'\nimport type { Schema, WithSources } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\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 === true && 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 != null && 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"],
|
|
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 of Object.keys(item as object) as (keyof T)[]) {\n const value = item[property]\n if (value !== undefined && value !== null) {\n const valueString = String(value)\n const propertyDistribution = distribution[property] ?? {}\n propertyDistribution[valueString] = (propertyDistribution[valueString] ?? 0) + 1\n distribution[property] = propertyDistribution\n }\n }\n }\n\n return distribution\n}\n", "import type { BinomialDistributionParameters } from '@xyo-network/payload-plugins/crypto-nft-collection'\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 { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/payload-plugins/crypto-nft'\nimport type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/payload-plugins/crypto-nft-collection'\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 '@ariestools/sdk'\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 '@ariestools/sdk'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@ariestools/sdk'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/payload-plugins/crypto-nft'\nimport { NftSchema, toTokenType } from '@xyo-network/payload-plugins/crypto-nft'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain'\nimport type { Provider } from 'ethers'\n\nimport { getErc1822SlotStatus } from '#erc1822-witness'\nimport { getErc1967SlotStatus } from '#erc1967-witness'\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.from({ length: size }, (_value, 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 == null || isHexZero(erc1967Status.slots.implementation) === true\n ? erc1822Status\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 settledNfts = 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 != null && metadataUri !== '' ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetadataUri !== undefined) {\n try {\n const response = await client.get<NftMetadata>(checkedMetadataUri)\n metadata = response.data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const network = await provider.getNetwork()\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number(network.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 const result: NftInfo[] = settledNfts.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 { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { TokenType } from '@xyo-network/payload-plugins/crypto-nft'\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 != null && 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/payload-plugins/crypto-nft'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk'\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 { EthAddressWrapper } from '@ariestools/eth-address'\nimport { asEthAddress, assertEx } from '@ariestools/sdk'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/payload-plugins/crypto-nft-collection'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/payload-plugins/crypto-nft-collection'\nimport type { Schema, WithSources } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm'\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 === true && 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 != null && 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
5
|
"mappings": "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",
|
|
6
6
|
"names": ["attributes", "p", "NftSchema", "assertEx", "ERC721Enumerable__factory", "assertEx", "ERC721Enumerable__factory", "NftSchema"]
|
|
7
7
|
}
|
|
@@ -29,7 +29,7 @@ import { getErc1967SlotStatus } from "#erc1967-witness";
|
|
|
29
29
|
// src/modules/crypto-nft-witness-wallet/lib/getNftMetadata.ts
|
|
30
30
|
import { FetchJsonClient } from "@ariestools/sdk";
|
|
31
31
|
import { ERC721URIStorage__factory, ERC1155URIStorage__factory as ERC1155URIStorage__factory2 } from "@xyo-network/open-zeppelin-typechain";
|
|
32
|
-
import { checkIpfsUrl } from "@xyo-network/witness-blockchain
|
|
32
|
+
import { checkIpfsUrl } from "@xyo-network/witness-blockchain";
|
|
33
33
|
import parseDataUrl from "parse-data-url";
|
|
34
34
|
|
|
35
35
|
// src/modules/crypto-nft-witness-wallet/lib/tokenTypes.ts
|
|
@@ -260,7 +260,7 @@ import {
|
|
|
260
260
|
NftSchema,
|
|
261
261
|
NftWitnessConfigSchema
|
|
262
262
|
} from "@xyo-network/payload-plugins/crypto-nft";
|
|
263
|
-
import { AbstractEvmWitness } from "@xyo-network/witness-evm
|
|
263
|
+
import { AbstractEvmWitness } from "@xyo-network/witness-evm";
|
|
264
264
|
var schema = NftSchema;
|
|
265
265
|
var defaultMaxNfts = 200;
|
|
266
266
|
var CryptoWalletNftWitness = class extends AbstractEvmWitness {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/crypto-nft-witness-wallet/lib/contractHasFunctions.ts", "../../src/modules/crypto-nft-witness-wallet/lib/getNftsOwnedByAddress.ts", "../../src/modules/crypto-nft-witness-wallet/lib/getNftMetadata.ts", "../../src/modules/crypto-nft-witness-wallet/lib/tokenTypes.ts", "../../src/modules/crypto-nft-witness-wallet/lib/getNftsFromWalletFromOpenSea.ts", "../../src/modules/crypto-nft-witness-wallet/lib/getProvider.ts", "../../src/modules/crypto-nft-witness-wallet/lib/tryCall.ts", "../../src/modules/crypto-nft-witness-wallet/Plugin.ts", "../../src/modules/crypto-nft-witness-wallet/Witness.ts"],
|
|
4
|
-
"sourcesContent": ["import { assertEx } from '@ariestools/sdk'\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 { isHexZero } from '@ariestools/sdk'\nimport {\n ERC721__factory, ERC1155__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport type { NftInfoFields, TokenType } from '@xyo-network/payload-plugins/crypto-nft'\nimport type { Provider } from 'ethers'\nimport { LRUCache } from 'lru-cache'\n\nimport { getErc1822SlotStatus } from '#erc1822-witness'\nimport { getErc1967SlotStatus } from '#erc1967-witness'\n\nimport { getNftMetadata } from './getNftMetadata.ts'\nimport { getNftsFromWalletFromOpenSea } from './getNftsFromWalletFromOpenSea.ts'\nimport { getProvider } from './getProvider.ts'\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst tokenTypeCache = new LRUCache<string, TokenType[]>({ max: 100 })\n\nexport const getTokenTypes = async (provider: Provider, address: string) => {\n const network = await provider.getNetwork()\n const key = `${address}|${network.chainId}`\n const currentValue = tokenTypeCache.get(key)\n if (currentValue) {\n return currentValue\n }\n const types = await tokenTypes(provider, address)\n tokenTypeCache.set(key, types)\n return types\n}\n\nexport const getErc721MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC721__factory.connect(address, provider)\n return [await contract.tokenURI(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getErc1155MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC1155__factory.connect(address, provider)\n return [await contract.uri(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getNftMetadataUri = async (address: string, tokenId: string, provider: Provider) => {\n const results = await Promise.all([getErc721MetadataUri(address, tokenId, provider), getErc1155MetadataUri(address, tokenId, provider)])\n return results[0][0] ?? results[1][0]\n}\n\nexport const getNftsOwnedByAddressWithMetadata = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 200,\n /** @param httpTimeout The connection timeout for HTTP call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout)\n const nftResult = await Promise.all(\n nfts.map(async (nft) => {\n try {\n if (nft.metadataUri == null || nft.metadataUri === '' || !nft.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(\n nft.implementation ?? nft.address,\n getProvider(providers),\n nft.tokenId,\n true,\n nft.metadataUri,\n )\n nft.metadata = nft.metadata ?? metadata\n nft.metadataUri = nft.metadataUri ?? metadataUri\n }\n return nft\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(error.stack)\n throw ex\n }\n }),\n )\n return nftResult\n}\n\nexport const getNftsOwnedByAddress = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 100,\n /** @param httpTimeout The connection timeout for HTTP call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n // const assets = await getAssetsFromWallet(publicAddress, maxNfts, timeout)\n const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout)\n\n const nftResult = await Promise.all(\n nfts.map(async (nft) => {\n try {\n const {\n contract, identifier, metadata_url,\n } = nft\n const provider = getProvider(providers)\n\n const block = await provider.getBlockNumber()\n\n // Check if Upgradeable\n const [erc1967Status, erc1822Status] = await Promise.all([\n // Check if ERC-1967 Upgradeable\n getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n getErc1822SlotStatus(provider, contract, block),\n ])\n\n const erc1967Implementation = erc1967Status.slots.implementation\n const implementation\n = (erc1967Implementation == null || erc1967Implementation === '' || isHexZero(erc1967Implementation) === true\n ? erc1822Status\n : erc1967Status).implementation\n\n let supply = 1n\n const types = await getTokenTypes(provider, implementation)\n if (types.includes('ERC1155')) {\n const supply1155 = ERC1155Supply__factory.connect(implementation, getProvider(providers))\n supply = (await tryCall(async () => await supply1155['totalSupply(uint256)'](erc1967Status.address))) ?? 1n\n }\n const fieldsNetwork = await provider.getNetwork()\n const fields: NftInfoFields = {\n address: contract,\n chainId: Number(fieldsNetwork.chainId),\n metadataUri: metadata_url ?? undefined,\n supply: `0x${supply.toString(16)}`,\n tokenId: identifier,\n type: types.at(0),\n types,\n }\n if (implementation !== contract) {\n fields.implementation = implementation\n }\n return fields\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(error.stack)\n throw ex\n }\n }),\n )\n\n return nftResult\n}\n", "/* eslint-disable complexity */\n\nimport { FetchJsonClient } from '@ariestools/sdk'\nimport { ERC721URIStorage__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { NftMetadata } from '@xyo-network/payload-plugins/crypto-nft'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\nimport parseDataUrl from 'parse-data-url'\n\nimport { isErc721, isErc1155 } from './tokenTypes.ts'\n\n/* const baseUrlAbi = [\n {\n inputs: [],\n name: 'baseUrl',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] */\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nconst fetchMetadataFromUri = async (uri: string): Promise<NftMetadata | undefined> => {\n const client = new FetchJsonClient({ timeout: 5000 })\n const response = await client.get<NftMetadata>(uri)\n return response.data ?? undefined\n}\n\nexport const getNftMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n tokenId: string,\n load = false,\n defaultUri?: string,\n): Promise<[string | undefined, NftMetadata | undefined]> => {\n const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n\n let uri721: string | undefined\n const is721 = await isErc721(provider, contractAddress)\n if (is721) {\n try {\n uri721 = await storage721.tokenURI(tokenId)\n } catch {\n // const error = ex as Error\n // console.error(`metaDataUri[${error.name}][${contractAddress}]: storage721.tokenURI(tokenId) failed`)\n }\n }\n\n /* let baseUrl: string | undefined = undefined\n if (is721) {\n try {\n const baseUrlContract = new Contract(contractAddress, baseUrlAbi, provider)\n baseUrl = await baseUrlContract.bareUrl()\n } catch (ex) {\n const error = ex as Error\n console.error(`baseUrl[${error.name}][${contractAddress}]: baseUrl() failed`)\n }\n }\n\n if (baseUrl && !uri721?.startsWith(baseUrl)) {\n uri721 = `${baseUrl}${uri721 ?? tokenId}`\n }\n */\n\n let uri1155: string | undefined\n if (uri721 == null || uri721 === '') {\n const is1155 = await isErc1155(provider, contractAddress)\n if (is1155) {\n try {\n uri1155 = await storage1155.uri(tokenId)\n } catch {\n // const error = ex as Error\n // console.error(`metaDataUri[${error.name}][${contractAddress}]: storage1155.uri(tokenId) failed`)\n // console.log(error.message)\n }\n }\n }\n\n const tokenMetadataUri = [uri721, uri1155].find(Boolean) ?? defaultUri\n let metadata: NftMetadata | undefined\n if (load) {\n if (tokenMetadataUri?.startsWith('data:') === true) {\n const parsedDataUrl = parseDataUrl(tokenMetadataUri)\n if (parsedDataUrl !== false && parsedDataUrl.contentType === 'application/json') {\n const buf = parsedDataUrl.toBuffer()\n const value = buf.toString('utf8')\n metadata = JSON.parse(value) as NftMetadata\n }\n } else {\n /* if (tokenMetadataUri && tokenMetadataUri.length < 5) {\n console.log(`tokenMetadataUri [<5][${contractAddress}]: ${tokenMetadataUri}`)\n console.log(`tokenMetadataUri [uri721]: ${uri721}`)\n console.log(`tokenMetadataUri [uri1155]: ${uri1155}`)\n console.log(`tokenMetadataUri [defaultUri]: ${defaultUri}`)\n } */\n const checkedMetadataUri = tokenMetadataUri != null && tokenMetadataUri.length > 0 ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : undefined\n try {\n if (checkedMetadataUri != null && checkedMetadataUri.length > 0) {\n metadata = await fetchMetadataFromUri(checkedMetadataUri)\n }\n } catch {\n try {\n if (defaultUri != null && defaultUri.length > 0) {\n metadata = await fetchMetadataFromUri(defaultUri)\n }\n } catch {\n // const error = ex as Error\n // console.error(`metadata: ${error.message}`)\n }\n }\n }\n }\n\n return [tokenMetadataUri, metadata]\n}\n", "import { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { TokenType } from '@xyo-network/payload-plugins/crypto-nft'\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, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n", "import type { EthAddress } from '@ariestools/sdk'\nimport { assertEx, FetchJsonClient } from '@ariestools/sdk'\n\ninterface OpenSeaNFT {\n /*\n * Collection slug. A unique string to identify a collection on OpenSea\n */\n collection: string\n /*\n * The unique public blockchain identifier for the contract\n */\n contract: EthAddress\n /**\n * @deprecated\n */\n created_at: string\n /*\n * Description of the NFT\n */\n description: string | null\n /*\n * The NFT's unique identifier within the smart contract (also referred to as token_id)\n */\n identifier: string\n /*\n * Link to the image associated with the NFT\n */\n image_url: string | null\n /*\n * If the item is currently able to be bought or sold using OpenSea\n */\n is_disabled: boolean\n /*\n * If the item is currently classified as 'Not Safe for Work' by OpenSea as defined in OpenSea's NSFW Policy.\n */\n is_nsfw: boolean\n /*\n * Link to the offchain metadata store\n */\n metadata_url: string | null\n /*\n * Name of the NFT\n */\n name: string | null\n /*\n * ERC standard of the token (erc721, erc1155)\n */\n token_standard: string\n /*\n * Last time that the NFT's metadata was updated by OpenSea\n */\n updated_at: string\n}\n\nexport const getNftsFromWalletFromOpenSea = async (address: string, maxNfts = 200, timeout = 2000) => {\n const apiKey = assertEx(process.env.OPENSEA_API_KEY, () => 'No opensea key found')\n\n const client = new FetchJsonClient({ headers: { 'x-api-key': apiKey }, timeout })\n\n const response = await client.get<{ nfts: OpenSeaNFT[] }>(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)\n const nfts = response.data?.nfts ?? []\n return nfts\n}\n", "import type { Provider } from 'ethers'\n\nexport const getProvider = (providers: Provider[]) => {\n return providers[Date.now() % providers.length] // pick a random provider\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 != null && 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/payload-plugins/crypto-nft'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk'\n\nimport { CryptoWalletNftWitness } from './Witness.ts'\n\nexport const CryptoWalletNftWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoWalletNftWitness> =>\n createPayloadSetWitnessPlugin<CryptoWalletNftWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoWalletNftWitness.create(params)\n return result\n },\n },\n )\n", "import { EthAddressWrapper } from '@ariestools/eth-address'\nimport { assertEx } from '@ariestools/sdk'\nimport type {\n CryptoWalletNftWitnessConfig,\n NftInfo,\n NftWitnessQuery,\n} from '@xyo-network/payload-plugins/crypto-nft'\nimport {\n isNftWitnessQuery,\n NftSchema,\n NftWitnessConfigSchema,\n} from '@xyo-network/payload-plugins/crypto-nft'\nimport type { Schema } from '@xyo-network/sdk'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib/index.ts'\n\nexport type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<\n TParams,\n NftWitnessQuery,\n NftInfo\n> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftWitnessConfigSchema\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get timeout() {\n return this.config.timeout ?? 10_000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.startedAsync('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n // calling it here to make sure we rests the cache\n const providers = await this.getProviders()\n try {\n const observations = await Promise.all(\n queries.map(async (query) => {\n const provider = await this.getProvider(true, true)\n const addressValue = assertEx(query?.address ?? this.config.address, () => 'params.address is required')\n const parsedAddressValue = EthAddressWrapper.parse(addressValue)\n const address = assertEx(parsedAddressValue?.toString(), () => 'Failed to parse params.address')\n const network = await provider.getNetwork()\n const chainId = assertEx(network.chainId, () => 'params.chainId is required')\n const maxNfts = query?.maxNfts != null && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts\n try {\n const nfts\n = this.loadMetadata\n ? await getNftsOwnedByAddressWithMetadata(address, providers, maxNfts, this.timeout)\n : await getNftsOwnedByAddress(address, providers, maxNfts, this.timeout)\n const observation = nfts.map<NftInfo>((nft) => {\n return { ...nft, schema }\n })\n return observation\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`, { cause: ex })\n }\n }),\n )\n return observations.flat()\n } catch (ex) {\n const error = ex as Error\n console.error(error)\n return []\n }\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { assertEx } from '@ariestools/sdk'\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 { isHexZero } from '@ariestools/sdk'\nimport {\n ERC721__factory, ERC1155__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport type { NftInfoFields, TokenType } from '@xyo-network/payload-plugins/crypto-nft'\nimport type { Provider } from 'ethers'\nimport { LRUCache } from 'lru-cache'\n\nimport { getErc1822SlotStatus } from '#erc1822-witness'\nimport { getErc1967SlotStatus } from '#erc1967-witness'\n\nimport { getNftMetadata } from './getNftMetadata.ts'\nimport { getNftsFromWalletFromOpenSea } from './getNftsFromWalletFromOpenSea.ts'\nimport { getProvider } from './getProvider.ts'\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst tokenTypeCache = new LRUCache<string, TokenType[]>({ max: 100 })\n\nexport const getTokenTypes = async (provider: Provider, address: string) => {\n const network = await provider.getNetwork()\n const key = `${address}|${network.chainId}`\n const currentValue = tokenTypeCache.get(key)\n if (currentValue) {\n return currentValue\n }\n const types = await tokenTypes(provider, address)\n tokenTypeCache.set(key, types)\n return types\n}\n\nexport const getErc721MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC721__factory.connect(address, provider)\n return [await contract.tokenURI(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getErc1155MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC1155__factory.connect(address, provider)\n return [await contract.uri(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getNftMetadataUri = async (address: string, tokenId: string, provider: Provider) => {\n const results = await Promise.all([getErc721MetadataUri(address, tokenId, provider), getErc1155MetadataUri(address, tokenId, provider)])\n return results[0][0] ?? results[1][0]\n}\n\nexport const getNftsOwnedByAddressWithMetadata = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 200,\n /** @param httpTimeout The connection timeout for HTTP call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout)\n const nftResult = await Promise.all(\n nfts.map(async (nft) => {\n try {\n if (nft.metadataUri == null || nft.metadataUri === '' || !nft.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(\n nft.implementation ?? nft.address,\n getProvider(providers),\n nft.tokenId,\n true,\n nft.metadataUri,\n )\n nft.metadata = nft.metadata ?? metadata\n nft.metadataUri = nft.metadataUri ?? metadataUri\n }\n return nft\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(error.stack)\n throw ex\n }\n }),\n )\n return nftResult\n}\n\nexport const getNftsOwnedByAddress = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 100,\n /** @param httpTimeout The connection timeout for HTTP call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n // const assets = await getAssetsFromWallet(publicAddress, maxNfts, timeout)\n const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout)\n\n const nftResult = await Promise.all(\n nfts.map(async (nft) => {\n try {\n const {\n contract, identifier, metadata_url,\n } = nft\n const provider = getProvider(providers)\n\n const block = await provider.getBlockNumber()\n\n // Check if Upgradeable\n const [erc1967Status, erc1822Status] = await Promise.all([\n // Check if ERC-1967 Upgradeable\n getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n getErc1822SlotStatus(provider, contract, block),\n ])\n\n const erc1967Implementation = erc1967Status.slots.implementation\n const implementation\n = (erc1967Implementation == null || erc1967Implementation === '' || isHexZero(erc1967Implementation) === true\n ? erc1822Status\n : erc1967Status).implementation\n\n let supply = 1n\n const types = await getTokenTypes(provider, implementation)\n if (types.includes('ERC1155')) {\n const supply1155 = ERC1155Supply__factory.connect(implementation, getProvider(providers))\n supply = (await tryCall(async () => await supply1155['totalSupply(uint256)'](erc1967Status.address))) ?? 1n\n }\n const fieldsNetwork = await provider.getNetwork()\n const fields: NftInfoFields = {\n address: contract,\n chainId: Number(fieldsNetwork.chainId),\n metadataUri: metadata_url ?? undefined,\n supply: `0x${supply.toString(16)}`,\n tokenId: identifier,\n type: types.at(0),\n types,\n }\n if (implementation !== contract) {\n fields.implementation = implementation\n }\n return fields\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(error.stack)\n throw ex\n }\n }),\n )\n\n return nftResult\n}\n", "/* eslint-disable complexity */\n\nimport { FetchJsonClient } from '@ariestools/sdk'\nimport { ERC721URIStorage__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { NftMetadata } from '@xyo-network/payload-plugins/crypto-nft'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain'\nimport type { Provider } from 'ethers'\nimport parseDataUrl from 'parse-data-url'\n\nimport { isErc721, isErc1155 } from './tokenTypes.ts'\n\n/* const baseUrlAbi = [\n {\n inputs: [],\n name: 'baseUrl',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] */\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nconst fetchMetadataFromUri = async (uri: string): Promise<NftMetadata | undefined> => {\n const client = new FetchJsonClient({ timeout: 5000 })\n const response = await client.get<NftMetadata>(uri)\n return response.data ?? undefined\n}\n\nexport const getNftMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n tokenId: string,\n load = false,\n defaultUri?: string,\n): Promise<[string | undefined, NftMetadata | undefined]> => {\n const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n\n let uri721: string | undefined\n const is721 = await isErc721(provider, contractAddress)\n if (is721) {\n try {\n uri721 = await storage721.tokenURI(tokenId)\n } catch {\n // const error = ex as Error\n // console.error(`metaDataUri[${error.name}][${contractAddress}]: storage721.tokenURI(tokenId) failed`)\n }\n }\n\n /* let baseUrl: string | undefined = undefined\n if (is721) {\n try {\n const baseUrlContract = new Contract(contractAddress, baseUrlAbi, provider)\n baseUrl = await baseUrlContract.bareUrl()\n } catch (ex) {\n const error = ex as Error\n console.error(`baseUrl[${error.name}][${contractAddress}]: baseUrl() failed`)\n }\n }\n\n if (baseUrl && !uri721?.startsWith(baseUrl)) {\n uri721 = `${baseUrl}${uri721 ?? tokenId}`\n }\n */\n\n let uri1155: string | undefined\n if (uri721 == null || uri721 === '') {\n const is1155 = await isErc1155(provider, contractAddress)\n if (is1155) {\n try {\n uri1155 = await storage1155.uri(tokenId)\n } catch {\n // const error = ex as Error\n // console.error(`metaDataUri[${error.name}][${contractAddress}]: storage1155.uri(tokenId) failed`)\n // console.log(error.message)\n }\n }\n }\n\n const tokenMetadataUri = [uri721, uri1155].find(Boolean) ?? defaultUri\n let metadata: NftMetadata | undefined\n if (load) {\n if (tokenMetadataUri?.startsWith('data:') === true) {\n const parsedDataUrl = parseDataUrl(tokenMetadataUri)\n if (parsedDataUrl !== false && parsedDataUrl.contentType === 'application/json') {\n const buf = parsedDataUrl.toBuffer()\n const value = buf.toString('utf8')\n metadata = JSON.parse(value) as NftMetadata\n }\n } else {\n /* if (tokenMetadataUri && tokenMetadataUri.length < 5) {\n console.log(`tokenMetadataUri [<5][${contractAddress}]: ${tokenMetadataUri}`)\n console.log(`tokenMetadataUri [uri721]: ${uri721}`)\n console.log(`tokenMetadataUri [uri1155]: ${uri1155}`)\n console.log(`tokenMetadataUri [defaultUri]: ${defaultUri}`)\n } */\n const checkedMetadataUri = tokenMetadataUri != null && tokenMetadataUri.length > 0 ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : undefined\n try {\n if (checkedMetadataUri != null && checkedMetadataUri.length > 0) {\n metadata = await fetchMetadataFromUri(checkedMetadataUri)\n }\n } catch {\n try {\n if (defaultUri != null && defaultUri.length > 0) {\n metadata = await fetchMetadataFromUri(defaultUri)\n }\n } catch {\n // const error = ex as Error\n // console.error(`metadata: ${error.message}`)\n }\n }\n }\n }\n\n return [tokenMetadataUri, metadata]\n}\n", "import { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { TokenType } from '@xyo-network/payload-plugins/crypto-nft'\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, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n", "import type { EthAddress } from '@ariestools/sdk'\nimport { assertEx, FetchJsonClient } from '@ariestools/sdk'\n\ninterface OpenSeaNFT {\n /*\n * Collection slug. A unique string to identify a collection on OpenSea\n */\n collection: string\n /*\n * The unique public blockchain identifier for the contract\n */\n contract: EthAddress\n /**\n * @deprecated\n */\n created_at: string\n /*\n * Description of the NFT\n */\n description: string | null\n /*\n * The NFT's unique identifier within the smart contract (also referred to as token_id)\n */\n identifier: string\n /*\n * Link to the image associated with the NFT\n */\n image_url: string | null\n /*\n * If the item is currently able to be bought or sold using OpenSea\n */\n is_disabled: boolean\n /*\n * If the item is currently classified as 'Not Safe for Work' by OpenSea as defined in OpenSea's NSFW Policy.\n */\n is_nsfw: boolean\n /*\n * Link to the offchain metadata store\n */\n metadata_url: string | null\n /*\n * Name of the NFT\n */\n name: string | null\n /*\n * ERC standard of the token (erc721, erc1155)\n */\n token_standard: string\n /*\n * Last time that the NFT's metadata was updated by OpenSea\n */\n updated_at: string\n}\n\nexport const getNftsFromWalletFromOpenSea = async (address: string, maxNfts = 200, timeout = 2000) => {\n const apiKey = assertEx(process.env.OPENSEA_API_KEY, () => 'No opensea key found')\n\n const client = new FetchJsonClient({ headers: { 'x-api-key': apiKey }, timeout })\n\n const response = await client.get<{ nfts: OpenSeaNFT[] }>(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)\n const nfts = response.data?.nfts ?? []\n return nfts\n}\n", "import type { Provider } from 'ethers'\n\nexport const getProvider = (providers: Provider[]) => {\n return providers[Date.now() % providers.length] // pick a random provider\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 != null && 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/payload-plugins/crypto-nft'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk'\n\nimport { CryptoWalletNftWitness } from './Witness.ts'\n\nexport const CryptoWalletNftWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoWalletNftWitness> =>\n createPayloadSetWitnessPlugin<CryptoWalletNftWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoWalletNftWitness.create(params)\n return result\n },\n },\n )\n", "import { EthAddressWrapper } from '@ariestools/eth-address'\nimport { assertEx } from '@ariestools/sdk'\nimport type {\n CryptoWalletNftWitnessConfig,\n NftInfo,\n NftWitnessQuery,\n} from '@xyo-network/payload-plugins/crypto-nft'\nimport {\n isNftWitnessQuery,\n NftSchema,\n NftWitnessConfigSchema,\n} from '@xyo-network/payload-plugins/crypto-nft'\nimport type { Schema } from '@xyo-network/sdk'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib/index.ts'\n\nexport type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<\n TParams,\n NftWitnessQuery,\n NftInfo\n> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftWitnessConfigSchema\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get timeout() {\n return this.config.timeout ?? 10_000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.startedAsync('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n // calling it here to make sure we rests the cache\n const providers = await this.getProviders()\n try {\n const observations = await Promise.all(\n queries.map(async (query) => {\n const provider = await this.getProvider(true, true)\n const addressValue = assertEx(query?.address ?? this.config.address, () => 'params.address is required')\n const parsedAddressValue = EthAddressWrapper.parse(addressValue)\n const address = assertEx(parsedAddressValue?.toString(), () => 'Failed to parse params.address')\n const network = await provider.getNetwork()\n const chainId = assertEx(network.chainId, () => 'params.chainId is required')\n const maxNfts = query?.maxNfts != null && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts\n try {\n const nfts\n = this.loadMetadata\n ? await getNftsOwnedByAddressWithMetadata(address, providers, maxNfts, this.timeout)\n : await getNftsOwnedByAddress(address, providers, maxNfts, this.timeout)\n const observation = nfts.map<NftInfo>((nft) => {\n return { ...nft, schema }\n })\n return observation\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`, { cause: ex })\n }\n }),\n )\n return observations.flat()\n } catch (ex) {\n const error = ex as Error\n console.error(error)\n return []\n }\n }\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["ERC1155URIStorage__factory", "ERC1155URIStorage__factory", "assertEx", "FetchJsonClient", "NftSchema", "assertEx", "assertEx", "NftSchema"]
|
|
7
7
|
}
|
|
@@ -55,7 +55,7 @@ var toErc1822Status = zodToFactory(Erc1822StatusZod, "toErc1822Status");
|
|
|
55
55
|
// src/modules/erc1822-witness/Witness.ts
|
|
56
56
|
import { asEthAddress as asEthAddress2, assertEx } from "@ariestools/sdk";
|
|
57
57
|
import { asSchema as asSchema2, isPayloadOfSchemaType } from "@xyo-network/sdk";
|
|
58
|
-
import { AbstractEvmWitness, EvmAddressSchema } from "@xyo-network/witness-evm
|
|
58
|
+
import { AbstractEvmWitness, EvmAddressSchema } from "@xyo-network/witness-evm";
|
|
59
59
|
var Erc1822WitnessConfigSchema = asSchema2("network.xyo.erc1822.witness.config", true);
|
|
60
60
|
var Erc1822Witness = class extends AbstractEvmWitness {
|
|
61
61
|
static configSchemas = [...super.configSchemas, Erc1822WitnessConfigSchema];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/erc1822-witness/lib/getErc1822SlotStatus.ts", "../../src/modules/erc1822-witness/Payload.ts", "../../src/modules/erc1822-witness/Witness.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EthAddress } from '@ariestools/sdk'\nimport {\n asEthAddress, hexFromHexString, isHexZero,\n} from '@ariestools/sdk'\nimport type { Provider } from 'ethers'\nimport * as z from 'zod/mini'\n\nexport const ERC1822_PROXY_LOGIC_SLOT = '0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7'\n\nexport const Erc1822DataSlotsZod = z.object({ implementation: z.optional(z.custom<EthAddress>()) })\n\nexport type Erc1822DataSlots = z.infer<typeof Erc1822DataSlotsZod>\n\nexport const Erc1822SlotStatusZod = z.object({\n address: z.custom<EthAddress>(),\n implementation: z.custom<EthAddress>(),\n slots: Erc1822DataSlotsZod,\n})\n\nexport type Erc1822SlotStatus = z.infer<typeof Erc1822SlotStatusZod>\n\nconst readAddressFromSlot = async (provider: Provider, address: string, slot: string, block?: number) => {\n try {\n const slotValue = await provider.getStorage(address, slot, block)\n return asEthAddress(hexFromHexString(slotValue, { prefix: true }))\n } catch {\n return\n }\n}\n\nexport const getErc1822SlotStatus = async (provider: Provider, address: EthAddress, block?: number): Promise<Erc1822SlotStatus> => {\n const status: Erc1822SlotStatus = {\n address,\n implementation: address,\n slots: { implementation: await readAddressFromSlot(provider, address, ERC1822_PROXY_LOGIC_SLOT, block) },\n }\n\n if (status.slots.implementation != null && isHexZero(status.slots.implementation) !== true) {\n status.implementation = status.slots.implementation\n }\n\n return status\n}\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport { asSchema, PayloadZodOfSchema } from '@xyo-network/sdk'\nimport * as z from 'zod/mini'\n\nimport { Erc1822SlotStatusZod } from './lib/index.ts'\n\nexport const Erc1822StatusSchema = asSchema('network.xyo.erc1822.status', true)\nexport type Erc1822StatusSchema = typeof Erc1822StatusSchema\n\nexport const Erc1822StatusZod = z.extend(PayloadZodOfSchema(Erc1822StatusSchema), {\n address: z.string(),\n block: z.number(),\n chainId: z.number(),\n implementation: z.optional(Erc1822SlotStatusZod.shape.implementation),\n slots: z.optional(Erc1822SlotStatusZod.shape.slots),\n})\n\nexport type Erc1822Status = z.infer<typeof Erc1822StatusZod>\n\nexport const isErc1822Status = zodIsFactory(Erc1822StatusZod)\nexport const asErc1822Status = zodAsFactory(Erc1822StatusZod, 'asErc1822Status')\nexport const toErc1822Status = zodToFactory(Erc1822StatusZod, 'toErc1822Status')\n", "import { asEthAddress, assertEx } from '@ariestools/sdk'\nimport type { Schema } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type {\n EvmAddress,\n EvmWitnessConfig, EvmWitnessParams,\n} from '@xyo-network/witness-evm
|
|
4
|
+
"sourcesContent": ["import type { EthAddress } from '@ariestools/sdk'\nimport {\n asEthAddress, hexFromHexString, isHexZero,\n} from '@ariestools/sdk'\nimport type { Provider } from 'ethers'\nimport * as z from 'zod/mini'\n\nexport const ERC1822_PROXY_LOGIC_SLOT = '0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7'\n\nexport const Erc1822DataSlotsZod = z.object({ implementation: z.optional(z.custom<EthAddress>()) })\n\nexport type Erc1822DataSlots = z.infer<typeof Erc1822DataSlotsZod>\n\nexport const Erc1822SlotStatusZod = z.object({\n address: z.custom<EthAddress>(),\n implementation: z.custom<EthAddress>(),\n slots: Erc1822DataSlotsZod,\n})\n\nexport type Erc1822SlotStatus = z.infer<typeof Erc1822SlotStatusZod>\n\nconst readAddressFromSlot = async (provider: Provider, address: string, slot: string, block?: number) => {\n try {\n const slotValue = await provider.getStorage(address, slot, block)\n return asEthAddress(hexFromHexString(slotValue, { prefix: true }))\n } catch {\n return\n }\n}\n\nexport const getErc1822SlotStatus = async (provider: Provider, address: EthAddress, block?: number): Promise<Erc1822SlotStatus> => {\n const status: Erc1822SlotStatus = {\n address,\n implementation: address,\n slots: { implementation: await readAddressFromSlot(provider, address, ERC1822_PROXY_LOGIC_SLOT, block) },\n }\n\n if (status.slots.implementation != null && isHexZero(status.slots.implementation) !== true) {\n status.implementation = status.slots.implementation\n }\n\n return status\n}\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport { asSchema, PayloadZodOfSchema } from '@xyo-network/sdk'\nimport * as z from 'zod/mini'\n\nimport { Erc1822SlotStatusZod } from './lib/index.ts'\n\nexport const Erc1822StatusSchema = asSchema('network.xyo.erc1822.status', true)\nexport type Erc1822StatusSchema = typeof Erc1822StatusSchema\n\nexport const Erc1822StatusZod = z.extend(PayloadZodOfSchema(Erc1822StatusSchema), {\n address: z.string(),\n block: z.number(),\n chainId: z.number(),\n implementation: z.optional(Erc1822SlotStatusZod.shape.implementation),\n slots: z.optional(Erc1822SlotStatusZod.shape.slots),\n})\n\nexport type Erc1822Status = z.infer<typeof Erc1822StatusZod>\n\nexport const isErc1822Status = zodIsFactory(Erc1822StatusZod)\nexport const asErc1822Status = zodAsFactory(Erc1822StatusZod, 'asErc1822Status')\nexport const toErc1822Status = zodToFactory(Erc1822StatusZod, 'toErc1822Status')\n", "import { asEthAddress, assertEx } from '@ariestools/sdk'\nimport type { Schema } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type {\n EvmAddress,\n EvmWitnessConfig, EvmWitnessParams,\n} from '@xyo-network/witness-evm'\nimport { AbstractEvmWitness, EvmAddressSchema } from '@xyo-network/witness-evm'\n\nimport { getErc1822SlotStatus } from './lib/index.ts'\nimport type { Erc1822Status } from './Payload.ts'\nimport { Erc1822StatusSchema } from './Payload.ts'\n\nexport const Erc1822WitnessConfigSchema = asSchema('network.xyo.erc1822.witness.config', true)\nexport type Erc1822WitnessConfigSchema = typeof Erc1822WitnessConfigSchema\n\nexport type Erc1822WitnessConfig = EvmWitnessConfig<{ address?: string }, Erc1822WitnessConfigSchema>\n\nexport type Erc1822WitnessParams = EvmWitnessParams<Erc1822WitnessConfig>\n\nexport class Erc1822Witness<TParams extends Erc1822WitnessParams = Erc1822WitnessParams> extends AbstractEvmWitness<\n TParams,\n EvmAddress,\n Erc1822Status\n> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, Erc1822WitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = Erc1822WitnessConfigSchema\n\n protected override async observeHandler(inPayloads: EvmAddress[] = []): Promise<Erc1822Status[]> {\n await this.startedAsync('throw')\n // calling it here to make sure we rests the cache\n await this.getProviders()\n try {\n const observations = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType<EvmAddress>(EvmAddressSchema)).map(async ({ address }) => {\n const validatedAddress = asEthAddress(assertEx(address ?? this.config.address, () => 'Missing address'), true)\n\n const provider = await this.getProvider(true, true)\n\n const block = await provider.getBlockNumber()\n\n const { implementation, slots } = await getErc1822SlotStatus(provider, validatedAddress, block)\n\n const network = await provider.getNetwork()\n const observation: Erc1822Status = {\n address: validatedAddress,\n block,\n chainId: Number(network.chainId),\n implementation,\n schema: Erc1822StatusSchema,\n slots,\n }\n return observation\n }),\n )\n return observations\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n throw error\n }\n }\n}\n"],
|
|
5
5
|
"mappings": ";AACA;AAAA,EACE;AAAA,EAAc;AAAA,EAAkB;AAAA,OAC3B;AAEP,YAAY,OAAO;AAEZ,IAAM,2BAA2B;AAEjC,IAAM,sBAAwB,SAAO,EAAE,gBAAkB,WAAW,SAAmB,CAAC,EAAE,CAAC;AAI3F,IAAM,uBAAyB,SAAO;AAAA,EAC3C,SAAW,SAAmB;AAAA,EAC9B,gBAAkB,SAAmB;AAAA,EACrC,OAAO;AACT,CAAC;AAID,IAAM,sBAAsB,OAAO,UAAoB,SAAiB,MAAc,UAAmB;AACvG,MAAI;AACF,UAAM,YAAY,MAAM,SAAS,WAAW,SAAS,MAAM,KAAK;AAChE,WAAO,aAAa,iBAAiB,WAAW,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EACnE,QAAQ;AACN;AAAA,EACF;AACF;AAEO,IAAM,uBAAuB,OAAO,UAAoB,SAAqB,UAA+C;AACjI,QAAM,SAA4B;AAAA,IAChC;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO,EAAE,gBAAgB,MAAM,oBAAoB,UAAU,SAAS,0BAA0B,KAAK,EAAE;AAAA,EACzG;AAEA,MAAI,OAAO,MAAM,kBAAkB,QAAQ,UAAU,OAAO,MAAM,cAAc,MAAM,MAAM;AAC1F,WAAO,iBAAiB,OAAO,MAAM;AAAA,EACvC;AAEA,SAAO;AACT;;;AC1CA;AAAA,EACE;AAAA,EAAc;AAAA,EAAc;AAAA,OACvB;AACP,SAAS,UAAU,0BAA0B;AAC7C,YAAYA,QAAO;AAIZ,IAAM,sBAAsB,SAAS,8BAA8B,IAAI;AAGvE,IAAM,mBAAqB,UAAO,mBAAmB,mBAAmB,GAAG;AAAA,EAChF,SAAW,UAAO;AAAA,EAClB,OAAS,UAAO;AAAA,EAChB,SAAW,UAAO;AAAA,EAClB,gBAAkB,YAAS,qBAAqB,MAAM,cAAc;AAAA,EACpE,OAAS,YAAS,qBAAqB,MAAM,KAAK;AACpD,CAAC;AAIM,IAAM,kBAAkB,aAAa,gBAAgB;AACrD,IAAM,kBAAkB,aAAa,kBAAkB,iBAAiB;AACxE,IAAM,kBAAkB,aAAa,kBAAkB,iBAAiB;;;ACvB/E,SAAS,gBAAAC,eAAc,gBAAgB;AAEvC,SAAS,YAAAC,WAAU,6BAA6B;AAKhD,SAAS,oBAAoB,wBAAwB;AAM9C,IAAM,6BAA6BC,UAAS,sCAAsC,IAAI;AAOtF,IAAM,iBAAN,cAA0F,mBAI/F;AAAA,EACA,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,0BAA0B;AAAA,EACtG,OAAyB,sBAA8B;AAAA,EAEvD,MAAyB,eAAe,aAA2B,CAAC,GAA6B;AAC/F,UAAM,KAAK,aAAa,OAAO;AAE/B,UAAM,KAAK,aAAa;AACxB,QAAI;AACF,YAAM,eAAe,MAAM,QAAQ;AAAA,QACjC,WAAW,OAAO,sBAAkC,gBAAgB,CAAC,EAAE,IAAI,OAAO,EAAE,QAAQ,MAAM;AAChG,gBAAM,mBAAmBC,cAAa,SAAS,WAAW,KAAK,OAAO,SAAS,MAAM,iBAAiB,GAAG,IAAI;AAE7G,gBAAM,WAAW,MAAM,KAAK,YAAY,MAAM,IAAI;AAElD,gBAAM,QAAQ,MAAM,SAAS,eAAe;AAE5C,gBAAM,EAAE,gBAAgB,MAAM,IAAI,MAAM,qBAAqB,UAAU,kBAAkB,KAAK;AAE9F,gBAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,gBAAM,cAA6B;AAAA,YACjC,SAAS;AAAA,YACT;AAAA,YACA,SAAS,OAAO,QAAQ,OAAO;AAAA,YAC/B;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,MAAM,OAAO,EAAE;AAC3D,YAAM;AAAA,IACR;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["z", "asEthAddress", "asSchema", "asSchema", "asEthAddress"]
|
|
7
7
|
}
|
|
@@ -87,7 +87,7 @@ var toErc1967Status = zodToFactory(Erc1967StatusZod, "toErc1967Status");
|
|
|
87
87
|
// src/modules/erc1967-witness/Witness.ts
|
|
88
88
|
import { assertEx } from "@ariestools/sdk";
|
|
89
89
|
import { asSchema as asSchema2, isPayloadOfSchemaType } from "@xyo-network/sdk";
|
|
90
|
-
import { AbstractEvmWitness, EvmAddressSchema } from "@xyo-network/witness-evm
|
|
90
|
+
import { AbstractEvmWitness, EvmAddressSchema } from "@xyo-network/witness-evm";
|
|
91
91
|
var Erc1967WitnessConfigSchema = asSchema2("network.xyo.erc1967.witness.config", true);
|
|
92
92
|
var Erc1967Witness = class extends AbstractEvmWitness {
|
|
93
93
|
static configSchemas = [...super.configSchemas, Erc1967WitnessConfigSchema];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/erc1967-witness/lib/getErc1967SlotStatus.ts", "../../src/modules/erc1967-witness/Payload.ts", "../../src/modules/erc1967-witness/Witness.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Address, EthAddress } from '@ariestools/sdk'\nimport {\n asEthAddress, hexFromHexString, isHexZero,\n} from '@ariestools/sdk'\nimport { UpgradeableBeacon__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\nimport * as z from 'zod/mini'\n\nexport const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc' as EthAddress\nexport const ERC1967_PROXY_BEACON_STORAGE_SLOT = '0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50' as EthAddress\nexport const ERC1967_PROXY_ADMIN_STORAGE_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103' as EthAddress\nexport const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = '0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143' as EthAddress\n\nexport const Erc1967DataSlotsZod = z.object({\n admin: z.optional(z.custom<EthAddress>()),\n beacon: z.optional(z.custom<EthAddress>()),\n implementation: z.optional(z.custom<EthAddress>()),\n rollback: z.optional(z.custom<EthAddress>()),\n})\n\nexport type Erc1967DataSlots = z.infer<typeof Erc1967DataSlotsZod>\n\nexport const Erc1967SlotStatusZod = z.object({\n address: z.string(),\n beacon: z.optional(z.object({ implementation: z.optional(z.custom<Address>()) })),\n implementation: z.string(),\n slots: Erc1967DataSlotsZod,\n})\n\nexport type Erc1967SlotStatus = z.infer<typeof Erc1967SlotStatusZod>\n\nconst readAddressFromSlot = async (provider: Provider, address: string, slot: string, block?: number) => {\n try {\n const slotValue = await provider.getStorage(address, slot, block)\n return asEthAddress(hexFromHexString(slotValue, { prefix: true }))\n } catch {\n return\n }\n}\n\nexport const getErc1967SlotStatus = async (provider: Provider, address: string, block?: number): Promise<Erc1967SlotStatus> => {\n const status: Erc1967SlotStatus = {\n address,\n implementation: address,\n slots: {\n admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT, block),\n beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT, block),\n implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT, block),\n rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT, block),\n },\n }\n\n if (status.slots.implementation != null && isHexZero(status.slots.implementation) === false) {\n status.implementation = `0x${BigInt(status.slots.implementation)\n .toString(16)\n .padStart(40, '0')}`\n } else {\n if (status.slots.beacon != null && isHexZero(status.slots.beacon) === false) {\n const beacon = UpgradeableBeacon__factory.connect(status.slots.beacon, { provider })\n try {\n const implementation = (await beacon.implementation(block != null && block !== 0 ? { blockTag: block } : {})) as Address\n if (implementation.length > 0) {\n status.beacon = { implementation }\n if (isHexZero(implementation) === false) {\n status.implementation = implementation\n }\n }\n } catch (ex) {\n const error = ex as Error\n console.log(error.message)\n }\n }\n }\n\n return status\n}\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport { asSchema, PayloadZodOfSchema } from '@xyo-network/sdk'\nimport * as z from 'zod/mini'\n\nimport { Erc1967DataSlotsZod, Erc1967SlotStatusZod } from './lib/index.ts'\n\nexport const Erc1967StatusSchema = asSchema('network.xyo.erc1967.status', true)\nexport type Erc1967StatusSchema = typeof Erc1967StatusSchema\n\nexport const Erc1967StatusZod = z.extend(PayloadZodOfSchema(Erc1967StatusSchema), {\n address: z.string(),\n beacon: Erc1967SlotStatusZod.shape.beacon,\n block: z.number(),\n chainId: z.number(),\n implementation: z.optional(Erc1967SlotStatusZod.shape.implementation),\n slots: z.optional(Erc1967DataSlotsZod),\n})\n\nexport type Erc1967Status = z.infer<typeof Erc1967StatusZod>\n\nexport const isErc1967Status = zodIsFactory(Erc1967StatusZod)\nexport const asErc1967Status = zodAsFactory(Erc1967StatusZod, 'asErc1967Status')\nexport const toErc1967Status = zodToFactory(Erc1967StatusZod, 'toErc1967Status')\n", "import { assertEx } from '@ariestools/sdk'\nimport type { Schema } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type {\n EvmAddress,\n EvmWitnessConfig, EvmWitnessParams,\n} from '@xyo-network/witness-evm
|
|
4
|
+
"sourcesContent": ["import type { Address, EthAddress } from '@ariestools/sdk'\nimport {\n asEthAddress, hexFromHexString, isHexZero,\n} from '@ariestools/sdk'\nimport { UpgradeableBeacon__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\nimport * as z from 'zod/mini'\n\nexport const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc' as EthAddress\nexport const ERC1967_PROXY_BEACON_STORAGE_SLOT = '0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50' as EthAddress\nexport const ERC1967_PROXY_ADMIN_STORAGE_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103' as EthAddress\nexport const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = '0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143' as EthAddress\n\nexport const Erc1967DataSlotsZod = z.object({\n admin: z.optional(z.custom<EthAddress>()),\n beacon: z.optional(z.custom<EthAddress>()),\n implementation: z.optional(z.custom<EthAddress>()),\n rollback: z.optional(z.custom<EthAddress>()),\n})\n\nexport type Erc1967DataSlots = z.infer<typeof Erc1967DataSlotsZod>\n\nexport const Erc1967SlotStatusZod = z.object({\n address: z.string(),\n beacon: z.optional(z.object({ implementation: z.optional(z.custom<Address>()) })),\n implementation: z.string(),\n slots: Erc1967DataSlotsZod,\n})\n\nexport type Erc1967SlotStatus = z.infer<typeof Erc1967SlotStatusZod>\n\nconst readAddressFromSlot = async (provider: Provider, address: string, slot: string, block?: number) => {\n try {\n const slotValue = await provider.getStorage(address, slot, block)\n return asEthAddress(hexFromHexString(slotValue, { prefix: true }))\n } catch {\n return\n }\n}\n\nexport const getErc1967SlotStatus = async (provider: Provider, address: string, block?: number): Promise<Erc1967SlotStatus> => {\n const status: Erc1967SlotStatus = {\n address,\n implementation: address,\n slots: {\n admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT, block),\n beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT, block),\n implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT, block),\n rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT, block),\n },\n }\n\n if (status.slots.implementation != null && isHexZero(status.slots.implementation) === false) {\n status.implementation = `0x${BigInt(status.slots.implementation)\n .toString(16)\n .padStart(40, '0')}`\n } else {\n if (status.slots.beacon != null && isHexZero(status.slots.beacon) === false) {\n const beacon = UpgradeableBeacon__factory.connect(status.slots.beacon, { provider })\n try {\n const implementation = (await beacon.implementation(block != null && block !== 0 ? { blockTag: block } : {})) as Address\n if (implementation.length > 0) {\n status.beacon = { implementation }\n if (isHexZero(implementation) === false) {\n status.implementation = implementation\n }\n }\n } catch (ex) {\n const error = ex as Error\n console.log(error.message)\n }\n }\n }\n\n return status\n}\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport { asSchema, PayloadZodOfSchema } from '@xyo-network/sdk'\nimport * as z from 'zod/mini'\n\nimport { Erc1967DataSlotsZod, Erc1967SlotStatusZod } from './lib/index.ts'\n\nexport const Erc1967StatusSchema = asSchema('network.xyo.erc1967.status', true)\nexport type Erc1967StatusSchema = typeof Erc1967StatusSchema\n\nexport const Erc1967StatusZod = z.extend(PayloadZodOfSchema(Erc1967StatusSchema), {\n address: z.string(),\n beacon: Erc1967SlotStatusZod.shape.beacon,\n block: z.number(),\n chainId: z.number(),\n implementation: z.optional(Erc1967SlotStatusZod.shape.implementation),\n slots: z.optional(Erc1967DataSlotsZod),\n})\n\nexport type Erc1967Status = z.infer<typeof Erc1967StatusZod>\n\nexport const isErc1967Status = zodIsFactory(Erc1967StatusZod)\nexport const asErc1967Status = zodAsFactory(Erc1967StatusZod, 'asErc1967Status')\nexport const toErc1967Status = zodToFactory(Erc1967StatusZod, 'toErc1967Status')\n", "import { assertEx } from '@ariestools/sdk'\nimport type { Schema } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type {\n EvmAddress,\n EvmWitnessConfig, EvmWitnessParams,\n} from '@xyo-network/witness-evm'\nimport { AbstractEvmWitness, EvmAddressSchema } from '@xyo-network/witness-evm'\n\nimport { getErc1967SlotStatus } from './lib/index.ts'\nimport type { Erc1967Status } from './Payload.ts'\nimport { Erc1967StatusSchema } from './Payload.ts'\n\nexport const Erc1967WitnessConfigSchema = asSchema('network.xyo.erc1967.witness.config', true)\nexport type Erc1967WitnessConfigSchema = typeof Erc1967WitnessConfigSchema\n\nexport type Erc1967WitnessConfig = EvmWitnessConfig<{ address?: string }, Erc1967WitnessConfigSchema>\n\nexport type Erc1967WitnessParams = EvmWitnessParams<Erc1967WitnessConfig>\n\nexport class Erc1967Witness<TParams extends Erc1967WitnessParams = Erc1967WitnessParams> extends AbstractEvmWitness<\n TParams,\n EvmAddress,\n Erc1967Status\n> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, Erc1967WitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = Erc1967WitnessConfigSchema\n\n protected override async observeHandler(inPayloads: EvmAddress[] = []): Promise<Erc1967Status[]> {\n await this.startedAsync('throw')\n // calling it here to make sure we rests the cache\n await this.getProviders()\n try {\n const observations = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType<EvmAddress>(EvmAddressSchema)).map(async ({ address }) => {\n const validatedAddress = assertEx(address ?? this.config.address, () => 'Missing address').toLowerCase()\n\n const provider = await this.getProvider(true, true)\n\n const block = await provider.getBlockNumber()\n\n const {\n beacon, implementation, slots,\n } = await getErc1967SlotStatus(provider, validatedAddress, block)\n\n const network = await provider.getNetwork()\n\n const observation: Erc1967Status = {\n address: validatedAddress,\n beacon,\n block,\n chainId: Number(network.chainId),\n implementation,\n schema: Erc1967StatusSchema,\n slots,\n }\n return observation\n }),\n )\n return observations\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n throw error\n }\n }\n}\n"],
|
|
5
5
|
"mappings": ";AACA;AAAA,EACE;AAAA,EAAc;AAAA,EAAkB;AAAA,OAC3B;AACP,SAAS,kCAAkC;AAE3C,YAAY,OAAO;AAEZ,IAAM,4CAA4C;AAClD,IAAM,oCAAoC;AAC1C,IAAM,mCAAmC;AACzC,IAAM,sCAAsC;AAE5C,IAAM,sBAAwB,SAAO;AAAA,EAC1C,OAAS,WAAW,SAAmB,CAAC;AAAA,EACxC,QAAU,WAAW,SAAmB,CAAC;AAAA,EACzC,gBAAkB,WAAW,SAAmB,CAAC;AAAA,EACjD,UAAY,WAAW,SAAmB,CAAC;AAC7C,CAAC;AAIM,IAAM,uBAAyB,SAAO;AAAA,EAC3C,SAAW,SAAO;AAAA,EAClB,QAAU,WAAW,SAAO,EAAE,gBAAkB,WAAW,SAAgB,CAAC,EAAE,CAAC,CAAC;AAAA,EAChF,gBAAkB,SAAO;AAAA,EACzB,OAAO;AACT,CAAC;AAID,IAAM,sBAAsB,OAAO,UAAoB,SAAiB,MAAc,UAAmB;AACvG,MAAI;AACF,UAAM,YAAY,MAAM,SAAS,WAAW,SAAS,MAAM,KAAK;AAChE,WAAO,aAAa,iBAAiB,WAAW,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EACnE,QAAQ;AACN;AAAA,EACF;AACF;AAEO,IAAM,uBAAuB,OAAO,UAAoB,SAAiB,UAA+C;AAC7H,QAAM,SAA4B;AAAA,IAChC;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO;AAAA,MACL,OAAO,MAAM,oBAAoB,UAAU,SAAS,kCAAkC,KAAK;AAAA,MAC3F,QAAQ,MAAM,oBAAoB,UAAU,SAAS,mCAAmC,KAAK;AAAA,MAC7F,gBAAgB,MAAM,oBAAoB,UAAU,SAAS,2CAA2C,KAAK;AAAA,MAC7G,UAAU,MAAM,oBAAoB,UAAU,SAAS,qCAAqC,KAAK;AAAA,IACnG;AAAA,EACF;AAEA,MAAI,OAAO,MAAM,kBAAkB,QAAQ,UAAU,OAAO,MAAM,cAAc,MAAM,OAAO;AAC3F,WAAO,iBAAiB,KAAK,OAAO,OAAO,MAAM,cAAc,EAC5D,SAAS,EAAE,EACX,SAAS,IAAI,GAAG,CAAC;AAAA,EACtB,OAAO;AACL,QAAI,OAAO,MAAM,UAAU,QAAQ,UAAU,OAAO,MAAM,MAAM,MAAM,OAAO;AAC3E,YAAM,SAAS,2BAA2B,QAAQ,OAAO,MAAM,QAAQ,EAAE,SAAS,CAAC;AACnF,UAAI;AACF,cAAM,iBAAkB,MAAM,OAAO,eAAe,SAAS,QAAQ,UAAU,IAAI,EAAE,UAAU,MAAM,IAAI,CAAC,CAAC;AAC3G,YAAI,eAAe,SAAS,GAAG;AAC7B,iBAAO,SAAS,EAAE,eAAe;AACjC,cAAI,UAAU,cAAc,MAAM,OAAO;AACvC,mBAAO,iBAAiB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,gBAAQ,IAAI,MAAM,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC3EA;AAAA,EACE;AAAA,EAAc;AAAA,EAAc;AAAA,OACvB;AACP,SAAS,UAAU,0BAA0B;AAC7C,YAAYA,QAAO;AAIZ,IAAM,sBAAsB,SAAS,8BAA8B,IAAI;AAGvE,IAAM,mBAAqB,UAAO,mBAAmB,mBAAmB,GAAG;AAAA,EAChF,SAAW,UAAO;AAAA,EAClB,QAAQ,qBAAqB,MAAM;AAAA,EACnC,OAAS,UAAO;AAAA,EAChB,SAAW,UAAO;AAAA,EAClB,gBAAkB,YAAS,qBAAqB,MAAM,cAAc;AAAA,EACpE,OAAS,YAAS,mBAAmB;AACvC,CAAC;AAIM,IAAM,kBAAkB,aAAa,gBAAgB;AACrD,IAAM,kBAAkB,aAAa,kBAAkB,iBAAiB;AACxE,IAAM,kBAAkB,aAAa,kBAAkB,iBAAiB;;;ACxB/E,SAAS,gBAAgB;AAEzB,SAAS,YAAAC,WAAU,6BAA6B;AAKhD,SAAS,oBAAoB,wBAAwB;AAM9C,IAAM,6BAA6BC,UAAS,sCAAsC,IAAI;AAOtF,IAAM,iBAAN,cAA0F,mBAI/F;AAAA,EACA,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,0BAA0B;AAAA,EACtG,OAAyB,sBAA8B;AAAA,EAEvD,MAAyB,eAAe,aAA2B,CAAC,GAA6B;AAC/F,UAAM,KAAK,aAAa,OAAO;AAE/B,UAAM,KAAK,aAAa;AACxB,QAAI;AACF,YAAM,eAAe,MAAM,QAAQ;AAAA,QACjC,WAAW,OAAO,sBAAkC,gBAAgB,CAAC,EAAE,IAAI,OAAO,EAAE,QAAQ,MAAM;AAChG,gBAAM,mBAAmB,SAAS,WAAW,KAAK,OAAO,SAAS,MAAM,iBAAiB,EAAE,YAAY;AAEvG,gBAAM,WAAW,MAAM,KAAK,YAAY,MAAM,IAAI;AAElD,gBAAM,QAAQ,MAAM,SAAS,eAAe;AAE5C,gBAAM;AAAA,YACJ;AAAA,YAAQ;AAAA,YAAgB;AAAA,UAC1B,IAAI,MAAM,qBAAqB,UAAU,kBAAkB,KAAK;AAEhE,gBAAM,UAAU,MAAM,SAAS,WAAW;AAE1C,gBAAM,cAA6B;AAAA,YACjC,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA,SAAS,OAAO,QAAQ,OAAO;AAAA,YAC/B;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,MAAM,OAAO,EAAE;AAC3D,YAAM;AAAA,IACR;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["z", "asSchema", "asSchema"]
|
|
7
7
|
}
|
|
@@ -137,7 +137,7 @@ import {
|
|
|
137
137
|
isHexZero
|
|
138
138
|
} from "@ariestools/sdk";
|
|
139
139
|
import { isPayloadOfSchemaType as isPayloadOfSchemaType2 } from "@xyo-network/sdk";
|
|
140
|
-
import { AbstractEvmWitness } from "@xyo-network/witness-evm
|
|
140
|
+
import { AbstractEvmWitness } from "@xyo-network/witness-evm";
|
|
141
141
|
import { Contract } from "ethers";
|
|
142
142
|
import { getErc1822SlotStatus } from "#erc1822-witness";
|
|
143
143
|
import { getErc1967SlotStatus } from "#erc1967-witness";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/evm-call-witness/Diviner.ts", "../../src/modules/evm-call-witness/Labels.ts", "../../src/modules/evm-call-witness/Payload.ts", "../../src/modules/evm-call-witness/model.ts", "../../src/modules/evm-call-witness/Witness.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Promisable } from '@ariestools/sdk'\nimport {\n assertEx, zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport type {\n DivinerConfig, DivinerParams, Payload, Schema,\n} from '@xyo-network/sdk'\nimport {\n AbstractDiviner, asSchema, isPayloadOfSchemaType, PayloadZodOfSchema,\n} from '@xyo-network/sdk'\nimport * as z from 'zod/mini'\n\nimport { EvmCallDivinerLabels } from './Labels.ts'\nimport type { EvmCallResult } from './Payload.ts'\nimport { asEvmCallSuccess, EvmCallResultSchema } from './Payload.ts'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const EvmCallDivinerConfigSchema = asSchema('network.xyo.evm.call.diviner.config', true)\nexport type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema\n\nexport type EvmCallDivinerConfig = DivinerConfig<{\n schema: EvmCallDivinerConfigSchema\n}>\nexport type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>\n\nexport const EvmCallResultsSchema = asSchema('network.xyo.evm.call.results', true)\nexport type EvmCallResultsSchema = typeof EvmCallResultsSchema\n\nexport const EvmCallResultsEntryZod = z.object({\n args: z.optional(z.array(z.unknown())),\n result: z.unknown(),\n})\n\nexport type EvmCallResultsEntry = z.infer<typeof EvmCallResultsEntryZod>\n\nexport const EvmCallResultsZod = z.extend(PayloadZodOfSchema(EvmCallResultsSchema), {\n address: z.string(),\n chainId: z.number(),\n results: z.optional(z.record(z.string(), EvmCallResultsEntryZod)),\n})\n\nexport type EvmCallResults = z.infer<typeof EvmCallResultsZod>\n\nexport const isEvmCallResults = zodIsFactory(EvmCallResultsZod)\nexport const asEvmCallResults = zodAsFactory(EvmCallResultsZod, 'asEvmCallResults')\nexport const toEvmCallResults = zodToFactory(EvmCallResultsZod, 'toEvmCallResults')\n\nexport class EvmCallDiviner<TParams extends EvmCallDivinerParams = EvmCallDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallDivinerConfigSchema\n static override readonly labels: EvmCallDivinerLabels = { ...super.labels, ...EvmCallDivinerLabels }\n\n protected static findCallResult<TResult = string>(address: string, functionName: string, payloads: EvmCallResult[]): TResult | undefined {\n const foundPayload = payloads.find(payload => payload.functionName === functionName && payload.address === address)\n return asEvmCallSuccess(foundPayload)?.result as TResult | undefined\n }\n\n protected static matchingExistingField<R = string, T extends Payload = Payload>(objs: T[], field: keyof T): R | undefined {\n const expectedValue = objs.at(0)?.[field] as R\n\n const didNotMatch = objs.reduce((prev, obj) => {\n return prev || obj[field] !== expectedValue\n }, false)\n return didNotMatch ? undefined : expectedValue\n }\n\n protected contractInfoRequiredFields(callResults: EvmCallResult[]): EvmCallResults {\n return {\n address: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'address'), () => 'Mismatched address'),\n chainId: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'chainId'), () => 'Mismatched chainId'),\n schema: EvmCallResultsSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: EvmCallResult[] = []): Promise<EvmCallResults[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema))\n const addresses = Object.keys(\n\n callResults.reduce<Record<string, boolean>>((prev, result) => {\n if (result.address) {\n prev[result.address] = true\n }\n return prev\n }, {}),\n )\n const result = await Promise.all(\n addresses.map(async (address) => {\n const foundCallResults = callResults.filter(callResult => callResult.address === address)\n const results: EvmCallResults = {\n results: await this.reduceResults(foundCallResults),\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return results\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: EvmCallResult[]): Promisable<EvmCallResults['results']> {\n return callResults.reduce<\n Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n >((prev, callResult) => {\n const typedCallResult = asEvmCallSuccess(callResult)\n if (typedCallResult) {\n prev[callResult.functionName] = { args: typedCallResult.args, result: typedCallResult?.result }\n }\n return prev\n }, {})\n }\n}\n", "import type { Labels } from '@xyo-network/sdk'\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport interface EvmCallDivinerLabels extends Labels {\n 'network.xyo.crypto.contract.info': 'diviner'\n}\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport const EvmCallDivinerLabels: EvmCallDivinerLabels = { 'network.xyo.crypto.contract.info': 'diviner' }\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport { asSchema, PayloadZodOfSchema } from '@xyo-network/sdk'\nimport * as z from 'zod/mini'\n\nexport const EvmCallSchema = asSchema('network.xyo.evm.call', true)\nexport type EvmCallSchema = typeof EvmCallSchema\n\nexport const EvmCallZod = z.extend(PayloadZodOfSchema(EvmCallSchema), {\n address: z.optional(z.string()),\n args: z.optional(z.array(z.unknown())),\n block: z.optional(z.number()),\n functionName: z.optional(z.string()),\n})\n\nexport type EvmCall = z.infer<typeof EvmCallZod>\n\nexport const isEvmCall = zodIsFactory(EvmCallZod)\nexport const asEvmCall = zodAsFactory(EvmCallZod, 'asEvmCall')\nexport const toEvmCall = zodToFactory(EvmCallZod, 'toEvmCall')\n\nexport const EvmCallResultSchema = asSchema('network.xyo.evm.call.result', true)\nexport type EvmCallResultSchema = typeof EvmCallResultSchema\n\nexport const EvmCallResultBaseZod = z.extend(PayloadZodOfSchema(EvmCallResultSchema), {\n address: z.string(),\n args: z.array(z.unknown()),\n block: z.optional(z.number()),\n chainId: z.number(),\n functionName: z.string(),\n implementation: z.optional(z.string()),\n})\n\nexport type EvmCallResultBase = z.infer<typeof EvmCallResultBaseZod>\n\nexport const EvmCallSuccessZod = z\n .extend(EvmCallResultBaseZod, { result: z.unknown() })\n .check(z.refine(value => (value as { result?: unknown }).result !== undefined))\n\nexport type EvmCallSuccess = EvmCallResultBase & {\n result: unknown\n}\n\nexport const EvmCallFailureZod = z\n .extend(EvmCallResultBaseZod, { error: z.string() })\n .check(z.refine(value => (value as { error?: unknown }).error !== undefined))\n\nexport type EvmCallFailure = EvmCallResultBase & {\n error: string\n}\n\nexport const EvmCallResultZod = z.union([EvmCallSuccessZod, EvmCallFailureZod])\n\nexport type EvmCallResult = EvmCallSuccess | EvmCallFailure\n\nexport const isEvmCallResult = zodIsFactory(EvmCallResultZod)\nexport const asEvmCallResult = zodAsFactory(EvmCallResultZod, 'asEvmCallResult')\nexport const toEvmCallResult = zodToFactory(EvmCallResultZod, 'toEvmCallResult')\n\nexport const isEvmCallSuccess = zodIsFactory(EvmCallSuccessZod)\nexport const asEvmCallSuccess = zodAsFactory(EvmCallSuccessZod, 'asEvmCallSuccess')\nexport const toEvmCallSuccess = zodToFactory(EvmCallSuccessZod, 'toEvmCallSuccess')\n\nexport const isEvmCallFailure = zodIsFactory(EvmCallFailureZod)\nexport const asEvmCallFailure = zodAsFactory(EvmCallFailureZod, 'asEvmCallFailure')\nexport const toEvmCallFailure = zodToFactory(EvmCallFailureZod, 'toEvmCallFailure')\n", "import { asSchema } from '@xyo-network/sdk'\nimport type { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport type { JsonFragment } from 'ethers'\n\nexport type Abi = string | readonly (JsonFragment | string)[]\n\nexport const EvmCallWitnessConfigSchema = asSchema('network.xyo.evm.call.witness.config', true)\nexport type EvmCallWitnessConfigSchema = typeof EvmCallWitnessConfigSchema\n\nexport type EvmCallWitnessConfig = EvmWitnessConfig<\n {\n abi?: Abi\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallWitnessConfigSchema\n>\n\nexport type EvmCallWitnessParams = EvmWitnessParams<EvmCallWitnessConfig>\n", "import type { JsonObject } from '@ariestools/sdk'\nimport {\n asEthAddress, assertEx, isHexZero,\n} from '@ariestools/sdk'\nimport type { Schema } from '@xyo-network/sdk'\nimport { isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\nimport type { InterfaceAbi } from 'ethers'\nimport { Contract } from 'ethers'\n\nimport { getErc1822SlotStatus } from '#erc1822-witness'\nimport { getErc1967SlotStatus } from '#erc1967-witness'\n\nimport type { EvmCallWitnessParams } from './model.ts'\nimport { EvmCallWitnessConfigSchema } from './model.ts'\nimport type {\n EvmCall, EvmCallResult,\n EvmCallSuccess,\n} from './Payload.ts'\nimport { EvmCallResultSchema, EvmCallSchema } from './Payload.ts'\n\nexport class EvmCallWitness<TParams extends EvmCallWitnessParams = EvmCallWitnessParams> extends AbstractEvmWitness<TParams, EvmCall, EvmCallResult> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallWitnessConfigSchema\n\n get abi() {\n return assertEx(this.config.abi, () => 'Missing abi') as InterfaceAbi\n }\n\n protected override async observeHandler(inPayloads: EvmCall[] = []): Promise<EvmCallResult[]> {\n await this.startedAsync('throw')\n // calling it here to make sure we rests the cache\n await this.getProviders()\n try {\n const observations = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType<EvmCall>(EvmCallSchema)).map(async ({\n functionName, args, address, block: payloadBlock,\n }) => {\n const validatedAddress = asEthAddress(assertEx(address ?? this.config.address, () => 'Missing address'), true)\n const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')\n const mergedArgs = [...(args ?? this.config.args ?? [])] as JsonObject[]\n\n const provider = await this.getProvider(true, true)\n\n const block = this.config.block ?? payloadBlock ?? (await provider.getBlockNumber())\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block)\n\n const implementation = (isHexZero(erc1967Status.slots.implementation ?? '0x00') === true ? erc1822Status : erc1967Status).implementation\n\n const contract = new Contract(implementation, this.abi, provider)\n let transformedResult: unknown\n try {\n const result: unknown = await contract[validatedFunctionName](...mergedArgs)\n transformedResult = typeof result === 'bigint' ? `0x${result.toString(16)}` : result\n } catch {\n // const error = ex as Error & { code: string }\n // this.logger.error(`Error [${this.config.name}]: ${error.code} : ${error.message}`)\n }\n const network = await provider.getNetwork()\n const observation: EvmCallSuccess = {\n address: validatedAddress,\n args: mergedArgs,\n block,\n chainId: Number(network.chainId),\n functionName: validatedFunctionName,\n result: transformedResult,\n schema: EvmCallResultSchema,\n }\n if (implementation !== validatedAddress) {\n observation.implementation = implementation\n }\n // console.log(`observation: ${JSON.stringify(observation, null, 2)}`)\n return observation\n }),\n )\n return observations\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n throw error\n }\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import type { Promisable } from '@ariestools/sdk'\nimport {\n assertEx, zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport type {\n DivinerConfig, DivinerParams, Payload, Schema,\n} from '@xyo-network/sdk'\nimport {\n AbstractDiviner, asSchema, isPayloadOfSchemaType, PayloadZodOfSchema,\n} from '@xyo-network/sdk'\nimport * as z from 'zod/mini'\n\nimport { EvmCallDivinerLabels } from './Labels.ts'\nimport type { EvmCallResult } from './Payload.ts'\nimport { asEvmCallSuccess, EvmCallResultSchema } from './Payload.ts'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const EvmCallDivinerConfigSchema = asSchema('network.xyo.evm.call.diviner.config', true)\nexport type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema\n\nexport type EvmCallDivinerConfig = DivinerConfig<{\n schema: EvmCallDivinerConfigSchema\n}>\nexport type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>\n\nexport const EvmCallResultsSchema = asSchema('network.xyo.evm.call.results', true)\nexport type EvmCallResultsSchema = typeof EvmCallResultsSchema\n\nexport const EvmCallResultsEntryZod = z.object({\n args: z.optional(z.array(z.unknown())),\n result: z.unknown(),\n})\n\nexport type EvmCallResultsEntry = z.infer<typeof EvmCallResultsEntryZod>\n\nexport const EvmCallResultsZod = z.extend(PayloadZodOfSchema(EvmCallResultsSchema), {\n address: z.string(),\n chainId: z.number(),\n results: z.optional(z.record(z.string(), EvmCallResultsEntryZod)),\n})\n\nexport type EvmCallResults = z.infer<typeof EvmCallResultsZod>\n\nexport const isEvmCallResults = zodIsFactory(EvmCallResultsZod)\nexport const asEvmCallResults = zodAsFactory(EvmCallResultsZod, 'asEvmCallResults')\nexport const toEvmCallResults = zodToFactory(EvmCallResultsZod, 'toEvmCallResults')\n\nexport class EvmCallDiviner<TParams extends EvmCallDivinerParams = EvmCallDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallDivinerConfigSchema\n static override readonly labels: EvmCallDivinerLabels = { ...super.labels, ...EvmCallDivinerLabels }\n\n protected static findCallResult<TResult = string>(address: string, functionName: string, payloads: EvmCallResult[]): TResult | undefined {\n const foundPayload = payloads.find(payload => payload.functionName === functionName && payload.address === address)\n return asEvmCallSuccess(foundPayload)?.result as TResult | undefined\n }\n\n protected static matchingExistingField<R = string, T extends Payload = Payload>(objs: T[], field: keyof T): R | undefined {\n const expectedValue = objs.at(0)?.[field] as R\n\n const didNotMatch = objs.reduce((prev, obj) => {\n return prev || obj[field] !== expectedValue\n }, false)\n return didNotMatch ? undefined : expectedValue\n }\n\n protected contractInfoRequiredFields(callResults: EvmCallResult[]): EvmCallResults {\n return {\n address: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'address'), () => 'Mismatched address'),\n chainId: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'chainId'), () => 'Mismatched chainId'),\n schema: EvmCallResultsSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: EvmCallResult[] = []): Promise<EvmCallResults[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema))\n const addresses = Object.keys(\n\n callResults.reduce<Record<string, boolean>>((prev, result) => {\n if (result.address) {\n prev[result.address] = true\n }\n return prev\n }, {}),\n )\n const result = await Promise.all(\n addresses.map(async (address) => {\n const foundCallResults = callResults.filter(callResult => callResult.address === address)\n const results: EvmCallResults = {\n results: await this.reduceResults(foundCallResults),\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return results\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: EvmCallResult[]): Promisable<EvmCallResults['results']> {\n return callResults.reduce<\n Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n >((prev, callResult) => {\n const typedCallResult = asEvmCallSuccess(callResult)\n if (typedCallResult) {\n prev[callResult.functionName] = { args: typedCallResult.args, result: typedCallResult?.result }\n }\n return prev\n }, {})\n }\n}\n", "import type { Labels } from '@xyo-network/sdk'\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport interface EvmCallDivinerLabels extends Labels {\n 'network.xyo.crypto.contract.info': 'diviner'\n}\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport const EvmCallDivinerLabels: EvmCallDivinerLabels = { 'network.xyo.crypto.contract.info': 'diviner' }\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport { asSchema, PayloadZodOfSchema } from '@xyo-network/sdk'\nimport * as z from 'zod/mini'\n\nexport const EvmCallSchema = asSchema('network.xyo.evm.call', true)\nexport type EvmCallSchema = typeof EvmCallSchema\n\nexport const EvmCallZod = z.extend(PayloadZodOfSchema(EvmCallSchema), {\n address: z.optional(z.string()),\n args: z.optional(z.array(z.unknown())),\n block: z.optional(z.number()),\n functionName: z.optional(z.string()),\n})\n\nexport type EvmCall = z.infer<typeof EvmCallZod>\n\nexport const isEvmCall = zodIsFactory(EvmCallZod)\nexport const asEvmCall = zodAsFactory(EvmCallZod, 'asEvmCall')\nexport const toEvmCall = zodToFactory(EvmCallZod, 'toEvmCall')\n\nexport const EvmCallResultSchema = asSchema('network.xyo.evm.call.result', true)\nexport type EvmCallResultSchema = typeof EvmCallResultSchema\n\nexport const EvmCallResultBaseZod = z.extend(PayloadZodOfSchema(EvmCallResultSchema), {\n address: z.string(),\n args: z.array(z.unknown()),\n block: z.optional(z.number()),\n chainId: z.number(),\n functionName: z.string(),\n implementation: z.optional(z.string()),\n})\n\nexport type EvmCallResultBase = z.infer<typeof EvmCallResultBaseZod>\n\nexport const EvmCallSuccessZod = z\n .extend(EvmCallResultBaseZod, { result: z.unknown() })\n .check(z.refine(value => (value as { result?: unknown }).result !== undefined))\n\nexport type EvmCallSuccess = EvmCallResultBase & {\n result: unknown\n}\n\nexport const EvmCallFailureZod = z\n .extend(EvmCallResultBaseZod, { error: z.string() })\n .check(z.refine(value => (value as { error?: unknown }).error !== undefined))\n\nexport type EvmCallFailure = EvmCallResultBase & {\n error: string\n}\n\nexport const EvmCallResultZod = z.union([EvmCallSuccessZod, EvmCallFailureZod])\n\nexport type EvmCallResult = EvmCallSuccess | EvmCallFailure\n\nexport const isEvmCallResult = zodIsFactory(EvmCallResultZod)\nexport const asEvmCallResult = zodAsFactory(EvmCallResultZod, 'asEvmCallResult')\nexport const toEvmCallResult = zodToFactory(EvmCallResultZod, 'toEvmCallResult')\n\nexport const isEvmCallSuccess = zodIsFactory(EvmCallSuccessZod)\nexport const asEvmCallSuccess = zodAsFactory(EvmCallSuccessZod, 'asEvmCallSuccess')\nexport const toEvmCallSuccess = zodToFactory(EvmCallSuccessZod, 'toEvmCallSuccess')\n\nexport const isEvmCallFailure = zodIsFactory(EvmCallFailureZod)\nexport const asEvmCallFailure = zodAsFactory(EvmCallFailureZod, 'asEvmCallFailure')\nexport const toEvmCallFailure = zodToFactory(EvmCallFailureZod, 'toEvmCallFailure')\n", "import { asSchema } from '@xyo-network/sdk'\nimport type { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm'\nimport type { JsonFragment } from 'ethers'\n\nexport type Abi = string | readonly (JsonFragment | string)[]\n\nexport const EvmCallWitnessConfigSchema = asSchema('network.xyo.evm.call.witness.config', true)\nexport type EvmCallWitnessConfigSchema = typeof EvmCallWitnessConfigSchema\n\nexport type EvmCallWitnessConfig = EvmWitnessConfig<\n {\n abi?: Abi\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallWitnessConfigSchema\n>\n\nexport type EvmCallWitnessParams = EvmWitnessParams<EvmCallWitnessConfig>\n", "import type { JsonObject } from '@ariestools/sdk'\nimport {\n asEthAddress, assertEx, isHexZero,\n} from '@ariestools/sdk'\nimport type { Schema } from '@xyo-network/sdk'\nimport { isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm'\nimport type { InterfaceAbi } from 'ethers'\nimport { Contract } from 'ethers'\n\nimport { getErc1822SlotStatus } from '#erc1822-witness'\nimport { getErc1967SlotStatus } from '#erc1967-witness'\n\nimport type { EvmCallWitnessParams } from './model.ts'\nimport { EvmCallWitnessConfigSchema } from './model.ts'\nimport type {\n EvmCall, EvmCallResult,\n EvmCallSuccess,\n} from './Payload.ts'\nimport { EvmCallResultSchema, EvmCallSchema } from './Payload.ts'\n\nexport class EvmCallWitness<TParams extends EvmCallWitnessParams = EvmCallWitnessParams> extends AbstractEvmWitness<TParams, EvmCall, EvmCallResult> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallWitnessConfigSchema\n\n get abi() {\n return assertEx(this.config.abi, () => 'Missing abi') as InterfaceAbi\n }\n\n protected override async observeHandler(inPayloads: EvmCall[] = []): Promise<EvmCallResult[]> {\n await this.startedAsync('throw')\n // calling it here to make sure we rests the cache\n await this.getProviders()\n try {\n const observations = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType<EvmCall>(EvmCallSchema)).map(async ({\n functionName, args, address, block: payloadBlock,\n }) => {\n const validatedAddress = asEthAddress(assertEx(address ?? this.config.address, () => 'Missing address'), true)\n const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')\n const mergedArgs = [...(args ?? this.config.args ?? [])] as JsonObject[]\n\n const provider = await this.getProvider(true, true)\n\n const block = this.config.block ?? payloadBlock ?? (await provider.getBlockNumber())\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block)\n\n const implementation = (isHexZero(erc1967Status.slots.implementation ?? '0x00') === true ? erc1822Status : erc1967Status).implementation\n\n const contract = new Contract(implementation, this.abi, provider)\n let transformedResult: unknown\n try {\n const result: unknown = await contract[validatedFunctionName](...mergedArgs)\n transformedResult = typeof result === 'bigint' ? `0x${result.toString(16)}` : result\n } catch {\n // const error = ex as Error & { code: string }\n // this.logger.error(`Error [${this.config.name}]: ${error.code} : ${error.message}`)\n }\n const network = await provider.getNetwork()\n const observation: EvmCallSuccess = {\n address: validatedAddress,\n args: mergedArgs,\n block,\n chainId: Number(network.chainId),\n functionName: validatedFunctionName,\n result: transformedResult,\n schema: EvmCallResultSchema,\n }\n if (implementation !== validatedAddress) {\n observation.implementation = implementation\n }\n // console.log(`observation: ${JSON.stringify(observation, null, 2)}`)\n return observation\n }),\n )\n return observations\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n throw error\n }\n }\n}\n"],
|
|
5
5
|
"mappings": ";AACA;AAAA,EACE;AAAA,EAAU,gBAAAA;AAAA,EAAc,gBAAAC;AAAA,EAAc,gBAAAC;AAAA,OACjC;AAIP;AAAA,EACE;AAAA,EAAiB,YAAAC;AAAA,EAAU;AAAA,EAAuB,sBAAAC;AAAA,OAC7C;AACP,YAAYC,QAAO;;;ACEZ,IAAM,uBAA6C,EAAE,oCAAoC,UAAU;;;ACZ1G;AAAA,EACE;AAAA,EAAc;AAAA,EAAc;AAAA,OACvB;AACP,SAAS,UAAU,0BAA0B;AAC7C,YAAY,OAAO;AAEZ,IAAM,gBAAgB,SAAS,wBAAwB,IAAI;AAG3D,IAAM,aAAe,SAAO,mBAAmB,aAAa,GAAG;AAAA,EACpE,SAAW,WAAW,SAAO,CAAC;AAAA,EAC9B,MAAQ,WAAW,QAAQ,UAAQ,CAAC,CAAC;AAAA,EACrC,OAAS,WAAW,SAAO,CAAC;AAAA,EAC5B,cAAgB,WAAW,SAAO,CAAC;AACrC,CAAC;AAIM,IAAM,YAAY,aAAa,UAAU;AACzC,IAAM,YAAY,aAAa,YAAY,WAAW;AACtD,IAAM,YAAY,aAAa,YAAY,WAAW;AAEtD,IAAM,sBAAsB,SAAS,+BAA+B,IAAI;AAGxE,IAAM,uBAAyB,SAAO,mBAAmB,mBAAmB,GAAG;AAAA,EACpF,SAAW,SAAO;AAAA,EAClB,MAAQ,QAAQ,UAAQ,CAAC;AAAA,EACzB,OAAS,WAAW,SAAO,CAAC;AAAA,EAC5B,SAAW,SAAO;AAAA,EAClB,cAAgB,SAAO;AAAA,EACvB,gBAAkB,WAAW,SAAO,CAAC;AACvC,CAAC;AAIM,IAAM,oBACV,SAAO,sBAAsB,EAAE,QAAU,UAAQ,EAAE,CAAC,EACpD,MAAQ,SAAO,WAAU,MAA+B,WAAW,MAAS,CAAC;AAMzE,IAAM,oBACV,SAAO,sBAAsB,EAAE,OAAS,SAAO,EAAE,CAAC,EAClD,MAAQ,SAAO,WAAU,MAA8B,UAAU,MAAS,CAAC;AAMvE,IAAM,mBAAqB,QAAM,CAAC,mBAAmB,iBAAiB,CAAC;AAIvE,IAAM,kBAAkB,aAAa,gBAAgB;AACrD,IAAM,kBAAkB,aAAa,kBAAkB,iBAAiB;AACxE,IAAM,kBAAkB,aAAa,kBAAkB,iBAAiB;AAExE,IAAM,mBAAmB,aAAa,iBAAiB;AACvD,IAAM,mBAAmB,aAAa,mBAAmB,kBAAkB;AAC3E,IAAM,mBAAmB,aAAa,mBAAmB,kBAAkB;AAE3E,IAAM,mBAAmB,aAAa,iBAAiB;AACvD,IAAM,mBAAmB,aAAa,mBAAmB,kBAAkB;AAC3E,IAAM,mBAAmB,aAAa,mBAAmB,kBAAkB;;;AFhD3E,IAAM,6BAA6BC,UAAS,uCAAuC,IAAI;AAQvF,IAAM,uBAAuBA,UAAS,gCAAgC,IAAI;AAG1E,IAAM,yBAA2B,UAAO;AAAA,EAC7C,MAAQ,YAAW,SAAQ,WAAQ,CAAC,CAAC;AAAA,EACrC,QAAU,WAAQ;AACpB,CAAC;AAIM,IAAM,oBAAsB,UAAOC,oBAAmB,oBAAoB,GAAG;AAAA,EAClF,SAAW,UAAO;AAAA,EAClB,SAAW,UAAO;AAAA,EAClB,SAAW,YAAW,UAAS,UAAO,GAAG,sBAAsB,CAAC;AAClE,CAAC;AAIM,IAAM,mBAAmBC,cAAa,iBAAiB;AACvD,IAAM,mBAAmBC,cAAa,mBAAmB,kBAAkB;AAC3E,IAAM,mBAAmBC,cAAa,mBAAmB,kBAAkB;AAE3E,IAAM,iBAAN,MAAM,wBAAoF,gBAAyB;AAAA,EACxH,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,0BAA0B;AAAA,EACtG,OAAyB,sBAA8B;AAAA,EACvD,OAAyB,SAA+B,EAAE,GAAG,MAAM,QAAQ,GAAG,qBAAqB;AAAA,EAEnG,OAAiB,eAAiC,SAAiB,cAAsB,UAAgD;AACvI,UAAM,eAAe,SAAS,KAAK,aAAW,QAAQ,iBAAiB,gBAAgB,QAAQ,YAAY,OAAO;AAClH,WAAO,iBAAiB,YAAY,GAAG;AAAA,EACzC;AAAA,EAEA,OAAiB,sBAA+D,MAAW,OAA+B;AACxH,UAAM,gBAAgB,KAAK,GAAG,CAAC,IAAI,KAAK;AAExC,UAAM,cAAc,KAAK,OAAO,CAAC,MAAM,QAAQ;AAC7C,aAAO,QAAQ,IAAI,KAAK,MAAM;AAAA,IAChC,GAAG,KAAK;AACR,WAAO,cAAc,SAAY;AAAA,EACnC;AAAA,EAEU,2BAA2B,aAA8C;AACjF,WAAO;AAAA,MACL,SAAS,SAAS,gBAAe,sBAAsB,aAAa,SAAS,GAAG,MAAM,oBAAoB;AAAA,MAC1G,SAAS,SAAS,gBAAe,sBAAsB,aAAa,SAAS,GAAG,MAAM,oBAAoB;AAAA,MAC1G,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAyB,cAAc,aAA8B,CAAC,GAA8B;AAClG,UAAM,cAAc,WAAW,OAAO,sBAAqC,mBAAmB,CAAC;AAC/F,UAAM,YAAY,OAAO;AAAA,MAEvB,YAAY,OAAgC,CAAC,MAAMC,YAAW;AAC5D,YAAIA,QAAO,SAAS;AAClB,eAAKA,QAAO,OAAO,IAAI;AAAA,QACzB;AACA,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AAAA,IACP;AACA,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC3B,UAAU,IAAI,OAAO,YAAY;AAC/B,cAAM,mBAAmB,YAAY,OAAO,gBAAc,WAAW,YAAY,OAAO;AACxF,cAAM,UAA0B;AAAA,UAC9B,SAAS,MAAM,KAAK,cAAc,gBAAgB;AAAA,UAClD,GAAG,KAAK,2BAA2B,gBAAgB;AAAA,QACrD;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,cAAc,aAAqE;AAC3F,WAAO,YAAY,OAQjB,CAAC,MAAM,eAAe;AACtB,YAAM,kBAAkB,iBAAiB,UAAU;AACnD,UAAI,iBAAiB;AACnB,aAAK,WAAW,YAAY,IAAI,EAAE,MAAM,gBAAgB,MAAM,QAAQ,iBAAiB,OAAO;AAAA,MAChG;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;;;AGrHA,SAAS,YAAAC,iBAAgB;AAMlB,IAAM,6BAA6BA,UAAS,uCAAuC,IAAI;;;ACL9F;AAAA,EACE;AAAA,EAAc,YAAAC;AAAA,EAAU;AAAA,OACnB;AAEP,SAAS,yBAAAC,8BAA6B;AACtC,SAAS,0BAA0B;AAEnC,SAAS,gBAAgB;AAEzB,SAAS,4BAA4B;AACrC,SAAS,4BAA4B;AAU9B,IAAM,iBAAN,cAA0F,mBAAoD;AAAA,EACnJ,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,0BAA0B;AAAA,EACtG,OAAyB,sBAA8B;AAAA,EAEvD,IAAI,MAAM;AACR,WAAOC,UAAS,KAAK,OAAO,KAAK,MAAM,aAAa;AAAA,EACtD;AAAA,EAEA,MAAyB,eAAe,aAAwB,CAAC,GAA6B;AAC5F,UAAM,KAAK,aAAa,OAAO;AAE/B,UAAM,KAAK,aAAa;AACxB,QAAI;AACF,YAAM,eAAe,MAAM,QAAQ;AAAA,QACjC,WAAW,OAAOC,uBAA+B,aAAa,CAAC,EAAE,IAAI,OAAO;AAAA,UAC1E;AAAA,UAAc;AAAA,UAAM;AAAA,UAAS,OAAO;AAAA,QACtC,MAAM;AACJ,gBAAM,mBAAmB,aAAaD,UAAS,WAAW,KAAK,OAAO,SAAS,MAAM,iBAAiB,GAAG,IAAI;AAC7G,gBAAM,wBAAwBA,UAAS,gBAAgB,KAAK,OAAO,cAAc,MAAM,iBAAiB;AACxG,gBAAM,aAAa,CAAC,GAAI,QAAQ,KAAK,OAAO,QAAQ,CAAC,CAAE;AAEvD,gBAAM,WAAW,MAAM,KAAK,YAAY,MAAM,IAAI;AAElD,gBAAM,QAAQ,KAAK,OAAO,SAAS,gBAAiB,MAAM,SAAS,eAAe;AAGlF,gBAAM,gBAAgB,MAAM,qBAAqB,UAAU,kBAAkB,KAAK;AAGlF,gBAAM,gBAAgB,MAAM,qBAAqB,UAAU,kBAAkB,KAAK;AAElF,gBAAM,kBAAkB,UAAU,cAAc,MAAM,kBAAkB,MAAM,MAAM,OAAO,gBAAgB,eAAe;AAE1H,gBAAM,WAAW,IAAI,SAAS,gBAAgB,KAAK,KAAK,QAAQ;AAChE,cAAI;AACJ,cAAI;AACF,kBAAM,SAAkB,MAAM,SAAS,qBAAqB,EAAE,GAAG,UAAU;AAC3E,gCAAoB,OAAO,WAAW,WAAW,KAAK,OAAO,SAAS,EAAE,CAAC,KAAK;AAAA,UAChF,QAAQ;AAAA,UAGR;AACA,gBAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,gBAAM,cAA8B;AAAA,YAClC,SAAS;AAAA,YACT,MAAM;AAAA,YACN;AAAA,YACA,SAAS,OAAO,QAAQ,OAAO;AAAA,YAC/B,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AACA,cAAI,mBAAmB,kBAAkB;AACvC,wBAAY,iBAAiB;AAAA,UAC/B;AAEA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,MAAM,OAAO,EAAE;AAC3D,YAAM;AAAA,IACR;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["zodAsFactory", "zodIsFactory", "zodToFactory", "asSchema", "PayloadZodOfSchema", "z", "asSchema", "PayloadZodOfSchema", "zodIsFactory", "zodAsFactory", "zodToFactory", "result", "asSchema", "assertEx", "isPayloadOfSchemaType", "assertEx", "isPayloadOfSchemaType"]
|
|
7
7
|
}
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
creatableModule,
|
|
41
41
|
isPayloadOfSchemaType
|
|
42
42
|
} from "@xyo-network/sdk";
|
|
43
|
-
import { AbstractEvmWitness, EvmAddressSchema } from "@xyo-network/witness-evm
|
|
43
|
+
import { AbstractEvmWitness, EvmAddressSchema } from "@xyo-network/witness-evm";
|
|
44
44
|
var EvmContractWitnessConfigSchema = asSchema2("network.xyo.evm.contract.witness.config", true);
|
|
45
45
|
var EvmContractWitness = class extends AbstractEvmWitness {
|
|
46
46
|
async observeHandler(inPayloads = []) {
|