@lukso/transaction-decoder 1.3.7-dev.caea45e → 1.3.7
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.cjs +11 -11
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +4 -4
- package/dist/cdn/transaction-decoder.global.js.map +1 -1
- package/dist/{chunk-JP3VO7OF.js → chunk-HFBAO6YR.js} +2 -2
- package/dist/{chunk-XE5YIF5G.js → chunk-MGPLCACC.js} +12 -12
- package/dist/chunk-MGPLCACC.js.map +1 -0
- package/dist/{chunk-LZFM5SNN.js → chunk-MSTGEOTX.js} +4 -4
- package/dist/{chunk-C3O7HMFS.js → chunk-RYQVLCCC.js} +2 -2
- package/dist/data.cjs +11 -11
- package/dist/data.cjs.map +1 -1
- package/dist/data.js +2 -2
- package/dist/index.cjs +11 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -4
- package/dist/server.cjs +1409 -1460
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +2 -17
- package/dist/server.d.ts +2 -17
- package/dist/server.js +2 -56
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/src/server/index.ts +0 -10
- package/src/server/types.ts +1 -14
- package/src/server.ts +0 -1
- package/src/types/index.ts +1 -5
- package/dist/chunk-XE5YIF5G.js.map +0 -1
- package/src/server/decodeEventLogs.ts +0 -71
- /package/dist/{chunk-JP3VO7OF.js.map → chunk-HFBAO6YR.js.map} +0 -0
- /package/dist/{chunk-LZFM5SNN.js.map → chunk-MSTGEOTX.js.map} +0 -0
- /package/dist/{chunk-C3O7HMFS.js.map → chunk-RYQVLCCC.js.map} +0 -0
package/dist/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/addressResolver.ts","../src/server/addressResolver.ts","../src/server/caches.ts","../src/decoder/registry.ts","../src/decoder/utils.ts","../src/decoder/plugins/schemaDefault.ts","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP1UniversalReceiverDelegate.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP3ProfileMetadata.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP4DigitalAsset.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP4DigitalAssetLegacy.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP5ReceivedAssets.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP6KeyManager.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP8IdentifiableDigitalAsset.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP9Vault.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP10ReceivedVaults.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP12IssuedAssets.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/@erc725/erc725.js/schemas/LSP17ContractExtension.json","../src/decoder/constants.ts","../src/decoder/getDataFromExternalSources.ts","../src/decoder/plugins/standardPlugin.ts","../src/utils/debug.ts","../src/decoder/aggregation.ts","../src/decoder/events.ts","../src/decoder/plugins/RegistryAbi.ts","../src/decoder/plugins/enhanceBurntPix.ts","../src/decoder/plugins/enhanceGraffiti.ts","../src/decoder/plugins/enhanceLSP0ERC725Account.ts","../src/decoder/transaction.ts","../src/decoder/plugins/enhanceSetData.ts","../src/decoder/plugins/universalReceiverTypeIds.ts","../src/decoder/plugins/enhanceLSP6KeyManager.ts","../../../node_modules/.pnpm/@lukso+lsp6-contracts@0.15.5/node_modules/@lukso/lsp6-contracts/artifacts/LSP6KeyManager.json","../src/decoder/interfaces.ts","../src/decoder/plugins/enhanceLSP7DigitalAsset.ts","../src/decoder/cache.ts","../src/decoder/plugins/enhanceLSP8IdentifiableDigitalAsset.ts","../src/decoder/plugins/enhanceLSP9Vault.ts","../src/decoder/plugins/enhanceLSP26FollowerSystem.ts","../../../node_modules/.pnpm/@lukso+lsp-smart-contracts@0.16.7/node_modules/@lukso/lsp-smart-contracts/artifacts/LSP9Vault.json","../src/decoder/functionSignature.ts","../src/decoder/lruCache.ts","../src/decoder/plugins/enhanceRetrieveAbi.ts","../src/decoder/plugins/index.ts","../src/server/decodeEventLogs.ts","../src/core/addressCollector.ts","../src/server/decodeTransactionSync.ts","../src/server/decodeTransactionsBatch.ts","../src/server/finishDecoding.ts","../src/server/index.ts"],"sourcesContent":["import request, { gql } from 'graphql-request'\nimport type { Address, Chain, Hex } from 'viem'\nimport { lukso } from 'viem/chains'\nimport type { DataKey, EnhancedInfo } from '../types'\nimport type { AddressIdentityCache } from './cache'\n\n/**\n * GraphQL queries for address resolution\n * Using the exact schema from addressGQL.ts\n */\nconst addressesGql = gql`\nquery AddressQuery($profiles: [String!], $assets: [String!], $tokens: [String!]) {\n Profile(\n where: {id: {_in: $profiles}}\n ) {\n fullName\n id\n name\n tags\n description\n standard\n controllers {\n address\n tags\n permissions\n }\n owner {\n id\n }\n profileImages(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n backgroundImages(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n avatars(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n }\n Token(where: {id: {_in: $tokens}}) {\n id\n baseAsset {\n id\n description\n icons {\n src\n verified\n width\n height\n }\n isCollection\n isLSP7\n isUnknown\n name\n standard\n interfaces\n decimals\n owner_id\n lsp4Creators {\n profile_id\n }\n }\n formattedTokenId\n icons {\n src\n verified\n width\n height\n }\n images(where: {index: {_eq: 0}}) {\n src\n verified\n width\n height\n }\n lsp4TokenName\n lsp4TokenSymbol\n lsp4TokenType\n lsp8TokenIdFormat\n tokenId\n name\n description\n lsp4Creators {\n profile_id\n }\n }\n Asset(where: {id: {_in: $assets}}) {\n id\n images(where: {index: {_eq: 0}}) {\n src\n width\n verified\n height\n }\n interfaces\n isCollection\n isLSP7\n isUnknown\n lsp4TokenName\n lsp4TokenSymbol\n lsp4TokenType\n method\n name\n icons {\n src\n width\n height\n }\n description\n decimals\n standard\n owner_id\n lsp4Creators {\n profile_id\n }\n }\n}\n`\n\n// Image data structure from GraphQL\nexport interface ImageData {\n width?: number\n height?: number\n url?: string // Raw URL (may be ipfs://)\n src?: string // Resolved HTTPS URL (fallback to url if not present)\n verified?: boolean\n}\n\n// Link data structure from GraphQL\nexport interface LinkData {\n url: string\n title?: string\n}\n\n// Profile data from GraphQL\nexport interface ProfileData {\n id: Hex\n name?: string\n fullName?: string\n tags?: string[]\n description?: string\n links?: LinkData[]\n standard?: string\n controllers?: Array<{\n address: string\n tags?: string[]\n permissions?: Hex\n }>\n owner?: { id: string }\n profileImages?: ImageData[]\n backgroundImages?: ImageData[]\n avatars?: ImageData[]\n}\n\n// Asset data from GraphQL\nexport interface AssetData {\n id: Hex\n name?: string\n standard?: string\n lsp4TokenName?: string\n lsp4TokenSymbol?: string\n lsp4TokenType?: string\n method?: string\n description?: string\n links?: LinkData[]\n decimals?: number\n interfaces?: string[]\n isCollection?: boolean\n isLSP7?: boolean\n isUnknown?: boolean\n icons?: ImageData[]\n images?: ImageData[]\n}\n\n// Token data from GraphQL\nexport interface TokenData {\n id: Hex\n tokenId?: Hex\n name?: string\n description?: string\n links?: LinkData[]\n lsp4TokenName?: string\n lsp4TokenSymbol?: string\n lsp4TokenType?: string\n lsp8TokenIdFormat?: string\n formattedTokenId?: string\n baseAsset?: {\n id: Hex\n description?: string\n icons?: ImageData[]\n isCollection?: boolean\n isLSP7?: boolean\n isUnknown?: boolean\n name?: string\n standard?: string\n interfaces?: string[]\n decimals?: number\n }\n icons?: ImageData[]\n images?: ImageData[]\n}\n\nexport type TFetchAddressData = {\n Profile?: ProfileData[]\n Asset?: AssetData[]\n Token?: TokenData[]\n}\n\n/**\n * Fetch multiple addresses from GraphQL and return them as a Map\n * This is the shared implementation that both server and core can use\n */\nexport async function fetchMultipleAddresses(\n addresses: readonly DataKey[],\n graphqlEndpoint: string,\n cache?: AddressIdentityCache\n): Promise<Map<DataKey, EnhancedInfo>> {\n const results = new Map<DataKey, EnhancedInfo>()\n\n if (addresses.length === 0) {\n return results\n }\n\n // Check cache first if provided\n const uncachedAddresses: DataKey[] = []\n\n if (cache) {\n // Try to get many at once if supported\n if (cache.getMany) {\n const cachedResults = await cache.getMany(addresses)\n for (const [key, value] of cachedResults) {\n results.set(key, value)\n }\n // Find which ones we still need to fetch\n for (const addr of addresses) {\n if (!results.has(addr)) {\n uncachedAddresses.push(addr)\n }\n }\n } else {\n // Fall back to individual lookups\n for (const addr of addresses) {\n const cached = await cache.get(addr)\n if (cached) {\n results.set(addr, cached)\n } else {\n uncachedAddresses.push(addr)\n }\n }\n }\n\n // If all were cached, return early\n if (uncachedAddresses.length === 0) {\n return results\n }\n } else {\n // No cache, fetch all\n uncachedAddresses.push(...addresses)\n }\n\n // Parse addresses and tokens\n const profiles: string[] = []\n const assets: string[] = []\n const tokens: string[] = []\n const tokenMapping = new Map<string, { address: Address; tokenId?: string }>()\n\n for (const key of uncachedAddresses) {\n const hasDash = key.includes('-')\n const hasColon = key.includes(':')\n\n if (hasColon || hasDash) {\n const normalizedKey = key.replace(/[-:]/, '-')\n tokens.push(normalizedKey)\n const [address, tokenId] = key.split(/[-:]/)\n tokenMapping.set(key, { address: address as Address, tokenId })\n } else {\n // Regular addresses - could be profiles or assets\n profiles.push(key)\n assets.push(key)\n }\n }\n\n try {\n // Fetch data from GraphQL\n const data = (await request(graphqlEndpoint, addressesGql, {\n profiles,\n assets,\n tokens,\n })) as TFetchAddressData\n\n // Process profiles\n if (data.Profile) {\n for (const profile of data.Profile) {\n if (profile.standard !== 'LSP0ERC725Account') {\n continue\n }\n const enhancedInfo: EnhancedInfo = {\n address: profile.id as Address,\n __gqltype: 'Profile',\n name: profile.name || profile.fullName,\n fullName: profile.fullName,\n standard: profile.standard,\n tags: profile.tags,\n description: profile.description,\n owner: profile.owner,\n controllers: profile.controllers,\n profileImages: profile.profileImages,\n backgroundImages: profile.backgroundImages,\n avatars: profile.avatars,\n }\n results.set(profile.id as Address, enhancedInfo)\n }\n }\n\n // Process tokens (must be before assets per addressGQL.ts logic)\n if (data.Token) {\n for (const token of data.Token) {\n const { id: _id, baseAsset, tokenId, ...rest } = token\n\n // Tokens have a composite ID format and baseAsset reference\n if (baseAsset?.id && tokenId) {\n const enhancedInfo: EnhancedInfo = {\n address: baseAsset.id as Address,\n tokenId: tokenId as Address,\n __gqltype: 'Token',\n ...rest,\n baseAsset,\n }\n // Store with both dash and colon separators to handle both formats\n const keyWithColon = `${baseAsset.id}:${tokenId}` as DataKey\n const keyWithDash = `${baseAsset.id}-${tokenId}` as DataKey\n results.set(keyWithColon, enhancedInfo)\n results.set(keyWithDash, enhancedInfo)\n }\n }\n }\n\n // Process assets\n if (data.Asset) {\n for (const asset of data.Asset) {\n if (asset.standard === 'LSP0ERC725Account') {\n // Skip profiles - already processed\n continue\n }\n const enhancedInfo: EnhancedInfo = {\n address: asset.id as Address,\n __gqltype: 'Asset',\n ...asset,\n }\n if (!results.has(asset.id as Address)) {\n results.set(asset.id as Address, enhancedInfo)\n }\n }\n }\n\n // Cache the newly fetched results\n if (cache) {\n const newEntries: Array<[DataKey, EnhancedInfo]> = []\n\n // Collect all new entries\n for (const [key, value] of results) {\n // Only cache entries that were fetched (not from cache)\n const isCached = addresses.some(\n (addr) => addr.toLowerCase() === key.toLowerCase()\n )\n\n if (\n isCached &&\n uncachedAddresses.some(\n (addr) => addr.toLowerCase() === key.toLowerCase()\n )\n ) {\n newEntries.push([key, value])\n }\n }\n\n // Use batch update if available\n if (cache.setMany && newEntries.length > 0) {\n await cache.setMany(newEntries)\n } else {\n // Fall back to individual updates\n for (const [key, value] of newEntries) {\n await cache.set(key, value)\n }\n }\n }\n\n return results\n } catch (error) {\n console.error('Failed to fetch addresses:', error)\n return results\n }\n}\n\n/**\n * Get GraphQL endpoint for a given chain\n */\nexport function getGraphQLEndpoint(chain: Chain): string {\n return chain.id === lukso.id\n ? 'https://envio.lukso-mainnet.universal.tech/v1/graphql'\n : 'https://envio.lukso-testnet.universal.tech/v1/graphql'\n}\n\n/**\n * GraphQL query to find profiles controlled by specific addresses\n */\nconst profilesByControllerGql = gql`\nquery ProfilesByController($controllerAddresses: [String!]) {\n Profile(\n where: {\n controllers: {\n address: { _in: $controllerAddresses }\n tags: {\n _contains: [\n \"ADDCONTROLLER\"\n \"EDITPERMISSIONS\"\n \"SUPER_TRANSFERVALUE\"\n \"TRANSFERVALUE\"\n \"SUPER_CALL\"\n \"CALL\"\n \"SUPER_STATICCALL\"\n \"STATICCALL\"\n \"DEPLOY\"\n \"SUPER_SETDATA\"\n \"SETDATA\"\n \"ENCRYPT\"\n \"DECRYPT\"\n \"SIGN\"\n \"EXECUTE_RELAY_CALL\"\n ]\n }\n }\n }\n order_by: { blockNumber: asc }\n ) {\n fullName\n id\n name\n tags\n description\n standard\n controllers {\n address\n tags\n permissions\n }\n owner {\n id\n }\n profileImages(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n backgroundImages(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n avatars(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n }\n}\n`\n\n/**\n * Find profiles controlled by specific controller addresses\n * @param controllerAddresses - Array of controller addresses to search for\n * @param chain - Which chain to query\n * @returns Array of profile data\n */\nexport async function fetchProfilesByControllers(\n controllerAddresses: readonly Address[],\n chain: Chain\n): Promise<ProfileData[]> {\n const graphqlEndpoint = getGraphQLEndpoint(chain)\n\n try {\n const data = (await request(graphqlEndpoint, profilesByControllerGql, {\n controllerAddresses: controllerAddresses.map((addr) =>\n addr.toLowerCase()\n ),\n })) as { Profile?: ProfileData[] }\n\n return data.Profile || []\n } catch (error) {\n console.error(\n `Failed to fetch profiles by controllers on ${chain.name}:`,\n error\n )\n return []\n }\n}\n\nexport type ImageURL = {\n url?: string\n data?: string\n src?: string\n width: number\n height: number\n index?: number\n verified?: string\n}\n\n/**\n * Assuming the images are sorted ascending by width and/or height pick the first\n * image that's larger than the requested size * dpr and process that one.\n * By default this will assume the data came from the indexer and therefore\n * we do not need to verify the existence of all the images (i.e. HEAD requests for\n * each image) Setting ignoreHead to false is important during RPC mode so that\n * we can skip images that are not really available.\n *\n * @param images - array of images\n * @param options - specify arguments for search/processing\n * @returns { width, height, src } - the image that fits the criteria\n */\nexport async function getImage(\n images: ImageURL[],\n options: {\n width: number\n height?: number\n index?: number\n ignoreVerification?: boolean\n forcePng?: boolean\n ignoreHead?: boolean\n fallback?: string\n dpr?: number\n }\n): Promise<{ width: number; height: number; src?: string } | undefined> {\n const {\n width,\n height: _height,\n index,\n ignoreVerification,\n ignoreHead = true, // By default we don't want to do HEAD requests for all images.\n dpr = 1,\n } = options\n const boost = dpr === 1 ? 1.5 : 1\n const height = _height || width\n const { src: _src, verified } =\n (images || []).find(\n (i) =>\n i.width >= width * boost * dpr &&\n i.height &&\n i.height >= height * boost * dpr &&\n (index ? i.index === index : i.index === undefined)\n ) ||\n images?.at(-1) ||\n {}\n // We're talking about images here, so we should be using /image/ instead of /ipfs/\n const url = _src?.startsWith('https://api.universalprofile.cloud/ipfs/')\n ? _src?.replace(/\\/ipfs\\//, '/image/')\n : _src\n if (!url) {\n return options.fallback\n ? { src: options.fallback, width: 128, height: 128 }\n : undefined\n }\n try {\n let isImage: string | undefined\n if (typeof caches !== 'undefined' && !ignoreHead) {\n const cache = await caches.open('image-types')\n const cached = await cache.match(url)\n if (cached) {\n const response = await cached.json()\n if (response) {\n isImage = response\n }\n }\n }\n if (!isImage && !ignoreHead) {\n // HEAD will return 200, 404 and so including the 'content-type'\n // We use this to determine what type of images we have.\n // If the images came from the indexer then this test\n // has already been done on the indexer and we can skip it here.\n const _now = Date.now()\n isImage = await fetch(url, { method: 'HEAD' })\n .then((response) => {\n if (response.ok) {\n const mime = response.headers.get('content-type') || ''\n response.body?.cancel()\n return /^image\\//.test(mime) ? mime : undefined\n }\n response.body?.cancel()\n return undefined\n })\n .catch((error) => {\n console.error((error as Error).stack)\n return undefined\n })\n if (isImage != null && typeof caches !== 'undefined') {\n const cache = await caches.open('image-types')\n await cache\n .put(url, new Response(JSON.stringify(isImage)))\n .catch((error) => {\n console.error((error as Error).stack, url)\n })\n }\n }\n if (isImage || ignoreHead) {\n const finalUrl = new URL(url)\n const { searchParams } = finalUrl\n const qs = new URLSearchParams(searchParams)\n if (width) {\n qs.set('width', `${width * boost}`)\n }\n if (width || height) {\n qs.set('height', `${(height || width) * boost}`)\n }\n qs.set('fit', 'cover')\n qs.set('dpr', dpr.toString())\n if (\n !options.ignoreHead &&\n !/\\/svg/.test(isImage || '') &&\n options.forcePng\n ) {\n qs.set('format', 'png')\n }\n finalUrl.search = qs.toString()\n const image = finalUrl.toString()\n return {\n width,\n height: height || width,\n src:\n verified === 'INVALID' && !ignoreVerification\n ? `${image}&blur=30`\n : image,\n }\n }\n } catch (error) {\n console.error((error as Error).stack)\n }\n return options.fallback\n ? { src: options.fallback, width: 128, height: 128 }\n : undefined\n}\n","import type { Chain } from 'viem'\nimport { fetchMultipleAddresses } from '../shared/addressResolver'\nimport type { AddressIdentityCache } from '../shared/cache'\nimport type { DataKey, EnhancedInfo } from '../types'\nimport type { ServerDecoderCaches } from './caches'\n\n/**\n * Server-side address resolver with caching\n */\nexport class ServerAddressResolver {\n private cacheAdapter: AddressIdentityCache\n\n constructor(\n private graphqlEndpoint: string,\n _chain: Chain,\n private caches: ServerDecoderCaches\n ) {\n // Create adapter to use ServerDecoderCaches as AddressIdentityCache\n this.cacheAdapter = {\n get: (key: DataKey) => this.caches.getAddress(key),\n set: (key: DataKey, value: EnhancedInfo) =>\n this.caches.setAddress(key, value),\n has: (key: DataKey) => this.caches.hasAddress(key),\n getMany: (keys: DataKey[]) => this.caches.getAddresses(keys),\n }\n }\n\n /**\n * Resolve addresses, using cache when possible\n */\n async resolveAddresses(\n addresses: readonly DataKey[]\n ): Promise<Map<DataKey, EnhancedInfo>> {\n // Use the shared implementation with cache adapter\n return fetchMultipleAddresses(\n addresses,\n this.graphqlEndpoint,\n this.cacheAdapter\n )\n }\n\n /**\n * Resolve addresses with timeout\n */\n async resolveAddressesWithTimeout(\n addresses: DataKey[],\n timeoutMs: number\n ): Promise<Map<DataKey, EnhancedInfo>> {\n return Promise.race([\n this.resolveAddresses(addresses),\n new Promise<Map<DataKey, EnhancedInfo>>((resolve) => {\n setTimeout(() => {\n // On timeout, return whatever we have cached\n const results = this.caches.getAddresses(addresses)\n resolve(results)\n }, timeoutMs)\n }),\n ])\n }\n\n /**\n * Warm the cache with specific addresses\n */\n async warmCache(addresses: DataKey[]): Promise<void> {\n // Simply call resolveAddresses which will cache any uncached addresses\n await this.resolveAddresses(addresses)\n }\n}\n","import { LRUCache } from 'lru-cache'\nimport type { Abi } from 'viem'\nimport type { DecoderResult, Info } from '../decoder/types'\nimport type { DataKey, EnhancedInfo } from '../types'\nimport type { CacheStats } from './types'\n\n/**\n * Multi-level caching system for server-side decoder\n */\nexport class ServerDecoderCaches {\n // Level 1: Decoded transaction cache (keyed by transaction hash)\n private transactionCache: LRUCache<string, DecoderResult>\n private transactionStats = { hits: 0, misses: 0 }\n\n // Level 2: Address metadata cache (keyed by address or address:tokenId)\n private addressCache: LRUCache<string, EnhancedInfo>\n private addressStats = { hits: 0, misses: 0 }\n\n // Level 3: Contract ABI cache (keyed by address)\n private abiCache: LRUCache<string, Abi>\n private abiStats = { hits: 0, misses: 0 }\n\n // Level 4: Schema decode cache (keyed by key:value)\n private schemaCache: LRUCache<string, Info>\n private schemaStats = { hits: 0, misses: 0 }\n\n constructor(\n options: {\n transactionCacheSize?: number\n addressCacheSize?: number\n abiCacheSize?: number\n schemaCacheSize?: number\n } = {}\n ) {\n // Transaction cache - store complete decoded results\n this.transactionCache = new LRUCache<string, DecoderResult>({\n max: options.transactionCacheSize || 10000,\n ttl: 1000 * 60 * 60, // 1 hour TTL\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n })\n\n // Address cache - store profile/asset metadata\n this.addressCache = new LRUCache<string, EnhancedInfo>({\n max: options.addressCacheSize || 50000,\n ttl: 1000 * 60 * 60 * 24, // 24 hour TTL\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n })\n\n // ABI cache - store contract ABIs\n this.abiCache = new LRUCache<string, Abi>({\n max: options.abiCacheSize || 5000,\n ttl: 1000 * 60 * 60 * 24 * 7, // 7 day TTL (ABIs rarely change)\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n })\n\n // Schema cache - store decoded schema values\n this.schemaCache = new LRUCache<string, Info>({\n max: options.schemaCacheSize || 10000,\n ttl: 1000 * 60 * 60, // 1 hour TTL\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n })\n }\n\n /**\n * Get cache key for a data key (address or address:tokenId)\n */\n private getDataKeyCacheKey(key: DataKey): string {\n return key.toLowerCase()\n }\n\n // Transaction cache methods\n getTransaction(hash: string): DecoderResult | undefined {\n const result = this.transactionCache.get(hash.toLowerCase())\n if (result) {\n this.transactionStats.hits++\n return { ...result, cached: true }\n }\n this.transactionStats.misses++\n return undefined\n }\n\n setTransaction(hash: string, result: DecoderResult): void {\n this.transactionCache.set(hash.toLowerCase(), result)\n }\n\n // Address cache methods\n getAddress(key: DataKey): EnhancedInfo | undefined {\n const cacheKey = this.getDataKeyCacheKey(key)\n const result = this.addressCache.get(cacheKey)\n if (result) {\n this.addressStats.hits++\n return result\n }\n this.addressStats.misses++\n return undefined\n }\n\n setAddress(key: DataKey, data: EnhancedInfo): void {\n const cacheKey = this.getDataKeyCacheKey(key)\n this.addressCache.set(cacheKey, data)\n }\n\n hasAddress(key: DataKey): boolean {\n return this.addressCache.has(this.getDataKeyCacheKey(key))\n }\n\n getAddresses(keys: DataKey[]): Map<DataKey, EnhancedInfo> {\n const results = new Map<DataKey, EnhancedInfo>()\n for (const key of keys) {\n const data = this.getAddress(key)\n if (data) {\n results.set(key, data)\n }\n }\n return results\n }\n\n // ABI cache methods\n getAbi(address: string): Abi | undefined {\n const result = this.abiCache.get(address.toLowerCase())\n if (result) {\n this.abiStats.hits++\n return result\n }\n this.abiStats.misses++\n return undefined\n }\n\n setAbi(address: string, abi: Abi): void {\n this.abiCache.set(address.toLowerCase(), abi)\n }\n\n hasAbi(address: string): boolean {\n return this.abiCache.has(address.toLowerCase())\n }\n\n // Schema cache methods\n getSchema(key: string, value: string): Info | undefined {\n const cacheKey = `${key}:${value}`\n const result = this.schemaCache.get(cacheKey)\n if (result) {\n this.schemaStats.hits++\n return result\n }\n this.schemaStats.misses++\n return undefined\n }\n\n setSchema(key: string, value: string, info: Info): void {\n const cacheKey = `${key}:${value}`\n this.schemaCache.set(cacheKey, info)\n }\n\n // Cache management\n clear(): void {\n this.transactionCache.clear()\n this.addressCache.clear()\n this.abiCache.clear()\n this.schemaCache.clear()\n\n // Reset stats\n this.transactionStats = { hits: 0, misses: 0 }\n this.addressStats = { hits: 0, misses: 0 }\n this.abiStats = { hits: 0, misses: 0 }\n this.schemaStats = { hits: 0, misses: 0 }\n }\n\n getStats(): CacheStats {\n const calculateHitRate = (stats: { hits: number; misses: number }) => {\n const total = stats.hits + stats.misses\n return total > 0 ? stats.hits / total : 0\n }\n\n return {\n transactions: {\n size: this.transactionCache.size,\n maxSize: this.transactionCache.max,\n hits: this.transactionStats.hits,\n misses: this.transactionStats.misses,\n hitRate: calculateHitRate(this.transactionStats),\n },\n addresses: {\n size: this.addressCache.size,\n maxSize: this.addressCache.max,\n hits: this.addressStats.hits,\n misses: this.addressStats.misses,\n hitRate: calculateHitRate(this.addressStats),\n },\n abis: {\n size: this.abiCache.size,\n maxSize: this.abiCache.max,\n hits: this.abiStats.hits,\n misses: this.abiStats.misses,\n hitRate: calculateHitRate(this.abiStats),\n },\n schemas: {\n size: this.schemaCache.size,\n maxSize: this.schemaCache.max,\n hits: this.schemaStats.hits,\n misses: this.schemaStats.misses,\n hitRate: calculateHitRate(this.schemaStats),\n },\n }\n }\n}\n","import type { Hex } from 'viem'\nimport type { DecoderPlugin, Info, SchemaPlugin } from './types'\n\n/**\n * Plugin metadata for registry\n */\nexport interface PluginMetadata {\n name: string\n plugin: DecoderPlugin\n priority?: number\n required?: boolean // Cannot be overridden, always runs first\n description?: string\n version?: string\n usesAsync?: boolean // Whether this plugin performs async operations\n}\n\n/**\n * Schema plugin metadata\n */\nexport interface SchemaPluginMetadata {\n name: string\n plugin: SchemaPlugin\n priority?: number\n required?: boolean // Cannot be overridden, always runs first\n description?: string\n version?: string\n}\n\n/**\n * Global plugin registry for auto-registration\n */\nclass PluginRegistry {\n private plugins: Map<string, PluginMetadata> = new Map()\n private schemaPlugins: Map<string, SchemaPluginMetadata> = new Map()\n\n /**\n * Register a decoder plugin\n * @param name - Unique plugin name\n * @param plugin - Plugin instance\n * @param options - Registration options\n */\n register(\n name: string,\n plugin: DecoderPlugin,\n options?: {\n priority?: number\n required?: boolean\n override?: boolean\n description?: string\n version?: string\n usesAsync?: boolean\n }\n ): void {\n const {\n override = false,\n priority = 0,\n required = false,\n description,\n version,\n usesAsync = false,\n } = options || {}\n\n const existing = this.plugins.get(name)\n\n if (existing) {\n if (existing.required) {\n console.error(\n `Plugin \"${name}\" is marked as required and cannot be overridden.`\n )\n return\n }\n if (!override) {\n console.warn(\n `Plugin \"${name}\" is already registered. Use override: true to replace.`\n )\n return\n }\n }\n\n this.plugins.set(name, {\n name,\n plugin: Object.freeze(plugin),\n priority,\n required,\n description,\n version,\n usesAsync,\n })\n }\n\n /**\n * Register a schema plugin\n * @param name - Unique plugin name\n * @param plugin - Schema plugin instance\n * @param options - Registration options\n */\n registerSchema(\n name: string,\n plugin: SchemaPlugin,\n options?: {\n priority?: number\n required?: boolean\n override?: boolean\n description?: string\n version?: string\n }\n ): void {\n const {\n override = false,\n priority = 0,\n required = false,\n description,\n version,\n } = options || {}\n\n const existing = this.schemaPlugins.get(name)\n\n if (existing) {\n if (existing.required) {\n console.error(\n `Schema plugin \"${name}\" is marked as required and cannot be overridden.`\n )\n return\n }\n if (!override) {\n console.warn(\n `Schema plugin \"${name}\" is already registered. Use override: true to replace.`\n )\n return\n }\n }\n\n this.schemaPlugins.set(name, {\n name,\n plugin: Object.freeze(plugin),\n priority,\n required,\n description,\n version,\n })\n }\n\n /**\n * Unregister a plugin\n */\n unregister(name: string): boolean {\n return this.plugins.delete(name)\n }\n\n /**\n * Get all registered decoder plugins (excluding overridden ones)\n * @param options - Filter options\n */\n async getAll(options?: {\n excludeNames?: string[]\n syncOnly?: boolean\n }): Promise<DecoderPlugin[]> {\n const { excludeNames = [], syncOnly = false } = options || {}\n const exclude = new Set(excludeNames)\n let plugins = Array.from(this.plugins.values())\n\n // Filter by syncOnly if requested\n if (syncOnly) {\n plugins = plugins.filter((meta) => !meta.usesAsync)\n }\n\n // Check if any required plugins are being excluded\n for (const name of exclude) {\n const plugin = this.plugins.get(name)\n if (plugin?.required) {\n console.warn(\n `Warning: Plugin \"${name}\" is required and cannot be excluded. It will run first.`\n )\n }\n }\n\n // Separate required and optional plugins\n return plugins\n .sort((a, b) => (b.priority || 0) - (a.priority || 0))\n .map(({ plugin }) => plugin)\n }\n\n /**\n * Get all schema plugins (excluding overridden ones)\n * @param excludeNames - Plugin names to exclude\n */\n getAllSchema(excludeNames?: string[]): SchemaPlugin[] {\n const exclude = new Set(excludeNames || [])\n const plugins = Array.from(this.schemaPlugins.values())\n\n // Check if any required plugins are being excluded\n for (const name of exclude) {\n const plugin = this.schemaPlugins.get(name)\n if (plugin?.required) {\n console.warn(\n `Warning: Schema plugin \"${name}\" is required and cannot be excluded. It will run first.`\n )\n }\n }\n\n // Separate required and optional plugins\n const required = plugins\n .filter((meta) => meta.required)\n .sort((a, b) => (b.priority || 0) - (a.priority || 0))\n\n const optional = plugins\n .filter((meta) => !meta.required && !exclude.has(meta.name))\n .sort((a, b) => (b.priority || 0) - (a.priority || 0))\n\n // Required plugins always come first, then optional ones\n return [...required, ...optional].map((meta) => meta.plugin)\n }\n\n /**\n * Get a specific plugin by name\n */\n async get(name: string): Promise<DecoderPlugin | undefined> {\n const meta = this.plugins.get(name)\n return meta?.plugin\n }\n\n /**\n * Get plugin metadata\n */\n getMetadata(name: string): PluginMetadata | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get schema plugin metadata\n */\n getSchemaMetadata(name: string): SchemaPluginMetadata | undefined {\n return this.schemaPlugins.get(name)\n }\n\n /**\n * Check if a plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Clear all plugins\n */\n clear(): void {\n this.plugins.clear()\n this.schemaPlugins.clear()\n }\n\n /**\n * Get the number of registered plugins\n */\n get size(): number {\n return this.plugins.size + this.schemaPlugins.size\n }\n\n /**\n * List all registered plugins with metadata\n */\n list(): { plugins: PluginMetadata[]; schemaPlugins: SchemaPluginMetadata[] } {\n return {\n plugins: Array.from(this.plugins.values()),\n schemaPlugins: Array.from(this.schemaPlugins.values()),\n }\n }\n}\n\n// Freeze the PluginRegistry prototype to prevent modifications\nObject.freeze(PluginRegistry.prototype)\nObject.freeze(PluginRegistry)\n\n// Global singleton instance\nexport const pluginRegistry = new PluginRegistry()\n\n// Convenience function for plugin authors\nexport function registerPlugin(\n name: string,\n plugin: DecoderPlugin,\n options?: {\n priority?: number\n required?: boolean\n override?: boolean\n description?: string\n version?: string\n usesAsync?: boolean\n }\n): void {\n pluginRegistry.register(name, plugin, options)\n}\n\n// Convenience function for schema plugin authors\nexport function registerSchemaPlugin(\n name: string,\n plugin: SchemaPlugin,\n options?: {\n priority?: number\n required?: boolean\n override?: boolean\n description?: string\n version?: string\n }\n): void {\n pluginRegistry.registerSchema(name, plugin, options)\n}\n\n// Helper to create a named schema plugin\nexport function createNamedSchemaPlugin(\n name: string,\n plugin: (key: Hex, value: Hex) => Promise<Info | undefined>\n): SchemaPlugin {\n const namedPlugin = Object.assign(plugin, { name })\n return namedPlugin as SchemaPlugin\n}\n\n// Helper to create a named decoder plugin\nexport function createNamedPlugin(\n name: string,\n plugin: Omit<DecoderPlugin, 'name'>\n): DecoderPlugin {\n return { ...plugin, name }\n}\n","import {\n type Abi,\n type AbiFunction,\n AbiFunctionSignatureNotFoundError,\n type AbiParameter,\n type Address,\n type Chain,\n createPublicClient,\n type DecodeFunctionDataParameters,\n decodeAbiParameters,\n type Hex,\n http,\n type PublicClient,\n slice,\n toFunctionSelector,\n} from 'viem'\nimport { formatAbiItem } from 'viem/utils'\nimport type {\n ArrayArgs,\n AsyncOperations,\n CustomDecodeFunctionDataReturn,\n DecoderResult,\n EnhancedInfo,\n} from './types'\n\n/**\n * Custom decoder for function data with additional named args support\n * It's essentially the same code as decodeFunctionData, but also\n * returning a namedArgs where we zip together the args and the inputs.\n */\nexport function customDecodeFunctionData<\n const abi extends Abi | readonly unknown[],\n _preferError = false,\n>(\n parameters: Partial<\n DecodeFunctionDataParameters<abi> & {\n namedArgs?:\n | Record<number, AbiParameter & { value?: unknown }>\n | Record<string, unknown>\n }\n >,\n preferError?: boolean\n) {\n try {\n const { abi, data } = parameters as DecodeFunctionDataParameters\n const signature = slice(data, 0, 4)\n const description: AbiFunction | undefined = (abi.find(\n (x) =>\n x.type === (preferError ? 'error' : 'function') &&\n signature === toFunctionSelector(formatAbiItem(x))\n ) || undefined) as AbiFunction | undefined\n if (!description)\n throw new AbiFunctionSignatureNotFoundError(signature, {\n docsPath: '/docs/contract/decodeFunctionData',\n })\n const args = (\n 'inputs' in description &&\n description.inputs &&\n description.inputs.length > 0\n ? decodeAbiParameters(description.inputs, slice(data, 4))\n : undefined\n ) as readonly unknown[] | undefined\n const result: {\n functionName: string\n sig: Hex\n input: Hex\n args?: ArrayArgs\n } = {\n functionName: (description as { name: string }).name,\n sig: signature,\n input: data,\n }\n if (args) {\n const { args: namedArgs } = createNamedArgs(args, description.inputs)\n result.args = namedArgs\n }\n return result as CustomDecodeFunctionDataReturn<abi>\n } catch {}\n}\n\nexport function createNamedArgs(\n args: unknown[] | readonly unknown[],\n inputs?: AbiParameter[] | readonly AbiParameter[]\n): { args: ArrayArgs } {\n const array = args.map((value, index) => {\n return {\n name: `args${index + 1}`,\n ...inputs?.[index],\n value,\n } as AbiParameter & { value: unknown }\n })\n return { args: array }\n}\n\n/**\n * Get an argument value by its name from the args array.\n * This utility function allows accessing arguments by name without needing namedArgs.\n *\n * @param args - The array of arguments with their metadata\n * @param name - The name of the argument to find\n * @returns The value of the argument if found, undefined otherwise\n */\nexport function getArgByName(\n args: ArrayArgs | undefined,\n name: string\n): unknown {\n if (!args) return undefined\n\n const arg = args.find((arg) => arg.name === name)\n return arg?.value\n}\n\nexport function extractAddress(address?: Address | EnhancedInfo) {\n if (typeof address === 'object') {\n return address.address\n }\n return address\n}\n\nconst clients: Record<number, PublicClient> = {} as Record<number, PublicClient>\nexport function getPublicClient(chain: Chain): PublicClient {\n const { id } = chain\n if (!id) {\n throw new Error('Chain ID is required to create a public client')\n }\n if (!clients[id]) {\n clients[id] = createPublicClient({\n chain,\n transport: http(),\n batch: {\n multicall: {\n batchSize: 100,\n },\n },\n })\n }\n const result = clients[id]\n if (!result) {\n throw new Error(`Public client for chain ID ${id} not found`)\n }\n return result\n}\n\n/**\n * Helper to check if a specific async operation is enabled\n */\nexport function isAsyncOperationEnabled(\n asyncOption: boolean | AsyncOperations | undefined,\n operation: AsyncOperations\n): boolean {\n // Handle backward compatibility\n if (typeof asyncOption === 'boolean') {\n return asyncOption\n }\n // If not specified, default to DISABLED\n if (asyncOption === undefined) {\n return false\n }\n // Check bitmap\n return (asyncOption & operation) !== 0\n}\n\n/**\n * Check if a single decoded item needs enhancement\n * @param item - A single decoded result (not checking children)\n * @returns true if this specific item needs enhancement\n */\nfunction needsEnhancementSingle(item: DecoderResult): boolean {\n // If sig is \"0x\", there's no function signature to decode\n if ('sig' in item && item.sig === '0x') {\n return false\n }\n\n // If it has a standard, it's already identified\n if (item.standard) {\n return false\n }\n\n // Otherwise it needs enhancement\n return true\n}\n\n/**\n * Check if a decoded result needs enhancement\n * Returns true if the result OR any of its children need enhancement\n */\nexport function needsEnhancement(result: DecoderResult): boolean {\n // Check if the main result needs enhancement\n if (needsEnhancementSingle(result)) {\n return true\n }\n\n // Check if any children need enhancement\n if ('children' in result && Array.isArray(result.children)) {\n return result.children.some((child) => {\n // Children might be ResultType or ResultSetData, which don't have all DecoderResult fields\n // We only check for standard property which is common to all\n if (child.standard) {\n return false\n }\n // If sig is \"0x\", there's no function signature to decode\n if ('sig' in child && child.sig === '0x') {\n return false\n }\n // Otherwise it needs enhancement\n return true\n })\n }\n\n // Nothing needs enhancement\n return false\n}\n","import {\n type DecodeDataOutput,\n decodeData,\n decodeMappingKey,\n decodePermissions,\n decodeValueContent,\n type ERC725JSONSchema,\n isDynamicKeyName,\n type Permissions,\n} from '@erc725/erc725.js'\nimport { type Hex, isHex } from 'viem'\nimport { ARRAY_MAX, defaultSchema, IPFS_GATEWAY } from '../constants'\nimport { getDataFromExternalSources } from '../getDataFromExternalSources'\nimport type { Info } from '../types'\n\nexport const schemaDefaultPlugin = decodeKeyValuePlugin(defaultSchema)\nexport default schemaDefaultPlugin\n\n/**\n * Decode key/value pair as per erc725 schema\n * @param key\n * @param value\n * @returns\n */\nexport function decodeKeyValuePlugin(\n defaultSchema: ERC725JSONSchema[],\n process?: (output: Info) => Promise<Info>\n) {\n const preProcess = async (key: Hex, value: Hex): Promise<Info> => {\n // Search for the schema entry.\n const schema =\n defaultSchema.find((item) => {\n if (key === item.key) {\n return true\n }\n const index = item.key.indexOf('<')\n if (index !== -1) {\n return key.slice(0, index) === item.key.slice(0, index)\n }\n return false\n }) ||\n defaultSchema.find((item) => {\n if (key.slice(0, 34) === item.key.slice(0, 34)) {\n return true\n }\n return false\n })\n if (schema) {\n try {\n // Get the raw name.\n const name = schema.name.replace(/[:[\\]]|<.*?>/g, '')\n if (schema.keyType === 'Array') {\n if (schema.key === key) {\n // Convert hex string to Uint8Array without using Buffer\n const hexString = value.slice(2)\n const all = new Uint8Array(hexString.length / 2)\n for (let i = 0; i < hexString.length; i += 2) {\n all[i / 2] = Number.parseInt(hexString.substring(i, i + 2), 16)\n }\n // Figure out the first and last byte of the value (this is to allow\n // the older and newer ways to store the array length i.e. uint256, uint128 and so on.)\n const [{ start: _start, end } = { start: 0, end: 0 }] = all.reduce(\n (\n acc: Array<{ isZero: boolean; start: number; end: number }>,\n byte,\n index_\n ) => {\n let isZero = byte === 0 || index_ === 0\n const last = acc.at(-1)\n let index = index_\n if (\n !last ||\n last.isZero !== isZero ||\n index === all.length - 1\n ) {\n if (index === all.length - 1) {\n index = all.length\n } else if (index === 0) {\n isZero = true\n }\n if (last) {\n last.end = index\n last.isZero = isZero\n }\n if (isZero) {\n acc.push({\n isZero,\n start: index,\n end: index === 0 ? index + 1 : index,\n })\n }\n }\n return acc\n },\n []\n )\n const picked =\n Math.abs(end - all.length + 1) <= 4\n ? all.length + 1\n : Math.abs(end - all.length / 2 + 1) <= 4\n ? all.length / 2\n : end\n const segment = value.slice(0, picked * 2 + 2)\n const length = BigInt(segment)\n if (length > ARRAY_MAX) {\n // We don't support arrays larger than 1000. Inside of the indexer it's a problem because of a single array column\n // and we had to pick some kind of maximum size to prevent the SQL from crashing.\n return {\n ...schema,\n type: 'Error',\n key,\n value: 'Array length too large',\n }\n }\n return {\n ...schema,\n type: 'ArrayLength',\n pretty: name,\n value: Number(length),\n }\n }\n // Extract array index.\n const index = BigInt(`0x${key.slice(34)}`)\n if (index > ARRAY_MAX) {\n return {\n ...schema,\n type: 'Error',\n key,\n value: 'Array index too large',\n }\n }\n let data =\n value !== '0x'\n ? decodeValueContent(schema.valueContent, value)\n : undefined\n if (schema.valueContent.startsWith('0x')) {\n data = data === schema.valueContent\n }\n return {\n ...schema,\n type: 'ArrayItem',\n pretty: name,\n dynamic: Number(index),\n value: data,\n }\n }\n // Decode dynamic parts.\n let dynamicKeyParts: string[] | string | undefined\n if (isDynamicKeyName(schema.name)) {\n dynamicKeyParts = decodeMappingKey(key, schema).map(({ value }) =>\n isHex(value) ? (value as string).toLowerCase() : `${value}`\n )\n }\n // Decode value\n let rawData =\n value !== '0x'\n ? (decodeData(\n [\n dynamicKeyParts\n ? {\n keyName: schema.name,\n dynamicKeyParts,\n value,\n }\n : { keyName: schema.name, value },\n ],\n defaultSchema\n ) as unknown as Record<string, unknown>[])\n : [{ value: undefined }]\n let data = rawData?.[0]?.value\n // Some special cases.\n if (schema.name === 'LSP8TokenMetadataBaseURI') {\n const { url: _url } = (data as { url: string | undefined }) || {}\n const url = _url?.replace(/\\0*$/g, '')\n if (!url && url?.includes('\\0')) {\n return {\n ...schema,\n pretty: name,\n type: 'Error',\n key,\n value: 'Invalid URL (contains \\\\0)',\n }\n }\n return { ...schema, type: 'Value', name, value: url }\n }\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const { url: _url } = (data as { url: string | undefined }) || {}\n const url = _url?.replace(/\\0*$/g, '')\n if (!url || url?.includes('\\0')) {\n const newURL = url?.replace(/\\0/g, '\\\\0')\n const { error, data, method } = rawData?.[0] as {\n error: string\n data?: string\n method?: string\n url?: string\n }\n return {\n ...schema,\n pretty: name,\n type: 'Error',\n key,\n value: `${error ? `${error} ` : ''}Invalid URL (contains \\\\0 ${newURL})`,\n data,\n method,\n url: newURL,\n }\n }\n const newURL = (data as { url: string }).url.replace(\n 'https://2eff.lukso.dev/ipfs/',\n 'ipfs://'\n )\n if (newURL !== (data as { url: string }).url) {\n ;(data as { url: string }).url = newURL\n }\n rawData = (await getDataFromExternalSources(\n defaultSchema,\n rawData as unknown as DecodeDataOutput[],\n IPFS_GATEWAY,\n false\n )) as unknown as Record<string, unknown>[]\n if (rawData?.[0]?.error) {\n const { error, data, method, url } = rawData?.[0] as {\n error: string\n data?: string\n method?: string\n url?: string\n }\n return {\n ...schema,\n type: 'Error',\n pretty: name,\n value: error,\n data,\n method,\n url,\n }\n }\n data =\n (rawData?.[0]?.value as Record<string, unknown>)?.[schema.name] ||\n (rawData?.[0]?.value as Record<string, unknown>)\n } else if (schema.valueContent.startsWith('0x')) {\n data = data === schema.valueContent\n }\n const {\n data: _data,\n method,\n src,\n url,\n } = rawData?.[0] as {\n data?: string\n method?: string\n url?: string\n src?: string\n }\n if (schema.name === 'AddressPermissions:Permissions:<address>') {\n let _value: string | object = data as string | object\n try {\n const {\n ERC4337_PERMISSION: _ignore1,\n ALL_PERMISSIONS: _ignore2,\n ...rest\n } = decodePermissions(data as Hex) as unknown as Permissions & {\n ISRECOVERY?: boolean\n }\n if (Object.keys('rest').length === 1 && rest.ADDCONTROLLER) {\n rest.ISRECOVERY = true\n }\n _value = rest\n } catch {\n // Ignore\n }\n return {\n ...schema,\n type: 'Value',\n pretty: name,\n value: _value,\n dynamic:\n dynamicKeyParts?.length === 1\n ? dynamicKeyParts[0]\n : dynamicKeyParts,\n data: _data,\n method,\n src,\n url,\n }\n }\n return {\n ...schema,\n type: 'Value',\n pretty: name,\n value: data,\n dynamic:\n dynamicKeyParts?.length === 1\n ? dynamicKeyParts[0]\n : dynamicKeyParts,\n data: _data,\n method,\n src,\n url,\n }\n } catch (error) {\n return { ...schema, type: 'Error', key, value: error as Error }\n }\n }\n return { type: 'Undecoded', name: undefined, key, value }\n }\n return async (key: Hex, value: Hex) => {\n try {\n const result = await preProcess(key, value)\n if (process) {\n return await process(result)\n }\n return result\n } catch {}\n return undefined\n }\n}\n","[\n {\n \"name\": \"LSP1UniversalReceiverDelegate\",\n \"key\": \"0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate:<bytes32>\",\n \"key\": \"0x0cfc51aec37c55a4d0b10000<bytes32>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","[\n {\n \"name\": \"SupportedStandards:LSP3Profile\",\n \"key\": \"0xeafec4d89fa9619884b600005ef83ad9559033e6e941db7d7c495acdce616347\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"bytes4\",\n \"valueContent\": \"0x5ef83ad9\"\n },\n {\n \"name\": \"LSP3Profile\",\n \"key\": \"0x5ef83ad9559033e6e941db7d7c495acdce616347d28e90c7ce47cbfcfcad3bc5\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"bytes\",\n \"valueContent\": \"VerifiableURI\"\n },\n {\n \"name\": \"LSP12IssuedAssets[]\",\n \"key\": \"0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP12IssuedAssetsMap:<address>\",\n \"key\": \"0x74ac2555c10b9349e78f0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n },\n {\n \"name\": \"LSP5ReceivedAssets[]\",\n \"key\": \"0x6460ee3c0aac563ccbf76d6e1d07bada78e3a9514e6382b736ed3f478ab7b90b\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP5ReceivedAssetsMap:<address>\",\n \"key\": \"0x812c4334633eb816c80d0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate\",\n \"key\": \"0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate:<bytes32>\",\n \"key\": \"0x0cfc51aec37c55a4d0b10000<bytes32>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP17Extension:<bytes4>\",\n \"key\": \"0xcee78b4094da860110960000<bytes4>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","[\n {\n \"name\": \"SupportedStandards:LSP4DigitalAsset\",\n \"key\": \"0xeafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"bytes4\",\n \"valueContent\": \"0xa4d96624\"\n },\n {\n \"name\": \"LSP4TokenName\",\n \"key\": \"0xdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af1\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"string\",\n \"valueContent\": \"String\"\n },\n {\n \"name\": \"LSP4TokenSymbol\",\n \"key\": \"0x2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db932756\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"string\",\n \"valueContent\": \"String\"\n },\n {\n \"name\": \"LSP4TokenType\",\n \"key\": \"0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"uint256\",\n \"valueContent\": \"Number\"\n },\n {\n \"name\": \"LSP4Metadata\",\n \"key\": \"0x9afb95cacc9f95858ec44aa8c3b685511002e30ae54415823f406128b85b238e\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"bytes\",\n \"valueContent\": \"VerifiableURI\"\n },\n {\n \"name\": \"LSP4Creators[]\",\n \"key\": \"0x114bd03b3a46d48759680d81ebb2b414fda7d030a7105a851867accf1c2352e7\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP4CreatorsMap:<address>\",\n \"key\": \"0x6de85eaf5d982b4e5da00000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n }\n]\n","[\n {\n \"name\": \"SupportedStandards:LSP4DigitalCertificate\",\n \"key\": \"0xeafec4d89fa9619884b6b89135626455000000000000000000000000abf0613c\",\n \"keyType\": \"Mapping\",\n \"valueContent\": \"0xabf0613c\",\n \"valueType\": \"bytes\"\n }\n]\n","[\n {\n \"name\": \"LSP5ReceivedAssets[]\",\n \"key\": \"0x6460ee3c0aac563ccbf76d6e1d07bada78e3a9514e6382b736ed3f478ab7b90b\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP5ReceivedAssetsMap:<address>\",\n \"key\": \"0x812c4334633eb816c80d0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n }\n]\n","[\n {\n \"name\": \"AddressPermissions[]\",\n \"key\": \"0xdf30dba06db6a30e65354d9a64c609861f089545ca58c6b4dbe31a5f338cb0e3\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"AddressPermissions:Permissions:<address>\",\n \"key\": \"0x4b80742de2bf82acb3630000<address>\",\n \"keyType\": \"MappingWithGrouping\",\n \"valueType\": \"bytes32\",\n \"valueContent\": \"BitArray\"\n },\n {\n \"name\": \"AddressPermissions:AllowedCalls:<address>\",\n \"key\": \"0x4b80742de2bf393a64c70000<address>\",\n \"keyType\": \"MappingWithGrouping\",\n \"valueType\": \"(bytes4,address,bytes4,bytes4)[CompactBytesArray]\",\n \"valueContent\": \"(BitArray,Address,Bytes4,Bytes4)\"\n },\n {\n \"name\": \"AddressPermissions:AllowedERC725YDataKeys:<address>\",\n \"key\": \"0x4b80742de2bf866c29110000<address>\",\n \"keyType\": \"MappingWithGrouping\",\n \"valueType\": \"bytes[CompactBytesArray]\",\n \"valueContent\": \"Bytes\"\n }\n]\n","[\n {\n \"name\": \"LSP8TokenIdFormat\",\n \"key\": \"0xf675e9361af1c1664c1868cfa3eb97672d6b1a513aa5b81dec34c9ee330e818d\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"uint256\",\n \"valueContent\": \"Number\"\n },\n {\n \"name\": \"LSP8TokenMetadataBaseURI\",\n \"key\": \"0x1a7628600c3bac7101f53697f48df381ddc36b9015e7d7c9c5633d1252aa2843\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"bytes\",\n \"valueContent\": \"VerifiableURI\"\n },\n {\n \"name\": \"LSP8ReferenceContract\",\n \"key\": \"0x708e7b881795f2e6b6c2752108c177ec89248458de3bf69d0d43480b3e5034e6\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"(address,bytes32)\",\n \"valueContent\": \"(Address,Bytes32)\"\n }\n]\n","[\n {\n \"name\": \"SupportedStandards:LSP9Vault\",\n \"key\": \"0xeafec4d89fa9619884b600007c0334a14085fefa8b51ae5a40895018882bdb90\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"bytes4\",\n \"valueContent\": \"0x7c0334a1\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate\",\n \"key\": \"0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate:<bytes32>\",\n \"key\": \"0x0cfc51aec37c55a4d0b10000<bytes32>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP17Extension:<bytes4>\",\n \"key\": \"0xcee78b4094da860110960000<bytes4>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","[\n {\n \"name\": \"LSP10VaultsMap:<address>\",\n \"key\": \"0x192448c3c0f88c7f238c0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n },\n {\n \"name\": \"LSP10Vaults[]\",\n \"key\": \"0x55482936e01da86729a45d2b87a6b1d3bc582bea0ec00e38bdb340e3af6f9f06\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","[\n {\n \"name\": \"LSP12IssuedAssets[]\",\n \"key\": \"0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP12IssuedAssetsMap:<address>\",\n \"key\": \"0x74ac2555c10b9349e78f0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n }\n]\n","[\n {\n \"name\": \"LSP17Extension:<bytes4>\",\n \"key\": \"0xcee78b4094da860110960000<bytes4>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","import type { ERC725JSONSchema } from '@erc725/erc725.js'\nimport LSP1Schema from '@erc725/erc725.js/schemas/LSP1UniversalReceiverDelegate.json' with {\n type: 'json',\n}\nimport LSP3Schema from '@erc725/erc725.js/schemas/LSP3ProfileMetadata.json' with {\n type: 'json',\n}\nimport LSP4Schema from '@erc725/erc725.js/schemas/LSP4DigitalAsset.json' with {\n type: 'json',\n}\nimport LSP4LegacySchema from '@erc725/erc725.js/schemas/LSP4DigitalAssetLegacy.json' with {\n type: 'json',\n}\nimport LSP5Schema from '@erc725/erc725.js/schemas/LSP5ReceivedAssets.json' with {\n type: 'json',\n}\nimport LSP6Schema from '@erc725/erc725.js/schemas/LSP6KeyManager.json' with {\n type: 'json',\n}\nimport LSP8Schema from '@erc725/erc725.js/schemas/LSP8IdentifiableDigitalAsset.json' with {\n type: 'json',\n}\nimport LSP9Schema from '@erc725/erc725.js/schemas/LSP9Vault.json' with {\n type: 'json',\n}\nimport LSP10Schema from '@erc725/erc725.js/schemas/LSP10ReceivedVaults.json' with {\n type: 'json',\n}\nimport LSP12Schema from '@erc725/erc725.js/schemas/LSP12IssuedAssets.json' with {\n type: 'json',\n}\nimport LSP17Schema from '@erc725/erc725.js/schemas/LSP17ContractExtension.json' with {\n type: 'json',\n}\n\nexport const IPFS_GATEWAY = 'https://api.universalprofile.cloud/ipfs/'\nexport const FUNCTION_DICTIONARY_URL =\n 'https://4bytesdictionary.universalprofile.cloud'\nexport const OPENCHAIN_DICTIONARY_URL =\n 'https://api.openchain.xyz/signature-database/v1/lookup'\nexport const ARRAY_MAX = 1000\n\n/**\n * Concatenation of all the schemas\n */\nexport const defaultSchema: ERC725JSONSchema[] = [\n ...LSP8Schema,\n ...LSP4Schema,\n ...LSP5Schema,\n ...LSP3Schema,\n ...LSP1Schema,\n ...LSP4LegacySchema,\n ...LSP6Schema,\n ...LSP9Schema,\n ...LSP10Schema,\n ...LSP12Schema,\n ...LSP17Schema,\n {\n name: 'LSP28TheGrid',\n key: '0x724141d9918ce69e6b8afcf53a91748466086ba2c74b94cab43c649ae2ac23ff',\n keyType: 'Singleton',\n valueType: 'bytes',\n valueContent: 'VerifiableURI',\n },\n]\n\n/**\n * The important standards for profile, lsp7 and lsp8\n */\ntype Standards =\n | 'LSP0ERC725Account'\n | 'LSP7DigitalAsset'\n | 'LSP8IdentifiableDigitalAsset'\n\n/**\n * Interface id entry for interface id items.\n */\ntype StandardID = {\n key: `0x${string}`\n name: string\n standard: Standards\n}\n\n/**\n * Array of our standard interfaceIDs\n */\nexport const ITEMS: StandardID[] = [\n {\n key: '0x24871b3d' as `0x${string}`,\n name: 'isProfile',\n standard: 'LSP0ERC725Account' as Standards,\n },\n\n {\n key: '0xc52d6008' as `0x${string}`,\n name: 'isLSP7',\n standard: 'LSP7DigitalAsset' as Standards,\n },\n {\n key: '0xb3c4928f' as `0x${string}`,\n name: 'isLSP7',\n standard: 'LSP7DigitalAsset' as Standards,\n },\n {\n key: '0xdaa746b7' as `0x${string}`,\n name: 'isLSP7',\n standard: 'LSP7DigitalAsset' as Standards,\n },\n\n {\n key: '0x3a271706' as `0x${string}`,\n name: 'isLSP8',\n standard: 'LSP8IdentifiableDigitalAsset' as Standards,\n },\n {\n key: '0xecad9f75' as `0x${string}`,\n name: 'isLSP8',\n standard: 'LSP8IdentifiableDigitalAsset' as Standards,\n },\n {\n key: '0x30dc5278' as `0x${string}`,\n name: 'isLSP8',\n standard: 'LSP8IdentifiableDigitalAsset' as Standards,\n },\n]\n","import type {\n DecodeDataOutput,\n ERC725JSONSchema,\n GetDataExternalSourcesOutput,\n URLDataWithHash,\n} from '@erc725/erc725.js'\nimport { isDataAuthentic, patchIPFSUrlsIfApplicable } from '@erc725/erc725.js'\n\nexport async function loadFile(\n _url: string,\n ipfsGateway: string\n): Promise<ArrayBuffer | null> {\n let url = _url\n if (url.startsWith('data:')) {\n // Handle data URLs\n const base64Data = url.split(',')[1]\n const binaryString = atob(base64Data)\n const len = binaryString.length\n const bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i)\n }\n return Promise.resolve(bytes.buffer)\n }\n if (url.startsWith('ipfs://')) {\n // Handle IPFS URLs\n const ipfsHash = url.replace('ipfs://', '')\n url = `${ipfsGateway}${ipfsHash}`\n }\n return fetch(url)\n .then((response) => {\n if (!response.ok) {\n throw new Error('Network response was not ok')\n }\n return response.arrayBuffer()\n })\n .catch(() => null)\n}\n\nexport const getDataFromExternalSources = (\n schemas: ERC725JSONSchema[],\n dataFromChain: DecodeDataOutput[],\n ipfsGateway: string,\n throwException = true\n): Promise<\n Array<\n GetDataExternalSourcesOutput & {\n error?: string\n method?: string\n data?: string\n url?: string\n src?: string\n }\n >\n> => {\n const promises = dataFromChain.map(async (dataEntry) => {\n const schemaElement = schemas.find((schema) => schema.key === dataEntry.key)\n\n if (!schemaElement) {\n // It is weird if we can't find the schema element for the key...\n // Let's simply ignore and return it...\n return dataEntry\n }\n\n if (\n !['jsonurl', 'asseturl', 'verifiableuri'].includes(\n schemaElement.valueContent.toLowerCase()\n )\n ) {\n return dataEntry\n }\n\n const urlDataWithHash: URLDataWithHash = dataEntry.value as URLDataWithHash // Type URLDataWithHash\n let url: string | undefined\n let src: string | undefined\n try {\n // At this stage, value should be of type jsonurl, verifiableuri or asseturl\n if (typeof dataEntry.value === 'string') {\n throw new Error(\n `Value is string instead of ${schemaElement.valueContent}`\n )\n }\n\n if (!dataEntry.value) {\n throw new Error(`${schemaElement.valueContent} empty`)\n }\n\n if (Array.isArray(dataEntry.value)) {\n throw new Error(\n `Value is Array instead of ${schemaElement.valueContent}`\n )\n }\n\n url = urlDataWithHash.url\n ;({ url: src } = patchIPFSUrlsIfApplicable(\n urlDataWithHash as URLDataWithHash,\n ipfsGateway\n ))\n let _length = 'unknown'\n if (!url.startsWith('data:') && /[=?/]$/.test(url)) {\n // this URL is not verifiable and the URL ends with a / or ? or = meaning it's not a file\n // and more likely to be some kind of directory or query BaseU=== \"errorRI\n return dataEntry\n }\n const receivedData = /^data:|^ipfs:\\/\\/|\\/ipfs\\//.test(url)\n ? await loadFile(src, ipfsGateway).then((buffer) =>\n buffer\n ? new Uint8Array(buffer)\n : Promise.reject(new Error('No Data'))\n )\n : await fetch(src).then(async (response) => {\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return response\n .arrayBuffer()\n .then((buffer) => new Uint8Array(buffer))\n })\n _length = receivedData.length.toString()\n const captureHashes: Record<string, string> = {}\n const captureErrors: string[] = []\n if (receivedData.length >= 2) {\n // JSON data cannot be less than 2 characters long.\n try {\n // - Build a string containing the first and last byte of the received data\n // and try to convert it to utf8. If that succeeds then\n // - check whether those could represent valid JSON data.\n // - then validate the data as JSON\n // - then verfiy the data against the verification method\n // Improved JSON detection. We now check the first and up to the last 3 bytes.\n // The 3 bytes can be `]` or '}' with either SPACE, LF or CRLF at the end.\n // When editing JSON using a text editor, a lot of time it's pretty printed\n // and an empty line added to the end. This is a common pattern.\n const capture: number[] = []\n capture.push(receivedData[0])\n if (receivedData.length > 3) {\n capture.push(receivedData[receivedData.length - 3])\n }\n if (receivedData.length > 2) {\n capture.push(receivedData[receivedData.length - 2])\n }\n if (receivedData.length > 1) {\n capture.push(receivedData[receivedData.length - 1])\n }\n const key = String.fromCharCode.apply(null, capture)\n // Currently not supported even though they could be added and can represent valid JSON.\n // \" \" => JSON.stringify(\"\") NOT SUPPORTED as valid JSON\n // t or f and e => JSON.stringify(true) or JSON.stringify(false) NOT SUPPORTED as valid JSON\n // 0-9 => JSON.stringify(0) integer or float (note .5 is not legitimate JSON) NOT SUPPORTED as valid JSON\n // if (/^(\\[\\]|\\{\\}|(tf)e|\\d\\d)$/.test(key)) {\n // Check if the beginning or end are\n // { and } => JSON.stringify({...}) => pretty much 100% of our JSON will be this.\n // [ and ] => JSON.stringify([...])\n if (/^(\\[.*\\]|\\{.*\\})\\s*$/s.test(key)) {\n const json = new TextDecoder().decode(new Uint8Array(receivedData))\n const value = JSON.parse(json)\n if (\n isDataAuthentic(\n value,\n urlDataWithHash.verification,\n captureErrors\n )\n ) {\n return {\n ...dataEntry,\n value,\n data: urlDataWithHash.verification?.data,\n method: urlDataWithHash.verification?.method,\n url,\n src,\n }\n }\n captureHashes[captureErrors.pop() || ''] =\n urlDataWithHash.verification?.data || ''\n if (\n isDataAuthentic(\n receivedData,\n urlDataWithHash.verification,\n captureErrors\n )\n ) {\n return {\n ...dataEntry,\n value,\n data: urlDataWithHash.verification?.data,\n method: urlDataWithHash.verification?.method,\n url,\n src,\n }\n }\n captureHashes[captureErrors.pop() || ''] =\n urlDataWithHash.verification?.data || ''\n throw new Error(\n `Data does not validate, ignored ${Object.entries(captureHashes)\n .map(\n ([expected, got]) =>\n `calculated(${got}) != expected(${expected})`\n )\n .join(', ')}`\n )\n }\n } catch {\n // ignore\n }\n }\n if (\n isDataAuthentic(\n receivedData,\n urlDataWithHash.verification,\n captureErrors\n )\n ) {\n return {\n ...dataEntry,\n value: receivedData,\n data: urlDataWithHash.verification?.data,\n method: urlDataWithHash.verification?.method,\n url,\n src,\n }\n }\n captureHashes[captureErrors.pop() || ''] =\n urlDataWithHash.verification?.data || ''\n throw new Error(\n `Data does not validate, ignored ${Object.entries(captureHashes)\n .map(\n ([expected, got]) => `calculated(${got}) != expected(${expected})`\n )\n .join(', ')}`\n )\n } catch (error) {\n const message = (error as { message: string }).message\n if (throwException) {\n throw error\n }\n return {\n ...dataEntry,\n value: null,\n error: message,\n data: urlDataWithHash.verification?.data,\n method: urlDataWithHash.verification?.method,\n url,\n src,\n }\n }\n })\n return Promise.all(promises)\n}\n","import type { ERC725JSONSchema } from '@erc725/erc725.js'\nimport type { Abi, AbiParameter, Log, Transaction } from 'viem'\nimport { pluginRegistry } from '../registry'\nimport type {\n Aggregation,\n DecodeEventCallback,\n DecodeEventResult,\n DecoderOptions,\n DecoderPlugin,\n DecoderResult,\n EnhancerAggregationKeyCallback,\n EnhancerCallback,\n EnhancerSummarizeCallback,\n Info,\n PluginOptions,\n ResultType,\n SchemaPlugin,\n} from '../types'\nimport { customDecodeFunctionData } from '../utils'\nimport { decodeKeyValuePlugin } from './schemaDefault'\n\n/**\n * Helper to create aggregation keys with plugin prefix\n */\nexport function createAggregationKey(\n pluginOptions: PluginOptions,\n key: string\n): string {\n return `${pluginOptions.name || pluginOptions.decoderName || 'unknown'}:${key}`\n}\n\n/**\n *\n * @param abi abi to use for decoding\n * @param pluginOptions options to name abi, decoder or module (optional since the enhancer can provide some or all)\n * @param enhance callback to do the actual enhancement once the abi function was decoded.\n * @returns enhanced transaction\n */\nexport function standardPlugin<T extends Abi | readonly unknown[]>(\n abi: T,\n pluginOptions: PluginOptions,\n callbacks: {\n enhance: EnhancerCallback\n decodeEvent: DecodeEventCallback\n overrideEnhance?: EnhancerCallback\n getAggregationKey?: EnhancerAggregationKeyCallback\n summarize?: EnhancerSummarizeCallback\n aggregations?: Aggregation[]\n }\n): DecoderPlugin {\n const {\n abiName,\n decoderName = 'unknown',\n moduleHint,\n required,\n priority,\n name,\n usesAsync,\n } = pluginOptions\n const plugin: DecoderPlugin = {\n enhance: async (transaction: DecoderResult, options: DecoderOptions) => {\n if (callbacks.overrideEnhance) {\n return await callbacks.overrideEnhance(\n transaction,\n pluginOptions,\n options\n )\n }\n const { preferError } = options\n const {\n to: _to,\n from: _from,\n value: _value,\n input,\n blockNumber: _blockNumber,\n // logs,\n } = transaction as Partial<Transaction> & {\n data?: `0x${string}`\n logs?: Log[]\n }\n const to = _to || undefined\n const from = _from || undefined\n const value = _value ? BigInt(_value) : 0n\n const decoded = customDecodeFunctionData(\n {\n abi,\n data: input || '0x',\n },\n preferError\n )\n if (!decoded) {\n // Most of the time decoded will through an error,\n // but if the result is undefined, then assume it also\n // didn't work.\n return\n }\n const { functionName, sig, args } = decoded as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n const output: DecoderResult = {\n isDecoded: true,\n ...transaction,\n resultType: 'execute',\n functionName,\n sig,\n input,\n __decoder: decoderName,\n standard: abiName || 'unknown',\n moduleHint,\n args,\n to,\n from,\n value,\n } as DecoderResult\n const enhanced = await callbacks.enhance(output, pluginOptions, options)\n if (enhanced) {\n return enhanced\n }\n return // This enhancement was denied by the enhancer so we need to re-try.\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return callbacks.decodeEvent(log, options)\n },\n getAggregationKey: async (result, pluginOptions, options) => {\n if (!callbacks.getAggregationKey) {\n return\n }\n return callbacks.getAggregationKey(result, pluginOptions, options)\n },\n summarize: async (aggregationKey, result, pluginOptions, options) => {\n if (!callbacks.summarize) {\n return\n }\n return callbacks.summarize(aggregationKey, result, pluginOptions, options)\n },\n }\n\n // Add optional properties to the plugin\n if (name !== undefined) {\n plugin.name = name\n }\n if (required !== undefined) {\n plugin.required = required\n }\n if (priority !== undefined) {\n plugin.priority = priority\n }\n\n if (usesAsync !== undefined) {\n plugin.usesAsync = usesAsync\n }\n\n if (callbacks.aggregations !== undefined) {\n plugin.aggregations = callbacks.aggregations\n }\n\n // Freeze the plugin to prevent modifications\n const frozenPlugin = Object.freeze(plugin)\n\n // Auto-register the plugin if it has a name\n // Use direct import of registry to avoid circular dependency\n if (name) {\n pluginRegistry.register(name, frozenPlugin, {\n priority,\n required,\n usesAsync, // Include async flag for registration\n })\n }\n\n return frozenPlugin\n}\n\n/**\n * Creates a standard schema plugin from ERC725 schemas\n * @param schemas Array of ERC725JSONSchema objects\n * @param pluginOptions Options including name, required, priority\n * @param process Optional post-processing function\n * @returns SchemaPlugin\n */\nexport function standardSchemaPlugin(\n schemas: ERC725JSONSchema[],\n pluginOptions?: {\n name?: string\n required?: boolean\n priority?: number\n },\n process?: (output: Info) => Promise<Info>\n): SchemaPlugin {\n const basePlugin = decodeKeyValuePlugin(schemas, process)\n\n // Create a proper SchemaPlugin by assigning properties to the function\n const plugin = Object.assign(basePlugin, {\n name: pluginOptions?.name,\n required: pluginOptions?.required,\n priority: pluginOptions?.priority ?? 50,\n })\n\n // Freeze the plugin to prevent modifications\n return Object.freeze(plugin)\n}\n","/**\n * Debug wrapper for edge/worker environments\n * This avoids the tty dependency in the debug module\n */\n\nconst debugInstances = new Map<string, boolean>()\n\n// Simple debug implementation that doesn't rely on Node.js modules\nexport function createDebug(namespace: string) {\n // Check if this namespace is enabled\n const DEBUG = (typeof process !== 'undefined' && process.env?.DEBUG) || ''\n\n // Simple pattern matching\n const isEnabled = () => {\n if (!DEBUG) return false\n if (DEBUG === '*') return true\n\n const patterns = DEBUG.split(',').map((p) => p.trim())\n for (const pattern of patterns) {\n if (pattern === namespace) return true\n if (pattern.endsWith('*') && namespace.startsWith(pattern.slice(0, -1)))\n return true\n if (pattern.startsWith('-')) {\n const negPattern = pattern.slice(1)\n if (negPattern === namespace) return false\n if (\n negPattern.endsWith('*') &&\n namespace.startsWith(negPattern.slice(0, -1))\n )\n return false\n }\n }\n return false\n }\n\n debugInstances.set(namespace, isEnabled())\n\n return (...args: any[]) => {\n if (!debugInstances.get(namespace)) return\n\n const timestamp = new Date().toISOString()\n const prefix = `[${timestamp}] ${namespace}`\n\n // In Cloudflare Workers, console.log is the only option\n console.log(prefix, ...args)\n }\n}\n\nexport default createDebug\n","import createDebug from '../utils/debug'\nimport type { Aggregation, DecoderResult } from './types'\n\n/**\n * Helper function to create a typed aggregation configuration\n * @param config The aggregation configuration\n * @returns A frozen aggregation object\n */\nexport function standardAggregation<T>(config: {\n key: string\n map: (tx: DecoderResult) => T | undefined\n reduce: (state: T | undefined, mapped: T) => T\n finalize: (state: T) => Omit<import('./types').ResultAggregate, 'resultType'>\n}): Aggregation<T> {\n return Object.freeze(config)\n}\n\n/**\n * Aggregation engine for processing transactions with map/reduce pattern\n */\nexport interface AggregationState<T = unknown> {\n data: T\n lastTransaction: DecoderResult\n}\n\nconst debug = createDebug('decoder:aggregation')\n\nexport class PluginAggregationEngine {\n private plugins = new Map<string, import('./types').DecoderPlugin>()\n private states = new Map<string, Map<string, AggregationState>>() // plugin -> key -> state\n\n /**\n * Register a plugin with aggregations\n */\n registerPlugin(plugin: import('./types').DecoderPlugin) {\n if (plugin.name && plugin.aggregations && plugin.aggregations.length > 0) {\n debug(\n `Registering plugin ${plugin.name} with ${plugin.aggregations.length} aggregations`\n )\n this.plugins.set(plugin.name, plugin)\n this.states.set(plugin.name, new Map())\n }\n }\n\n /**\n * Process a transaction through relevant aggregations\n */\n processTransaction(tx: DecoderResult) {\n // Skip if no aggregations needed\n if (!tx.aggregationKeys || tx.aggregationKeys.length === 0) return\n\n // Process aggregations based on the full aggregation keys\n for (const fullKey of tx.aggregationKeys) {\n // Split the full key to get plugin name and aggregation key\n const [pluginName, ...keyParts] = fullKey.split(':')\n const aggregationKey = keyParts.join(':') // Handle keys with colons\n\n const plugin = this.plugins.get(pluginName)\n if (!plugin || !plugin.aggregations) {\n debug(`processTransaction: No plugin found for ${pluginName}`)\n continue\n }\n\n const pluginStates = this.states.get(pluginName)\n if (!pluginStates) {\n debug(`processTransaction: No states for plugin ${pluginName}`)\n continue\n }\n\n const agg = plugin.aggregations.find((a) => a.key === aggregationKey)\n if (!agg) {\n debug(\n `processTransaction: No aggregation found for key ${aggregationKey} in plugin ${pluginName}`\n )\n continue\n }\n\n const mapped = agg.map(tx)\n if (mapped !== undefined) {\n const currentState = pluginStates.get(aggregationKey)\n if (!currentState) {\n // First transaction for this aggregation\n debug(\n `processTransaction: First transaction for ${pluginName}:${aggregationKey}`\n )\n pluginStates.set(aggregationKey, {\n data: mapped,\n lastTransaction: tx,\n })\n } else {\n // Update existing state\n const newData = agg.reduce(currentState.data, mapped)\n pluginStates.set(aggregationKey, {\n data: newData,\n lastTransaction: tx, // Always update to latest transaction\n })\n }\n } else {\n debug(\n `processTransaction: map returned undefined for ${pluginName}:${aggregationKey}`\n )\n }\n }\n }\n\n /**\n * Process a batch of transactions\n */\n processBatch(txs: DecoderResult[]) {\n debug(`Processing batch of ${txs.length} transactions`)\n let processedCount = 0\n for (const tx of txs) {\n this.processTransaction(tx)\n if (tx.aggregationKeys && tx.aggregationKeys.length > 0) {\n processedCount++\n }\n }\n debug(`Processed ${processedCount} transactions with aggregationKeys`)\n }\n\n /**\n * Get finalized result for a specific plugin and aggregation key\n */\n getResult(pluginName: string, key: string): DecoderResult | undefined {\n const plugin = this.plugins.get(pluginName)\n const pluginStates = this.states.get(pluginName)\n\n if (!plugin || !pluginStates) return undefined\n\n const agg = plugin.aggregations?.find((a) => a.key === key)\n const state = pluginStates.get(key)\n\n if (!agg || state === undefined) return undefined\n\n // Merge aggregation result with last transaction metadata\n const aggregationResult = agg.finalize(state.data)\n\n return {\n ...state.lastTransaction,\n ...aggregationResult,\n resultType: 'aggregate' as const,\n } as DecoderResult\n }\n\n /**\n * Get all aggregation results\n */\n getAllResults(): Array<{\n plugin: string\n key: string\n result: DecoderResult\n }> {\n const results: Array<{\n plugin: string\n key: string\n result: DecoderResult\n }> = []\n\n for (const [pluginName, plugin] of this.plugins) {\n const pluginStates = this.states.get(pluginName)\n\n // Skip if this plugin has no states (hasn't processed any transactions yet)\n if (!pluginStates) {\n continue\n }\n\n for (const agg of plugin.aggregations || []) {\n const state = pluginStates.get(agg.key)\n if (state !== undefined) {\n results.push({\n plugin: pluginName,\n key: agg.key,\n result: {\n ...state.lastTransaction,\n ...agg.finalize(state.data),\n resultType: 'aggregate' as const,\n } as DecoderResult,\n })\n }\n }\n }\n\n return results\n }\n\n /**\n * Clear all aggregation states\n */\n clear() {\n for (const states of this.states.values()) {\n states.clear()\n }\n }\n\n /**\n * Clear states for a specific plugin\n */\n clearPlugin(pluginName: string) {\n this.states.get(pluginName)?.clear()\n }\n\n /**\n * Get current state (for persistence)\n */\n getStates(): Map<string, Map<string, AggregationState>> {\n return new Map(this.states)\n }\n\n /**\n * Restore states (from persistence)\n */\n restoreStates(states: Map<string, Map<string, AggregationState>>) {\n // Merge states instead of replacing to preserve plugin initialization\n for (const [pluginName, pluginStates] of states) {\n this.states.set(pluginName, new Map(pluginStates))\n }\n }\n}\n","import {\n type Abi,\n AbiDecodingDataSizeTooSmallError,\n AbiEventSignatureEmptyTopicsError,\n AbiEventSignatureNotFoundError,\n type AbiParameter,\n BaseError,\n type Chain,\n type ContractEventName,\n type DecodeEventLogParameters,\n type DecodeEventLogReturnType,\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n decodeAbiParameters,\n type EventDefinition,\n type Hex,\n type Log,\n size,\n toEventSelector,\n} from 'viem'\nimport { formatAbiItem } from 'viem/utils'\nimport type { ArrayArgs, DecodeEventResult } from './types'\nimport { createNamedArgs } from './utils'\n\nconst docsPath = '/docs/contract/decodeEventLog'\n\nfunction decodeTopic({ param, value }: { param: AbiParameter; value: Hex }) {\n if (\n param.type === 'string' ||\n param.type === 'bytes' ||\n param.type === 'tuple' ||\n param.type.match(/^(.*)\\[(\\d+)?\\]$/)\n )\n return value\n const decodedArg = decodeAbiParameters([param], value) || []\n return decodedArg[0]\n}\n\nexport type PositionOutOfBoundsErrorType = PositionOutOfBoundsError & {\n name: 'PositionOutOfBoundsError'\n}\nexport class PositionOutOfBoundsError extends BaseError {\n constructor({ length, position }: { length: number; position: number }) {\n super(\n `Position \\`${position}\\` is out of bounds (\\`0 < position < ${length}\\`).`,\n { name: 'PositionOutOfBoundsError' }\n )\n }\n}\n\n/**\n * Custom copy of decodeEventLog which can assemble named args.\n * @param parameters\n * @returns\n */\nexport function customDecodeEventLog<\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName<abi> | undefined = undefined,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n>(\n parameters: DecodeEventLogParameters<abi, eventName, topics, data, strict>\n): DecodeEventLogReturnType<abi, eventName, topics, data, strict> {\n const {\n abi,\n data,\n strict: strict_,\n topics,\n } = parameters as DecodeEventLogParameters\n\n const strict = strict_ ?? true\n const [signature, ...argTopics] = topics\n if (!signature) throw new AbiEventSignatureEmptyTopicsError({ docsPath })\n\n const abiItem = (() => {\n if (abi.length === 1) return abi[0]\n return abi.find(\n (x) =>\n x.type === 'event' &&\n signature === toEventSelector(formatAbiItem(x) as EventDefinition)\n )\n })()\n\n if (!(abiItem && 'name' in abiItem) || abiItem.type !== 'event')\n throw new AbiEventSignatureNotFoundError(signature, { docsPath })\n\n const { name, inputs } = abiItem\n const isUnnamed = inputs?.some((x) => !('name' in x && x.name))\n\n let args: unknown[] | Record<string, unknown> = isUnnamed ? [] : {}\n\n // Decode topics (indexed args).\n const indexedInputs = inputs.filter((x) => 'indexed' in x && x.indexed)\n for (let i = 0; i < indexedInputs.length; i++) {\n const param = indexedInputs[i]\n const topic = argTopics[i]\n if (!topic)\n throw new DecodeLogTopicsMismatch({\n abiItem,\n param: param as AbiParameter & { indexed: boolean },\n })\n if (isUnnamed && Array.isArray(args)) {\n args[i] = decodeTopic({ param, value: topic })\n } else if (!isUnnamed && !Array.isArray(args)) {\n args[param.name || i] = decodeTopic({ param, value: topic })\n }\n }\n\n // Decode data (non-indexed args).\n const nonIndexedInputs = inputs.filter((x) => !('indexed' in x && x.indexed))\n if (nonIndexedInputs.length > 0) {\n if (data && data !== '0x') {\n try {\n const decodedData = decodeAbiParameters(nonIndexedInputs, data)\n if (decodedData) {\n if (isUnnamed && Array.isArray(args)) {\n args = [...args, ...decodedData]\n } else if (!isUnnamed && !Array.isArray(args)) {\n for (let i = 0; i < nonIndexedInputs.length; i++) {\n const name = nonIndexedInputs[i].name\n if (name) {\n args[name] = decodedData[i]\n }\n }\n }\n }\n } catch (err) {\n if (strict) {\n if (\n err instanceof AbiDecodingDataSizeTooSmallError ||\n (err as { name?: string }).name === 'PositionOutOfBoundsError' // Unfortunately, this is not exported from viem\n )\n throw new DecodeLogDataMismatch({\n abiItem,\n data: data,\n params: nonIndexedInputs,\n size: size(data),\n })\n throw err\n }\n }\n } else if (strict) {\n throw new DecodeLogDataMismatch({\n abiItem,\n data: '0x',\n params: nonIndexedInputs,\n size: 0,\n })\n }\n }\n const { args: namedArgs } = createNamedArgs(\n Array.isArray(args) ? args : Object.values(args),\n inputs\n )\n return {\n eventName: name,\n args: namedArgs,\n } as unknown as DecodeEventLogReturnType<abi, eventName, topics, data, strict>\n}\n\n/**\n * Decode events\n *\n * @param log Transaction to decode (should have data/input)\n * @returns Promise<ResultType>\n */\nexport function decodeEvent<abi extends Abi | readonly unknown[] = Abi>(\n _chain: Chain,\n abi: abi,\n log: DecodeEventResult\n):\n | ({\n eventName: string\n args: ArrayArgs\n } & DecodeEventResult)\n | undefined {\n const { data: _data } = log as Log\n\n let _lastError: Error | undefined\n try {\n const result = customDecodeEventLog({\n abi,\n data: _data,\n topics: (log as Log).topics || [],\n })\n return { ...log, ...result } as unknown as {\n eventName: string\n args: ArrayArgs\n } & DecodeEventResult\n } catch {}\n}\n","export default [\n {\n inputs: [\n { internalType: 'address', name: 'creator', type: 'address' },\n { internalType: 'address', name: '_codehub', type: 'address' },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n { inputs: [], name: 'ERC725Y_DataKeysValuesEmptyArray', type: 'error' },\n { inputs: [], name: 'ERC725Y_DataKeysValuesLengthMismatch', type: 'error' },\n { inputs: [], name: 'ERC725Y_MsgValueDisallowed', type: 'error' },\n {\n inputs: [{ internalType: 'bytes', name: 'storedData', type: 'bytes' }],\n name: 'InvalidExtensionAddress',\n type: 'error',\n },\n {\n inputs: [{ internalType: 'bytes', name: 'data', type: 'bytes' }],\n name: 'InvalidFunctionSelector',\n type: 'error',\n },\n { inputs: [], name: 'LSP4TokenNameNotEditable', type: 'error' },\n { inputs: [], name: 'LSP4TokenSymbolNotEditable', type: 'error' },\n { inputs: [], name: 'LSP4TokenTypeNotEditable', type: 'error' },\n {\n inputs: [{ internalType: 'uint256', name: 'callIndex', type: 'uint256' }],\n name: 'LSP8BatchCallFailed',\n type: 'error',\n },\n { inputs: [], name: 'LSP8CannotSendToAddressZero', type: 'error' },\n { inputs: [], name: 'LSP8CannotSendToSelf', type: 'error' },\n { inputs: [], name: 'LSP8CannotUseAddressZeroAsOperator', type: 'error' },\n { inputs: [], name: 'LSP8InvalidTransferBatch', type: 'error' },\n {\n inputs: [{ internalType: 'bytes32', name: 'tokenId', type: 'bytes32' }],\n name: 'LSP8NonExistentTokenId',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n ],\n name: 'LSP8NonExistingOperator',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'address', name: 'caller', type: 'address' },\n ],\n name: 'LSP8NotTokenOperator',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'tokenOwner', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'address', name: 'caller', type: 'address' },\n ],\n name: 'LSP8NotTokenOwner',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'tokenReceiver', type: 'address' },\n ],\n name: 'LSP8NotifyTokenReceiverContractMissingLSP1Interface',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'tokenReceiver', type: 'address' },\n ],\n name: 'LSP8NotifyTokenReceiverIsEOA',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n ],\n name: 'LSP8OperatorAlreadyAuthorized',\n type: 'error',\n },\n { inputs: [], name: 'LSP8TokenContractCannotHoldValue', type: 'error' },\n {\n inputs: [{ internalType: 'bytes32', name: 'tokenId', type: 'bytes32' }],\n name: 'LSP8TokenIdAlreadyMinted',\n type: 'error',\n },\n { inputs: [], name: 'LSP8TokenIdFormatNotEditable', type: 'error' },\n { inputs: [], name: 'LSP8TokenIdsDataEmptyArray', type: 'error' },\n { inputs: [], name: 'LSP8TokenIdsDataLengthMismatch', type: 'error' },\n { inputs: [], name: 'LSP8TokenOwnerCannotBeOperator', type: 'error' },\n {\n inputs: [\n { internalType: 'bytes4', name: 'functionSelector', type: 'bytes4' },\n ],\n name: 'NoExtensionFoundForFunctionSelector',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'callerAddress', type: 'address' },\n ],\n name: 'OwnableCallerNotTheOwner',\n type: 'error',\n },\n { inputs: [], name: 'OwnableCannotSetZeroAddressAsOwner', type: 'error' },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'dataKey',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'dataValue',\n type: 'bytes',\n },\n ],\n name: 'DataChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'tokenOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'tokenId',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'operatorNotificationData',\n type: 'bytes',\n },\n ],\n name: 'OperatorAuthorizationChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'tokenOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'tokenId',\n type: 'bytes32',\n },\n { indexed: false, internalType: 'bool', name: 'notified', type: 'bool' },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'operatorNotificationData',\n type: 'bytes',\n },\n ],\n name: 'OperatorRevoked',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'previousOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'tokenId',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'dataKey',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'dataValue',\n type: 'bytes',\n },\n ],\n name: 'TokenIdDataChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n { indexed: true, internalType: 'address', name: 'from', type: 'address' },\n { indexed: true, internalType: 'address', name: 'to', type: 'address' },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'tokenId',\n type: 'bytes32',\n },\n { indexed: false, internalType: 'bool', name: 'force', type: 'bool' },\n { indexed: false, internalType: 'bytes', name: 'data', type: 'bytes' },\n ],\n name: 'Transfer',\n type: 'event',\n },\n { stateMutability: 'payable', type: 'fallback' },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n {\n internalType: 'bytes',\n name: 'operatorNotificationData',\n type: 'bytes',\n },\n ],\n name: 'authorizeOperator',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'tokenOwner', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'banner',\n outputs: [{ internalType: 'contract Fractal', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes[]', name: 'data', type: 'bytes[]' }],\n name: 'batchCalls',\n outputs: [{ internalType: 'bytes[]', name: 'results', type: 'bytes[]' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'dataKey', type: 'bytes32' }],\n name: 'getData',\n outputs: [{ internalType: 'bytes', name: 'dataValue', type: 'bytes' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32[]', name: 'dataKeys', type: 'bytes32[]' },\n ],\n name: 'getDataBatch',\n outputs: [{ internalType: 'bytes[]', name: 'dataValues', type: 'bytes[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32[]', name: 'tokenIds', type: 'bytes32[]' },\n { internalType: 'bytes32[]', name: 'dataKeys', type: 'bytes32[]' },\n ],\n name: 'getDataBatchForTokenIds',\n outputs: [{ internalType: 'bytes[]', name: 'dataValues', type: 'bytes[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'bytes32', name: 'dataKey', type: 'bytes32' },\n ],\n name: 'getDataForTokenId',\n outputs: [{ internalType: 'bytes', name: 'dataValue', type: 'bytes' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'tokenId', type: 'bytes32' }],\n name: 'getOperatorsOf',\n outputs: [{ internalType: 'address[]', name: '', type: 'address[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'uint32', name: 'seed', type: 'uint32' },\n { internalType: 'address', name: 'fractal', type: 'address' },\n ],\n name: 'inject',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n ],\n name: 'isOperatorFor',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'fractal', type: 'address' },\n { internalType: 'address', name: 'owner', type: 'address' },\n { internalType: 'address', name: 'registry', type: 'address' },\n ],\n name: 'migrate',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'uint32', name: 'seed', type: 'uint32' },\n ],\n name: 'mint',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint32', name: '', type: 'uint32' }],\n name: 'minted',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bool', name: '_paused', type: 'bool' }],\n name: 'pause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'paused',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'uint256', name: 'iters', type: 'uint256' },\n ],\n name: 'refine',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'renounceOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'bool', name: 'notify', type: 'bool' },\n {\n internalType: 'bytes',\n name: 'operatorNotificationData',\n type: 'bytes',\n },\n ],\n name: 'revokeOperator',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: '', type: 'address' }],\n name: 'seeds',\n outputs: [{ internalType: 'uint32', name: '', type: 'uint32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'dataKey', type: 'bytes32' },\n { internalType: 'bytes', name: 'dataValue', type: 'bytes' },\n ],\n name: 'setData',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32[]', name: 'dataKeys', type: 'bytes32[]' },\n { internalType: 'bytes[]', name: 'dataValues', type: 'bytes[]' },\n ],\n name: 'setDataBatch',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32[]', name: 'tokenIds', type: 'bytes32[]' },\n { internalType: 'bytes32[]', name: 'dataKeys', type: 'bytes32[]' },\n { internalType: 'bytes[]', name: 'dataValues', type: 'bytes[]' },\n ],\n name: 'setDataBatchForTokenIds',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'bytes32', name: 'dataKey', type: 'bytes32' },\n { internalType: 'bytes', name: 'dataValue', type: 'bytes' },\n ],\n name: 'setDataForTokenId',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }],\n name: 'supportsInterface',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'index', type: 'uint256' }],\n name: 'tokenAt',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'tokenOwner', type: 'address' }],\n name: 'tokenIdsOf',\n outputs: [{ internalType: 'bytes32[]', name: '', type: 'bytes32[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'tokenId', type: 'bytes32' }],\n name: 'tokenOwnerOf',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'totalSupply',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'from', type: 'address' },\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'bool', name: 'force', type: 'bool' },\n { internalType: 'bytes', name: 'data', type: 'bytes' },\n ],\n name: 'transfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address[]', name: 'from', type: 'address[]' },\n { internalType: 'address[]', name: 'to', type: 'address[]' },\n { internalType: 'bytes32[]', name: 'tokenId', type: 'bytes32[]' },\n { internalType: 'bool[]', name: 'force', type: 'bool[]' },\n { internalType: 'bytes[]', name: 'data', type: 'bytes[]' },\n ],\n name: 'transferBatch',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n { stateMutability: 'payable', type: 'receive' },\n]\n","import { standardAggregation } from '../aggregation'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultAggregate,\n} from '../types'\nimport { createAggregationKey, standardPlugin } from '.'\nimport RegistryAbi from './RegistryAbi'\n\n// Define aggregation state type\ninterface RefineAggregationState {\n callerCounts: Record<\n string,\n { count: number; tokenIds: Record<`0x${string}:${string}`, number> }\n >\n minBlock: number\n maxBlock: number\n count: number\n}\n\n// Create the refine aggregation\nconst refineAggregation = standardAggregation<RefineAggregationState>({\n key: 'refine',\n\n map: (tx) => {\n // Only process refine calls\n if ('functionName' in tx && tx.functionName === 'refine' && tx.from) {\n return {\n callerCounts: {\n [tx.from.toLowerCase()]: {\n count: 1,\n tokenIds: {\n [`${tx.to}:${('args' in tx ? tx?.args?.[0]?.value : undefined) ?? 'none'}`]: 1,\n },\n },\n },\n minBlock: Number(tx.blockNumber),\n maxBlock: Number(tx.blockNumber),\n count: 1,\n }\n }\n return undefined\n },\n\n reduce: (state, mapped) => {\n if (!state) return mapped\n\n // Merge caller counts\n const callerCounts = { ...state.callerCounts }\n for (const [caller, { count, tokenIds }] of Object.entries(\n mapped.callerCounts\n )) {\n const item = callerCounts[caller] ?? { count: 0, tokenIds: {} }\n item.count += count\n item.tokenIds = {\n ...item.tokenIds,\n ...tokenIds,\n }\n }\n\n return {\n callerCounts,\n minBlock: Math.min(state.minBlock, mapped.minBlock),\n maxBlock: Math.max(state.maxBlock, mapped.maxBlock),\n count: state.count + mapped.count,\n }\n },\n\n finalize: (state): Omit<ResultAggregate, 'resultType'> => {\n const stats = Object.entries(state.callerCounts)\n .sort(([, a], [, b]) => b.count - a.count)\n .slice(0, 10)\n .map(([address, { count, tokenIds }]) => {\n const tokens = Object.entries(tokenIds)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5)\n .map(([token]) => token)\n return { address, count, tokens }\n })\n return {\n aggregate: {\n count: state.count,\n from: stats.map(({ address }) => address),\n tokens: stats.flatMap(({ tokens }) => tokens),\n blockRange: {\n from: state.minBlock,\n to: state.maxBlock,\n },\n },\n }\n },\n})\n\nexport const enhanceBurntPixPlugin = standardPlugin(\n RegistryAbi,\n {\n name: 'burntpix',\n abiName: 'BurntPix',\n decoderName: '@lukso/burntpix',\n priority: 50,\n },\n {\n enhance: enhanceBurntPix,\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, RegistryAbi, log)\n },\n aggregations: [refineAggregation],\n }\n)\n\nexport async function enhanceBurntPix(\n result: DecoderResult,\n pluginOptions: PluginOptions,\n _options: DecoderOptions\n): Promise<DecoderResult | undefined> {\n // Mark refine transactions as aggregatable\n if ('functionName' in result && result.functionName === 'refine') {\n return {\n ...result,\n standard: pluginOptions.abiName,\n __decoder: pluginOptions.decoderName,\n aggregationKeys: [createAggregationKey(pluginOptions, 'refine')],\n } as DecoderResult\n }\n return undefined\n}\n\nexport default enhanceBurntPixPlugin\n","import { bytesToString, type Hex, hexToBytes, size, slice } from 'viem'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderPlugin,\n DecoderResult,\n PluginOptions,\n ResultType,\n} from '../types'\n\n// Since this plugin doesn't use an abi, we need to short circuit with \"as DecoderResult\"\nexport const enhanceGraffitiPlugin: DecoderPlugin = Object.freeze({\n enhance: async (result: DecoderResult, options: DecoderOptions) =>\n enhanceGraffiti(\n result,\n { abiName: 'graffiti', decoderName: 'graffiti' },\n options\n ),\n decodeEvent: async (_log: DecodeEventResult, _options: DecoderOptions) =>\n undefined,\n required: true,\n priority: 1000,\n name: 'graffiti',\n})\n\nexport async function enhanceGraffiti(\n result: DecoderResult,\n _pluginOptions: PluginOptions,\n _options: DecoderOptions\n) {\n const { input } = result as ResultType\n if (\n input &&\n size(input || '0x') >= 4 &&\n slice(input || '0x', 0, 4) === '0x00000000'\n ) {\n let graffiti: string = slice(input, 4)\n try {\n graffiti = bytesToString(hexToBytes(graffiti as Hex))\n } catch {\n // Ignore\n }\n return {\n ...result,\n resultType: 'grafitti',\n sig: '0x',\n functionName: '',\n input,\n graffiti,\n __decoder: 'grafitti',\n } as DecoderResult\n }\n return undefined\n}\n\nexport default enhanceGraffitiPlugin\n","import { universalProfileAbi as UniversalProfile } from '@lukso/universalprofile-contracts/abi'\nimport type { Address, Hex, Log } from 'viem'\nimport { decodeEvent } from '../events'\nimport { decodeTransaction } from '../transaction'\nimport type {\n ArrayArgs,\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultExecute,\n ResultShared,\n ResultType,\n} from '../types'\nimport { createNamedArgs } from '../utils'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\nimport { unwrapUniversalReceiver } from './universalReceiverTypeIds'\n\nexport const enhanceLSP0ERC725AccountPlugin = standardPlugin(\n UniversalProfile,\n {\n name: 'profile',\n abiName: 'LSP0ERC725Account',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: enhanceLSP0ERC725Account,\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n const decoded = decodeEvent(options.chain, UniversalProfile, log)\n if (!decoded || decoded.eventName !== 'UniversalReceiver') {\n return decoded\n }\n\n // Extract UniversalReceiver args\n const typeId = decoded.args.find((a) => a.name === 'typeId')?.value as Hex\n const receivedData = decoded.args.find((a) => a.name === 'receivedData')\n ?.value as Hex\n const from = decoded.args.find((a) => a.name === 'from')?.value as Address\n const profileAddress = (decoded as unknown as Log).address as Address\n\n if (!typeId || !receivedData || !from) {\n return decoded\n }\n\n // Unwrap based on typeId (always succeeds — falls back to generic Notification)\n const unwrapped = unwrapUniversalReceiver(\n typeId,\n receivedData,\n from,\n profileAddress\n )\n\n // Rewrite the event: inner event becomes the main event,\n // original UniversalReceiver goes into wrappers.\n // Topics and data are rewritten to match the inner event's ABI.\n const { wrappers: _w, standard: _s, ...logBase } = decoded\n return {\n ...logBase,\n eventName: unwrapped.eventName,\n args: unwrapped.args,\n standard: unwrapped.standard,\n topics: unwrapped.topics,\n data: unwrapped.data,\n wrappers: [logBase],\n } as DecodeEventResult\n },\n }\n)\n\nexport async function enhanceLSP0ERC725Account(\n result: DecoderResult,\n pluginOptions: PluginOptions,\n options: DecoderOptions\n): Promise<DecoderResult | undefined> {\n const setData = await enhanceSetData(\n result,\n { ...pluginOptions, abiName: '', decoderName: '' },\n options\n )\n if (setData) {\n return setData\n }\n const {\n functionName,\n sig,\n args,\n input,\n blockNumber,\n to: _to,\n from: _from,\n value,\n } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: ArrayArgs\n }\n let to = _to\n let from = _from\n switch (functionName) {\n case 'executeBatch': {\n // executeBatch\n const children: Array<ResultType> = []\n const [executeTypes, targets, values, inputs] = args.map(\n ({ value }) => value\n ) as [bigint[], Address[], bigint[], `0x${string}`[]]\n const {\n functionName: _functionName,\n sig: _sig,\n args: _args,\n resultType: _resultType,\n ...plainResult\n } = result as ResultExecute & ResultShared\n for (let i = 0; i < values.length; i++) {\n const _data = inputs[i] as `0x${string}`\n const _value = BigInt(values[i])\n const _to = targets[i]\n const decoded = await decodeTransaction(\n {\n input: _data,\n to: _to,\n from: from,\n value: _value,\n } as DecoderResult,\n options\n )\n children.push(\n executeTypes[i] === 1n\n ? ({\n ...plainResult,\n ...decoded,\n resultType: 'create',\n } as DecoderResult)\n : ({ ...plainResult, ...decoded } as DecoderResult)\n )\n }\n options.wrappers.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n functionName,\n sig,\n standard: pluginOptions.abiName,\n args,\n to,\n from,\n value,\n input,\n __decoder: pluginOptions.decoderName,\n } as DecoderResult)\n const execute: ResultType = {\n ...result,\n resultType: 'executeBatch',\n standard: pluginOptions.abiName,\n __decoder: pluginOptions.decoderName,\n children,\n to,\n from,\n value,\n } as unknown as ResultType\n return {\n blockNumber,\n ...execute,\n } as unknown as DecoderResult\n }\n case 'execute': {\n // LSP0 execute\n const [executeType, target, value, _data] = args.map(\n ({ value }) => value\n ) as [bigint, Address, bigint, `0x${string}`]\n // const _target = await getKMTarget(chain, to)\n const decoded = await decodeTransaction(\n {\n input: _data,\n to: target,\n from: to || from, // This should be decoded to the profile address if it's a controller.\n value,\n } as DecoderResult,\n options\n )\n from = to || from\n to = target || to\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n functionName,\n sig,\n input,\n __decoder: pluginOptions.decoderName,\n to,\n from,\n value,\n standard: pluginOptions.abiName,\n ...createNamedArgs(\n [executeType, target, value, _data],\n [\n { name: 'executeType', type: 'uint256' },\n { name: 'target', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ]\n ),\n } as DecoderResult)\n return {\n ...result,\n functionName,\n sig,\n standard: pluginOptions.abiName,\n __decoder: pluginOptions.decoderName,\n ...decoded,\n resultType: executeType === 1n ? 'create' : 'execute',\n } as unknown as DecoderResult\n }\n }\n}\n\nexport default enhanceLSP0ERC725AccountPlugin\n","import { type Hex, isAddress, isAddressEqual, slice, zeroAddress } from 'viem'\nimport {\n type DecodeEventResult,\n type DecoderOptions,\n type DecoderResult,\n ErrorType,\n} from './types'\nimport { createNamedArgs } from './utils'\n\n/**\n * Decode transaction\n * @param transaction Transaction to decode (should have data/input)\n * @param options Decoder options\n * @returns Promise<DecoderResult>\n */\nexport async function decodeTransaction(\n fullTransaction: DecoderResult,\n options: DecoderOptions & {\n preferError?: boolean\n }\n): Promise<DecoderResult | undefined> {\n const { preferError } = options\n // Normalize input field - ensure we only have input, not data\n const {\n to,\n from,\n value,\n input: rawInput,\n data: rawData,\n ...restTransaction\n } = fullTransaction as DecoderResult & { data?: Hex }\n const { logs, ...transaction } = {\n ...restTransaction,\n to,\n from,\n value,\n input: rawInput || rawData,\n }\n const data = rawInput || rawData\n if (!data || data === '0x') {\n if (preferError) {\n return {\n ...transaction,\n isDecoded: true,\n functionName: undefined,\n __decoder: undefined,\n sig: slice(data || '0x', 0, 4),\n resultType: 'error',\n errorType: ErrorType.INVALID,\n ...createNamedArgs([], []),\n standard: undefined,\n phase: 'enhanced',\n } as DecoderResult\n }\n return {\n ...transaction,\n isDecoded: true,\n functionName: undefined,\n __decoder: undefined,\n standard: undefined,\n sig: slice(data || '0x', 0, 4),\n ...createNamedArgs([], []),\n resultType: 'execute',\n phase: 'enhanced',\n } as DecoderResult\n }\n let _lastError: Error | undefined\n\n // The caller is responsible for providing the appropriate plugin set\n // For sync-only decoding, use pluginRegistry.getAll({ syncOnly: true })\n // For full decoding, use pluginRegistry.getAll()\n const activePlugins = options.plugins\n\n for (const plugin of activePlugins) {\n if (to && isAddress(to) && isAddressEqual(to, zeroAddress)) {\n return {\n ...transaction,\n isDecoded: true,\n ...createNamedArgs([], []),\n resultType: 'create',\n to,\n from,\n value,\n logs,\n phase: 'immediate',\n } as DecoderResult\n }\n\n try {\n const check = await plugin.enhance(transaction, options)\n if (check) {\n const output: DecodeEventResult[] = []\n if (logs) {\n for (const log of logs) {\n const data = await plugin.decodeEvent(log, options)\n if (data) {\n output.push(data)\n continue\n }\n let done = false\n for (const eventPlugin of activePlugins) {\n if (eventPlugin !== plugin) {\n const data = await eventPlugin.decodeEvent(log, options)\n if (data) {\n output.push(data)\n done = true\n break\n }\n }\n }\n if (!done) {\n output.push(log as DecodeEventResult)\n }\n }\n check.logs = output\n }\n let phase: 'immediate' | 'enhanced' | 'complete' =\n plugin.usesAsync ||\n ('functionName' in check && check.functionName && check.standard) ||\n check.input === '0x' ||\n !check.input\n ? 'enhanced'\n : 'immediate'\n\n // If result has children, check if ALL children are enhanced\n // If any child is not enhanced, downgrade parent to 'immediate'\n const resultWithChildren = check as { children?: DecoderResult[] }\n if (\n phase === 'enhanced' &&\n resultWithChildren.children &&\n Array.isArray(resultWithChildren.children) &&\n resultWithChildren.children.length > 0\n ) {\n const allChildrenEnhanced = resultWithChildren.children.every(\n (child: DecoderResult) => (child as any).phase === 'enhanced'\n )\n if (!allChildrenEnhanced) {\n phase = 'immediate'\n }\n }\n\n const result = {\n ...transaction,\n ...check,\n phase,\n } as DecoderResult\n return result\n }\n } catch (e) {\n console.error(e)\n }\n }\n let phase: 'immediate' | 'enhanced' | 'complete' =\n ('functionName' in transaction &&\n transaction.functionName &&\n transaction.standard) ||\n transaction.input === '0x' ||\n !transaction.input\n ? 'enhanced'\n : 'immediate'\n\n // If result has children, check if ALL children are enhanced\n // If any child is not enhanced, downgrade parent to 'immediate'\n const transactionWithChildren = transaction as { children?: DecoderResult[] }\n if (\n phase === 'enhanced' &&\n transactionWithChildren.children &&\n Array.isArray(transactionWithChildren.children) &&\n transactionWithChildren.children.length > 0\n ) {\n const allChildrenEnhanced = transactionWithChildren.children.every(\n (child: DecoderResult) => (child as any).phase === 'enhanced'\n )\n if (!allChildrenEnhanced) {\n phase = 'immediate'\n }\n }\n\n const result = {\n ...transaction,\n standard: undefined,\n __decoder: undefined,\n resultType: 'raw',\n phase,\n sig: slice(\n fullTransaction.input ||\n ('data' in fullTransaction && (fullTransaction.data as Hex)) ||\n '0x',\n 0,\n 4\n ),\n ...createNamedArgs([], []),\n ...(options.wrappers.length ? { wrappers: options.wrappers } : {}),\n logs,\n } as DecoderResult\n return result\n}\n","import type { AbiParameter } from 'viem'\nimport type {\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultSetData,\n ResultShared,\n ResultType,\n} from '../types'\nimport { createNamedArgs } from '../utils'\nimport { decodeKeyValueRaw } from '.'\n\n/**\n *\n * @param result decode setData and setDataBatch as either a single or many setData items.\n * @returns\n */\nexport async function enhanceSetData(\n result: ResultType & ResultShared & { moduleHint?: string },\n pluginOptions: PluginOptions,\n options: DecoderOptions\n): Promise<DecoderResult | undefined> {\n const { functionName, sig, args, input, blockNumber, to, from, value } =\n result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n namedArgs?:\n | Record<number, AbiParameter & { value?: unknown }>\n | Record<string, unknown>\n }\n switch (functionName) {\n case 'setData': {\n const [_key, _value] = args.map(({ value }) => value) as `0x${string}`[]\n // Single setData\n return {\n ...result,\n resultType: 'setDataBatch',\n functionName,\n standard: result.standard || pluginOptions.abiName || 'LSPContract',\n __decoder:\n result.__decoder ||\n pluginOptions.decoderName ||\n '@lukso/lsp-smart-contracts',\n input,\n blockNumber,\n sig,\n args,\n children: [\n {\n ...result,\n info: await decodeKeyValueRaw(_key, _value, options),\n standard: result.standard || pluginOptions.abiName || 'LSPContract',\n __decoder:\n result.__decoder ||\n pluginOptions.decoderName ||\n '@lukso/lsp-smart-contracts',\n phase: 'enhanced',\n to,\n from,\n value,\n ...(args\n ? {\n ...createNamedArgs(\n [_key, _value],\n [\n { name: 'key', type: 'bytes32' },\n { name: 'value', type: 'bytes' },\n ]\n ),\n }\n : {}),\n },\n ] as unknown as Array<ResultSetData>,\n to,\n from,\n value,\n } as DecoderResult\n }\n case 'setDataBatch': {\n // Multiple setDataBatch\n const children: Array<ResultType> = []\n const [keys, values] = args.map(({ value }) => value) as [\n `0x${string}`[],\n `0x${string}`[],\n ]\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i] as `0x${string}`\n const _value = values[i] as `0x${string}`\n children.push({\n ...result,\n resultType: 'setData',\n standard: result.standard || pluginOptions.abiName || 'LSPContract',\n __decoder:\n result.__decoder ||\n pluginOptions.decoderName ||\n '@lukso/lsp-smart-contracts',\n phase: 'enhanced',\n to,\n from,\n value,\n ...createNamedArgs(\n [key, _value],\n [\n { name: 'key', type: 'bytes32' },\n { name: 'value', type: 'bytes' },\n ]\n ),\n info: await decodeKeyValueRaw(key, _value, options),\n } as DecoderResult)\n }\n const setDataBatchResult = {\n ...result,\n resultType: 'setDataBatch',\n functionName,\n sig,\n input,\n ...(args ? { args } : {}),\n standard: result.standard || pluginOptions.abiName || 'LSPContract',\n __decoder:\n result.__decoder ||\n pluginOptions.decoderName ||\n '@lukso/lsp-smart-contracts',\n to,\n from,\n value,\n children,\n } as DecoderResult\n return setDataBatchResult\n }\n }\n return undefined\n}\n\nexport default enhanceSetData\n","import type { AbiParameter, Address, Hex } from 'viem'\nimport {\n decodeAbiParameters,\n encodeAbiParameters,\n getAddress,\n keccak256,\n slice,\n toHex,\n} from 'viem'\nimport type { ArrayArgs } from '../types'\nimport { createNamedArgs } from '../utils'\n\n/**\n * Result of unwrapping a UniversalReceiver event based on its typeId.\n * Contains the inner event that was wrapped by the UniversalReceiver notification,\n * including rewritten topics and data fields matching the inner event's ABI.\n */\nexport type UnwrapResult = {\n eventName: string\n args: ArrayArgs\n standard?: string\n topics: [Hex, ...Hex[]]\n data: Hex\n}\n\ntype UnwrapFn = (\n receivedData: Hex,\n from: Address,\n profileAddress: Address,\n eventName: string\n) => UnwrapResult | undefined\n\n/**\n * Compute topic0 (event signature hash) and ABI-encode the data field\n * for an event with all non-indexed parameters.\n */\nfunction encodeEventLog(\n eventName: string,\n params: AbiParameter[],\n values: unknown[]\n): { topics: [Hex, ...Hex[]]; data: Hex } {\n const sig = `${eventName}(${params.map((p) => p.type).join(',')})`\n const topic0 = keccak256(toHex(sig))\n const data = encodeAbiParameters(params, values)\n return { topics: [topic0], data }\n}\n\n// --- LSP26 FollowerSystem ---\n\n// keccak256('LSP26FollowerSystem_FollowNotification')\nconst TYPEID_LSP26_FOLLOW: Hex =\n '0x71e02f9f05bcd5816ec4f3134aa2e5a916669537ec6c77fe66ea595fabc2d51a'\n\n// keccak256('LSP26FollowerSystem_UnfollowNotification')\nconst TYPEID_LSP26_UNFOLLOW: Hex =\n '0x9d3c0b4012b69658977b099bdaa51eff0f0460f421fba96d15669506c00d1c4f'\n\n// --- LSP7 DigitalAsset ---\n\n// keccak256('LSP7Tokens_SenderNotification')\nconst TYPEID_LSP7_TOKENSSENDER: Hex =\n '0x429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea'\n\n// keccak256('LSP7Tokens_RecipientNotification')\nconst TYPEID_LSP7_TOKENSRECIPIENT: Hex =\n '0x20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c'\n\n// --- LSP8 IdentifiableDigitalAsset ---\n\n// keccak256('LSP8Tokens_SenderNotification')\nconst TYPEID_LSP8_TOKENSSENDER: Hex =\n '0xb23eae7e6d1564b295b4c3e3be402d9a2f0776c57bdf365903496f6fa481ab00'\n\n// keccak256('LSP8Tokens_RecipientNotification')\nconst TYPEID_LSP8_TOKENSRECIPIENT: Hex =\n '0x0b084a55ebf70fd3c06fd755269dac2212c4d3f0f4d09079780bfa50c1b2984d'\n\n// --- Event parameter definitions ---\n\nconst followParams: AbiParameter[] = [\n { name: 'follower', type: 'address' },\n { name: 'addr', type: 'address' },\n]\n\nconst unfollowParams: AbiParameter[] = [\n { name: 'unfollower', type: 'address' },\n { name: 'addr', type: 'address' },\n]\n\nconst lsp7TransferParams: AbiParameter[] = [\n { name: 'operator', type: 'address' },\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'force', type: 'bool' },\n { name: 'data', type: 'bytes' },\n]\n\nconst lsp8TransferParams: AbiParameter[] = [\n { name: 'operator', type: 'address' },\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'tokenId', type: 'bytes32' },\n { name: 'force', type: 'bool' },\n { name: 'data', type: 'bytes' },\n]\n\nconst notificationParams: AbiParameter[] = [\n { name: 'from', type: 'address' },\n { name: 'typeId', type: 'bytes32' },\n { name: 'data', type: 'bytes' },\n]\n\n/**\n * Decode LSP26 Follow notification.\n * receivedData is abi.encodePacked(followerAddress) — raw 20 bytes.\n */\nfunction unwrapLSP26Follow(\n receivedData: Hex,\n _from: Address,\n profileAddress: Address,\n _eventName: string\n): UnwrapResult | undefined {\n if (!receivedData || receivedData.length < 42) {\n return undefined\n }\n const followerAddress = getAddress(slice(receivedData, 0, 20))\n const values = [followerAddress, profileAddress]\n return {\n eventName: 'URDFollow',\n ...createNamedArgs(values, followParams),\n ...encodeEventLog('URDFollow', followParams, values),\n standard: 'LSP26FollowerSystem',\n }\n}\n\n/**\n * Decode LSP26 Unfollow notification.\n * receivedData is abi.encodePacked(unfollowerAddress) — raw 20 bytes.\n */\nfunction unwrapLSP26Unfollow(\n receivedData: Hex,\n _from: Address,\n profileAddress: Address,\n _eventName: string\n): UnwrapResult | undefined {\n if (!receivedData || receivedData.length < 42) {\n return undefined\n }\n const unfollowerAddress = getAddress(slice(receivedData, 0, 20))\n const values = [unfollowerAddress, profileAddress]\n return {\n eventName: 'URDUnfollow',\n ...createNamedArgs(values, unfollowParams),\n ...encodeEventLog('URDUnfollow', unfollowParams, values),\n standard: 'LSP26FollowerSystem',\n }\n}\n\n/**\n * Decode LSP7 token transfer notification.\n * receivedData is abi.encode(operator, from, to, amount, data).\n */\nfunction unwrapLSP7Transfer(\n receivedData: Hex,\n _from: Address,\n _profileAddress: Address,\n eventName: string\n): UnwrapResult | undefined {\n try {\n const [operator, sender, recipient, amount, data] = decodeAbiParameters(\n [\n { name: 'operator', type: 'address' },\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n receivedData\n )\n const values = [operator, sender, recipient, amount, true, data]\n return {\n eventName,\n ...createNamedArgs(values, lsp7TransferParams),\n ...encodeEventLog(eventName, lsp7TransferParams, values),\n standard: 'LSP7DigitalAsset',\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * Decode LSP8 token transfer notification.\n * receivedData is abi.encode(operator, from, to, tokenId, data).\n */\nfunction unwrapLSP8Transfer(\n receivedData: Hex,\n _from: Address,\n _profileAddress: Address,\n eventName: string\n): UnwrapResult | undefined {\n try {\n const [operator, sender, recipient, tokenId, data] = decodeAbiParameters(\n [\n { name: 'operator', type: 'address' },\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'tokenId', type: 'bytes32' },\n { name: 'data', type: 'bytes' },\n ],\n receivedData\n )\n const values = [operator, sender, recipient, tokenId, true, data]\n return {\n eventName,\n ...createNamedArgs(values, lsp8TransferParams),\n ...encodeEventLog(eventName, lsp8TransferParams, values),\n standard: 'LSP8IdentifiableDigitalAsset',\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * Registry mapping typeId → unwrap function.\n */\nconst typeIdUnwrappers: Record<Hex, { fn: UnwrapFn; eventName: string }> = {\n [TYPEID_LSP26_FOLLOW]: { fn: unwrapLSP26Follow, eventName: 'Follow' },\n [TYPEID_LSP26_UNFOLLOW]: { fn: unwrapLSP26Unfollow, eventName: 'Unfollow' },\n [TYPEID_LSP7_TOKENSSENDER]: {\n fn: unwrapLSP7Transfer,\n eventName: 'URDTokensSent',\n },\n [TYPEID_LSP7_TOKENSRECIPIENT]: {\n fn: unwrapLSP7Transfer,\n eventName: 'URDTokensReceived',\n },\n [TYPEID_LSP8_TOKENSSENDER]: {\n fn: unwrapLSP8Transfer,\n eventName: 'URDTokensSent',\n },\n [TYPEID_LSP8_TOKENSRECIPIENT]: {\n fn: unwrapLSP8Transfer,\n eventName: 'URDTokensReceived',\n },\n}\n\n/**\n * Unwrap a UniversalReceiver event based on its typeId.\n * For known typeIds, decodes receivedData into specific event args.\n * For unknown typeIds, returns a generic Notification with raw receivedData.\n * Always rewrites topics and data to match the inner event's ABI.\n */\nexport function unwrapUniversalReceiver(\n typeId: Hex,\n receivedData: Hex,\n from: Address,\n profileAddress: Address\n): UnwrapResult {\n const entry = typeIdUnwrappers[typeId]\n if (entry) {\n const result = entry.fn(receivedData, from, profileAddress, entry.eventName)\n if (result) {\n return result\n }\n }\n\n // Fallback: generic notification with raw data\n const values = [from, typeId, receivedData]\n return {\n eventName: 'URDNotification',\n ...createNamedArgs(values, notificationParams),\n ...encodeEventLog('Notification', notificationParams, values),\n }\n}\n","import { lsp6KeyManagerAbi as KeyManager } from '@lukso/lsp6-contracts/abi'\nimport type { AbiParameter } from 'viem'\nimport { decodeEvent } from '../events'\nimport { getKMTarget } from '../interfaces'\nimport { decodeTransaction } from '../transaction'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultExecute,\n ResultShared,\n ResultType,\n} from '../types'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nexport const enhanceLSP6KeyManagerPlugin = standardPlugin(\n KeyManager,\n {\n name: 'keyManager',\n abiName: 'LSP6KeyManager',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(result, pluginOptions, options)\n if (setData) {\n return setData\n }\n return enhanceKeyManager(result, pluginOptions, options)\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, KeyManager, log)\n },\n }\n)\n\nexport async function enhanceKeyManager(\n result: ResultType & ResultShared & { moduleHint?: string },\n pluginOptions: PluginOptions,\n options: DecoderOptions\n): Promise<DecoderResult | undefined> {\n const {\n functionName,\n sig,\n args,\n input,\n to: _to,\n from: _from,\n value,\n } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n\n let to = _to\n let from = _from\n\n switch (functionName) {\n case 'execute': {\n // LSP6 execute\n const decoded = await decodeTransaction(\n {\n input: args?.[0]?.value as `0x${string}` | undefined,\n to,\n from,\n value,\n } as DecoderResult,\n options\n )\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n __decoder: pluginOptions.decoderName,\n functionName,\n sig,\n input,\n standard: pluginOptions.abiName,\n args,\n } as DecoderResult)\n const execute: ResultType = {\n ...result,\n ...decoded,\n to,\n from,\n value,\n } as unknown as ResultType\n return {\n ...execute,\n } as unknown as DecoderResult\n }\n case 'executeBatch': {\n // LSP6 executeBatch\n const children: Array<ResultType> = []\n const [values, inputs] = args.map(({ value }) => value) as [\n `0x${string}`[],\n `0x${string}`[],\n ]\n const {\n functionName: _functionName,\n sig: _sig,\n args: _args,\n resultType: _resultType,\n ...plainResult\n } = result as ResultExecute & ResultShared\n\n for (let i = 0; i < values.length; i++) {\n const _data = inputs[i] as `0x${string}`\n const _value = BigInt(values[i])\n const decoded = await decodeTransaction(\n {\n input: _data,\n to,\n from,\n value: _value,\n } as DecoderResult,\n options\n )\n children.push({ ...plainResult, ...decoded } as DecoderResult)\n }\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n functionName,\n sig,\n __decoder: pluginOptions.decoderName,\n standard: pluginOptions.abiName,\n args,\n input,\n } as DecoderResult)\n return {\n ...result,\n resultType: 'executeBatch',\n __decoder: '@lukso/lsp-smart-contracts',\n standard: pluginOptions.abiName,\n children,\n to,\n from,\n value,\n } as unknown as DecoderResult\n }\n case 'executeRelayerCallBatch': {\n // executeRelayerCallBatch\n const [signatures, nonces, validityTimestamps, values, payloads] =\n args.map(({ value }) => value) as [\n `0x${string}`[],\n bigint[],\n bigint[],\n bigint[],\n `0x${string}`[],\n ]\n const children: Array<ResultType> = []\n for (let i = 0; i < values.length; i++) {\n const _data = payloads[i] as `0x${string}`\n const _value = BigInt(values[i])\n const _signature = signatures[i] as `0x${string}`\n const _nonce = nonces[i]\n const _validityTimestamp = validityTimestamps[i]\n const decoded = await decodeTransaction(\n {\n input: _data,\n to,\n from,\n value: _value,\n } as DecoderResult,\n options\n )\n children.push({ ...result, ...decoded } as DecoderResult)\n }\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n __decoder: pluginOptions.decoderName,\n functionName,\n sig,\n input,\n standard: pluginOptions.abiName,\n args,\n } as DecoderResult)\n return {\n ...result,\n resultType: 'executeBatch',\n __decoder: pluginOptions.decoderName,\n standard: pluginOptions.abiName,\n children,\n to,\n from,\n value,\n } as unknown as DecoderResult\n }\n // -> executeRelayCall\n case 'executeRelayCall': {\n const [_signature, _nonce, _validityTimestamps, _input] = args.map(\n ({ value }) => value\n ) as [`0x${string}`, bigint, bigint, `0x${string}`]\n const _target = await getKMTarget(options.chain, to)\n const decoded = await decodeTransaction(\n {\n input: _input,\n to: _target ?? to,\n from,\n value,\n } as DecoderResult,\n options\n )\n from = to || from\n to = _target || to\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n __decoder: pluginOptions.decoderName,\n functionName,\n sig,\n input,\n standard: pluginOptions.abiName,\n to,\n from,\n value,\n args,\n } as DecoderResult)\n return {\n ...decoded,\n } as unknown as DecoderResult\n }\n }\n}\n\nexport default enhanceLSP6KeyManagerPlugin\n","{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"LSP6KeyManager\",\n \"sourceName\": \"contracts/LSP6KeyManager.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"target_\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"BatchExecuteParamsLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"BatchExecuteRelayCallParamsLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"CallingKeyManagerNotAllowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"DelegateCallDisallowedViaKeyManager\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ExecuteParametersEmptyArray\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ExecuteParametersLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725Y_DataKeysValuesLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"dataValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidDataValuesForDataKeys\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"invalidFunction\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"InvalidERC725Function\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"allowedCallsValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidEncodedAllowedCalls\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"value\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"context\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"InvalidEncodedAllowedERC725YDataKeys\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidLSP6Target\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"payload\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidPayload\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"signer\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"invalidNonce\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidRelayNonce\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"InvalidWhitelistedCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"KeyManagerCannotBeSetAsExtensionForLSP20Functions\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"totalValues\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"msgValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"LSP6BatchExcessiveValueSent\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"totalValues\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"msgValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"LSP6BatchInsufficientValueSent\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"NoCallsAllowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"NoERC725YDataKeysAllowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"NoPermissionsSet\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"NotAllowedCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"disallowedKey\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"NotAllowedERC725YDataKey\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"permission\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"NotAuthorised\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"NotRecognisedPermissionKey\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"RelayCallBeforeStartTime\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"RelayCallExpired\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"signer\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"PermissionsVerified\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"VERSION\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"payload\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"execute\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"values\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"payloads\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"executeBatch\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"nonce\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"validityTimestamps\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"payload\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"executeRelayCall\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"signatures\",\n \"type\": \"bytes[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"nonces\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"validityTimestamps\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"values\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"payloads\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"executeRelayCallBatch\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"channelId\",\n \"type\": \"uint128\"\n }\n ],\n \"name\": \"getNonce\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataHash\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"isValidSignature\",\n \"outputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"returnedStatus\",\n \"type\": \"bytes4\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"targetContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"msgValue\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"callData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"lsp20VerifyCall\",\n \"outputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"\",\n \"type\": \"bytes4\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"lsp20VerifyCallResult\",\n \"outputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"\",\n \"type\": \"bytes4\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"interfaceId\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"supportsInterface\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"target\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x60806040523480156200001157600080fd5b50604051620041e1380380620041e1833981016040819052620000349162000082565b6001600160a01b0381166200005c5760405163fc85457960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055620000b4565b6000602082840312156200009557600080fd5b81516001600160a01b0381168114620000ad57600080fd5b9392505050565b61411d80620000c46000396000f3fe6080604052600436106100bc5760003560e01c8063b44581d911610074578063d4b839921161004e578063d4b83992146101e3578063de928f141461020b578063ffa1ad741461022b57600080fd5b8063b44581d914610182578063bf0176ff146101b0578063d3fc45d3146101c357600080fd5b80631626ba7e116100a55780631626ba7e146101165780634c8a4e741461014f578063a20856a51461016257600080fd5b806301ffc9a7146100c157806309c5eabe146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046133ab565b610274565b60405190151581526020015b60405180910390f35b610109610104366004613417565b610347565b6040516100ed91906134a9565b34801561012257600080fd5b50610136610131366004613581565b61035b565b6040516001600160e01b031990911681526020016100ed565b61010961015d3660046135c8565b6103e4565b61017561017036600461373a565b6103fe565b6040516100ed9190613825565b34801561018e57600080fd5b506101a261019d36600461389c565b610600565b6040519081526020016100ed565b6101756101be3660046138ea565b610652565b3480156101cf57600080fd5b506101366101de366004613581565b6107db565b3480156101ef57600080fd5b506001546040516001600160a01b0390911681526020016100ed565b34801561021757600080fd5b50610136610226366004613956565b610817565b34801561023757600080fd5b506101096040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b60006001600160e01b031982167f23f34c620000000000000000000000000000000000000000000000000000000014806102be57506001600160e01b03198216630b135d3f60e11b145b806102f257506001600160e01b031982167f0d6ecac700000000000000000000000000000000000000000000000000000000145b8061032657506001600160e01b031982167f5ac7990800000000000000000000000000000000000000000000000000000000145b8061034157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060610354348484610981565b9392505050565b600080600061036a8585610ab4565b90925090506000816004811115610383576103836139db565b1461039b57506001600160e01b031991506103419050565b6001546103c09062200000906103ba906001600160a01b031685610af9565b81161490565b6103d2576001600160e01b03196103db565b630b135d3f60e11b5b95945050505050565b60606103f4868686348787610bba565b9695505050505050565b8851606090881415806104115750878614155b8061041c5750858414155b806104275750838214155b1561045e576040517fb4d50d2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff811115610479576104796134bc565b6040519080825280602002602001820160405280156104ac57816020015b60608152602001906001900390816104975790505b5090506000805b848110156105c657348888838181106104ce576104ce6139f1565b90506020020135836104e09190613a1d565b925082111561051057604051630c28c92b60e21b8152600481018390523460248201526044015b60405180910390fd5b6105a18d8281518110610525576105256139f1565b60200260200101518d8d8481811061053f5761053f6139f1565b905060200201358c8c85818110610558576105586139f1565b905060200201358b8b86818110610571576105716139f1565b905060200201358a8a8781811061058a5761058a6139f1565b905060200281019061059c9190613a30565b610bba565b8382815181106105b3576105b36139f1565b60209081029190910101526001016104b3565b50348110156105f15760405163528c345b60e11b815260048101829052346024820152604401610507565b509a9950505050505050505050565b6001600160a01b0382166000908152602081815260408083206fffffffffffffffffffffffffffffffff85168452909152812054608083901b6fffffffffffffffffffffffffffffffff191617610354565b606083821461068d576040517f55a187db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff8111156106a8576106a86134bc565b6040519080825280602002602001820160405280156106db57816020015b60608152602001906001900390816106c65790505b5090506000805b848110156107a457348888838181106106fd576106fd6139f1565b905060200201358361070f9190613a1d565b925082111561073a57604051630c28c92b60e21b815260048101839052346024820152604401610507565b61077f88888381811061074f5761074f6139f1565b90506020020135878784818110610768576107686139f1565b905060200281019061077a9190613a30565b610981565b838281518110610791576107916139f1565b60209081029190910101526001016106e2565b50348110156107cf5760405163528c345b60e11b815260048101829052346024820152604401610507565b5090505b949350505050565b6001546000906001600160a01b0316330361080857336000908152600260205260409020805460ff191690555b5063d3fc45d360e01b92915050565b600080631fc8da4360e21b61082c8486613a77565b6001600160e01b031916148061085b5750639790242160e01b61084f8486613a77565b6001600160e01b031916145b90506001600160a01b038716330361091a57600061087a888389610db8565b905061088a888860008888610e25565b6108948486613a77565b6001600160e01b03191686886001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a481806108de5750805b6108ef5763de928f0160e01b610911565b7fde928f00000000000000000000000000000000000000000000000000000000005b925050506103f4565b6001600160a01b03871660009081526002602052604090205460ff16801561095a5761095a876109536001600160a01b038b1682610af9565b6080611246565b610968888860008888610e25565b81806108de5750806108ef5763de928f0160e01b610911565b606060048210156109a9578282604051630d886ef360e21b8152600401610507929190613aa7565b6000631fc8da4360e21b6109bd8486613a77565b6001600160e01b03191614806109ec5750639790242160e01b6109e08486613a77565b6001600160e01b031916145b6001549091506001600160a01b03166000610a08828433610db8565b9050610a18823360008989610e25565b610a228587613a77565b6001600160e01b03191687336001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610a7183898989611256565b905081158015610a7f575083155b15610aa957610aa9836001600160a01b03166000908152600260205260409020805460ff19169055565b979650505050505050565b6000808251604103610aea5760208301516040840151606085015160001a610ade8782858561130e565b94509450505050610af2565b506000905060025b9250929050565b6000806001600160a01b0384166354f6127f610b397f4b80742de2bf82acb36300000000000000000000000000000000000000000000606087901b6113d2565b6040518263ffffffff1660e01b8152600401610b5791815260200190565b600060405180830381865afa158015610b74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b9c9190810190613ad6565b90508051602014610bb1575060009050610341565b6107d381613b44565b60606004821015610be2578282604051630d886ef360e21b8152600401610507929190613aa7565b6001546001600160a01b03166000610bfe89898989898961143b565b6001600160a01b03811660009081526020818152604080832060808d901c84529091529020549091506fffffffffffffffffffffffffffffffff891614610c775780888a6040517fc9bd9eb900000000000000000000000000000000000000000000000000000000815260040161050793929190613b6b565b6001600160a01b03811660009081526020818152604080832060808c901c84529091528120805491610ca883613b93565b9190505550610cb687611493565b6000631fc8da4360e21b610cca8688613a77565b6001600160e01b0319161480610cf95750639790242160e01b610ced8688613a77565b6001600160e01b031916145b90506000610d08848385610db8565b9050610d18848460018a8a610e25565b610d228688613a77565b6001600160e01b03191688846001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610d71858a8a8a611256565b905081158015610d7f575082155b15610da957610da9856001600160a01b03166000908152600260205260409020805460ff19169055565b9b9a5050505050505050505050565b6001600160a01b03831660009081526002602052604090205460ff168015610df657610df1826109536001600160a01b03871682610af9565b610354565b82610354576001600160a01b0384166000908152600260205260409020805460ff191660011790559392505050565b6000610e3a6001600160a01b03871686610af9565b905080610e7e576040517ff292052a0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610507565b8315610e8e57610e8e8582611548565b6000610e9a8385613a77565b90507f80dc96f4000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f0257600080610edd8560048189613bac565b810190610eea9190613581565b91509150610efb89898685856115b2565b505061123d565b7f686fdbdf000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f6157600080610f438560048189613bac565b810190610f509190613bd6565b91509150610efb898986858561162e565b7fbb3fd702000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610fd1576000808080610fa4876004818b613bac565b810190610fb19190613c85565b9350935093509350610fc88b8b88878787876117b1565b5050505061123d565b7fce7a7bae000000000000000000000000000000000000000000000000000000006001600160e01b0319821601611156576000808080611014876004818b613bac565b8101906110219190613d43565b93509350935093508251845114158061103c57508151835114155b8061104957508051825114155b15611080576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83516000036110bb576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b845181101561114c5761113a8c8c898885815181106110df576110df6139f1565b60200260200101518886815181106110f9576110f96139f1565b6020026020010151888781518110611113576111136139f1565b602002602001015188888151811061112d5761112d6139f1565b60200260200101516117b1565b8061114481613b93565b9150506110be565b505050505061123d565b6001600160e01b031981167ff2fde38b0000000000000000000000000000000000000000000000000000000014806111b757506001600160e01b031981167f79ba509700000000000000000000000000000000000000000000000000000000145b806111eb57506001600160e01b031981167f715018a600000000000000000000000000000000000000000000000000000000145b156111ff576111fa868361187e565b61123d565b6040517f2ba8851c0000000000000000000000000000000000000000000000000000000081526001600160e01b031982166004820152602401610507565b50505050505050565b6112518383836118b3565b505050565b6060600080866001600160a01b0316865a908787604051611278929190613e41565b600060405180830381858888f193505050503d80600081146112b6576040519150601f19603f3d011682016040523d82523d6000602084013e6112bb565b606091505b5091509150600061130283836040518060400160405280601e81526020017f4c5350363a206661696c656420657865637574696e67207061796c6f616400008152506118e6565b98975050505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561134557506000905060036113c9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611399573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113c2576000600192509250506113c9565b9150600090505b94509492505050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c830152918291016040516020818303038152906040529050806107d390613b44565b600080601946888888888860405160200161145c9796959493929190613e51565b60408051601f198184030181529190529050600061147a30836118ff565b9050611486818a611932565b9998505050505050505050565b8060000361149e5750565b608081901c81428211156114dd576040517ede4b8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff166000036114fc57505050565b806fffffffffffffffffffffffffffffffff16421115611251576040517f5c53a98c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62400000808216146115ae5760408051631ded6b7360e11b81526001600160a01b03841660048201526024810191909152601260448201527f455845435554455f52454c41595f43414c4c00000000000000000000000000006064820152608401610507565b5050565b60006115c086858585611956565b90506203ffff19810161160f5762020000808516036115df5750611627565b6115ed858562040000611246565b61160a85846116056001600160a01b038a1683611d0d565b611dad565b611625565b8061161a5750611627565b611625858583611246565b505b5050505050565b8051825114611669576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080835167ffffffffffffffff811115611686576116866134bc565b6040519080825280602002602001820160405280156116af578160200160208202803683370190505b509050600080805b6116f58a898984815181106116ce576116ce6139f1565b60200260200101518985815181106116e8576116e86139f1565b6020026020010151611956565b91506203ffff19820161170b576001945061174e565b811561171c5761171c898984611246565b6001848281518110611730576117306139f1565b911515602092830291909101909101528261174a81613b93565b9350505b806001019050865181106116b75784156117a5576202000080891603611778575050505050611627565b611786898962040000611246565b6117a5898861179e6001600160a01b038e1683611d0d565b8787611f0d565b50505050505050505050565b306001600160a01b038416036117f3576040517fa431b23600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83611806576111fa878787868686612151565b60018414806118155750600284145b1561182e5781151561182887878361222d565b5061123d565b60038403611844576111fa8787878686866122b2565b6004840361123d576040517f80d6ebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808216146115ae57600061189460016122e1565b90508281604051631ded6b7360e11b8152600401610507929190613e87565b80821681146112515760006118c7826122e1565b90508381604051631ded6b7360e11b8152600401610507929190613e87565b606083156118f5575081610354565b61035483836126de565b60008282604051602001611914929190613ea9565b60405160208183030381529060405280519060200120905092915050565b60008060006119418585610ab4565b9150915061194e81612708565b509392505050565b60007f20cf245f92495cf19acab2659b39f67a000000000000000000000000000000006fffffffffffffffffffffffffffffffff198416016119ac576006848116146119a486858584612870565b9150506107d3565b7fb47f8bd21d4100000000000000000000000000000000000000000000000000007fffffffffffff0000000000000000000000000000000000000000000000000000841601611b29576006848116146001600160a01b031984167fb47f8bd21d407d534c9d0000000000000000000000000000000000000000000001611a7a578251602014158015611a3e5750825115155b15611a60578383604051631fa4139760e01b8152600401610507929190613f07565b8015611a705750600090506107d3565b6119a48685612a5a565b7fb47f8bd21d40c6c59b39000000000000000000000000000000000000000000006001600160a01b0319851601611ab7576119a486858584612a90565b7fb47f8bd21d407993d6ef000000000000000000000000000000000000000000006001600160a01b0319851601611af4576119a486858584612afb565b6040517f0f7d735b00000000000000000000000000000000000000000000000000000000815260048101859052602401610507565b7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47831480611b8057506001600160a01b031983167f0cfc51aec37c55a4d0b100000000000000000000000000000000000000000000145b15611bdc578151601414158015611b975750815115155b15611bb9578282604051631fa4139760e01b8152600401610507929190613f07565b606080851603611bcb575060006107d3565b611bd58584612b25565b90506107d3565b7f311874bf6b2579feef6a000000000000000000000000000000000000000000006001600160a01b0319841601611d03578151601414158015611c2157508151601514155b8015611c2d5750815115155b15611c4f578282604051631fa4139760e01b8152600401610507929190613f07565b606083901b6001600160e01b031981167fde928f14000000000000000000000000000000000000000000000000000000001480611c9c57506001600160e01b0319811663d3fc45d360e01b145b15611ce55730611cab84613f20565b60601c03611ce5576040517f4a9fa8cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601880861603611cf95750600090506107d3565b6119a48685612bab565b50620400006107d3565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf866c29110000000000000000000000000000000000000000000085851b6113d2565b6040518263ffffffff1660e01b8152600401611d6891815260200190565b600060405180830381865afa158015611d85573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103549190810190613ad6565b8051600003611dda5760405163ed7fa50960e01b81526001600160a01b0384166004820152602401610507565b6000806000805b8451841015611ee257848481518110611dfc57611dfc6139f1565b01602001516001600160f81b03191685611e17866001613a1d565b81518110611e2757611e276139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611e6890613f5c565b60f01c9250821580611e7a5750602083115b15611e9a578460405163ae6cbd3760e01b81526004016105079190613fa8565b611ea5836020613ffa565b611eb090600861400d565b8585016022015160001990911b908116925090508581168203611ed65750505050505050565b92820160020192611de1565b60405163557ae07960e01b81526001600160a01b038816600482015260248101879052604401610507565b8251600003611f3a5760405163ed7fa50960e01b81526001600160a01b0386166004820152602401610507565b835160008080805b87518410156120cb57878481518110611f5d57611f5d6139f1565b01602001516001600160f81b03191688611f78866001613a1d565b81518110611f8857611f886139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611fc990613f5c565b60f01c9250821580611fdb5750602083115b15611ffb578760405163ae6cbd3760e01b81526004016105079190613fa8565b612006836020613ffa565b61201190600861400d565b8885016022015160001990911b9081169250905060005b858110156120be57878181518110612042576120426139f1565b60200260200101511561205757600101612028565b82828b838151811061206b5761206b6139f1565b602002602001015116036120b657600188828151811061208d5761208d6139f1565b91151560209283029190910190910152600180880197879003016120b657505050505050611627565b600101612028565b5092820160020192611f42565b60005b85811015612144578781815181106120e8576120e86139f1565b602002602001015161213c578a8a8281518110612107576121076139f1565b602090810291909101015160405163557ae07960e01b81526001600160a01b0390921660048301526024820152604401610507565b6001016120ce565b5050505050505050505050565b80518215801591610100878116149190159061040080891614908490612175575082155b15612187576121878989610200611246565b818015612192575083155b801561219c575080155b156121ae576121ae8989610800611246565b811580156121ba575080155b156121cc576121cc8989610800611246565b831580156121d75750805b156121e55750505050611625565b8180156121ef5750835b80156121f85750825b156122065750505050611625565b8080156122105750825b1561221e5750505050611625565b6117a58a8a60008a8a8a612c31565b61223b838362010000611246565b6101008281161481801561224d575080155b156122ac5760408051631ded6b7360e11b81526001600160a01b03861660048201526024810191909152601360448201527f53555045525f5452414e5346455256414c5545000000000000000000000000006064820152608401610507565b50505050565b6110008481161480156122c55750611625565b6122d28686612000611246565b61123d87876003878787612c31565b6060600019820161232557505060408051808201909152601181527f5452414e534645524f574e455253484950000000000000000000000000000000602082015290565b600319820161236757505060408051808201909152600f81527f454449545045524d495353494f4e530000000000000000000000000000000000602082015290565b60011982016123a957505060408051808201909152600d81527f414444434f4e54524f4c4c455200000000000000000000000000000000000000602082015290565b60071982016123eb57505060408051808201909152600d81527f414444455854454e53494f4e5300000000000000000000000000000000000000602082015290565b600f19820161242d57505060408051808201909152601081527f4348414e4745455854454e53494f4e5300000000000000000000000000000000602082015290565b601f19820161246f57505060408051808201909152601c81527f414444554e4956455253414c524543454956455244454c454741544500000000602082015290565b603f1982016124b157505060408051808201909152601f81527f4348414e4745554e4956455253414c524543454956455244454c454741544500602082015290565b607f1982016124f357505060408051808201909152600a81527f5245454e5452414e435900000000000000000000000000000000000000000000602082015290565b6203ffff19820161253757505060408051808201909152600781527f5345544441544100000000000000000000000000000000000000000000000000602082015290565b6107ff19820161257a57505060408051808201909152600481527f43414c4c00000000000000000000000000000000000000000000000000000000602082015290565b611fff1982016125bd57505060408051808201909152600a81527f53544154494343414c4c00000000000000000000000000000000000000000000602082015290565b617fff19820161260057505060408051808201909152600c81527f44454c454741544543414c4c0000000000000000000000000000000000000000602082015290565b61ffff19820161264357505060408051808201909152600681527f4445504c4f590000000000000000000000000000000000000000000000000000602082015290565b6101ff19820161268657505060408051808201909152600d81527f5452414e5346455256414c554500000000000000000000000000000000000000602082015290565b621fffff1982016126ca57505060408051808201909152600481527f5349474e00000000000000000000000000000000000000000000000000000000602082015290565b505060408051602081019091526000815290565b8151156126ee5781518083602001fd5b8060405162461bcd60e51b815260040161050791906134a9565b600081600481111561271c5761271c6139db565b036127245750565b6001816004811115612738576127386139db565b036127855760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610507565b6002816004811115612799576127996139db565b036127e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610507565b60038160048111156127fa576127fa6139db565b0361286d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610507565b50565b60007f20cf245f92495cf19acab2659b39f679e0f76aba35a7394b241ce5a0cc734f1d84016129935782516010141580156128ab5750825115155b156128cd578383604051631fa4139760e01b8152600401610507929190613f07565b81156128db575060006107d3565b60006128e684614024565b60801c9050856001600160a01b03166354f6127f866040518263ffffffff1660e01b815260040161291991815260200190565b600060405180830381865afa158015612936573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261295e9190810190613ad6565b61296790614024565b60801c6fffffffffffffffffffffffffffffffff8216116129895760046119a4565b60029150506107d3565b8251158015906129a557508251601414155b156129c7578383604051631fa4139760e01b8152600401610507929190613f07565b81156129d5575060006107d3565b6040516354f6127f60e01b8152600481018590526001600160a01b038616906354f6127f90602401600060405180830381865afa158015612a1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a429190810190613ad6565b5115612a4f5760046103db565b600295945050505050565b60006001600160a01b03808316908290612a7690861683610af9565b90508015612a855760046103db565b506002949350505050565b6000612a9b83612e0d565b612aba578260405163187e77ab60e01b815260040161050791906134a9565b8115612ac8575060006107d3565b6001600160a01b0380851690600090612ae390881683610af9565b14612aef5760046103f4565b60029695505050505050565b6000612b0683612f03565b612aba578260405163ae6cbd3760e01b81526004016105079190614061565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b959190810190613ad6565b5115612ba2576040610354565b50602092915050565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612bf3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c1b9190810190613ad6565b5115612c28576010610354565b50600892915050565b6000612c466001600160a01b03881687612fe9565b90508051600003612c8e576040517f6cb605870000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610507565b6000612c9b868585613026565b905060005b8251811015612dab578251612cb6826022613a1d565b1115612cd7578260405163187e77ab60e01b815260040161050791906134a9565b6000612cef84612ce8846002613a1d565b6020613102565b905063ffffffff196020612d0283613b44565b63ffffffff19911b1603612d4d576040517f6fd203c50000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602401610507565b612d57818461322a565b8015612d685750612d688188613251565b8015612d795750612d798188613294565b8015612d8a5750612d8a81866132cc565b15612d985750505050611625565b50612da4602282613a1d565b9050612ca0565b508685612db7856140b3565b6040517f45147bce0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529290911660248301526001600160e01b0319166044820152606401610507565b6000805b8251811015612ee9578251612e27826001613a1d565b10612e355750600092915050565b6000838281518110612e4957612e496139f1565b01602001516001600160f81b03191684612e64846001613a1d565b81518110612e7457612e746139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612eb590613f5c565b60f01c905060208114612ecc575060009392505050565b612ed7816002613a1d565b612ee19083613a1d565b915050612e11565b82518103612efa5750600192915050565b50600092915050565b6000805b8251811015612ee9578251612f1d826001613a1d565b10612f2b5750600092915050565b6000838281518110612f3f57612f3f6139f1565b01602001516001600160f81b03191684612f5a846001613a1d565b81518110612f6a57612f6a6139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612fab90613f5c565b60f01c9050801580612fbd5750602081115b15612fcc575060009392505050565b612fd7816002613a1d565b612fe19083613a1d565b915050612f07565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf393a64c70000000000000000000000000000000000000000000085851b6113d2565b6000821561304e577c0100000000000000000000000000000000000000000000000000000000175b81511580159060009082613060575084155b9050818061306b5750805b156130f9578561309d577c020000000000000000000000000000000000000000000000000000000092909217916130f9565b600386036130cd577c040000000000000000000000000000000000000000000000000000000092909217916130f9565b600486036130f9577c080000000000000000000000000000000000000000000000000000000092909217915b50509392505050565b60608161311081601f613a1d565b101561315e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610507565b6131688284613a1d565b845110156131b85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610507565b6060821580156131d75760405191506000825260208201604052613221565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132105780518352602092830192016131f8565b5050858452601f01601f1916604052505b50949350505050565b600080613236846140b3565b83166001600160e01b03199081169084161491505092915050565b600080602061325f85613b44565b901b60601c90506001600160a01b038114806107d35750806001600160a01b0316836001600160a01b03161491505092915050565b60008060c06132a285613b44565b901b90506001600160e01b031980821614806107d357506107d36001600160a01b03841682613326565b60008060e06132da85613b44565b8451911b91506004111560006132ef856140b3565b90506001600160e01b031983811614806103f457508180156103f457506001600160e01b0319818116908416149695505050505050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613398575060208210155b8015610aa9575015159695505050505050565b6000602082840312156133bd57600080fd5b81356001600160e01b03198116811461035457600080fd5b60008083601f8401126133e757600080fd5b50813567ffffffffffffffff8111156133ff57600080fd5b602083019150836020828501011115610af257600080fd5b6000806020838503121561342a57600080fd5b823567ffffffffffffffff81111561344157600080fd5b61344d858286016133d5565b90969095509350505050565b60005b8381101561347457818101518382015260200161345c565b50506000910152565b60008151808452613495816020860160208601613459565b601f01601f19169290920160200192915050565b602081526000610354602083018461347d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134fb576134fb6134bc565b604052919050565b600067ffffffffffffffff82111561351d5761351d6134bc565b50601f01601f191660200190565b600082601f83011261353c57600080fd5b813561354f61354a82613503565b6134d2565b81815284602083860101111561356457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561359457600080fd5b82359150602083013567ffffffffffffffff8111156135b257600080fd5b6135be8582860161352b565b9150509250929050565b6000806000806000608086880312156135e057600080fd5b853567ffffffffffffffff808211156135f857600080fd5b61360489838a0161352b565b96506020880135955060408801359450606088013591508082111561362857600080fd5b50613635888289016133d5565b969995985093965092949392505050565b600067ffffffffffffffff821115613660576136606134bc565b5060051b60200190565b600082601f83011261367b57600080fd5b8135602061368b61354a83613646565b82815260059290921b840181019181810190868411156136aa57600080fd5b8286015b848110156136ea57803567ffffffffffffffff8111156136ce5760008081fd5b6136dc8986838b010161352b565b8452509183019183016136ae565b509695505050505050565b60008083601f84011261370757600080fd5b50813567ffffffffffffffff81111561371f57600080fd5b6020830191508360208260051b8501011115610af257600080fd5b600080600080600080600080600060a08a8c03121561375857600080fd5b893567ffffffffffffffff8082111561377057600080fd5b61377c8d838e0161366a565b9a5060208c013591508082111561379257600080fd5b61379e8d838e016136f5565b909a50985060408c01359150808211156137b757600080fd5b6137c38d838e016136f5565b909850965060608c01359150808211156137dc57600080fd5b6137e88d838e016136f5565b909650945060808c013591508082111561380157600080fd5b5061380e8c828d016136f5565b915080935050809150509295985092959850929598565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561387a57603f1988860301845261386885835161347d565b9450928501929085019060010161384c565b5092979650505050505050565b6001600160a01b038116811461286d57600080fd5b600080604083850312156138af57600080fd5b82356138ba81613887565b915060208301356fffffffffffffffffffffffffffffffff811681146138df57600080fd5b809150509250929050565b6000806000806040858703121561390057600080fd5b843567ffffffffffffffff8082111561391857600080fd5b613924888389016136f5565b9096509450602087013591508082111561393d57600080fd5b5061394a878288016136f5565b95989497509550505050565b60008060008060008060a0878903121561396f57600080fd5b863561397a81613887565b9550602087013561398a81613887565b9450604087013561399a81613887565b935060608701359250608087013567ffffffffffffffff8111156139bd57600080fd5b6139c989828a016133d5565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561034157610341613a07565b6000808335601e19843603018112613a4757600080fd5b83018035915067ffffffffffffffff821115613a6257600080fd5b602001915036819003821315610af257600080fd5b6001600160e01b03198135818116916004851015613a9f5780818660040360031b1b83161692505b505092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b600060208284031215613ae857600080fd5b815167ffffffffffffffff811115613aff57600080fd5b8201601f81018413613b1057600080fd5b8051613b1e61354a82613503565b818152856020838501011115613b3357600080fd5b6103db826020830160208601613459565b80516020808301519190811015613b65576000198160200360031b1b821691505b50919050565b6001600160a01b03841681528260208201526060604082015260006103db606083018461347d565b600060018201613ba557613ba5613a07565b5060010190565b60008085851115613bbc57600080fd5b83861115613bc957600080fd5b5050820193919092039150565b60008060408385031215613be957600080fd5b823567ffffffffffffffff80821115613c0157600080fd5b818501915085601f830112613c1557600080fd5b81356020613c2561354a83613646565b82815260059290921b84018101918181019089841115613c4457600080fd5b948201945b83861015613c6257853582529482019490820190613c49565b96505086013592505080821115613c7857600080fd5b506135be8582860161366a565b60008060008060808587031215613c9b57600080fd5b843593506020850135613cad81613887565b925060408501359150606085013567ffffffffffffffff811115613cd057600080fd5b613cdc8782880161352b565b91505092959194509250565b600082601f830112613cf957600080fd5b81356020613d0961354a83613646565b82815260059290921b84018101918181019086841115613d2857600080fd5b8286015b848110156136ea5780358352918301918301613d2c565b60008060008060808587031215613d5957600080fd5b843567ffffffffffffffff80821115613d7157600080fd5b613d7d88838901613ce8565b9550602091508187013581811115613d9457600080fd5b8701601f81018913613da557600080fd5b8035613db361354a82613646565b81815260059190911b8201840190848101908b831115613dd257600080fd5b928501925b82841015613df9578335613dea81613887565b82529285019290850190613dd7565b97505050506040870135915080821115613e1257600080fd5b613e1e88838901613ce8565b93506060870135915080821115613e3457600080fd5b50613cdc8782880161366a565b8183823760009101908152919050565b878152866020820152856040820152846060820152836080820152818360a08301376000910160a0019081529695505050505050565b6001600160a01b03831681526040602082015260006107d3604083018461347d565b7f190000000000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff198360601b16600282015260008251613ef9816016850160208701613459565b919091016016019392505050565b8281526040602082015260006107d3604083018461347d565b805160208201516bffffffffffffffffffffffff198082169291906014831015613f545780818460140360031b1b83161693505b505050919050565b6000815160208301517fffff00000000000000000000000000000000000000000000000000000000000080821693506002831015613f545760029290920360031b82901b161692915050565b604081526000613fbb604083018461347d565b8281036020840152601c81527f636f756c646e2774204445434f44452066726f6d2073746f726167650000000060208201526040810191505092915050565b8181038181111561034157610341613a07565b808202811582820484141761034157610341613a07565b6000815160208301516fffffffffffffffffffffffffffffffff1980821693506010831015613f545760109290920360031b82901b161692915050565b604081526000614074604083018461347d565b8281036020840152602081527f636f756c646e27742056414c49444154452074686520646174612076616c756560208201526040810191505092915050565b6000815160208301516001600160e01b031980821693506004831015613f545760049290920360031b82901b16169291505056fea264697066735822122048e22213f43f6c90a59e8e745a3ab0a66cd70af874d6f25bd1675165a369861464736f6c63430008110033\",\n \"deployedBytecode\": \"0x6080604052600436106100bc5760003560e01c8063b44581d911610074578063d4b839921161004e578063d4b83992146101e3578063de928f141461020b578063ffa1ad741461022b57600080fd5b8063b44581d914610182578063bf0176ff146101b0578063d3fc45d3146101c357600080fd5b80631626ba7e116100a55780631626ba7e146101165780634c8a4e741461014f578063a20856a51461016257600080fd5b806301ffc9a7146100c157806309c5eabe146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046133ab565b610274565b60405190151581526020015b60405180910390f35b610109610104366004613417565b610347565b6040516100ed91906134a9565b34801561012257600080fd5b50610136610131366004613581565b61035b565b6040516001600160e01b031990911681526020016100ed565b61010961015d3660046135c8565b6103e4565b61017561017036600461373a565b6103fe565b6040516100ed9190613825565b34801561018e57600080fd5b506101a261019d36600461389c565b610600565b6040519081526020016100ed565b6101756101be3660046138ea565b610652565b3480156101cf57600080fd5b506101366101de366004613581565b6107db565b3480156101ef57600080fd5b506001546040516001600160a01b0390911681526020016100ed565b34801561021757600080fd5b50610136610226366004613956565b610817565b34801561023757600080fd5b506101096040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b60006001600160e01b031982167f23f34c620000000000000000000000000000000000000000000000000000000014806102be57506001600160e01b03198216630b135d3f60e11b145b806102f257506001600160e01b031982167f0d6ecac700000000000000000000000000000000000000000000000000000000145b8061032657506001600160e01b031982167f5ac7990800000000000000000000000000000000000000000000000000000000145b8061034157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060610354348484610981565b9392505050565b600080600061036a8585610ab4565b90925090506000816004811115610383576103836139db565b1461039b57506001600160e01b031991506103419050565b6001546103c09062200000906103ba906001600160a01b031685610af9565b81161490565b6103d2576001600160e01b03196103db565b630b135d3f60e11b5b95945050505050565b60606103f4868686348787610bba565b9695505050505050565b8851606090881415806104115750878614155b8061041c5750858414155b806104275750838214155b1561045e576040517fb4d50d2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff811115610479576104796134bc565b6040519080825280602002602001820160405280156104ac57816020015b60608152602001906001900390816104975790505b5090506000805b848110156105c657348888838181106104ce576104ce6139f1565b90506020020135836104e09190613a1d565b925082111561051057604051630c28c92b60e21b8152600481018390523460248201526044015b60405180910390fd5b6105a18d8281518110610525576105256139f1565b60200260200101518d8d8481811061053f5761053f6139f1565b905060200201358c8c85818110610558576105586139f1565b905060200201358b8b86818110610571576105716139f1565b905060200201358a8a8781811061058a5761058a6139f1565b905060200281019061059c9190613a30565b610bba565b8382815181106105b3576105b36139f1565b60209081029190910101526001016104b3565b50348110156105f15760405163528c345b60e11b815260048101829052346024820152604401610507565b509a9950505050505050505050565b6001600160a01b0382166000908152602081815260408083206fffffffffffffffffffffffffffffffff85168452909152812054608083901b6fffffffffffffffffffffffffffffffff191617610354565b606083821461068d576040517f55a187db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff8111156106a8576106a86134bc565b6040519080825280602002602001820160405280156106db57816020015b60608152602001906001900390816106c65790505b5090506000805b848110156107a457348888838181106106fd576106fd6139f1565b905060200201358361070f9190613a1d565b925082111561073a57604051630c28c92b60e21b815260048101839052346024820152604401610507565b61077f88888381811061074f5761074f6139f1565b90506020020135878784818110610768576107686139f1565b905060200281019061077a9190613a30565b610981565b838281518110610791576107916139f1565b60209081029190910101526001016106e2565b50348110156107cf5760405163528c345b60e11b815260048101829052346024820152604401610507565b5090505b949350505050565b6001546000906001600160a01b0316330361080857336000908152600260205260409020805460ff191690555b5063d3fc45d360e01b92915050565b600080631fc8da4360e21b61082c8486613a77565b6001600160e01b031916148061085b5750639790242160e01b61084f8486613a77565b6001600160e01b031916145b90506001600160a01b038716330361091a57600061087a888389610db8565b905061088a888860008888610e25565b6108948486613a77565b6001600160e01b03191686886001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a481806108de5750805b6108ef5763de928f0160e01b610911565b7fde928f00000000000000000000000000000000000000000000000000000000005b925050506103f4565b6001600160a01b03871660009081526002602052604090205460ff16801561095a5761095a876109536001600160a01b038b1682610af9565b6080611246565b610968888860008888610e25565b81806108de5750806108ef5763de928f0160e01b610911565b606060048210156109a9578282604051630d886ef360e21b8152600401610507929190613aa7565b6000631fc8da4360e21b6109bd8486613a77565b6001600160e01b03191614806109ec5750639790242160e01b6109e08486613a77565b6001600160e01b031916145b6001549091506001600160a01b03166000610a08828433610db8565b9050610a18823360008989610e25565b610a228587613a77565b6001600160e01b03191687336001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610a7183898989611256565b905081158015610a7f575083155b15610aa957610aa9836001600160a01b03166000908152600260205260409020805460ff19169055565b979650505050505050565b6000808251604103610aea5760208301516040840151606085015160001a610ade8782858561130e565b94509450505050610af2565b506000905060025b9250929050565b6000806001600160a01b0384166354f6127f610b397f4b80742de2bf82acb36300000000000000000000000000000000000000000000606087901b6113d2565b6040518263ffffffff1660e01b8152600401610b5791815260200190565b600060405180830381865afa158015610b74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b9c9190810190613ad6565b90508051602014610bb1575060009050610341565b6107d381613b44565b60606004821015610be2578282604051630d886ef360e21b8152600401610507929190613aa7565b6001546001600160a01b03166000610bfe89898989898961143b565b6001600160a01b03811660009081526020818152604080832060808d901c84529091529020549091506fffffffffffffffffffffffffffffffff891614610c775780888a6040517fc9bd9eb900000000000000000000000000000000000000000000000000000000815260040161050793929190613b6b565b6001600160a01b03811660009081526020818152604080832060808c901c84529091528120805491610ca883613b93565b9190505550610cb687611493565b6000631fc8da4360e21b610cca8688613a77565b6001600160e01b0319161480610cf95750639790242160e01b610ced8688613a77565b6001600160e01b031916145b90506000610d08848385610db8565b9050610d18848460018a8a610e25565b610d228688613a77565b6001600160e01b03191688846001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610d71858a8a8a611256565b905081158015610d7f575082155b15610da957610da9856001600160a01b03166000908152600260205260409020805460ff19169055565b9b9a5050505050505050505050565b6001600160a01b03831660009081526002602052604090205460ff168015610df657610df1826109536001600160a01b03871682610af9565b610354565b82610354576001600160a01b0384166000908152600260205260409020805460ff191660011790559392505050565b6000610e3a6001600160a01b03871686610af9565b905080610e7e576040517ff292052a0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610507565b8315610e8e57610e8e8582611548565b6000610e9a8385613a77565b90507f80dc96f4000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f0257600080610edd8560048189613bac565b810190610eea9190613581565b91509150610efb89898685856115b2565b505061123d565b7f686fdbdf000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f6157600080610f438560048189613bac565b810190610f509190613bd6565b91509150610efb898986858561162e565b7fbb3fd702000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610fd1576000808080610fa4876004818b613bac565b810190610fb19190613c85565b9350935093509350610fc88b8b88878787876117b1565b5050505061123d565b7fce7a7bae000000000000000000000000000000000000000000000000000000006001600160e01b0319821601611156576000808080611014876004818b613bac565b8101906110219190613d43565b93509350935093508251845114158061103c57508151835114155b8061104957508051825114155b15611080576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83516000036110bb576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b845181101561114c5761113a8c8c898885815181106110df576110df6139f1565b60200260200101518886815181106110f9576110f96139f1565b6020026020010151888781518110611113576111136139f1565b602002602001015188888151811061112d5761112d6139f1565b60200260200101516117b1565b8061114481613b93565b9150506110be565b505050505061123d565b6001600160e01b031981167ff2fde38b0000000000000000000000000000000000000000000000000000000014806111b757506001600160e01b031981167f79ba509700000000000000000000000000000000000000000000000000000000145b806111eb57506001600160e01b031981167f715018a600000000000000000000000000000000000000000000000000000000145b156111ff576111fa868361187e565b61123d565b6040517f2ba8851c0000000000000000000000000000000000000000000000000000000081526001600160e01b031982166004820152602401610507565b50505050505050565b6112518383836118b3565b505050565b6060600080866001600160a01b0316865a908787604051611278929190613e41565b600060405180830381858888f193505050503d80600081146112b6576040519150601f19603f3d011682016040523d82523d6000602084013e6112bb565b606091505b5091509150600061130283836040518060400160405280601e81526020017f4c5350363a206661696c656420657865637574696e67207061796c6f616400008152506118e6565b98975050505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561134557506000905060036113c9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611399573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113c2576000600192509250506113c9565b9150600090505b94509492505050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c830152918291016040516020818303038152906040529050806107d390613b44565b600080601946888888888860405160200161145c9796959493929190613e51565b60408051601f198184030181529190529050600061147a30836118ff565b9050611486818a611932565b9998505050505050505050565b8060000361149e5750565b608081901c81428211156114dd576040517ede4b8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff166000036114fc57505050565b806fffffffffffffffffffffffffffffffff16421115611251576040517f5c53a98c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62400000808216146115ae5760408051631ded6b7360e11b81526001600160a01b03841660048201526024810191909152601260448201527f455845435554455f52454c41595f43414c4c00000000000000000000000000006064820152608401610507565b5050565b60006115c086858585611956565b90506203ffff19810161160f5762020000808516036115df5750611627565b6115ed858562040000611246565b61160a85846116056001600160a01b038a1683611d0d565b611dad565b611625565b8061161a5750611627565b611625858583611246565b505b5050505050565b8051825114611669576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080835167ffffffffffffffff811115611686576116866134bc565b6040519080825280602002602001820160405280156116af578160200160208202803683370190505b509050600080805b6116f58a898984815181106116ce576116ce6139f1565b60200260200101518985815181106116e8576116e86139f1565b6020026020010151611956565b91506203ffff19820161170b576001945061174e565b811561171c5761171c898984611246565b6001848281518110611730576117306139f1565b911515602092830291909101909101528261174a81613b93565b9350505b806001019050865181106116b75784156117a5576202000080891603611778575050505050611627565b611786898962040000611246565b6117a5898861179e6001600160a01b038e1683611d0d565b8787611f0d565b50505050505050505050565b306001600160a01b038416036117f3576040517fa431b23600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83611806576111fa878787868686612151565b60018414806118155750600284145b1561182e5781151561182887878361222d565b5061123d565b60038403611844576111fa8787878686866122b2565b6004840361123d576040517f80d6ebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808216146115ae57600061189460016122e1565b90508281604051631ded6b7360e11b8152600401610507929190613e87565b80821681146112515760006118c7826122e1565b90508381604051631ded6b7360e11b8152600401610507929190613e87565b606083156118f5575081610354565b61035483836126de565b60008282604051602001611914929190613ea9565b60405160208183030381529060405280519060200120905092915050565b60008060006119418585610ab4565b9150915061194e81612708565b509392505050565b60007f20cf245f92495cf19acab2659b39f67a000000000000000000000000000000006fffffffffffffffffffffffffffffffff198416016119ac576006848116146119a486858584612870565b9150506107d3565b7fb47f8bd21d4100000000000000000000000000000000000000000000000000007fffffffffffff0000000000000000000000000000000000000000000000000000841601611b29576006848116146001600160a01b031984167fb47f8bd21d407d534c9d0000000000000000000000000000000000000000000001611a7a578251602014158015611a3e5750825115155b15611a60578383604051631fa4139760e01b8152600401610507929190613f07565b8015611a705750600090506107d3565b6119a48685612a5a565b7fb47f8bd21d40c6c59b39000000000000000000000000000000000000000000006001600160a01b0319851601611ab7576119a486858584612a90565b7fb47f8bd21d407993d6ef000000000000000000000000000000000000000000006001600160a01b0319851601611af4576119a486858584612afb565b6040517f0f7d735b00000000000000000000000000000000000000000000000000000000815260048101859052602401610507565b7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47831480611b8057506001600160a01b031983167f0cfc51aec37c55a4d0b100000000000000000000000000000000000000000000145b15611bdc578151601414158015611b975750815115155b15611bb9578282604051631fa4139760e01b8152600401610507929190613f07565b606080851603611bcb575060006107d3565b611bd58584612b25565b90506107d3565b7f311874bf6b2579feef6a000000000000000000000000000000000000000000006001600160a01b0319841601611d03578151601414158015611c2157508151601514155b8015611c2d5750815115155b15611c4f578282604051631fa4139760e01b8152600401610507929190613f07565b606083901b6001600160e01b031981167fde928f14000000000000000000000000000000000000000000000000000000001480611c9c57506001600160e01b0319811663d3fc45d360e01b145b15611ce55730611cab84613f20565b60601c03611ce5576040517f4a9fa8cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601880861603611cf95750600090506107d3565b6119a48685612bab565b50620400006107d3565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf866c29110000000000000000000000000000000000000000000085851b6113d2565b6040518263ffffffff1660e01b8152600401611d6891815260200190565b600060405180830381865afa158015611d85573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103549190810190613ad6565b8051600003611dda5760405163ed7fa50960e01b81526001600160a01b0384166004820152602401610507565b6000806000805b8451841015611ee257848481518110611dfc57611dfc6139f1565b01602001516001600160f81b03191685611e17866001613a1d565b81518110611e2757611e276139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611e6890613f5c565b60f01c9250821580611e7a5750602083115b15611e9a578460405163ae6cbd3760e01b81526004016105079190613fa8565b611ea5836020613ffa565b611eb090600861400d565b8585016022015160001990911b908116925090508581168203611ed65750505050505050565b92820160020192611de1565b60405163557ae07960e01b81526001600160a01b038816600482015260248101879052604401610507565b8251600003611f3a5760405163ed7fa50960e01b81526001600160a01b0386166004820152602401610507565b835160008080805b87518410156120cb57878481518110611f5d57611f5d6139f1565b01602001516001600160f81b03191688611f78866001613a1d565b81518110611f8857611f886139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611fc990613f5c565b60f01c9250821580611fdb5750602083115b15611ffb578760405163ae6cbd3760e01b81526004016105079190613fa8565b612006836020613ffa565b61201190600861400d565b8885016022015160001990911b9081169250905060005b858110156120be57878181518110612042576120426139f1565b60200260200101511561205757600101612028565b82828b838151811061206b5761206b6139f1565b602002602001015116036120b657600188828151811061208d5761208d6139f1565b91151560209283029190910190910152600180880197879003016120b657505050505050611627565b600101612028565b5092820160020192611f42565b60005b85811015612144578781815181106120e8576120e86139f1565b602002602001015161213c578a8a8281518110612107576121076139f1565b602090810291909101015160405163557ae07960e01b81526001600160a01b0390921660048301526024820152604401610507565b6001016120ce565b5050505050505050505050565b80518215801591610100878116149190159061040080891614908490612175575082155b15612187576121878989610200611246565b818015612192575083155b801561219c575080155b156121ae576121ae8989610800611246565b811580156121ba575080155b156121cc576121cc8989610800611246565b831580156121d75750805b156121e55750505050611625565b8180156121ef5750835b80156121f85750825b156122065750505050611625565b8080156122105750825b1561221e5750505050611625565b6117a58a8a60008a8a8a612c31565b61223b838362010000611246565b6101008281161481801561224d575080155b156122ac5760408051631ded6b7360e11b81526001600160a01b03861660048201526024810191909152601360448201527f53555045525f5452414e5346455256414c5545000000000000000000000000006064820152608401610507565b50505050565b6110008481161480156122c55750611625565b6122d28686612000611246565b61123d87876003878787612c31565b6060600019820161232557505060408051808201909152601181527f5452414e534645524f574e455253484950000000000000000000000000000000602082015290565b600319820161236757505060408051808201909152600f81527f454449545045524d495353494f4e530000000000000000000000000000000000602082015290565b60011982016123a957505060408051808201909152600d81527f414444434f4e54524f4c4c455200000000000000000000000000000000000000602082015290565b60071982016123eb57505060408051808201909152600d81527f414444455854454e53494f4e5300000000000000000000000000000000000000602082015290565b600f19820161242d57505060408051808201909152601081527f4348414e4745455854454e53494f4e5300000000000000000000000000000000602082015290565b601f19820161246f57505060408051808201909152601c81527f414444554e4956455253414c524543454956455244454c454741544500000000602082015290565b603f1982016124b157505060408051808201909152601f81527f4348414e4745554e4956455253414c524543454956455244454c454741544500602082015290565b607f1982016124f357505060408051808201909152600a81527f5245454e5452414e435900000000000000000000000000000000000000000000602082015290565b6203ffff19820161253757505060408051808201909152600781527f5345544441544100000000000000000000000000000000000000000000000000602082015290565b6107ff19820161257a57505060408051808201909152600481527f43414c4c00000000000000000000000000000000000000000000000000000000602082015290565b611fff1982016125bd57505060408051808201909152600a81527f53544154494343414c4c00000000000000000000000000000000000000000000602082015290565b617fff19820161260057505060408051808201909152600c81527f44454c454741544543414c4c0000000000000000000000000000000000000000602082015290565b61ffff19820161264357505060408051808201909152600681527f4445504c4f590000000000000000000000000000000000000000000000000000602082015290565b6101ff19820161268657505060408051808201909152600d81527f5452414e5346455256414c554500000000000000000000000000000000000000602082015290565b621fffff1982016126ca57505060408051808201909152600481527f5349474e00000000000000000000000000000000000000000000000000000000602082015290565b505060408051602081019091526000815290565b8151156126ee5781518083602001fd5b8060405162461bcd60e51b815260040161050791906134a9565b600081600481111561271c5761271c6139db565b036127245750565b6001816004811115612738576127386139db565b036127855760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610507565b6002816004811115612799576127996139db565b036127e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610507565b60038160048111156127fa576127fa6139db565b0361286d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610507565b50565b60007f20cf245f92495cf19acab2659b39f679e0f76aba35a7394b241ce5a0cc734f1d84016129935782516010141580156128ab5750825115155b156128cd578383604051631fa4139760e01b8152600401610507929190613f07565b81156128db575060006107d3565b60006128e684614024565b60801c9050856001600160a01b03166354f6127f866040518263ffffffff1660e01b815260040161291991815260200190565b600060405180830381865afa158015612936573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261295e9190810190613ad6565b61296790614024565b60801c6fffffffffffffffffffffffffffffffff8216116129895760046119a4565b60029150506107d3565b8251158015906129a557508251601414155b156129c7578383604051631fa4139760e01b8152600401610507929190613f07565b81156129d5575060006107d3565b6040516354f6127f60e01b8152600481018590526001600160a01b038616906354f6127f90602401600060405180830381865afa158015612a1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a429190810190613ad6565b5115612a4f5760046103db565b600295945050505050565b60006001600160a01b03808316908290612a7690861683610af9565b90508015612a855760046103db565b506002949350505050565b6000612a9b83612e0d565b612aba578260405163187e77ab60e01b815260040161050791906134a9565b8115612ac8575060006107d3565b6001600160a01b0380851690600090612ae390881683610af9565b14612aef5760046103f4565b60029695505050505050565b6000612b0683612f03565b612aba578260405163ae6cbd3760e01b81526004016105079190614061565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b959190810190613ad6565b5115612ba2576040610354565b50602092915050565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612bf3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c1b9190810190613ad6565b5115612c28576010610354565b50600892915050565b6000612c466001600160a01b03881687612fe9565b90508051600003612c8e576040517f6cb605870000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610507565b6000612c9b868585613026565b905060005b8251811015612dab578251612cb6826022613a1d565b1115612cd7578260405163187e77ab60e01b815260040161050791906134a9565b6000612cef84612ce8846002613a1d565b6020613102565b905063ffffffff196020612d0283613b44565b63ffffffff19911b1603612d4d576040517f6fd203c50000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602401610507565b612d57818461322a565b8015612d685750612d688188613251565b8015612d795750612d798188613294565b8015612d8a5750612d8a81866132cc565b15612d985750505050611625565b50612da4602282613a1d565b9050612ca0565b508685612db7856140b3565b6040517f45147bce0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529290911660248301526001600160e01b0319166044820152606401610507565b6000805b8251811015612ee9578251612e27826001613a1d565b10612e355750600092915050565b6000838281518110612e4957612e496139f1565b01602001516001600160f81b03191684612e64846001613a1d565b81518110612e7457612e746139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612eb590613f5c565b60f01c905060208114612ecc575060009392505050565b612ed7816002613a1d565b612ee19083613a1d565b915050612e11565b82518103612efa5750600192915050565b50600092915050565b6000805b8251811015612ee9578251612f1d826001613a1d565b10612f2b5750600092915050565b6000838281518110612f3f57612f3f6139f1565b01602001516001600160f81b03191684612f5a846001613a1d565b81518110612f6a57612f6a6139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612fab90613f5c565b60f01c9050801580612fbd5750602081115b15612fcc575060009392505050565b612fd7816002613a1d565b612fe19083613a1d565b915050612f07565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf393a64c70000000000000000000000000000000000000000000085851b6113d2565b6000821561304e577c0100000000000000000000000000000000000000000000000000000000175b81511580159060009082613060575084155b9050818061306b5750805b156130f9578561309d577c020000000000000000000000000000000000000000000000000000000092909217916130f9565b600386036130cd577c040000000000000000000000000000000000000000000000000000000092909217916130f9565b600486036130f9577c080000000000000000000000000000000000000000000000000000000092909217915b50509392505050565b60608161311081601f613a1d565b101561315e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610507565b6131688284613a1d565b845110156131b85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610507565b6060821580156131d75760405191506000825260208201604052613221565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132105780518352602092830192016131f8565b5050858452601f01601f1916604052505b50949350505050565b600080613236846140b3565b83166001600160e01b03199081169084161491505092915050565b600080602061325f85613b44565b901b60601c90506001600160a01b038114806107d35750806001600160a01b0316836001600160a01b03161491505092915050565b60008060c06132a285613b44565b901b90506001600160e01b031980821614806107d357506107d36001600160a01b03841682613326565b60008060e06132da85613b44565b8451911b91506004111560006132ef856140b3565b90506001600160e01b031983811614806103f457508180156103f457506001600160e01b0319818116908416149695505050505050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613398575060208210155b8015610aa9575015159695505050505050565b6000602082840312156133bd57600080fd5b81356001600160e01b03198116811461035457600080fd5b60008083601f8401126133e757600080fd5b50813567ffffffffffffffff8111156133ff57600080fd5b602083019150836020828501011115610af257600080fd5b6000806020838503121561342a57600080fd5b823567ffffffffffffffff81111561344157600080fd5b61344d858286016133d5565b90969095509350505050565b60005b8381101561347457818101518382015260200161345c565b50506000910152565b60008151808452613495816020860160208601613459565b601f01601f19169290920160200192915050565b602081526000610354602083018461347d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134fb576134fb6134bc565b604052919050565b600067ffffffffffffffff82111561351d5761351d6134bc565b50601f01601f191660200190565b600082601f83011261353c57600080fd5b813561354f61354a82613503565b6134d2565b81815284602083860101111561356457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561359457600080fd5b82359150602083013567ffffffffffffffff8111156135b257600080fd5b6135be8582860161352b565b9150509250929050565b6000806000806000608086880312156135e057600080fd5b853567ffffffffffffffff808211156135f857600080fd5b61360489838a0161352b565b96506020880135955060408801359450606088013591508082111561362857600080fd5b50613635888289016133d5565b969995985093965092949392505050565b600067ffffffffffffffff821115613660576136606134bc565b5060051b60200190565b600082601f83011261367b57600080fd5b8135602061368b61354a83613646565b82815260059290921b840181019181810190868411156136aa57600080fd5b8286015b848110156136ea57803567ffffffffffffffff8111156136ce5760008081fd5b6136dc8986838b010161352b565b8452509183019183016136ae565b509695505050505050565b60008083601f84011261370757600080fd5b50813567ffffffffffffffff81111561371f57600080fd5b6020830191508360208260051b8501011115610af257600080fd5b600080600080600080600080600060a08a8c03121561375857600080fd5b893567ffffffffffffffff8082111561377057600080fd5b61377c8d838e0161366a565b9a5060208c013591508082111561379257600080fd5b61379e8d838e016136f5565b909a50985060408c01359150808211156137b757600080fd5b6137c38d838e016136f5565b909850965060608c01359150808211156137dc57600080fd5b6137e88d838e016136f5565b909650945060808c013591508082111561380157600080fd5b5061380e8c828d016136f5565b915080935050809150509295985092959850929598565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561387a57603f1988860301845261386885835161347d565b9450928501929085019060010161384c565b5092979650505050505050565b6001600160a01b038116811461286d57600080fd5b600080604083850312156138af57600080fd5b82356138ba81613887565b915060208301356fffffffffffffffffffffffffffffffff811681146138df57600080fd5b809150509250929050565b6000806000806040858703121561390057600080fd5b843567ffffffffffffffff8082111561391857600080fd5b613924888389016136f5565b9096509450602087013591508082111561393d57600080fd5b5061394a878288016136f5565b95989497509550505050565b60008060008060008060a0878903121561396f57600080fd5b863561397a81613887565b9550602087013561398a81613887565b9450604087013561399a81613887565b935060608701359250608087013567ffffffffffffffff8111156139bd57600080fd5b6139c989828a016133d5565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561034157610341613a07565b6000808335601e19843603018112613a4757600080fd5b83018035915067ffffffffffffffff821115613a6257600080fd5b602001915036819003821315610af257600080fd5b6001600160e01b03198135818116916004851015613a9f5780818660040360031b1b83161692505b505092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b600060208284031215613ae857600080fd5b815167ffffffffffffffff811115613aff57600080fd5b8201601f81018413613b1057600080fd5b8051613b1e61354a82613503565b818152856020838501011115613b3357600080fd5b6103db826020830160208601613459565b80516020808301519190811015613b65576000198160200360031b1b821691505b50919050565b6001600160a01b03841681528260208201526060604082015260006103db606083018461347d565b600060018201613ba557613ba5613a07565b5060010190565b60008085851115613bbc57600080fd5b83861115613bc957600080fd5b5050820193919092039150565b60008060408385031215613be957600080fd5b823567ffffffffffffffff80821115613c0157600080fd5b818501915085601f830112613c1557600080fd5b81356020613c2561354a83613646565b82815260059290921b84018101918181019089841115613c4457600080fd5b948201945b83861015613c6257853582529482019490820190613c49565b96505086013592505080821115613c7857600080fd5b506135be8582860161366a565b60008060008060808587031215613c9b57600080fd5b843593506020850135613cad81613887565b925060408501359150606085013567ffffffffffffffff811115613cd057600080fd5b613cdc8782880161352b565b91505092959194509250565b600082601f830112613cf957600080fd5b81356020613d0961354a83613646565b82815260059290921b84018101918181019086841115613d2857600080fd5b8286015b848110156136ea5780358352918301918301613d2c565b60008060008060808587031215613d5957600080fd5b843567ffffffffffffffff80821115613d7157600080fd5b613d7d88838901613ce8565b9550602091508187013581811115613d9457600080fd5b8701601f81018913613da557600080fd5b8035613db361354a82613646565b81815260059190911b8201840190848101908b831115613dd257600080fd5b928501925b82841015613df9578335613dea81613887565b82529285019290850190613dd7565b97505050506040870135915080821115613e1257600080fd5b613e1e88838901613ce8565b93506060870135915080821115613e3457600080fd5b50613cdc8782880161366a565b8183823760009101908152919050565b878152866020820152856040820152846060820152836080820152818360a08301376000910160a0019081529695505050505050565b6001600160a01b03831681526040602082015260006107d3604083018461347d565b7f190000000000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff198360601b16600282015260008251613ef9816016850160208701613459565b919091016016019392505050565b8281526040602082015260006107d3604083018461347d565b805160208201516bffffffffffffffffffffffff198082169291906014831015613f545780818460140360031b1b83161693505b505050919050565b6000815160208301517fffff00000000000000000000000000000000000000000000000000000000000080821693506002831015613f545760029290920360031b82901b161692915050565b604081526000613fbb604083018461347d565b8281036020840152601c81527f636f756c646e2774204445434f44452066726f6d2073746f726167650000000060208201526040810191505092915050565b8181038181111561034157610341613a07565b808202811582820484141761034157610341613a07565b6000815160208301516fffffffffffffffffffffffffffffffff1980821693506010831015613f545760109290920360031b82901b161692915050565b604081526000614074604083018461347d565b8281036020840152602081527f636f756c646e27742056414c49444154452074686520646174612076616c756560208201526040810191505092915050565b6000815160208301516001600160e01b031980821693506004831015613f545760049290920360031b82901b16169291505056fea264697066735822122048e22213f43f6c90a59e8e745a3ab0a66cd70af874d6f25bd1675165a369861464736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n","import { abi as KeyManager } from '@lukso/lsp6-contracts/artifacts/LSP6KeyManager.json'\nimport { LRUCache } from 'lru-cache'\nimport {\n type Chain,\n type ChainContract,\n encodeFunctionData,\n getContract,\n} from 'viem'\nimport { ITEMS } from './constants'\nimport type { AddressModifier } from './types'\nimport { getPublicClient } from './utils'\n\nconst TARGETS = new LRUCache<string, Promise<`0x${string}` | undefined>>({\n max: 1000,\n ttl: 1000 * 60 * 60,\n})\n\n/**\n * Get the profile from the key manager.\n *\n * @param chain which chain to use\n * @param address address of key manager\n * @returns\n */\nexport async function getKMTarget(\n chain: Chain,\n address?: `0x${string}` | null\n): Promise<`0x${string}` | undefined> {\n if (!address) {\n return undefined\n }\n const info = TARGETS.get(address)\n if (info) {\n return info\n }\n const client = getPublicClient(chain)\n const out = client\n .readContract({\n address,\n abi: KeyManager,\n functionName: 'target',\n })\n .catch(() => undefined) as Promise<`0x${string}` | undefined>\n TARGETS.set(address, out)\n return out\n}\n\nconst INTERFACE_INFO = new LRUCache<string, Promise<string | undefined>>({\n max: 1000,\n ttl: 1000 * 60 * 60,\n})\n\n/**\n * Retrieve interface information, LSP7/8/0 for an address\n *\n * @param address\n * @param blockNumber\n * @param log\n * @returns\n */\nexport async function retrieveInterfaces(\n chain: Chain,\n modifier: AddressModifier\n): Promise<string | undefined> {\n const info = INTERFACE_INFO.get(modifier.address)\n if (info) {\n return info\n }\n const out = _retrieveInterfaces(chain, modifier)\n INTERFACE_INFO.set(modifier.address, out)\n return out\n}\n\nconst LSP2Fetcher = [\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'interfaceId',\n type: 'bytes4',\n },\n ],\n name: 'supportsInterface',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n type: 'function',\n name: 'aggregate3',\n inputs: [\n {\n name: 'calls',\n type: 'tuple[]',\n internalType: 'struct LSP2FetcherWithMulticall3.Call3[]',\n components: [\n { name: 'target', type: 'address', internalType: 'address' },\n { name: 'allowFailure', type: 'bool', internalType: 'bool' },\n { name: 'callData', type: 'bytes', internalType: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n internalType: 'struct LSP2FetcherWithMulticall3.Result[]',\n components: [\n { name: 'success', type: 'bool', internalType: 'bool' },\n { name: 'returnData', type: 'bytes', internalType: 'bytes' },\n ],\n },\n ],\n stateMutability: 'payable',\n },\n]\n\n/**\n * Lowlevel function to retrieve interface information\n *\n * @param address\n * @returns\n */\nasync function _retrieveInterfaces(\n chain: Chain,\n modifier: AddressModifier\n): Promise<string | undefined> {\n const { multicall3 } = chain.contracts as Record<string, ChainContract>\n if (!multicall3) {\n return undefined\n }\n const client = getPublicClient(chain)\n const _contract = getContract({\n client,\n address: multicall3.address,\n abi: LSP2Fetcher,\n })\n const args = ITEMS.map(({ key }) => {\n return {\n target: modifier.address,\n allowFailure: true,\n callData: encodeFunctionData({\n abi: LSP2Fetcher,\n functionName: 'supportsInterface',\n args: [key],\n }),\n }\n })\n return client\n .readContract({\n address: multicall3.address,\n abi: LSP2Fetcher,\n functionName: 'aggregate3',\n args: [args],\n })\n .catch((error) => {\n console.error(error)\n return []\n })\n .then((val) => {\n const response = val as Array<{ success: boolean; returnData: boolean }>\n for (const [index, value] of response.map(\n ({ success, returnData }, index: number) =>\n [index, success && Number(returnData)] as [number, boolean]\n )) {\n const item = ITEMS[index]\n if (!item) {\n continue\n }\n if (value) {\n return item.standard\n }\n }\n return undefined\n })\n .then((type) => {\n return type\n })\n}\n","import {\n lsp7BurnableAbi,\n lsp7CappedSupplyAbi,\n lsp7DigitalAssetAbi,\n lsp7MintableAbi,\n lsp7VotesAbi,\n} from '@lukso/lsp7-contracts/abi'\nimport type { AbiParameter } from 'viem'\nimport { CacheKeyPrefix, makeCacheKey } from '../cache'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultType,\n} from '../types'\nimport { getPublicClient } from '../utils'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nconst LSP7 = [\n ...lsp7DigitalAssetAbi,\n ...lsp7MintableAbi,\n ...lsp7BurnableAbi,\n ...lsp7CappedSupplyAbi,\n ...lsp7VotesAbi,\n]\n\nexport const enhanceLSP7DigitalAssetPlugin = standardPlugin(\n LSP7,\n {\n name: 'lsp7',\n abiName: 'LSP7DigitalAsset',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(\n result,\n { ...pluginOptions, abiName: '', decoderName: '' },\n options\n )\n if (setData) {\n return setData\n }\n\n // Add token metadata for LSP7 contracts for view matching\n if (options.async) {\n await enhanceLSP7Metadata(result, options)\n }\n\n const follow = await enhanceLSP26FollowerSystem(\n result,\n pluginOptions,\n options\n )\n if (follow) {\n return follow\n }\n return result\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, LSP7, log)\n },\n }\n)\n\n/**\n * Fetch and cache LSP7 contract metadata for view matching.\n * This function reads LSP4TokenType from the contract to determine if it's a token, NFT, or collection.\n * Results are cached per contract address to avoid redundant RPC calls for batch operations.\n *\n * @param result - The decoder result to enhance with metadata\n * @param options - Decoder options containing cache and chain client\n */\nasync function enhanceLSP7Metadata(\n result: DecoderResult,\n options: DecoderOptions\n): Promise<void> {\n if (!options.cache || !result.to) return\n\n const contractAddress = result.to\n const cacheKey = makeCacheKey(\n CacheKeyPrefix.CONTRACT_METADATA,\n contractAddress,\n 'lsp4-token-type'\n )\n\n try {\n // Use cache.getOrSet for automatic deduplication\n // If 5 transactions hit the same contract, only 1 RPC call is made\n const metadata = await options.cache.getOrSet(\n cacheKey,\n async () => {\n const client = getPublicClient(options.chain)\n\n // Read LSP4TokenType from contract\n // Key: keccak256('LSP4TokenType') = 0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3\n const tokenTypeData = await client.readContract({\n address: contractAddress,\n abi: LSP7,\n functionName: 'getData',\n args: [\n '0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3',\n ],\n })\n\n // Parse token type (0 = Token, 1 = NFT, 2 = Collection)\n const typeValue = tokenTypeData\n ? Number.parseInt(tokenTypeData as string, 16)\n : 0\n\n return {\n tokenType: typeValue,\n isToken: typeValue === 0,\n isNFT: typeValue === 1,\n isCollection: typeValue === 2,\n }\n },\n {\n ttl: 1000 * 60 * 60 * 24, // Cache for 24 hours (metadata rarely changes)\n signal: options.signal,\n }\n )\n\n // Add to result.custom for view matching\n result.custom = result.custom || {}\n Object.assign(result.custom, metadata)\n } catch (error) {\n console.warn('Failed to fetch LSP7 metadata:', error)\n // Set defaults on error (assume token)\n result.custom = result.custom || {}\n result.custom.tokenType = 0\n result.custom.isToken = true\n result.custom.isNFT = false\n result.custom.isCollection = false\n }\n}\n\n/**\n *\n * @param result enhanced if it's LSP7DigitalAsset\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceLSP26FollowerSystem(\n result: DecoderResult,\n _pluginOptions: PluginOptions,\n _options: DecoderOptions\n) {\n const { functionName } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n switch (functionName) {\n }\n return undefined\n}\n\nexport default enhanceLSP7DigitalAssetPlugin\n","/**\n * Cache interface for decoder with support for different backends\n * (LRU, Cloudflare KV, Redis, etc.)\n */\n\nimport type { Hex } from 'viem'\n\n/**\n * Cache entry with metadata\n */\nexport interface CacheEntry<T> {\n /** The cached value */\n value: T\n /** Timestamp when the entry expires (ms since epoch) */\n expires?: number\n /** Timestamp when the entry becomes stale (for stale-while-revalidate) */\n stale?: number\n /** Whether this entry resulted from an error */\n isError?: boolean\n}\n\n/**\n * Options for cache operations\n */\nexport interface CacheOptions {\n /** Time to live in milliseconds */\n ttl?: number\n /** TTL for error responses (typically shorter) */\n errorTTL?: number\n /** Time in ms after which the value is stale but still usable */\n staleWhileRevalidate?: number\n}\n\n/**\n * Generic cache interface that can be implemented by different backends\n */\nexport interface DecoderCache {\n /**\n * Get a value from the cache\n */\n get<T>(key: string): Promise<CacheEntry<T> | undefined>\n\n /**\n * Set a value in the cache\n */\n set<T>(key: string, value: T, options?: CacheOptions): Promise<void>\n\n /**\n * Delete a value from the cache\n */\n delete(key: string): Promise<void>\n\n /**\n * Get multiple values at once (for batch operations)\n */\n getMany?<T>(keys: string[]): Promise<Map<string, CacheEntry<T>>>\n\n /**\n * Set multiple values at once (for batch operations)\n */\n setMany?<T>(\n entries: Array<{ key: string; value: T; options?: CacheOptions }>\n ): Promise<void>\n\n /**\n * Clear all entries (optional)\n */\n clear?(): Promise<void>\n\n /**\n * Get or set with automatic promise deduplication\n * This is the main method for async operations\n */\n getOrSet<T>(\n key: string,\n factory: (signal?: AbortSignal) => Promise<T>,\n options?: CacheOptions & { signal?: AbortSignal }\n ): Promise<T>\n}\n\n/**\n * In-flight promise tracking for deduplication\n */\nexport class PromiseTracker<T> {\n private promises = new Map<string, Promise<T>>()\n\n /**\n * Get or create a promise for the given key\n */\n async getOrCreate(key: string, factory: () => Promise<T>): Promise<T> {\n const existing = this.promises.get(key)\n if (existing) {\n return existing\n }\n\n const promise = factory().finally(() => {\n // Clean up after completion\n this.promises.delete(key)\n })\n\n this.promises.set(key, promise)\n return promise\n }\n\n /**\n * Check if a promise is in flight\n */\n has(key: string): boolean {\n return this.promises.has(key)\n }\n\n /**\n * Clear all tracked promises\n */\n clear(): void {\n this.promises.clear()\n }\n}\n\n/**\n * Helper to create cache keys\n */\nexport function makeCacheKey(type: string, ...parts: (string | Hex)[]): string {\n return `${type}:${parts.join(':')}`\n}\n\n/**\n * Cache key prefixes for different resource types\n */\nexport enum CacheKeyPrefix {\n ABI = 'abi',\n FUNCTION_SIGNATURE = 'sig',\n ADDRESS = 'addr',\n TOKEN = 'token',\n PROFILE = 'profile',\n EXTERNAL_DATA = 'ext',\n SCHEMA = 'schema',\n CONTRACT_METADATA = 'contract-meta',\n}\n","import {\n lsp8BurnableAbi,\n lsp8CappedSupplyAbi,\n lsp8EnumerableAbi,\n lsp8IdentifiableDigitalAssetAbi,\n lsp8MintableAbi,\n lsp8VotesAbi,\n} from '@lukso/lsp8-contracts/abi'\nimport type { AbiParameter } from 'viem'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultShared,\n ResultType,\n} from '../types'\nimport { createNamedArgs } from '../utils'\nimport { decodeKeyValueRaw, standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nconst LSP8 = [\n ...lsp8IdentifiableDigitalAssetAbi,\n ...lsp8MintableAbi,\n ...lsp8BurnableAbi,\n ...lsp8CappedSupplyAbi,\n ...lsp8EnumerableAbi,\n ...lsp8VotesAbi,\n]\n\nexport const enhanceLSP8IdentifiableDigitalAssetPlugin = standardPlugin(\n LSP8,\n {\n name: 'lsp8',\n abiName: 'LSP8IdentifiableDigitalAsset',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(result, pluginOptions, options)\n if (setData) {\n return setData\n }\n return await enhanceLSP8IdentifiableDigitalAsset(\n result,\n pluginOptions,\n options\n )\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n const event = decodeEvent(options.chain, LSP8, log)\n if (event) {\n const tokenId = event.args.find(({ name }) => name === 'tokenId')?.value\n if (tokenId) {\n event.address = `${event.address}:${tokenId}`\n }\n }\n return event\n },\n }\n)\n\n/**\n *\n * @param result enhanced if it's LSP8\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceLSP8IdentifiableDigitalAsset(\n result: ResultType & ResultShared & { moduleHint?: string },\n pluginOptions: PluginOptions,\n options: DecoderOptions\n) {\n const setData = await enhanceSetData(\n result,\n { ...pluginOptions, abiName: '', decoderName: '' },\n options\n )\n if (setData) {\n return setData\n }\n const { functionName, sig, args, input, blockNumber, to, from, value } =\n result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n switch (functionName) {\n case 'setDataForTokenId': {\n // Single setDataForTokenId\n const [tokenId, _key, _value] = args.map(({ value }) => value) as [\n `0x${string}`,\n `0x${string}`,\n `0x${string}`,\n ]\n return {\n blockNumber,\n ...result,\n __decoder: pluginOptions.decoderName,\n resultType: 'setDataBatch',\n standard: pluginOptions.abiName,\n input,\n children: [\n {\n ...result,\n standard: pluginOptions.abiName,\n tokenId,\n to: `${to}:${tokenId}`,\n from,\n value,\n info: await decodeKeyValueRaw(_key, _value, options),\n },\n ] as Array<DecoderResult>,\n } as DecoderResult\n }\n case 'setDataBatchForTokenIds': {\n // Multiple setDataBatchForTokenIds\n const children: Array<ResultType> = []\n const [tokenIds, keys, values] = args.map(({ value }) => value) as [\n `0x${string}`[],\n `0x${string}`[],\n `0x${string}`[],\n ]\n for (let i = 0; i < tokenIds.length; i++) {\n const tokenId = tokenIds[i] as `0x${string}`\n const key = keys[i] as `0x${string}`\n const _value = values[i] as `0x${string}`\n children.push({\n ...result,\n resultType: 'setData',\n __decoder: '@lukso/lsp-smart-contracts',\n standard: key,\n ...createNamedArgs(\n [tokenId, key, _value],\n [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'key', type: 'bytes32' },\n { name: 'value', type: 'bytes' },\n ]\n ),\n tokenId,\n phase: 'enhanced',\n to: `${to}:${tokenId}`,\n from,\n value,\n info: await decodeKeyValueRaw(key, _value, options),\n } as DecoderResult)\n }\n return {\n ...result,\n __decoder: pluginOptions.decoderName,\n functionName,\n sig,\n input,\n standard: pluginOptions.abiName,\n resultType: 'setDataBatch',\n ...(args ? { args } : {}),\n to,\n from,\n value,\n children,\n } as DecoderResult\n }\n }\n return result\n}\n\nexport default enhanceLSP8IdentifiableDigitalAssetPlugin\n","import { lsp9VaultAbi as LSP9 } from '@lukso/lsp9-contracts/abi'\nimport type { AbiParameter } from 'viem'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n PluginOptions,\n ResultShared,\n ResultType,\n} from '../types'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nexport const enhanceLSP9VaultPlugin = standardPlugin(\n LSP9,\n {\n name: 'lsp9',\n abiName: 'LSP9Vault',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(result, pluginOptions, options)\n if (setData) {\n return setData\n }\n return await enhanceLSP9Vault(result, pluginOptions, options)\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, LSP9, log)\n },\n }\n)\n/**\n *\n * @param result enhanced if it's LSP8\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceLSP9Vault(\n result: ResultType & ResultShared & { moduleHint?: string },\n _pluginOptions: PluginOptions,\n _options: DecoderOptions\n) {\n const { functionName } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n switch (functionName) {\n }\n return undefined\n}\n\nexport default enhanceLSP9VaultPlugin\n","import { lsp26FollowerSystemAbi as LSP26 } from '@lukso/lsp26-contracts/abi'\nimport type { AbiParameter, Address } from 'viem'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultExecute,\n ResultType,\n} from '../types'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nexport const enhanceLSP26FollowerSystemPlugin = standardPlugin(\n LSP26,\n {\n name: 'lsp26',\n abiName: 'LSP26FollowerSystem',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(result, pluginOptions, options)\n if (setData) {\n return setData\n }\n return await enhanceLSP26FollowerSystem(result, pluginOptions, options)\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, LSP26, log)\n },\n }\n)\n/**\n *\n * @param result enhanced if it's LSP8\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceLSP26FollowerSystem(\n result: DecoderResult,\n _pluginOptions: PluginOptions,\n _options: DecoderOptions\n) {\n const { functionName, args } = result as ResultType & {\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n const { args: _args, ...partialResult } = result as ResultExecute\n switch (functionName) {\n case 'follow':\n case 'unfollow':\n return {\n ...result,\n children: [\n {\n ...partialResult,\n resultType: 'followProfile',\n phase: 'enhanced',\n address: args[0]?.value as Address,\n } as DecoderResult,\n ],\n } as DecoderResult\n case 'followBatch':\n case 'unfollowBatch':\n return {\n ...result,\n children: (result.resultType === 'execute'\n ? (result.args?.[0]?.value as Array<Address>) || []\n : []\n ).map((address: Address) => ({\n ...partialResult,\n phase: 'enhanced',\n resultType: 'followProfile',\n address,\n })),\n } as DecoderResult\n }\n return undefined\n}\n\nexport default enhanceLSP26FollowerSystemPlugin\n","{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"LSP9Vault\",\n \"sourceName\": \"@lukso/lsp9-contracts/contracts/LSP9Vault.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ContractDeploymentFailed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_CreateOperationsRequireEmptyRecipientAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ExecuteParametersEmptyArray\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ExecuteParametersLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"balance\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ERC725X_InsufficientBalance\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_MsgValueDisallowedInStaticCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_NoContractBytecodeProvided\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"operationTypeProvided\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ERC725X_UnknownOperationType\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725Y_DataKeysValuesLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725Y_MsgValueDisallowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"LSP14CallerNotPendingOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"LSP14CannotTransferOwnershipToSelf\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"LSP14MustAcceptOwnershipInSeparateTransaction\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"renounceOwnershipStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"renounceOwnershipEnd\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"LSP14NotInRenounceOwnershipInterval\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"LSP1DelegateNotAllowedToSetDataKey\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"functionSelector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"NoExtensionFoundForFunctionSelector\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"callerAddress\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableCallerNotTheOwner\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"operationType\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"contractAddress\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"salt\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"ContractCreated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"dataValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"DataChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"operationType\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"target\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"Executed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [],\n \"name\": \"OwnershipRenounced\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [],\n \"name\": \"RenounceOwnershipStarted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"typeId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"receivedData\",\n \"type\": \"bytes\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"returnedValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"UniversalReceiver\",\n \"type\": \"event\"\n },\n {\n \"stateMutability\": \"payable\",\n \"type\": \"fallback\"\n },\n {\n \"inputs\": [],\n \"name\": \"RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VERSION\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"acceptOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"data\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"batchCalls\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"results\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"operationType\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"target\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"execute\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"operationsType\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"address[]\",\n \"name\": \"targets\",\n \"type\": \"address[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"values\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"datas\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"executeBatch\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getData\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"dataValue\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"dataKeys\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"name\": \"getDataBatch\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"dataValues\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pendingOwner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"dataValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"setData\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"dataKeys\",\n \"type\": \"bytes32[]\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"dataValues\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"setDataBatch\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"interfaceId\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"supportsInterface\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"typeId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"receivedData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"universalReceiver\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"returnedValues\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"stateMutability\": \"payable\",\n \"type\": \"receive\"\n }\n ],\n \"bytecode\": \"0x60806040526040516200332e3803806200332e833981016040819052620000269162000366565b3415620000ad577f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b34336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c2604051620000a4906040808252600090820181905260606020830181905282015260800190565b60405180910390a45b620000c3816200016360201b620011ce1760201c565b6040805180820190915260048152637c0334a160e01b60208201526200010b907feafec4d89fa9619884b600007c0334a14085fefa8b51ae5a40895018882bdb9090620001d1565b604080516020808201909252600081526200015c916001600160a01b038416917f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c916200123c6200022a821b17901c565b5062000641565b6000546001600160a01b03828116911614620001ce57600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0383161790555b50565b6000828152600160205260409020620001eb82826200043c565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516200021e91906200055c565b60405180910390a25050565b62000254636bb56a1460e01b846001600160a01b0316620002db60201b620012d01790919060201c565b15620002d657604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906200028a908590859060040162000571565b6000604051808303816000875af1158015620002aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002d4919081019062000594565b505b505050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d915060005190508280156200034e575060208210155b80156200035b5750600081115b979650505050505050565b6000602082840312156200037957600080fd5b81516001600160a01b03811681146200039157600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003c357607f821691505b602082108103620003e457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002d657600081815260208120601f850160051c81016020861015620004135750805b601f850160051c820191505b8181101562000434578281556001016200041f565b505050505050565b81516001600160401b0381111562000458576200045862000398565b6200047081620004698454620003ae565b84620003ea565b602080601f831160018114620004a857600084156200048f5750858301515b600019600386901b1c1916600185901b17855562000434565b600085815260208120601f198616915b82811015620004d957888601518255948401946001909101908401620004b8565b5085821015620004f85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60005b83811015620005255781810151838201526020016200050b565b50506000910152565b600081518084526200054881602086016020860162000508565b601f01601f19169290920160200192915050565b6020815260006200039160208301846200052e565b8281526040602082015260006200058c60408301846200052e565b949350505050565b600060208284031215620005a757600080fd5b81516001600160401b0380821115620005bf57600080fd5b818401915084601f830112620005d457600080fd5b815181811115620005e957620005e962000398565b604051601f8201601f19908116603f0116810190838211818310171562000614576200061462000398565b816040528281528760208487010111156200062e57600080fd5b6200035b83602083016020880162000508565b612cdd80620006516000396000f3fe6080604052600436106101125760003560e01c806379ba5097116100a5578063dedff9c611610074578063ead3fbdf11610059578063ead3fbdf14610203578063f2fde38b146103ae578063ffa1ad74146103ce5761015d565b8063dedff9c614610370578063e30c3978146103905761015d565b806379ba5097146103035780637f23690c146103185780638da5cb5b1461032b578063979024211461035d5761015d565b806354f6127f116100e157806354f6127f1461029b5780636963d438146102bb5780636bb56a14146102db578063715018a6146102ee5761015d565b806301bfba611461020357806301ffc9a71461022b578063318584521461025b57806344c028fe1461027b5761015d565b3661015d57341561015b576101597f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b60405180602001604052806000815250610417565b505b005b600036606060048210156101eb5734156101d6576101d47f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b506040805160208101909152600081526101f8565b6101f5838361070e565b90505b915050805190602001f35b34801561020f57600080fd5b5061021860c881565b6040519081526020015b60405180910390f35b34801561023757600080fd5b5061024b61024636600461231b565b6108ea565b6040519015158152602001610222565b61026e610269366004612530565b610986565b6040516102229190612688565b61028e6102893660046126ea565b610a30565b604051610222919061273f565b3480156102a757600080fd5b5061028e6102b6366004612752565b610acf565b3480156102c757600080fd5b5061026e6102d636600461276b565b610ada565b61028e6102e93660046127e0565b610417565b3480156102fa57600080fd5b5061015b610c3d565b34801561030f57600080fd5b5061015b610cd3565b61015b6103263660046127e0565b610dcb565b34801561033757600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610222565b61015b61036b366004612827565b610e9c565b34801561037c57600080fd5b5061026e61038b366004612881565b611058565b34801561039c57600080fd5b506003546001600160a01b0316610345565b3480156103ba57600080fd5b5061015b6103c93660046128b6565b611103565b3480156103da57600080fd5b5061028e6040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b6060341580159061044857507f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc8314155b156104b3576104b17f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b60006104de7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47611359565b9050606060148251106105a15760006104f6836128d1565b60601c905061050c81635122dded60e11b6112d0565b1561059f57600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161055591339134918c918c910161290d565b6000604051808303816000875af1158015610574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261059c919081019061293b565b91505b505b60006105ba690cfc51aec37c55a4d0b160b01b876113fb565b905060006105c782611359565b90506060601482511061068a5760006105df836128d1565b60601c90506105f581635122dded60e11b6112d0565b1561068857600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161063e91339134918f918f910161290d565b6000604051808303816000875af115801561065d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610685919081019061293b565b91505b505b600480546001600160a01b03191690556040516106ad90859083906020016129a9565b60405160208183030381529060405295508734336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c28a8a6040516106fb9291906129a9565b60405180910390a4505050505092915050565b60606000806107286000356001600160e01b031916611464565b915091503460001415801561073b575080155b156107a5576107a37f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b6000356001600160e01b0319161580156107c657506001600160a01b038216155b156107e45760405180602001604052806000815250925050506108e4565b6001600160a01b038216610837576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081526001600160e01b03196000351660048201526024015b60405180910390fd5b600080836001600160a01b031683610850576000610852565b345b8888333460405160200161086994939291906129ce565b60408051601f1981840301815290829052610883916129fe565b60006040518083038185875af1925050503d80600081146108c0576040519150601f19603f3d011682016040523d82523d6000602084013e6108c5565b606091505b509150915081156108db5793506108e492505050565b80518060208301fd5b92915050565b60006001600160e01b031982167f28af17e600000000000000000000000000000000000000000000000000000000148061093457506001600160e01b03198216631aed5a8560e21b145b8061096857506001600160e01b031982167f94be599900000000000000000000000000000000000000000000000000000000145b80610977575061097782611548565b806108e457506108e482611586565b60606109906115c4565b3415610a19576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610a1091612a1a565b60405180910390a45b610a258585858561161b565b90505b949350505050565b6060610a3a6115c4565b3415610ac3576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610aba91612a1a565b60405180910390a45b610a25858585856117ab565b60606108e482611359565b60608167ffffffffffffffff811115610af557610af5612345565b604051908082528060200260200182016040528015610b2857816020015b6060815260200190600190039081610b135790505b50905060005b82811015610c365760008030868685818110610b4c57610b4c612a44565b9050602002810190610b5e9190612a5a565b604051610b6c929190612aa8565b600060405180830381855af49150503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b509150915081610c0e57805115610bc65780518082602001fd5b60405162461bcd60e51b815260206004820152601960248201527f4c5350393a20626174636843616c6c7320726576657274656400000000000000604482015260640161082e565b80848481518110610c2157610c21612a44565b60209081029190910101525050600101610b2e565b5092915050565b610c456115c4565b6000546001600160a01b0316610c596118b7565b6000546001600160a01b0316610cd057604080516001600160a01b0383166020820152600091810191909152610cd0907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471906060015b60408051601f198184030181529190526001600160a01b038416919061123c565b50565b600354600160a01b900460ff1615610d17576040517f5758dd0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b0316610d2b6119c3565b604080516001600160a01b03831660208201523391810191909152610d74907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa6516947190606001610caf565b604080516001600160a01b0383166020820152338183018190528251808303840181526060909201909252610cd091907f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c9061123c565b3415610dea5760405163f36ba73760e01b815260040160405180910390fd5b6000610df4611a29565b90508015610e8d576001600160a01b03198316690cfc51aec37c55a4d0b160b01b1480610e4b57507fffffffffffff00000000000000000000000000000000000000000000000000008316654b80742de2bf60d01b145b80610e6c57506001600160a01b03198316696773c5a04a6d4300884b60b11b145b15610e8d5760405163199611f160e01b81526004810184905260240161082e565b610e978383611ac3565b505050565b6000610ea6611a29565b90508151835114610ee3576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610f025760405163f36ba73760e01b815260040160405180910390fd5b60005b835181101561105257811561100e578351690cfc51aec37c55a4d0b160b01b90859083908110610f3757610f37612a44565b60200260200101516001600160a01b0319161480610f9657508351654b80742de2bf60d01b90859083908110610f6f57610f6f612a44565b602002602001015179ffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610fd357508351696773c5a04a6d4300884b60b11b90859083908110610fbf57610fbf612a44565b60200260200101516001600160a01b031916145b1561100e57838181518110610fea57610fea612a44565b602002602001015160405163199611f160e01b815260040161082e91815260200190565b61104a84828151811061102357611023612a44565b602002602001015184838151811061103d5761103d612a44565b6020026020010151611ac3565b600101610f05565b50505050565b6060815167ffffffffffffffff81111561107457611074612345565b6040519080825280602002602001820160405280156110a757816020015b60608152602001906001900390816110925790505b50905060005b82518110156110fd576110d88382815181106110cb576110cb612a44565b6020026020010151611359565b8282815181106110ea576110ea612a44565b60209081029190910101526001016110ad565b50919050565b61110b6115c4565b6003805460ff60a01b1916600160a01b17905561112781611b18565b600080546040516001600160a01b03918216929184169183917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a3604080516001600160a01b038381166020830152841681830181905282518083038401815260609092019092526111bd91907faefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f9061123c565b50506003805460ff60a01b19169055565b6000546001600160a01b03828116911614610cd057600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0383166001600160a01b031990911617905550565b6112566001600160a01b038416631aed5a8560e21b6112d0565b15610e9757604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906112899085908590600401612ab8565b6000604051808303816000875af11580156112a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611052919081019061293b565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015611342575060208210155b801561134e5750600081115b979650505050505050565b600081815260016020526040902080546060919061137690612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546113a290612ad1565b80156113ef5780601f106113c4576101008083540402835291602001916113ef565b820191906000526020600020905b8154815290600101906020018083116113d257829003601f168201915b50505050509050919050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c83015291829101604051602081830303815290604052905080610a2890612b05565b60008080611489696773c5a04a6d4300884b60b11b6001600160e01b031986166113fb565b9050600061149682611359565b90506014815110156114af575060009485945092505050565b805160150361153057806014815181106114cb576114cb612a44565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f01000000000000000000000000000000000000000000000000000000000000000361153057611521816128d1565b60601c95600195509350505050565b611539816128d1565b60601c95600095509350505050565b60006001600160e01b031982167fa918fa6b0000000000000000000000000000000000000000000000000000000014806108e457506108e482611b81565b6000806115996301ffc9a760e01b611464565b5090506001600160a01b0381166115b35750600092915050565b6115bd81846112d0565b9392505050565b336115d76000546001600160a01b031690565b6001600160a01b031614611619576040517fbf1169c500000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b565b60608351855114158061163c57508251845114158061163c57508151835114155b15611673576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516000036116ae576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000855167ffffffffffffffff8111156116ca576116ca612345565b6040519080825280602002602001820160405280156116fd57816020015b60608152602001906001900390816116e85790505b50905060005b86518110156117a15761177c87828151811061172157611721612a44565b602002602001015187838151811061173b5761173b612a44565b602002602001015187848151811061175557611755612a44565b602002602001015187858151811061176f5761176f612a44565b60200260200101516117ab565b82828151811061178e5761178e612a44565b6020908102919091010152600101611703565b5095945050505050565b6060846117c4576117bd848484611bbf565b9050610a28565b600185036117fe576001600160a01b038416156117f457604051631820c12560e11b815260040160405180910390fd5b6117bd8383611cf0565b60028503611838576001600160a01b0384161561182e57604051631820c12560e11b815260040160405180910390fd5b6117bd8383611e0a565b60038503611882578215611878576040517f72f2bc6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd8483611ef4565b6040517f7583b3bc0000000000000000000000000000000000000000000000000000000081526004810186905260240161082e565b60025443906000906118cb9060c890612b3f565b905060006118da60c883612b3f565b9050808311806118ea5750600254155b15611932576002839055600380546001600160a01b03191690556040517f81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e790600090a1505050565b81831015611976576040517f1b080942000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161082e565b61198060006111ce565b60006002819055600380546001600160a01b03191690556040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1505050565b6003546001600160a01b03163314611a09576040517f451e452800000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b611a12336111ce565b600380546001600160a01b03191690556000600255565b600080546001600160a01b03163314611ac0576004546001600160a01b03163314611abc5760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c79204f776e6572206f72207265656e746572656420556e69766572736160448201527f6c2052656365697665722044656c656761746520616c6c6f7765640000000000606482015260840161082e565b5060015b90565b6000828152600160205260409020611adb8282612ba0565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051611b0c919061273f565b60405180910390a25050565b306001600160a01b03821603611b5a576040517fe052a6f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03929092169190911790556000600255565b60006001600160e01b031982167f629aa6940000000000000000000000000000000000000000000000000000000014806108e457506108e482611ff8565b606082471015611beb576040516301bf351f60e31b81524760048201526024810184905260440161082e565b611bf482612c60565b6001600160e01b031916846001600160a01b031660007f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e86604051611c3b91815260200190565b60405180910390a4600080856001600160a01b03168585604051611c5f91906129fe565b60006040518083038185875af1925050503d8060008114611c9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ca1565b606091505b5091509150611ce682826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b9695505050505050565b606082471015611d1c576040516301bf351f60e31b81524760048201526024810184905260440161082e565b8151600003611d3e5760405163b81cd8d960e01b815260040160405180910390fd5b600082516020840185f090506001600160a01b038116611d8a576040517f0b07489b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000801b816001600160a01b031660017fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c387604051611dcb91815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b16602082015260340160405160208183030381529060405291505092915050565b60608151600003611e2e5760405163b81cd8d960e01b815260040160405180910390fd5b6000611e478360208551611e429190612c94565b61205f565b90506000611e6484600060208751611e5f9190612c94565b6120c5565b90506000611e738684846121ed565b905082816001600160a01b031660027fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c389604051611eb391815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052935050505092915050565b6060611eff82612c60565b6001600160e01b031916836001600160a01b031660037f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e6000604051611f4791815260200190565b60405180910390a4600080846001600160a01b031684604051611f6a91906129fe565b600060405180830381855afa9150503d8060008114611fa5576040519150601f19603f3d011682016040523d82523d6000602084013e611faa565b606091505b5091509150611fef82826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b95945050505050565b60006001600160e01b031982167f7545acac0000000000000000000000000000000000000000000000000000000014806108e457506301ffc9a760e01b6001600160e01b03198316146108e4565b606083156120555750816115bd565b6115bd83836122f1565b600061206c826020612b3f565b835110156120bc5760405162461bcd60e51b815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e64730000000000000000000000604482015260640161082e565b50016020015190565b6060816120d381601f612b3f565b10156121215760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161082e565b61212b8284612b3f565b8451101561217b5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161082e565b60608215801561219a57604051915060008252602082016040526121e4565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156121d35780518352602092830192016121bb565b5050858452601f01601f1916604052505b50949350505050565b60008347101561223f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161082e565b81516000036122905760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161082e565b8282516020840186f590506001600160a01b0381166115bd5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161082e565b8151156123015781518083602001fd5b8060405162461bcd60e51b815260040161082e919061273f565b60006020828403121561232d57600080fd5b81356001600160e01b0319811681146115bd57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561238457612384612345565b604052919050565b600067ffffffffffffffff8211156123a6576123a6612345565b5060051b60200190565b600082601f8301126123c157600080fd5b813560206123d66123d18361238c565b61235b565b82815260059290921b840181019181810190868411156123f557600080fd5b8286015b8481101561241057803583529183019183016123f9565b509695505050505050565b80356001600160a01b038116811461243257600080fd5b919050565b600067ffffffffffffffff82111561245157612451612345565b50601f01601f191660200190565b600082601f83011261247057600080fd5b813561247e6123d182612437565b81815284602083860101111561249357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126124c157600080fd5b813560206124d16123d18361238c565b82815260059290921b840181019181810190868411156124f057600080fd5b8286015b8481101561241057803567ffffffffffffffff8111156125145760008081fd5b6125228986838b010161245f565b8452509183019183016124f4565b6000806000806080858703121561254657600080fd5b843567ffffffffffffffff8082111561255e57600080fd5b61256a888389016123b0565b955060209150818701358181111561258157600080fd5b8701601f8101891361259257600080fd5b80356125a06123d18261238c565b81815260059190911b8201840190848101908b8311156125bf57600080fd5b928501925b828410156125e4576125d58461241b565b825292850192908501906125c4565b975050505060408701359150808211156125fd57600080fd5b612609888389016123b0565b9350606087013591508082111561261f57600080fd5b5061262c878288016124b0565b91505092959194509250565b60005b8381101561265357818101518382015260200161263b565b50506000910152565b60008151808452612674816020860160208601612638565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156126dd57603f198886030184526126cb85835161265c565b945092850192908501906001016126af565b5092979650505050505050565b6000806000806080858703121561270057600080fd5b843593506127106020860161241b565b925060408501359150606085013567ffffffffffffffff81111561273357600080fd5b61262c8782880161245f565b6020815260006115bd602083018461265c565b60006020828403121561276457600080fd5b5035919050565b6000806020838503121561277e57600080fd5b823567ffffffffffffffff8082111561279657600080fd5b818501915085601f8301126127aa57600080fd5b8135818111156127b957600080fd5b8660208260051b85010111156127ce57600080fd5b60209290920196919550909350505050565b600080604083850312156127f357600080fd5b82359150602083013567ffffffffffffffff81111561281157600080fd5b61281d8582860161245f565b9150509250929050565b6000806040838503121561283a57600080fd5b823567ffffffffffffffff8082111561285257600080fd5b61285e868387016123b0565b9350602085013591508082111561287457600080fd5b5061281d858286016124b0565b60006020828403121561289357600080fd5b813567ffffffffffffffff8111156128aa57600080fd5b610a28848285016123b0565b6000602082840312156128c857600080fd5b6115bd8261241b565b805160208201516bffffffffffffffffffffffff1980821692919060148310156129055780818460140360031b1b83161693505b505050919050565b6001600160a01b0385168152836020820152826040820152608060608201526000611ce6608083018461265c565b60006020828403121561294d57600080fd5b815167ffffffffffffffff81111561296457600080fd5b8201601f8101841361297557600080fd5b80516129836123d182612437565b81815285602083850101111561299857600080fd5b611fef826020830160208601612638565b6040815260006129bc604083018561265c565b8281036020840152611fef818561265c565b8385823760609290921b6bffffffffffffffffffffffff1916919092019081526014810191909152603401919050565b60008251612a10818460208701612638565b9190910192915050565b604081526000612a2d604083018461265c565b828103602093840152600081529190910192915050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612a7157600080fd5b83018035915067ffffffffffffffff821115612a8c57600080fd5b602001915036819003821315612aa157600080fd5b9250929050565b8183823760009101908152919050565b828152604060208201526000610a28604083018461265c565b600181811c90821680612ae557607f821691505b6020821081036110fd57634e487b7160e01b600052602260045260246000fd5b805160208083015191908110156110fd5760001960209190910360031b1b16919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108e4576108e4612b29565b601f821115610e9757600081815260208120601f850160051c81016020861015612b795750805b601f850160051c820191505b81811015612b9857828155600101612b85565b505050505050565b815167ffffffffffffffff811115612bba57612bba612345565b612bce81612bc88454612ad1565b84612b52565b602080601f831160018114612c035760008415612beb5750858301515b600019600386901b1c1916600185901b178555612b98565b600085815260208120601f198616915b82811015612c3257888601518255948401946001909101908401612c13565b5085821015612c505787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815160208301516001600160e01b0319808216935060048310156129055760049290920360031b82901b161692915050565b818103818111156108e4576108e4612b2956fea2646970667358221220983cd01c5c096dc341cad82320b7752212091ee642d60b9b2c6242b277561feb64736f6c63430008110033\",\n \"deployedBytecode\": \"0x6080604052600436106101125760003560e01c806379ba5097116100a5578063dedff9c611610074578063ead3fbdf11610059578063ead3fbdf14610203578063f2fde38b146103ae578063ffa1ad74146103ce5761015d565b8063dedff9c614610370578063e30c3978146103905761015d565b806379ba5097146103035780637f23690c146103185780638da5cb5b1461032b578063979024211461035d5761015d565b806354f6127f116100e157806354f6127f1461029b5780636963d438146102bb5780636bb56a14146102db578063715018a6146102ee5761015d565b806301bfba611461020357806301ffc9a71461022b578063318584521461025b57806344c028fe1461027b5761015d565b3661015d57341561015b576101597f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b60405180602001604052806000815250610417565b505b005b600036606060048210156101eb5734156101d6576101d47f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b506040805160208101909152600081526101f8565b6101f5838361070e565b90505b915050805190602001f35b34801561020f57600080fd5b5061021860c881565b6040519081526020015b60405180910390f35b34801561023757600080fd5b5061024b61024636600461231b565b6108ea565b6040519015158152602001610222565b61026e610269366004612530565b610986565b6040516102229190612688565b61028e6102893660046126ea565b610a30565b604051610222919061273f565b3480156102a757600080fd5b5061028e6102b6366004612752565b610acf565b3480156102c757600080fd5b5061026e6102d636600461276b565b610ada565b61028e6102e93660046127e0565b610417565b3480156102fa57600080fd5b5061015b610c3d565b34801561030f57600080fd5b5061015b610cd3565b61015b6103263660046127e0565b610dcb565b34801561033757600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610222565b61015b61036b366004612827565b610e9c565b34801561037c57600080fd5b5061026e61038b366004612881565b611058565b34801561039c57600080fd5b506003546001600160a01b0316610345565b3480156103ba57600080fd5b5061015b6103c93660046128b6565b611103565b3480156103da57600080fd5b5061028e6040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b6060341580159061044857507f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc8314155b156104b3576104b17f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b60006104de7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47611359565b9050606060148251106105a15760006104f6836128d1565b60601c905061050c81635122dded60e11b6112d0565b1561059f57600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161055591339134918c918c910161290d565b6000604051808303816000875af1158015610574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261059c919081019061293b565b91505b505b60006105ba690cfc51aec37c55a4d0b160b01b876113fb565b905060006105c782611359565b90506060601482511061068a5760006105df836128d1565b60601c90506105f581635122dded60e11b6112d0565b1561068857600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161063e91339134918f918f910161290d565b6000604051808303816000875af115801561065d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610685919081019061293b565b91505b505b600480546001600160a01b03191690556040516106ad90859083906020016129a9565b60405160208183030381529060405295508734336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c28a8a6040516106fb9291906129a9565b60405180910390a4505050505092915050565b60606000806107286000356001600160e01b031916611464565b915091503460001415801561073b575080155b156107a5576107a37f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b6000356001600160e01b0319161580156107c657506001600160a01b038216155b156107e45760405180602001604052806000815250925050506108e4565b6001600160a01b038216610837576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081526001600160e01b03196000351660048201526024015b60405180910390fd5b600080836001600160a01b031683610850576000610852565b345b8888333460405160200161086994939291906129ce565b60408051601f1981840301815290829052610883916129fe565b60006040518083038185875af1925050503d80600081146108c0576040519150601f19603f3d011682016040523d82523d6000602084013e6108c5565b606091505b509150915081156108db5793506108e492505050565b80518060208301fd5b92915050565b60006001600160e01b031982167f28af17e600000000000000000000000000000000000000000000000000000000148061093457506001600160e01b03198216631aed5a8560e21b145b8061096857506001600160e01b031982167f94be599900000000000000000000000000000000000000000000000000000000145b80610977575061097782611548565b806108e457506108e482611586565b60606109906115c4565b3415610a19576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610a1091612a1a565b60405180910390a45b610a258585858561161b565b90505b949350505050565b6060610a3a6115c4565b3415610ac3576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610aba91612a1a565b60405180910390a45b610a25858585856117ab565b60606108e482611359565b60608167ffffffffffffffff811115610af557610af5612345565b604051908082528060200260200182016040528015610b2857816020015b6060815260200190600190039081610b135790505b50905060005b82811015610c365760008030868685818110610b4c57610b4c612a44565b9050602002810190610b5e9190612a5a565b604051610b6c929190612aa8565b600060405180830381855af49150503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b509150915081610c0e57805115610bc65780518082602001fd5b60405162461bcd60e51b815260206004820152601960248201527f4c5350393a20626174636843616c6c7320726576657274656400000000000000604482015260640161082e565b80848481518110610c2157610c21612a44565b60209081029190910101525050600101610b2e565b5092915050565b610c456115c4565b6000546001600160a01b0316610c596118b7565b6000546001600160a01b0316610cd057604080516001600160a01b0383166020820152600091810191909152610cd0907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471906060015b60408051601f198184030181529190526001600160a01b038416919061123c565b50565b600354600160a01b900460ff1615610d17576040517f5758dd0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b0316610d2b6119c3565b604080516001600160a01b03831660208201523391810191909152610d74907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa6516947190606001610caf565b604080516001600160a01b0383166020820152338183018190528251808303840181526060909201909252610cd091907f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c9061123c565b3415610dea5760405163f36ba73760e01b815260040160405180910390fd5b6000610df4611a29565b90508015610e8d576001600160a01b03198316690cfc51aec37c55a4d0b160b01b1480610e4b57507fffffffffffff00000000000000000000000000000000000000000000000000008316654b80742de2bf60d01b145b80610e6c57506001600160a01b03198316696773c5a04a6d4300884b60b11b145b15610e8d5760405163199611f160e01b81526004810184905260240161082e565b610e978383611ac3565b505050565b6000610ea6611a29565b90508151835114610ee3576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610f025760405163f36ba73760e01b815260040160405180910390fd5b60005b835181101561105257811561100e578351690cfc51aec37c55a4d0b160b01b90859083908110610f3757610f37612a44565b60200260200101516001600160a01b0319161480610f9657508351654b80742de2bf60d01b90859083908110610f6f57610f6f612a44565b602002602001015179ffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610fd357508351696773c5a04a6d4300884b60b11b90859083908110610fbf57610fbf612a44565b60200260200101516001600160a01b031916145b1561100e57838181518110610fea57610fea612a44565b602002602001015160405163199611f160e01b815260040161082e91815260200190565b61104a84828151811061102357611023612a44565b602002602001015184838151811061103d5761103d612a44565b6020026020010151611ac3565b600101610f05565b50505050565b6060815167ffffffffffffffff81111561107457611074612345565b6040519080825280602002602001820160405280156110a757816020015b60608152602001906001900390816110925790505b50905060005b82518110156110fd576110d88382815181106110cb576110cb612a44565b6020026020010151611359565b8282815181106110ea576110ea612a44565b60209081029190910101526001016110ad565b50919050565b61110b6115c4565b6003805460ff60a01b1916600160a01b17905561112781611b18565b600080546040516001600160a01b03918216929184169183917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a3604080516001600160a01b038381166020830152841681830181905282518083038401815260609092019092526111bd91907faefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f9061123c565b50506003805460ff60a01b19169055565b6000546001600160a01b03828116911614610cd057600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0383166001600160a01b031990911617905550565b6112566001600160a01b038416631aed5a8560e21b6112d0565b15610e9757604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906112899085908590600401612ab8565b6000604051808303816000875af11580156112a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611052919081019061293b565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015611342575060208210155b801561134e5750600081115b979650505050505050565b600081815260016020526040902080546060919061137690612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546113a290612ad1565b80156113ef5780601f106113c4576101008083540402835291602001916113ef565b820191906000526020600020905b8154815290600101906020018083116113d257829003601f168201915b50505050509050919050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c83015291829101604051602081830303815290604052905080610a2890612b05565b60008080611489696773c5a04a6d4300884b60b11b6001600160e01b031986166113fb565b9050600061149682611359565b90506014815110156114af575060009485945092505050565b805160150361153057806014815181106114cb576114cb612a44565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f01000000000000000000000000000000000000000000000000000000000000000361153057611521816128d1565b60601c95600195509350505050565b611539816128d1565b60601c95600095509350505050565b60006001600160e01b031982167fa918fa6b0000000000000000000000000000000000000000000000000000000014806108e457506108e482611b81565b6000806115996301ffc9a760e01b611464565b5090506001600160a01b0381166115b35750600092915050565b6115bd81846112d0565b9392505050565b336115d76000546001600160a01b031690565b6001600160a01b031614611619576040517fbf1169c500000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b565b60608351855114158061163c57508251845114158061163c57508151835114155b15611673576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516000036116ae576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000855167ffffffffffffffff8111156116ca576116ca612345565b6040519080825280602002602001820160405280156116fd57816020015b60608152602001906001900390816116e85790505b50905060005b86518110156117a15761177c87828151811061172157611721612a44565b602002602001015187838151811061173b5761173b612a44565b602002602001015187848151811061175557611755612a44565b602002602001015187858151811061176f5761176f612a44565b60200260200101516117ab565b82828151811061178e5761178e612a44565b6020908102919091010152600101611703565b5095945050505050565b6060846117c4576117bd848484611bbf565b9050610a28565b600185036117fe576001600160a01b038416156117f457604051631820c12560e11b815260040160405180910390fd5b6117bd8383611cf0565b60028503611838576001600160a01b0384161561182e57604051631820c12560e11b815260040160405180910390fd5b6117bd8383611e0a565b60038503611882578215611878576040517f72f2bc6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd8483611ef4565b6040517f7583b3bc0000000000000000000000000000000000000000000000000000000081526004810186905260240161082e565b60025443906000906118cb9060c890612b3f565b905060006118da60c883612b3f565b9050808311806118ea5750600254155b15611932576002839055600380546001600160a01b03191690556040517f81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e790600090a1505050565b81831015611976576040517f1b080942000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161082e565b61198060006111ce565b60006002819055600380546001600160a01b03191690556040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1505050565b6003546001600160a01b03163314611a09576040517f451e452800000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b611a12336111ce565b600380546001600160a01b03191690556000600255565b600080546001600160a01b03163314611ac0576004546001600160a01b03163314611abc5760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c79204f776e6572206f72207265656e746572656420556e69766572736160448201527f6c2052656365697665722044656c656761746520616c6c6f7765640000000000606482015260840161082e565b5060015b90565b6000828152600160205260409020611adb8282612ba0565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051611b0c919061273f565b60405180910390a25050565b306001600160a01b03821603611b5a576040517fe052a6f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03929092169190911790556000600255565b60006001600160e01b031982167f629aa6940000000000000000000000000000000000000000000000000000000014806108e457506108e482611ff8565b606082471015611beb576040516301bf351f60e31b81524760048201526024810184905260440161082e565b611bf482612c60565b6001600160e01b031916846001600160a01b031660007f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e86604051611c3b91815260200190565b60405180910390a4600080856001600160a01b03168585604051611c5f91906129fe565b60006040518083038185875af1925050503d8060008114611c9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ca1565b606091505b5091509150611ce682826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b9695505050505050565b606082471015611d1c576040516301bf351f60e31b81524760048201526024810184905260440161082e565b8151600003611d3e5760405163b81cd8d960e01b815260040160405180910390fd5b600082516020840185f090506001600160a01b038116611d8a576040517f0b07489b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000801b816001600160a01b031660017fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c387604051611dcb91815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b16602082015260340160405160208183030381529060405291505092915050565b60608151600003611e2e5760405163b81cd8d960e01b815260040160405180910390fd5b6000611e478360208551611e429190612c94565b61205f565b90506000611e6484600060208751611e5f9190612c94565b6120c5565b90506000611e738684846121ed565b905082816001600160a01b031660027fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c389604051611eb391815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052935050505092915050565b6060611eff82612c60565b6001600160e01b031916836001600160a01b031660037f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e6000604051611f4791815260200190565b60405180910390a4600080846001600160a01b031684604051611f6a91906129fe565b600060405180830381855afa9150503d8060008114611fa5576040519150601f19603f3d011682016040523d82523d6000602084013e611faa565b606091505b5091509150611fef82826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b95945050505050565b60006001600160e01b031982167f7545acac0000000000000000000000000000000000000000000000000000000014806108e457506301ffc9a760e01b6001600160e01b03198316146108e4565b606083156120555750816115bd565b6115bd83836122f1565b600061206c826020612b3f565b835110156120bc5760405162461bcd60e51b815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e64730000000000000000000000604482015260640161082e565b50016020015190565b6060816120d381601f612b3f565b10156121215760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161082e565b61212b8284612b3f565b8451101561217b5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161082e565b60608215801561219a57604051915060008252602082016040526121e4565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156121d35780518352602092830192016121bb565b5050858452601f01601f1916604052505b50949350505050565b60008347101561223f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161082e565b81516000036122905760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161082e565b8282516020840186f590506001600160a01b0381166115bd5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161082e565b8151156123015781518083602001fd5b8060405162461bcd60e51b815260040161082e919061273f565b60006020828403121561232d57600080fd5b81356001600160e01b0319811681146115bd57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561238457612384612345565b604052919050565b600067ffffffffffffffff8211156123a6576123a6612345565b5060051b60200190565b600082601f8301126123c157600080fd5b813560206123d66123d18361238c565b61235b565b82815260059290921b840181019181810190868411156123f557600080fd5b8286015b8481101561241057803583529183019183016123f9565b509695505050505050565b80356001600160a01b038116811461243257600080fd5b919050565b600067ffffffffffffffff82111561245157612451612345565b50601f01601f191660200190565b600082601f83011261247057600080fd5b813561247e6123d182612437565b81815284602083860101111561249357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126124c157600080fd5b813560206124d16123d18361238c565b82815260059290921b840181019181810190868411156124f057600080fd5b8286015b8481101561241057803567ffffffffffffffff8111156125145760008081fd5b6125228986838b010161245f565b8452509183019183016124f4565b6000806000806080858703121561254657600080fd5b843567ffffffffffffffff8082111561255e57600080fd5b61256a888389016123b0565b955060209150818701358181111561258157600080fd5b8701601f8101891361259257600080fd5b80356125a06123d18261238c565b81815260059190911b8201840190848101908b8311156125bf57600080fd5b928501925b828410156125e4576125d58461241b565b825292850192908501906125c4565b975050505060408701359150808211156125fd57600080fd5b612609888389016123b0565b9350606087013591508082111561261f57600080fd5b5061262c878288016124b0565b91505092959194509250565b60005b8381101561265357818101518382015260200161263b565b50506000910152565b60008151808452612674816020860160208601612638565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156126dd57603f198886030184526126cb85835161265c565b945092850192908501906001016126af565b5092979650505050505050565b6000806000806080858703121561270057600080fd5b843593506127106020860161241b565b925060408501359150606085013567ffffffffffffffff81111561273357600080fd5b61262c8782880161245f565b6020815260006115bd602083018461265c565b60006020828403121561276457600080fd5b5035919050565b6000806020838503121561277e57600080fd5b823567ffffffffffffffff8082111561279657600080fd5b818501915085601f8301126127aa57600080fd5b8135818111156127b957600080fd5b8660208260051b85010111156127ce57600080fd5b60209290920196919550909350505050565b600080604083850312156127f357600080fd5b82359150602083013567ffffffffffffffff81111561281157600080fd5b61281d8582860161245f565b9150509250929050565b6000806040838503121561283a57600080fd5b823567ffffffffffffffff8082111561285257600080fd5b61285e868387016123b0565b9350602085013591508082111561287457600080fd5b5061281d858286016124b0565b60006020828403121561289357600080fd5b813567ffffffffffffffff8111156128aa57600080fd5b610a28848285016123b0565b6000602082840312156128c857600080fd5b6115bd8261241b565b805160208201516bffffffffffffffffffffffff1980821692919060148310156129055780818460140360031b1b83161693505b505050919050565b6001600160a01b0385168152836020820152826040820152608060608201526000611ce6608083018461265c565b60006020828403121561294d57600080fd5b815167ffffffffffffffff81111561296457600080fd5b8201601f8101841361297557600080fd5b80516129836123d182612437565b81815285602083850101111561299857600080fd5b611fef826020830160208601612638565b6040815260006129bc604083018561265c565b8281036020840152611fef818561265c565b8385823760609290921b6bffffffffffffffffffffffff1916919092019081526014810191909152603401919050565b60008251612a10818460208701612638565b9190910192915050565b604081526000612a2d604083018461265c565b828103602093840152600081529190910192915050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612a7157600080fd5b83018035915067ffffffffffffffff821115612a8c57600080fd5b602001915036819003821315612aa157600080fd5b9250929050565b8183823760009101908152919050565b828152604060208201526000610a28604083018461265c565b600181811c90821680612ae557607f821691505b6020821081036110fd57634e487b7160e01b600052602260045260246000fd5b805160208083015191908110156110fd5760001960209190910360031b1b16919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108e4576108e4612b29565b601f821115610e9757600081815260208120601f850160051c81016020861015612b795750805b601f850160051c820191505b81811015612b9857828155600101612b85565b505050505050565b815167ffffffffffffffff811115612bba57612bba612345565b612bce81612bc88454612ad1565b84612b52565b602080601f831160018114612c035760008415612beb5750858301515b600019600386901b1c1916600185901b178555612b98565b600085815260208120601f198616915b82811015612c3257888601518255948401946001909101908401612c13565b5085821015612c505787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815160208301516001600160e01b0319808216935060048310156129055760049290920360031b82901b161692915050565b818103818111156108e4576108e4612b2956fea2646970667358221220983cd01c5c096dc341cad82320b7752212091ee642d60b9b2c6242b277561feb64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n","import {\n type Abi,\n type AbiParameter,\n type Address,\n type Chain,\n decodeAbiParameters,\n encodeAbiParameters,\n getAddress,\n isAddress,\n isAddressEqual,\n parseAbiParameters,\n zeroAddress,\n} from 'viem'\nimport { CacheKeyPrefix, makeCacheKey } from './cache'\nimport { FUNCTION_DICTIONARY_URL, OPENCHAIN_DICTIONARY_URL } from './constants'\nimport { createLRUCache } from './lruCache'\nimport type { DecoderOptions, ResultType } from './types'\nimport { createNamedArgs, customDecodeFunctionData } from './utils'\n\n// Default cache for backward compatibility\nconst defaultCache = createLRUCache({\n max: 500,\n ttl: 60 * 1000, // 1 minute\n errorTTL: 30 * 1000, // 30 seconds\n})\n\n/**\n * Decode function parameter types from a function signature\n *\n * @param signature Function signature\n * @returns Array of parameter types\n * @throws Error if the signature is invalid\n */\nfunction generateNamedAbiParameters(signature: string): AbiParameter[] {\n const start = signature.indexOf('(')\n const end = signature.lastIndexOf(')')\n if (start === -1 || end === -1 || end <= start) {\n throw new Error(`Invalid signature: ${signature}`)\n }\n\n const paramString = signature.slice(start + 1, end)\n\n const rawParams = parseAbiParameters(paramString) as AbiParameter[]\n\n const assignNames = (params: AbiParameter[], prefix: string) => {\n return params.map((param: AbiParameter, index: number) => {\n const name = `${prefix}${index + 1}`\n if (param.type === 'tuple' && 'components' in param) {\n const components: AbiParameter[] = assignNames(\n param.components as AbiParameter[],\n `${name}_`\n )\n return { ...param, name, components } as AbiParameter\n }\n return { ...param, name } as AbiParameter\n })\n }\n\n return assignNames(rawParams, 'arg')\n}\n\nexport async function fetchAbi(\n chain: Chain,\n address: Address,\n options?: DecoderOptions\n) {\n const explorer = chain.blockExplorers?.default?.apiUrl\n if (!explorer) return undefined\n\n const cache = options?.cache ?? defaultCache\n let key = getAddress(address)\n const cacheKey = makeCacheKey(CacheKeyPrefix.ABI, key, String(chain.id))\n\n return cache.getOrSet(\n cacheKey,\n async (signal) => {\n let isProxy = false\n let decoderVerifiedContract = false\n let factoryName: string | undefined\n const _originalKey = key\n\n const addressUrl = new URL(`/api/v2/addresses/${key}`, explorer)\n const addressRes = await fetch(addressUrl, { signal })\n if (addressRes.ok) {\n const data = (await addressRes.json()) as {\n implementations?: { address?: Address; address_hash?: Address }[]\n is_contract?: boolean\n is_verified?: boolean\n proxy_type?: string\n name?: string\n }\n const {\n implementations: [\n { address: _address, address_hash: _addressHash } = {},\n ] = [],\n is_contract,\n is_verified: __decoderVerifiedContract,\n proxy_type,\n name: __factoryName,\n } = data\n const address = _address || _addressHash\n factoryName = __factoryName\n decoderVerifiedContract = Boolean(__decoderVerifiedContract || false)\n if (\n address &&\n is_contract &&\n proxy_type !== 'null' &&\n proxy_type != null\n ) {\n key = address as `0x${string}`\n isProxy = true // We resolved from proxy to implementation\n }\n }\n\n if (!decoderVerifiedContract) {\n // If the address is not a verified contract, return undefined\n return undefined\n }\n\n const url = new URL(`/api/v2/smart-contracts/${key}`, explorer)\n const res = await fetch(url, { signal })\n\n if (!res.ok) {\n return undefined\n }\n\n const result = await res.json()\n const {\n name = factoryName || 'UnknownName',\n abi,\n is_verified,\n } = result || {}\n\n if (abi && is_verified) {\n return {\n abi,\n __decoderVerifiedContract: decoderVerifiedContract, // If we have an ABI, treat it as verified\n __decoderIsProxy: isProxy,\n name,\n explorer,\n }\n }\n return undefined\n },\n { signal: options?.signal }\n ) as Promise<\n | {\n abi: Abi\n __decoderVerifiedContract: boolean\n __decoderIsProxy: boolean\n name: string\n explorer: string\n }\n | undefined\n >\n}\n\n/**\n * Gets a function signature. Returns an empty string if hexSignature\n * is not provided or an error is thrown.\n * If hexSignature is provided, it checks the cache storage.\n * If the signature is not found, it fetches 4bytes dictionary and stores\n * the result in the cache storage.\n *\n * @param string hexSignature - first 4 bytes of a payload\n * @param boolean preferError - if true, prefer error signatures\n * @returns function signature as a string\n */\nexport const getFunctionSignature = async (\n chain: Chain,\n input?: `0x${string}`,\n to?: `0x${string}`,\n preferError = false,\n options?: DecoderOptions\n): Promise<\n | (ResultType & {\n __decoder: string\n __decoderVerifiedContract?: boolean\n __decoderIsProxy?: boolean\n standard?: string\n })\n | undefined\n> => {\n // Remove 0x prefix\n if (to && isAddress(to) && isAddressEqual(to, zeroAddress)) {\n return {\n __decoder: 'none',\n standard: 'unknown',\n to,\n input,\n resultType: 'raw',\n }\n }\n const data = input?.slice(2) as string\n // Get the first 8 chars (4 bytes) of the data\n const selector = data.slice(0, 8)\n if (selector) {\n if (to) {\n // Wait for cached or new promise to resolve\n const info = await fetchAbi(chain, to, options)\n if (info) {\n // The explorer returned it as a verified abi.\n // Use the returned abi to decode the function signature.\n const decoded = customDecodeFunctionData({\n abi: info.abi,\n data: input || '0x',\n }) as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: readonly unknown[]\n }\n if (decoded) {\n return {\n ...decoded,\n __decoder: info.explorer,\n __decoderVerifiedContract: info.__decoderVerifiedContract,\n __decoderIsProxy: info.__decoderIsProxy,\n standard: info.name,\n }\n }\n }\n }\n // If we didn't resolve it yet, then try to fetch from one of the 4bytes dictionaries.\n const cache = options?.cache ?? defaultCache\n const cacheKey = makeCacheKey(CacheKeyPrefix.FUNCTION_SIGNATURE, selector)\n\n const signatureEntry = cache.getOrSet(\n cacheKey,\n async (signal) => {\n // Try our proxy first.\n const url = `${OPENCHAIN_DICTIONARY_URL}?function=0x${selector}`\n let __decoder = new URL(OPENCHAIN_DICTIONARY_URL).hostname\n\n try {\n const res = await fetch(url, { signal })\n if (res.ok) {\n const result = await res.json()\n if (result) {\n result.__decoder = __decoder\n return result\n }\n }\n } catch {\n // Continue to fallback\n }\n\n // Fallback to function dictionary\n __decoder = new URL(FUNCTION_DICTIONARY_URL).hostname\n const fallbackRes = await fetch(\n `${FUNCTION_DICTIONARY_URL}/${selector}`,\n { signal }\n )\n if (!fallbackRes.ok) {\n return undefined\n }\n const fallbackResult = await fallbackRes.json()\n if (fallbackResult) {\n fallbackResult.__decoder = __decoder\n }\n return fallbackResult\n },\n { signal: options?.signal }\n )\n // Wait for cached or new promise to resolve\n const methods = (await signatureEntry) as any\n if (methods?.results?.length > 0) {\n // We got one or more results.\n let search = methods.results.reverse()\n if (preferError) {\n // In case we're preferring Errors,\n // then look for all methods containing Error\n // and put them first.\n const withError = search.filter((result: Record<string, unknown>) =>\n /Error/.test(result.text_signature as string)\n )\n const withoutError = search.filter(\n (result: Record<string, unknown>) =>\n !/Error/.test(result.text_signature as string)\n )\n search = [...withError, ...withoutError]\n }\n // Go through each one and try to encode/decode the data\n // to make sure it works.\n for (const result of search) {\n try {\n const params: AbiParameter[] = generateNamedAbiParameters(\n result.text_signature || result.name\n )\n // Decode arguments according to function spec\n const args = decodeAbiParameters(params, `0x${data.slice(8)}`)\n\n // Build arg list (if there are bool values which are no 0 or 1 we can assume it's invalid)\n // Other values are validated in encodeParameters.\n const encodeArgs = Array.from({ length: params.length }).map(\n (_val, index) => {\n if (params[index].type === 'bool') {\n const val = args[`${index}`]\n if (val !== 1 && val !== 0 && val !== true && val !== false) {\n // Due to javascript truthyness any non-empty or non-zero value is encoded as true without a problem.\n // The output packet won't match but there is really no reason to even try.\n throw new Error('Invalid boolean value')\n }\n }\n if (params[index].type === 'address') {\n const val = args[`${index}`] as `0x${string}`\n if (!isAddress(val)) {\n throw new Error(`Invalid address value ${val}`)\n }\n }\n return args[`${index}`] ?? '0x'\n }\n )\n\n // Re-encode according to function spec.\n const newData = encodeAbiParameters(\n params,\n encodeArgs as never\n ).slice(2)\n\n if (data.slice(8) === newData) {\n return {\n resultType: 'execute',\n standard: 'unknown',\n sig: `0x${selector}`,\n functionName: result.text_signature.replace(/\\(.*$/, ''),\n ...(args\n ? {\n ...createNamedArgs(encodeArgs, params),\n }\n : {}),\n __decoder: methods.__decoder || FUNCTION_DICTIONARY_URL,\n } as ResultType & {\n __decoder: string\n __decoderVerifiedContract?: boolean\n }\n }\n } catch (_error) {\n // Ignore to try next record\n }\n }\n }\n }\n return undefined\n}\n","/**\n * LRU Cache implementation of DecoderCache interface\n */\n\nimport { LRUCache } from 'lru-cache'\nimport type { CacheEntry, CacheOptions, DecoderCache } from './cache'\n\n/**\n * Options for creating an LRU cache instance\n */\nexport interface LRUCacheOptions {\n /** Maximum number of items in cache */\n max?: number\n /** Default TTL in milliseconds */\n ttl?: number\n /** Default error TTL in milliseconds */\n errorTTL?: number\n /** Default stale-while-revalidate time in milliseconds */\n staleWhileRevalidate?: number\n}\n\n/**\n * LRU implementation of DecoderCache\n */\nexport class LRUDecoderCache implements DecoderCache {\n private cache: LRUCache<string, CacheEntry<unknown>>\n private promises: Map<string, Promise<unknown>>\n private defaultTTL: number\n private defaultErrorTTL: number\n private defaultStaleWhileRevalidate?: number\n\n constructor(options: LRUCacheOptions = {}) {\n this.defaultTTL = options.ttl ?? 5 * 60 * 1000 // 5 minutes\n this.defaultErrorTTL = options.errorTTL ?? 30 * 1000 // 30 seconds\n this.defaultStaleWhileRevalidate = options.staleWhileRevalidate\n\n this.cache = new LRUCache({\n max: options.max ?? 1000,\n })\n\n this.promises = new Map()\n }\n\n async get<T>(key: string): Promise<CacheEntry<T> | undefined> {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined\n if (!entry) {\n return undefined\n }\n\n // Check if expired\n if (entry.expires && Date.now() > entry.expires) {\n this.cache.delete(key)\n return undefined\n }\n\n return entry\n }\n\n async set<T>(key: string, value: T, options?: CacheOptions): Promise<void> {\n const now = Date.now()\n const ttl =\n options?.ttl ?? (options?.errorTTL ? options.errorTTL : this.defaultTTL)\n const isError = options?.errorTTL !== undefined\n\n const entry: CacheEntry<T> = {\n value,\n expires: now + ttl,\n isError,\n }\n\n const staleWhileRevalidate =\n options?.staleWhileRevalidate ?? this.defaultStaleWhileRevalidate\n if (staleWhileRevalidate) {\n entry.stale = now + ttl + staleWhileRevalidate\n }\n\n this.cache.set(key, entry as CacheEntry<unknown>)\n }\n\n async delete(key: string): Promise<void> {\n this.cache.delete(key)\n }\n\n async getMany<T>(keys: string[]): Promise<Map<string, CacheEntry<T>>> {\n const result = new Map<string, CacheEntry<T>>()\n\n for (const key of keys) {\n const entry = await this.get<T>(key)\n if (entry) {\n result.set(key, entry)\n }\n }\n\n return result\n }\n\n async setMany<T>(\n entries: Array<{ key: string; value: T; options?: CacheOptions }>\n ): Promise<void> {\n for (const { key, value, options } of entries) {\n await this.set(key, value, options)\n }\n }\n\n async clear(): Promise<void> {\n this.cache.clear()\n this.promises.clear()\n }\n\n async getOrSet<T>(\n key: string,\n factory: (signal?: AbortSignal) => Promise<T>,\n options?: CacheOptions & { signal?: AbortSignal }\n ): Promise<T> {\n // Check cache first\n const cached = await this.get<T>(key)\n const now = Date.now()\n\n // If we have a valid (non-expired) entry, return it\n if (cached && (!cached.expires || now < cached.expires)) {\n return cached.value\n }\n\n // If we have a stale entry and stale-while-revalidate is enabled\n if (cached?.stale && now < cached.stale && !this.promises.has(key)) {\n // Return stale value and revalidate in background\n const backgroundPromise = factory(options?.signal)\n .then(async (fresh) => {\n await this.set(key, fresh, options)\n return fresh\n })\n .catch(() => {\n // On error, keep the stale value\n return cached.value\n })\n .finally(() => {\n this.promises.delete(key)\n })\n\n this.promises.set(key, backgroundPromise)\n return cached.value\n }\n\n // Check if we have an in-flight promise\n const existingPromise = this.promises.get(key) as Promise<T> | undefined\n if (existingPromise) {\n return existingPromise\n }\n\n // No valid cache entry, fetch new value\n const promise = factory(options?.signal)\n .then(async (value) => {\n await this.set(key, value, options)\n return value\n })\n .catch(async (error) => {\n // Cache the error with shorter TTL\n await this.set(key, error as T, {\n ...options,\n ttl: options?.errorTTL ?? this.defaultErrorTTL,\n errorTTL: options?.errorTTL ?? this.defaultErrorTTL,\n })\n throw error\n })\n .finally(() => {\n this.promises.delete(key)\n })\n\n this.promises.set(key, promise)\n return promise as Promise<T>\n }\n}\n\n/**\n * Create a default LRU cache instance\n */\nexport function createLRUCache(options?: LRUCacheOptions): DecoderCache {\n return new LRUDecoderCache(options)\n}\n","import { abi as LSP9 } from '@lukso/lsp-smart-contracts/artifacts/LSP9Vault.json'\nimport type { AbiParameter } from 'viem'\nimport { decodeEvent } from '../events'\nimport { fetchAbi, getFunctionSignature } from '../functionSignature'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultShared,\n ResultType,\n} from '../types'\nimport { standardPlugin } from '.'\n\nexport const enhanceRetrieveAbiPlugin = standardPlugin(\n LSP9,\n {\n abiName: 'Internal',\n decoderName: 'explorer',\n name: 'abiRetrieve',\n usesAsync: true,\n priority: 0,\n },\n {\n enhance: async () => {\n return undefined\n },\n overrideEnhance: enhanceRetrieveAbi,\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n if (!log) {\n return undefined\n }\n const info = await fetchAbi(options.chain, log.address)\n // TBD. This will only work with explorer download of abi\n if (info) {\n const result = decodeEvent(options.chain, info.abi, log)\n if (result) {\n return { ...result, __decoder: info.explorer }\n }\n }\n return undefined\n },\n }\n)\n/**\n *\n * @param result enhanced if it's LSP8\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceRetrieveAbi(\n result: ResultType & ResultShared & { moduleHint?: string },\n _pluginOptions: PluginOptions,\n options: DecoderOptions\n) {\n const { input, to, from, value } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n try {\n const decoded = await getFunctionSignature(\n options.chain,\n input,\n (to || undefined) as `0x${string}` | undefined,\n options.preferError\n )\n if (decoded) {\n return {\n ...result,\n ...decoded,\n resultType: 'execute',\n to,\n from,\n value,\n input,\n } as DecoderResult\n }\n } catch {}\n return undefined\n}\n\nexport default enhanceRetrieveAbiPlugin\n","// Re-export standardPlugin and helpers from the new file\nexport {\n createAggregationKey,\n standardPlugin,\n standardSchemaPlugin,\n} from './standardPlugin'\n\nimport burntPix from './enhanceBurntPix'\n// Import plugins - now standardPlugin is available from ./standardPlugin\nimport graffiti from './enhanceGraffiti'\nimport profile from './enhanceLSP0ERC725Account'\nimport keyManager from './enhanceLSP6KeyManager'\nimport lsp7 from './enhanceLSP7DigitalAsset'\nimport lsp8 from './enhanceLSP8IdentifiableDigitalAsset'\nimport lsp9 from './enhanceLSP9Vault'\nimport lsp26 from './enhanceLSP26FollowerSystem'\nimport abiRetrieve from './enhanceRetrieveAbi'\nimport schemaDefaultPlugin from './schemaDefault'\n\n// Force evaluation of plugins to ensure they register (prevent tree-shaking)\n// These plugins self-register via standardPlugin when imported\n;[profile, keyManager, lsp7, lsp8, lsp9, lsp26, burntPix].forEach((p) => {\n p\n})\n\nimport type { Hex } from 'viem'\nimport type {\n DecoderOptions,\n DecoderPlugin,\n Info,\n ResultSetData,\n SchemaPlugin,\n} from '../types'\nimport { getArgByName } from '../utils'\n\nexport const defaultPlugins: ReadonlyArray<DecoderPlugin> = Object.freeze([\n graffiti,\n keyManager,\n profile,\n lsp7,\n lsp8,\n lsp9,\n lsp26,\n abiRetrieve,\n burntPix,\n])\n\nexport const defaultSchemaPlugins: ReadonlyArray<SchemaPlugin> = Object.freeze([\n schemaDefaultPlugin,\n])\n\nexport default defaultPlugins\n\nexport async function decodeKeyValue(\n result: ResultSetData,\n options: DecoderOptions\n): Promise<Info | undefined> {\n const key: Hex = (getArgByName(result.args, 'key') as Hex) ?? '0x'\n const value: Hex = (getArgByName(result.args, 'value') as Hex) ?? '0x'\n return await decodeKeyValueRaw(key, value, options)\n}\n\nexport async function decodeKeyValueRaw(\n key: Hex,\n value: Hex,\n options: DecoderOptions\n): Promise<Info | undefined> {\n for (const schemaPlugin of options.schemaPlugins) {\n try {\n const output = await schemaPlugin(key, value)\n if (output) {\n return output\n }\n } catch {}\n }\n return undefined\n}\n\n// Import registry and register default plugins when this module loads\nimport { pluginRegistry } from '../registry'\n\n// Register graffiti manually since it doesn't use standardPlugin\npluginRegistry.register('graffiti', graffiti, {\n priority: 100,\n required: false,\n})\n\n// Register abiRetrieve manually with async flag\npluginRegistry.register('abiRetrieve', abiRetrieve, {\n priority: 1,\n required: false,\n usesAsync: true,\n})\n\n// Register default schema plugin\npluginRegistry.registerSchema('default-schema', schemaDefaultPlugin, {\n priority: 100,\n required: false,\n})\n\n// Note: Other plugins using standardPlugin will auto-register when imported\n","import type { Hex } from 'viem'\nimport { decodeKeyValueRaw } from '../decoder/plugins'\nimport { pluginRegistry } from '../decoder/registry'\nimport type { DecodeEventResult, DecoderOptions } from '../decoder/types'\nimport type { ServerDecoderCaches } from './caches'\nimport type { ServerDecoderOptions } from './types'\n\n/**\n * Decode an array of raw log events using the registered decoder plugins.\n *\n * Uses the same plugin iteration pattern as transaction.ts:\n * try each plugin's `decodeEvent`, first match wins, raw log kept as fallback.\n *\n * For DataChanged events, also decodes the ERC725Y key-value pair using\n * the schema plugin system (same as setData transaction decoding).\n */\nexport async function decodeEventLogs(\n logs: DecodeEventResult[],\n options: ServerDecoderOptions,\n _caches: ServerDecoderCaches\n): Promise<DecodeEventResult[]> {\n const { chain } = options\n const plugins = await pluginRegistry.getAll({ syncOnly: true })\n const schemaPlugins = pluginRegistry.getAllSchema()\n\n const decoderOptions: DecoderOptions = {\n chain,\n plugins,\n schemaPlugins,\n wrappers: [],\n async: false,\n }\n\n const results: DecodeEventResult[] = []\n\n for (const log of logs) {\n let decoded: DecodeEventResult\n for (const plugin of plugins) {\n decoded = await plugin.decodeEvent(log, decoderOptions)\n if (decoded) break\n }\n const result = decoded ?? log\n\n // For DataChanged events, decode the ERC725Y key-value pair\n if (result?.eventName === 'DataChanged' && result.args) {\n try {\n const dataKey = result.args.find((a) => a.name === 'dataKey')?.value as\n | Hex\n | undefined\n const dataValue = result.args.find((a) => a.name === 'dataValue')\n ?.value as Hex | undefined\n if (dataKey) {\n const info = await decodeKeyValueRaw(\n dataKey,\n dataValue ?? '0x',\n decoderOptions\n )\n if (info) {\n ;(result as Record<string, unknown>).info = info\n }\n }\n } catch {\n // Schema decoding failed — keep event without info\n }\n }\n\n results.push(result)\n }\n\n return results\n}\n","import { type Address, type Hex, isHex, size } from 'viem'\nimport type { ArrayArgs } from '../decoder/types'\nimport { getArgByName } from '../decoder/utils'\nimport type { DataKey } from '../types'\n\nexport interface CollectedAddress {\n key: DataKey\n path: Array<string | number>\n parent?: Record<string, unknown>\n root: unknown\n}\n\n/**\n * Collect all DataKeys from a data structure\n * This is a simplified version that just returns the keys\n * @param data - The data to analyze\n * @param skipGqlTypes - Whether to skip GraphQL type fields\n * @param existingKeys - Optional existing keys to merge with\n */\nexport function collectDataKeys(\n data: unknown,\n skipGqlTypes = true,\n existingKeys?: DataKey[]\n): DataKey[] {\n const addresses = new Set<string>()\n\n // Add existing keys to the set first\n if (existingKeys) {\n for (const key of existingKeys) {\n if (typeof key === 'string') {\n addresses.add(key)\n } else {\n addresses.add(JSON.stringify(key))\n }\n }\n }\n\n // Check if this is an LSP8 decoded transaction and collect tokens\n function collectLSP8Tokens(obj: Record<string, unknown>): void {\n if (\n obj.standard !== 'LSP8IdentifiableDigitalAsset' ||\n !obj.to ||\n !obj.args\n ) {\n return\n }\n\n const contractAddress = obj.to as string\n const args = obj.args as ArrayArgs\n\n // Check for single tokenId\n const tokenId = getArgByName(args, 'tokenId') as string | undefined\n if (tokenId && tokenId !== null && tokenId !== '0x') {\n addresses.add(`${contractAddress}:${tokenId}`)\n }\n\n // Check for multiple tokenIds\n const tokenIds = getArgByName(args, 'tokenIds') as string[] | undefined\n if (Array.isArray(tokenIds)) {\n for (const tokenId of tokenIds) {\n // Skip null/undefined/empty tokens\n if (tokenId && tokenId !== null && tokenId !== '0x') {\n addresses.add(`${contractAddress}:${tokenId}`)\n }\n }\n }\n }\n\n function collect(\n obj: unknown,\n parent?: Record<string, unknown>,\n visited = new WeakSet(),\n path: string[] = []\n ): void {\n // Circular reference detection\n if (obj && typeof obj === 'object' && visited.has(obj)) {\n return\n }\n\n if (obj && typeof obj === 'object') {\n visited.add(obj)\n }\n // Handle string case first\n if (typeof obj === 'string' && obj.startsWith('0x')) {\n // Check if this is a composite address:tokenId format\n if (obj.includes(':')) {\n const [addressPart, tokenIdPart] = obj.split(':')\n // Validate both parts are hex strings\n if (\n addressPart.startsWith('0x') &&\n tokenIdPart.startsWith('0x') &&\n isHex(addressPart) &&\n size(addressPart as Hex) === 20\n ) {\n addresses.add(obj) // Just add the composite string directly\n return\n }\n }\n\n // Use regex to detect zero-padded addresses\n const isPaddedAddress = /^0x0*([a-fA-F0-9]{40})$/.test(obj)\n\n if (isPaddedAddress || (isHex(obj) && size(obj as Hex) === 20)) {\n // Skip if parent has __gqltype\n if (parent && skipGqlTypes && '__gqltype' in parent) {\n return\n }\n\n // Extract the actual address (remove padding if needed)\n const address = isPaddedAddress\n ? (obj.replace(/^0x0*([a-fA-F0-9]{40})$/, '0x$1') as Address)\n : obj\n\n // Skip if too many zeros (likely not an address)\n if (\n address\n .slice(2)\n .split('')\n .filter((c: string) => c === '0').length > 10\n ) {\n return\n }\n\n addresses.add(address)\n }\n return\n }\n\n if (!obj || typeof obj !== 'object') return\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n collect(obj[i], parent, visited, [...path, `[${i}]`])\n }\n } else {\n const record = obj as Record<string, unknown>\n\n // Check if this is an LSP8 transaction at the root level\n if ('standard' in record && 'to' in record && 'args' in record) {\n collectLSP8Tokens(record)\n }\n\n for (const [key, value] of Object.entries(record)) {\n collect(value, record, visited, [...path, key])\n }\n }\n }\n\n collect(data)\n\n // Convert to DataKey array (all as strings)\n return Array.from(addresses) as DataKey[]\n}\n","import { collectDataKeys } from '../core/addressCollector'\nimport { pluginRegistry } from '../decoder/registry'\nimport { decodeTransaction as decodeTransactionCore } from '../decoder/transaction'\nimport type { DecoderResult } from '../decoder/types'\nimport { needsEnhancement } from '../decoder/utils'\nimport type { ServerDecoderCaches } from './caches'\nimport type { ServerDecoderOptions } from './types'\n\n/**\n * Decode a single transaction with time-bounded enhancement\n */\nexport async function decodeTransactionSync(\n transaction: DecoderResult,\n options: ServerDecoderOptions,\n caches: ServerDecoderCaches\n): Promise<DecoderResult> {\n const startTime = Date.now()\n const { timeoutMs = 800, enableEnhancement = true, chain } = options\n\n // Check transaction cache first\n if (transaction.hash) {\n const cached = caches.getTransaction(transaction.hash)\n if (cached) {\n return cached\n }\n }\n\n try {\n // Phase 1: Immediate decode (sync plugins only)\n const phase1Start = Date.now()\n const plugins = await pluginRegistry.getAll({ syncOnly: true })\n const schemaPlugins = pluginRegistry.getAllSchema()\n\n const immediateOptions = {\n chain,\n plugins,\n schemaPlugins,\n wrappers: [],\n async: false,\n }\n const immediateResult = await decodeTransactionCore(\n transaction,\n immediateOptions\n )\n\n if (!immediateResult) {\n return {\n ...createErrorResult(transaction),\n phase: 'immediate',\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n }\n\n let currentResult: DecoderResult = immediateResult\n let phase: 'immediate' | 'enhanced' | 'complete' = 'immediate'\n\n // Transfer collected wrappers if any\n if (immediateOptions.wrappers.length > 0) {\n ;(currentResult as any).wrappers = immediateOptions.wrappers\n }\n\n // Collect addresses from the decoded result\n const addresses = collectDataKeys(currentResult)\n currentResult.addresses = addresses\n\n // Check if we have time for enhancement\n const phase1Time = Date.now() - phase1Start\n if (enableEnhancement && phase1Time < timeoutMs * 0.6) {\n // Check if enhancement is actually needed\n if (!needsEnhancement(currentResult)) {\n // Already fully decoded during immediate phase\n phase = 'enhanced'\n } else {\n // Phase 2: Enhancement with async plugins\n try {\n const allPlugins = await pluginRegistry.getAll()\n const enhancedOptions = {\n chain,\n plugins: allPlugins,\n schemaPlugins,\n wrappers: [],\n async: true,\n }\n const enhancedResult = await Promise.race([\n decodeTransactionCore(transaction, enhancedOptions),\n // Timeout for phase 2\n new Promise<null>((resolve) =>\n setTimeout(() => resolve(null), timeoutMs * 0.6 - phase1Time)\n ),\n ])\n\n if (enhancedResult) {\n currentResult = enhancedResult\n phase = 'enhanced'\n\n // Merge wrappers from both phases (immediate + enhanced)\n const allWrappers = [\n ...((immediateOptions.wrappers || []) as any[]),\n ...(enhancedOptions.wrappers || []),\n ].filter(\n (w, i, arr) =>\n // Deduplicate by checking if this is the first occurrence\n arr.findIndex(\n (x) => JSON.stringify(x) === JSON.stringify(w)\n ) === i\n )\n\n if (allWrappers.length > 0) {\n ;(currentResult as any).wrappers = allWrappers\n }\n\n // Re-collect addresses from enhanced result\n currentResult.addresses = collectDataKeys(currentResult)\n }\n } catch (error) {\n console.error('Enhancement failed:', error)\n }\n }\n }\n\n const result: DecoderResult = {\n ...currentResult,\n phase,\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n\n // Cache the result if we have a hash\n if (transaction.hash) {\n caches.setTransaction(transaction.hash, result)\n }\n\n return result\n } catch (error) {\n console.error('Failed to decode transaction:', error)\n return {\n ...createErrorResult(transaction),\n phase: 'immediate',\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n }\n}\n\nfunction createErrorResult(transaction: DecoderResult): DecoderResult {\n return {\n ...transaction,\n isDecoded: false,\n resultType: 'error',\n errorType: 'UNKNOWN',\n sig: '0x' as `0x${string}`,\n addresses: [],\n } as DecoderResult\n}\n","import { collectDataKeys } from '../core/addressCollector'\nimport { pluginRegistry } from '../decoder/registry'\nimport { decodeTransaction as decodeTransactionCore } from '../decoder/transaction'\nimport type { DecoderResult, ResultShared } from '../decoder/types'\nimport { needsEnhancement } from '../decoder/utils'\nimport type { ServerDecoderCaches } from './caches'\nimport type { BatchDecodeResult, ServerDecoderOptions } from './types'\n\n/**\n * Decode multiple transactions with batching and time budget\n */\nexport async function decodeTransactionsBatch(\n transactions: DecoderResult[],\n options: ServerDecoderOptions,\n caches: ServerDecoderCaches\n): Promise<BatchDecodeResult> {\n const startTime = Date.now()\n const { timeoutMs = 800, enableEnhancement = true, chain } = options\n\n // Step 1: Check cache for all transactions\n const results: (DecoderResult | null)[] = transactions.map((tx) => {\n if (tx.transactionHash) {\n const cached = caches.getTransaction(tx.transactionHash)\n if (cached) return cached\n }\n return null\n })\n\n // Find uncached transactions\n const uncachedIndexes: number[] = []\n const uncachedTransactions: DecoderResult[] = []\n results.forEach((result, index) => {\n if (!result) {\n uncachedIndexes.push(index)\n uncachedTransactions.push(transactions[index])\n }\n })\n\n // If all are cached, return early\n if (uncachedTransactions.length === 0) {\n return {\n results: results as DecoderResult[],\n }\n }\n\n try {\n // Get plugins once for all transactions\n const syncPlugins = await pluginRegistry.getAll({ syncOnly: true })\n const allPlugins = await pluginRegistry.getAll()\n const schemaPlugins = pluginRegistry.getAllSchema()\n\n // Phase 1: Immediate decode for all uncached transactions\n const phase1Start = Date.now()\n const immediateOptionsArray = uncachedTransactions.map(() => ({\n chain,\n plugins: syncPlugins,\n schemaPlugins,\n wrappers: [],\n async: false,\n }))\n\n const immediateResults: DecoderResult[] = (\n await Promise.all(\n uncachedTransactions.map(async (tx, i) => {\n return await decodeTransactionCore(tx, immediateOptionsArray[i])\n })\n )\n ).filter(Boolean) as DecoderResult[]\n\n // Create result objects and collect addresses\n const newResults: DecoderResult[] = immediateResults\n .map((result, i) => {\n const data = result || createErrorResult(uncachedTransactions[i])\n\n // Transfer wrappers from immediate phase options\n if (immediateOptionsArray[i].wrappers.length > 0) {\n ;(data as any).wrappers = immediateOptionsArray[i].wrappers\n }\n\n // Collect addresses from the decoded result\n data.addresses = collectDataKeys(data)\n ;(data as ResultShared).timeTaken = Date.now() - startTime\n return data\n })\n .filter(Boolean) as DecoderResult[]\n\n // Check if we have time for enhancement\n const phase1Time = Date.now() - phase1Start\n if (enableEnhancement && phase1Time < timeoutMs * 0.6) {\n // Phase 2: Enhancement with async plugins (batch all transactions)\n try {\n const enhancedOptionsArray = uncachedTransactions.map(() => ({\n chain,\n plugins: allPlugins,\n schemaPlugins,\n wrappers: [],\n async: true,\n }))\n\n const enhancePromises = uncachedTransactions.map((tx, i) => {\n // Only enhance if immediate decode succeeded\n if (!immediateResults[i]) return null\n\n // Check if enhancement is actually needed\n if (!needsEnhancement(immediateResults[i])) {\n // Already fully decoded during immediate phase\n return null\n }\n\n return decodeTransactionCore(tx, enhancedOptionsArray[i])\n })\n\n // Wait for all enhancements with remaining time budget\n const _remainingTime = timeoutMs * 0.6 - phase1Time\n const enhancedResults = await Promise.all(enhancePromises)\n\n // Update results with enhanced data\n enhancedResults.forEach((enhanced, i) => {\n if (enhanced) {\n // Merge wrappers from both phases (immediate + enhanced)\n const immediateWrappers = immediateOptionsArray[i].wrappers || []\n const enhancedWrappers = enhancedOptionsArray[i].wrappers || []\n const allWrappers = [\n ...immediateWrappers,\n ...enhancedWrappers,\n ].filter(\n (w, idx, arr) =>\n // Deduplicate by checking if this is the first occurrence\n arr.findIndex(\n (x) => JSON.stringify(x) === JSON.stringify(w)\n ) === idx\n )\n\n // Enhancement returned a new result\n newResults[i] = enhanced\n\n // Add merged wrappers if any\n if (allWrappers.length > 0) {\n ;(newResults[i] as any).wrappers = allWrappers\n }\n\n // Re-collect addresses from enhanced result\n newResults[i].addresses = collectDataKeys(enhanced)\n newResults[i].phase = 'enhanced'\n } else if (\n immediateResults[i] &&\n !needsEnhancement(immediateResults[i])\n ) {\n // Enhancement was skipped because already fully decoded\n newResults[i].phase = 'enhanced'\n }\n })\n } catch (error) {\n console.error('Batch enhancement failed:', error)\n }\n }\n\n // Update timings\n const totalTime = Date.now() - startTime\n newResults.forEach((result) => {\n result.timeTaken = totalTime\n })\n\n // Cache all new results\n newResults.forEach((result, i) => {\n const tx = uncachedTransactions[i]\n if (tx.hash) {\n caches.setTransaction(tx.hash, result)\n }\n })\n\n // Merge cached and new results\n uncachedIndexes.forEach((originalIndex, i) => {\n results[originalIndex] = newResults[i]\n })\n\n return {\n results: results as DecoderResult[],\n }\n } catch (error) {\n console.error('Batch decode failed:', error)\n // Return error results for uncached transactions\n uncachedIndexes.forEach((originalIndex) => {\n results[originalIndex] = {\n ...createErrorResult(transactions[originalIndex]),\n phase: 'immediate',\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n })\n\n return {\n results: results as DecoderResult[],\n }\n }\n}\n\nfunction createErrorResult(transaction: DecoderResult): DecoderResult {\n return {\n ...transaction,\n isDecoded: false,\n resultType: 'error',\n errorType: 'UNKNOWN',\n sig: '0x' as `0x${string}`,\n addresses: [],\n } as DecoderResult\n}\n","import { pluginRegistry } from '../decoder/registry'\nimport { decodeTransaction as decodeTransactionCore } from '../decoder/transaction'\nimport type { DecoderResult } from '../decoder/types'\nimport { createDebug } from '../utils/debug'\nimport type { ServerDecoderCaches } from './caches'\nimport type { ServerDecoderOptions } from './types'\n\nconst _debug = createDebug('decoder:finishDecoding')\n\n/**\n * Finish decoding a transaction by running enhancement phase\n * This only does phase 2 (async plugins) - address resolution should be done separately\n */\nexport async function finishDecoding(\n transaction: DecoderResult,\n options: ServerDecoderOptions,\n caches: ServerDecoderCaches\n): Promise<DecoderResult> {\n const startTime = Date.now()\n const { chain } = options\n\n try {\n // Check cache first\n const txHash = transaction.hash || transaction.transactionHash\n if (txHash) {\n const cached = caches.getTransaction(txHash)\n if (cached?.enhancementAttempted) {\n return {\n ...cached,\n cached: true,\n timeTaken: 0,\n } as DecoderResult\n }\n }\n\n // Get all plugins\n const allPlugins = await pluginRegistry.getAll()\n const schemaPlugins = pluginRegistry.getAllSchema()\n\n const enhancedOptions = {\n chain,\n plugins: allPlugins,\n schemaPlugins,\n wrappers: [],\n async: true,\n }\n\n // Wrappers and children must be removed when finishing decoding, because otherwise\n // the decoder will build hierarchical structures which are infinite.\n const {\n wrappers,\n children: _children,\n addresses: _addresses,\n ...transactionWithoutWrappers\n } = transaction as DecoderResult & {\n children?: unknown[]\n wrappers?: unknown[]\n addresses?: unknown[]\n }\n\n // Simply pass the entire transaction hierarchy to decodeTransactionCore\n // It will handle children properly and return a fully enhanced copy\n const enhancedResult = await decodeTransactionCore(\n transactionWithoutWrappers as DecoderResult,\n enhancedOptions\n )\n\n if (!enhancedResult) {\n if (txHash) {\n caches.setTransaction(txHash, {\n ...transaction,\n enhancementAttempted: true,\n })\n }\n return transaction\n }\n\n const result = {\n ...enhancedResult,\n // Only add wrappers if there are any\n ...((wrappers?.length || 0) > 0 ? { wrappers } : {}),\n cached: false,\n timeTaken: Date.now() - startTime,\n enhancementAttempted: true,\n } as DecoderResult\n\n // Always update cache with the enhanced result\n if (txHash) {\n caches.setTransaction(txHash, result)\n }\n\n return result\n } catch (error) {\n console.error('Failed to finish decoding transaction:', error)\n return {\n ...createErrorResult(transaction),\n phase: 'immediate',\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n }\n}\n\nfunction createErrorResult(transaction: DecoderResult): DecoderResult {\n return {\n ...transaction,\n resultType: 'error',\n errorType: 'UNKNOWN',\n sig: '0x' as `0x${string}`,\n addresses: [],\n } as DecoderResult\n}\n","import { ServerAddressResolver } from './addressResolver'\nimport { ServerDecoderCaches } from './caches'\nimport { decodeEventLogs } from './decodeEventLogs'\nimport { decodeTransactionSync } from './decodeTransactionSync'\nimport { decodeTransactionsBatch } from './decodeTransactionsBatch'\nimport { finishDecoding } from './finishDecoding'\nimport type {\n ServerDecoder,\n ServerDecoderConfig,\n ServerDecoderOptions,\n} from './types'\n\n// Import plugins to ensure they are registered\nimport '../decoder/plugins'\n\n/**\n * Create a server-optimized decoder instance\n */\nexport function createServerDecoder(\n config: ServerDecoderConfig\n): ServerDecoder {\n // Create caches\n const caches = new ServerDecoderCaches({\n transactionCacheSize: config.transactionCacheSize,\n addressCacheSize: config.addressCacheSize,\n abiCacheSize: config.abiCacheSize,\n schemaCacheSize: config.schemaCacheSize,\n })\n\n // Create address resolver\n const addressResolver = new ServerAddressResolver(\n config.graphqlEndpoint,\n config.defaultChain,\n caches\n )\n\n // Return server decoder interface\n return {\n async decodeTransaction(transaction, options) {\n const opts: ServerDecoderOptions = {\n chain: config.defaultChain,\n timeoutMs: config.defaultTimeout,\n ...options,\n }\n return decodeTransactionSync(transaction, opts, caches)\n },\n\n async decodeTransactionsBatch(transactions, options) {\n const opts: ServerDecoderOptions = {\n chain: config.defaultChain,\n timeoutMs: config.defaultTimeout,\n ...options,\n }\n return decodeTransactionsBatch(transactions, opts, caches)\n },\n\n async finishDecoding(transaction, options) {\n const opts: ServerDecoderOptions = {\n chain: config.defaultChain,\n timeoutMs: config.defaultTimeout,\n ...options,\n }\n return finishDecoding(transaction, opts, caches)\n },\n\n clearCaches() {\n caches.clear()\n },\n\n getCacheStats() {\n return caches.getStats()\n },\n\n async warmAddressCache(addresses) {\n await addressResolver.warmCache(addresses)\n },\n\n async resolveAddresses(addresses, timeoutMs = 3000) {\n return addressResolver.resolveAddressesWithTimeout(addresses, timeoutMs)\n },\n\n async decodeEventLogs(logs, options) {\n const opts: ServerDecoderOptions = {\n chain: config.defaultChain,\n timeoutMs: config.defaultTimeout,\n ...options,\n }\n return decodeEventLogs(logs, opts, caches)\n },\n }\n}\n"],"mappings":"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","names":["caches","abi","abi","arg","defaultSchema","process","index","data","value","url","newURL","method","abi","pluginOptions","decodeAbiParameters","formatAbiItem","decodeAbiParameters","abi","formatAbiItem","decodeAbiParameters","name","size","slice","size","slice","slice","slice","data","phase","result","value","decodeAbiParameters","slice","slice","decodeAbiParameters","value","_to","LRUCache","LRUCache","value","value","enhanceLSP26FollowerSystem","abi","decodeAbiParameters","encodeAbiParameters","getAddress","isAddress","isAddressEqual","zeroAddress","LRUCache","LRUCache","getAddress","address","abi","isAddress","isAddressEqual","zeroAddress","decodeAbiParameters","encodeAbiParameters","abi","isHex","size","tokenId","isHex","size","caches","caches","createErrorResult","caches","createErrorResult","caches"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/addressResolver.ts","../src/server/addressResolver.ts","../src/server/caches.ts","../src/core/addressCollector.ts","../src/decoder/utils.ts","../src/decoder/registry.ts","../src/decoder/transaction.ts","../src/server/decodeTransactionSync.ts","../src/server/decodeTransactionsBatch.ts","../src/utils/debug.ts","../src/server/finishDecoding.ts","../src/decoder/plugins/schemaDefault.ts","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP1UniversalReceiverDelegate.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP3ProfileMetadata.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP4DigitalAsset.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP4DigitalAssetLegacy.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP5ReceivedAssets.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP6KeyManager.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP8IdentifiableDigitalAsset.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP9Vault.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP10ReceivedVaults.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP12IssuedAssets.json","../../../node_modules/.pnpm/@erc725+erc725.js@0.28.2_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.1.13/node_modules/@erc725/erc725.js/schemas/LSP17ContractExtension.json","../src/decoder/constants.ts","../src/decoder/getDataFromExternalSources.ts","../src/decoder/plugins/standardPlugin.ts","../src/decoder/aggregation.ts","../src/decoder/events.ts","../src/decoder/plugins/RegistryAbi.ts","../src/decoder/plugins/enhanceBurntPix.ts","../src/decoder/plugins/enhanceGraffiti.ts","../src/decoder/plugins/enhanceLSP0ERC725Account.ts","../src/decoder/plugins/enhanceSetData.ts","../src/decoder/plugins/universalReceiverTypeIds.ts","../src/decoder/plugins/enhanceLSP6KeyManager.ts","../../../node_modules/.pnpm/@lukso+lsp6-contracts@0.15.5/node_modules/@lukso/lsp6-contracts/artifacts/LSP6KeyManager.json","../src/decoder/interfaces.ts","../src/decoder/plugins/enhanceLSP7DigitalAsset.ts","../src/decoder/cache.ts","../src/decoder/plugins/enhanceLSP8IdentifiableDigitalAsset.ts","../src/decoder/plugins/enhanceLSP9Vault.ts","../src/decoder/plugins/enhanceLSP26FollowerSystem.ts","../../../node_modules/.pnpm/@lukso+lsp-smart-contracts@0.16.7/node_modules/@lukso/lsp-smart-contracts/artifacts/LSP9Vault.json","../src/decoder/functionSignature.ts","../src/decoder/lruCache.ts","../src/decoder/plugins/enhanceRetrieveAbi.ts","../src/decoder/plugins/index.ts","../src/server/index.ts"],"sourcesContent":["import request, { gql } from 'graphql-request'\nimport type { Address, Chain, Hex } from 'viem'\nimport { lukso } from 'viem/chains'\nimport type { DataKey, EnhancedInfo } from '../types'\nimport type { AddressIdentityCache } from './cache'\n\n/**\n * GraphQL queries for address resolution\n * Using the exact schema from addressGQL.ts\n */\nconst addressesGql = gql`\nquery AddressQuery($profiles: [String!], $assets: [String!], $tokens: [String!]) {\n Profile(\n where: {id: {_in: $profiles}}\n ) {\n fullName\n id\n name\n tags\n description\n standard\n controllers {\n address\n tags\n permissions\n }\n owner {\n id\n }\n profileImages(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n backgroundImages(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n avatars(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n }\n Token(where: {id: {_in: $tokens}}) {\n id\n baseAsset {\n id\n description\n icons {\n src\n verified\n width\n height\n }\n isCollection\n isLSP7\n isUnknown\n name\n standard\n interfaces\n decimals\n owner_id\n lsp4Creators {\n profile_id\n }\n }\n formattedTokenId\n icons {\n src\n verified\n width\n height\n }\n images(where: {index: {_eq: 0}}) {\n src\n verified\n width\n height\n }\n lsp4TokenName\n lsp4TokenSymbol\n lsp4TokenType\n lsp8TokenIdFormat\n tokenId\n name\n description\n lsp4Creators {\n profile_id\n }\n }\n Asset(where: {id: {_in: $assets}}) {\n id\n images(where: {index: {_eq: 0}}) {\n src\n width\n verified\n height\n }\n interfaces\n isCollection\n isLSP7\n isUnknown\n lsp4TokenName\n lsp4TokenSymbol\n lsp4TokenType\n method\n name\n icons {\n src\n width\n height\n }\n description\n decimals\n standard\n owner_id\n lsp4Creators {\n profile_id\n }\n }\n}\n`\n\n// Image data structure from GraphQL\nexport interface ImageData {\n width?: number\n height?: number\n url?: string // Raw URL (may be ipfs://)\n src?: string // Resolved HTTPS URL (fallback to url if not present)\n verified?: boolean\n}\n\n// Link data structure from GraphQL\nexport interface LinkData {\n url: string\n title?: string\n}\n\n// Profile data from GraphQL\nexport interface ProfileData {\n id: Hex\n name?: string\n fullName?: string\n tags?: string[]\n description?: string\n links?: LinkData[]\n standard?: string\n controllers?: Array<{\n address: string\n tags?: string[]\n permissions?: Hex\n }>\n owner?: { id: string }\n profileImages?: ImageData[]\n backgroundImages?: ImageData[]\n avatars?: ImageData[]\n}\n\n// Asset data from GraphQL\nexport interface AssetData {\n id: Hex\n name?: string\n standard?: string\n lsp4TokenName?: string\n lsp4TokenSymbol?: string\n lsp4TokenType?: string\n method?: string\n description?: string\n links?: LinkData[]\n decimals?: number\n interfaces?: string[]\n isCollection?: boolean\n isLSP7?: boolean\n isUnknown?: boolean\n icons?: ImageData[]\n images?: ImageData[]\n}\n\n// Token data from GraphQL\nexport interface TokenData {\n id: Hex\n tokenId?: Hex\n name?: string\n description?: string\n links?: LinkData[]\n lsp4TokenName?: string\n lsp4TokenSymbol?: string\n lsp4TokenType?: string\n lsp8TokenIdFormat?: string\n formattedTokenId?: string\n baseAsset?: {\n id: Hex\n description?: string\n icons?: ImageData[]\n isCollection?: boolean\n isLSP7?: boolean\n isUnknown?: boolean\n name?: string\n standard?: string\n interfaces?: string[]\n decimals?: number\n }\n icons?: ImageData[]\n images?: ImageData[]\n}\n\nexport type TFetchAddressData = {\n Profile?: ProfileData[]\n Asset?: AssetData[]\n Token?: TokenData[]\n}\n\n/**\n * Fetch multiple addresses from GraphQL and return them as a Map\n * This is the shared implementation that both server and core can use\n */\nexport async function fetchMultipleAddresses(\n addresses: readonly DataKey[],\n graphqlEndpoint: string,\n cache?: AddressIdentityCache\n): Promise<Map<DataKey, EnhancedInfo>> {\n const results = new Map<DataKey, EnhancedInfo>()\n\n if (addresses.length === 0) {\n return results\n }\n\n // Check cache first if provided\n const uncachedAddresses: DataKey[] = []\n\n if (cache) {\n // Try to get many at once if supported\n if (cache.getMany) {\n const cachedResults = await cache.getMany(addresses)\n for (const [key, value] of cachedResults) {\n results.set(key, value)\n }\n // Find which ones we still need to fetch\n for (const addr of addresses) {\n if (!results.has(addr)) {\n uncachedAddresses.push(addr)\n }\n }\n } else {\n // Fall back to individual lookups\n for (const addr of addresses) {\n const cached = await cache.get(addr)\n if (cached) {\n results.set(addr, cached)\n } else {\n uncachedAddresses.push(addr)\n }\n }\n }\n\n // If all were cached, return early\n if (uncachedAddresses.length === 0) {\n return results\n }\n } else {\n // No cache, fetch all\n uncachedAddresses.push(...addresses)\n }\n\n // Parse addresses and tokens\n const profiles: string[] = []\n const assets: string[] = []\n const tokens: string[] = []\n const tokenMapping = new Map<string, { address: Address; tokenId?: string }>()\n\n for (const key of uncachedAddresses) {\n const hasDash = key.includes('-')\n const hasColon = key.includes(':')\n\n if (hasColon || hasDash) {\n const normalizedKey = key.replace(/[-:]/, '-')\n tokens.push(normalizedKey)\n const [address, tokenId] = key.split(/[-:]/)\n tokenMapping.set(key, { address: address as Address, tokenId })\n } else {\n // Regular addresses - could be profiles or assets\n profiles.push(key)\n assets.push(key)\n }\n }\n\n try {\n // Fetch data from GraphQL\n const data = (await request(graphqlEndpoint, addressesGql, {\n profiles,\n assets,\n tokens,\n })) as TFetchAddressData\n\n // Process profiles\n if (data.Profile) {\n for (const profile of data.Profile) {\n if (profile.standard !== 'LSP0ERC725Account') {\n continue\n }\n const enhancedInfo: EnhancedInfo = {\n address: profile.id as Address,\n __gqltype: 'Profile',\n name: profile.name || profile.fullName,\n fullName: profile.fullName,\n standard: profile.standard,\n tags: profile.tags,\n description: profile.description,\n owner: profile.owner,\n controllers: profile.controllers,\n profileImages: profile.profileImages,\n backgroundImages: profile.backgroundImages,\n avatars: profile.avatars,\n }\n results.set(profile.id as Address, enhancedInfo)\n }\n }\n\n // Process tokens (must be before assets per addressGQL.ts logic)\n if (data.Token) {\n for (const token of data.Token) {\n const { id: _id, baseAsset, tokenId, ...rest } = token\n\n // Tokens have a composite ID format and baseAsset reference\n if (baseAsset?.id && tokenId) {\n const enhancedInfo: EnhancedInfo = {\n address: baseAsset.id as Address,\n tokenId: tokenId as Address,\n __gqltype: 'Token',\n ...rest,\n baseAsset,\n }\n // Store with both dash and colon separators to handle both formats\n const keyWithColon = `${baseAsset.id}:${tokenId}` as DataKey\n const keyWithDash = `${baseAsset.id}-${tokenId}` as DataKey\n results.set(keyWithColon, enhancedInfo)\n results.set(keyWithDash, enhancedInfo)\n }\n }\n }\n\n // Process assets\n if (data.Asset) {\n for (const asset of data.Asset) {\n if (asset.standard === 'LSP0ERC725Account') {\n // Skip profiles - already processed\n continue\n }\n const enhancedInfo: EnhancedInfo = {\n address: asset.id as Address,\n __gqltype: 'Asset',\n ...asset,\n }\n if (!results.has(asset.id as Address)) {\n results.set(asset.id as Address, enhancedInfo)\n }\n }\n }\n\n // Cache the newly fetched results\n if (cache) {\n const newEntries: Array<[DataKey, EnhancedInfo]> = []\n\n // Collect all new entries\n for (const [key, value] of results) {\n // Only cache entries that were fetched (not from cache)\n const isCached = addresses.some(\n (addr) => addr.toLowerCase() === key.toLowerCase()\n )\n\n if (\n isCached &&\n uncachedAddresses.some(\n (addr) => addr.toLowerCase() === key.toLowerCase()\n )\n ) {\n newEntries.push([key, value])\n }\n }\n\n // Use batch update if available\n if (cache.setMany && newEntries.length > 0) {\n await cache.setMany(newEntries)\n } else {\n // Fall back to individual updates\n for (const [key, value] of newEntries) {\n await cache.set(key, value)\n }\n }\n }\n\n return results\n } catch (error) {\n console.error('Failed to fetch addresses:', error)\n return results\n }\n}\n\n/**\n * Get GraphQL endpoint for a given chain\n */\nexport function getGraphQLEndpoint(chain: Chain): string {\n return chain.id === lukso.id\n ? 'https://envio.lukso-mainnet.universal.tech/v1/graphql'\n : 'https://envio.lukso-testnet.universal.tech/v1/graphql'\n}\n\n/**\n * GraphQL query to find profiles controlled by specific addresses\n */\nconst profilesByControllerGql = gql`\nquery ProfilesByController($controllerAddresses: [String!]) {\n Profile(\n where: {\n controllers: {\n address: { _in: $controllerAddresses }\n tags: {\n _contains: [\n \"ADDCONTROLLER\"\n \"EDITPERMISSIONS\"\n \"SUPER_TRANSFERVALUE\"\n \"TRANSFERVALUE\"\n \"SUPER_CALL\"\n \"CALL\"\n \"SUPER_STATICCALL\"\n \"STATICCALL\"\n \"DEPLOY\"\n \"SUPER_SETDATA\"\n \"SETDATA\"\n \"ENCRYPT\"\n \"DECRYPT\"\n \"SIGN\"\n \"EXECUTE_RELAY_CALL\"\n ]\n }\n }\n }\n order_by: { blockNumber: asc }\n ) {\n fullName\n id\n name\n tags\n description\n standard\n controllers {\n address\n tags\n permissions\n }\n owner {\n id\n }\n profileImages(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n backgroundImages(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n avatars(where: {error: {_is_null: true}}, order_by: {width: asc}) {\n width\n height\n src\n verified\n }\n }\n}\n`\n\n/**\n * Find profiles controlled by specific controller addresses\n * @param controllerAddresses - Array of controller addresses to search for\n * @param chain - Which chain to query\n * @returns Array of profile data\n */\nexport async function fetchProfilesByControllers(\n controllerAddresses: readonly Address[],\n chain: Chain\n): Promise<ProfileData[]> {\n const graphqlEndpoint = getGraphQLEndpoint(chain)\n\n try {\n const data = (await request(graphqlEndpoint, profilesByControllerGql, {\n controllerAddresses: controllerAddresses.map((addr) =>\n addr.toLowerCase()\n ),\n })) as { Profile?: ProfileData[] }\n\n return data.Profile || []\n } catch (error) {\n console.error(\n `Failed to fetch profiles by controllers on ${chain.name}:`,\n error\n )\n return []\n }\n}\n\nexport type ImageURL = {\n url?: string\n data?: string\n src?: string\n width: number\n height: number\n index?: number\n verified?: string\n}\n\n/**\n * Assuming the images are sorted ascending by width and/or height pick the first\n * image that's larger than the requested size * dpr and process that one.\n * By default this will assume the data came from the indexer and therefore\n * we do not need to verify the existence of all the images (i.e. HEAD requests for\n * each image) Setting ignoreHead to false is important during RPC mode so that\n * we can skip images that are not really available.\n *\n * @param images - array of images\n * @param options - specify arguments for search/processing\n * @returns { width, height, src } - the image that fits the criteria\n */\nexport async function getImage(\n images: ImageURL[],\n options: {\n width: number\n height?: number\n index?: number\n ignoreVerification?: boolean\n forcePng?: boolean\n ignoreHead?: boolean\n fallback?: string\n dpr?: number\n }\n): Promise<{ width: number; height: number; src?: string } | undefined> {\n const {\n width,\n height: _height,\n index,\n ignoreVerification,\n ignoreHead = true, // By default we don't want to do HEAD requests for all images.\n dpr = 1,\n } = options\n const boost = dpr === 1 ? 1.5 : 1\n const height = _height || width\n const { src: _src, verified } =\n (images || []).find(\n (i) =>\n i.width >= width * boost * dpr &&\n i.height &&\n i.height >= height * boost * dpr &&\n (index ? i.index === index : i.index === undefined)\n ) ||\n images?.at(-1) ||\n {}\n // We're talking about images here, so we should be using /image/ instead of /ipfs/\n const url = _src?.startsWith('https://api.universalprofile.cloud/ipfs/')\n ? _src?.replace(/\\/ipfs\\//, '/image/')\n : _src\n if (!url) {\n return options.fallback\n ? { src: options.fallback, width: 128, height: 128 }\n : undefined\n }\n try {\n let isImage: string | undefined\n if (typeof caches !== 'undefined' && !ignoreHead) {\n const cache = await caches.open('image-types')\n const cached = await cache.match(url)\n if (cached) {\n const response = await cached.json()\n if (response) {\n isImage = response\n }\n }\n }\n if (!isImage && !ignoreHead) {\n // HEAD will return 200, 404 and so including the 'content-type'\n // We use this to determine what type of images we have.\n // If the images came from the indexer then this test\n // has already been done on the indexer and we can skip it here.\n const _now = Date.now()\n isImage = await fetch(url, { method: 'HEAD' })\n .then((response) => {\n if (response.ok) {\n const mime = response.headers.get('content-type') || ''\n response.body?.cancel()\n return /^image\\//.test(mime) ? mime : undefined\n }\n response.body?.cancel()\n return undefined\n })\n .catch((error) => {\n console.error((error as Error).stack)\n return undefined\n })\n if (isImage != null && typeof caches !== 'undefined') {\n const cache = await caches.open('image-types')\n await cache\n .put(url, new Response(JSON.stringify(isImage)))\n .catch((error) => {\n console.error((error as Error).stack, url)\n })\n }\n }\n if (isImage || ignoreHead) {\n const finalUrl = new URL(url)\n const { searchParams } = finalUrl\n const qs = new URLSearchParams(searchParams)\n if (width) {\n qs.set('width', `${width * boost}`)\n }\n if (width || height) {\n qs.set('height', `${(height || width) * boost}`)\n }\n qs.set('fit', 'cover')\n qs.set('dpr', dpr.toString())\n if (\n !options.ignoreHead &&\n !/\\/svg/.test(isImage || '') &&\n options.forcePng\n ) {\n qs.set('format', 'png')\n }\n finalUrl.search = qs.toString()\n const image = finalUrl.toString()\n return {\n width,\n height: height || width,\n src:\n verified === 'INVALID' && !ignoreVerification\n ? `${image}&blur=30`\n : image,\n }\n }\n } catch (error) {\n console.error((error as Error).stack)\n }\n return options.fallback\n ? { src: options.fallback, width: 128, height: 128 }\n : undefined\n}\n","import type { Chain } from 'viem'\nimport { fetchMultipleAddresses } from '../shared/addressResolver'\nimport type { AddressIdentityCache } from '../shared/cache'\nimport type { DataKey, EnhancedInfo } from '../types'\nimport type { ServerDecoderCaches } from './caches'\n\n/**\n * Server-side address resolver with caching\n */\nexport class ServerAddressResolver {\n private cacheAdapter: AddressIdentityCache\n\n constructor(\n private graphqlEndpoint: string,\n _chain: Chain,\n private caches: ServerDecoderCaches\n ) {\n // Create adapter to use ServerDecoderCaches as AddressIdentityCache\n this.cacheAdapter = {\n get: (key: DataKey) => this.caches.getAddress(key),\n set: (key: DataKey, value: EnhancedInfo) =>\n this.caches.setAddress(key, value),\n has: (key: DataKey) => this.caches.hasAddress(key),\n getMany: (keys: DataKey[]) => this.caches.getAddresses(keys),\n }\n }\n\n /**\n * Resolve addresses, using cache when possible\n */\n async resolveAddresses(\n addresses: readonly DataKey[]\n ): Promise<Map<DataKey, EnhancedInfo>> {\n // Use the shared implementation with cache adapter\n return fetchMultipleAddresses(\n addresses,\n this.graphqlEndpoint,\n this.cacheAdapter\n )\n }\n\n /**\n * Resolve addresses with timeout\n */\n async resolveAddressesWithTimeout(\n addresses: DataKey[],\n timeoutMs: number\n ): Promise<Map<DataKey, EnhancedInfo>> {\n return Promise.race([\n this.resolveAddresses(addresses),\n new Promise<Map<DataKey, EnhancedInfo>>((resolve) => {\n setTimeout(() => {\n // On timeout, return whatever we have cached\n const results = this.caches.getAddresses(addresses)\n resolve(results)\n }, timeoutMs)\n }),\n ])\n }\n\n /**\n * Warm the cache with specific addresses\n */\n async warmCache(addresses: DataKey[]): Promise<void> {\n // Simply call resolveAddresses which will cache any uncached addresses\n await this.resolveAddresses(addresses)\n }\n}\n","import { LRUCache } from 'lru-cache'\nimport type { Abi } from 'viem'\nimport type { DecoderResult, Info } from '../decoder/types'\nimport type { DataKey, EnhancedInfo } from '../types'\nimport type { CacheStats } from './types'\n\n/**\n * Multi-level caching system for server-side decoder\n */\nexport class ServerDecoderCaches {\n // Level 1: Decoded transaction cache (keyed by transaction hash)\n private transactionCache: LRUCache<string, DecoderResult>\n private transactionStats = { hits: 0, misses: 0 }\n\n // Level 2: Address metadata cache (keyed by address or address:tokenId)\n private addressCache: LRUCache<string, EnhancedInfo>\n private addressStats = { hits: 0, misses: 0 }\n\n // Level 3: Contract ABI cache (keyed by address)\n private abiCache: LRUCache<string, Abi>\n private abiStats = { hits: 0, misses: 0 }\n\n // Level 4: Schema decode cache (keyed by key:value)\n private schemaCache: LRUCache<string, Info>\n private schemaStats = { hits: 0, misses: 0 }\n\n constructor(\n options: {\n transactionCacheSize?: number\n addressCacheSize?: number\n abiCacheSize?: number\n schemaCacheSize?: number\n } = {}\n ) {\n // Transaction cache - store complete decoded results\n this.transactionCache = new LRUCache<string, DecoderResult>({\n max: options.transactionCacheSize || 10000,\n ttl: 1000 * 60 * 60, // 1 hour TTL\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n })\n\n // Address cache - store profile/asset metadata\n this.addressCache = new LRUCache<string, EnhancedInfo>({\n max: options.addressCacheSize || 50000,\n ttl: 1000 * 60 * 60 * 24, // 24 hour TTL\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n })\n\n // ABI cache - store contract ABIs\n this.abiCache = new LRUCache<string, Abi>({\n max: options.abiCacheSize || 5000,\n ttl: 1000 * 60 * 60 * 24 * 7, // 7 day TTL (ABIs rarely change)\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n })\n\n // Schema cache - store decoded schema values\n this.schemaCache = new LRUCache<string, Info>({\n max: options.schemaCacheSize || 10000,\n ttl: 1000 * 60 * 60, // 1 hour TTL\n updateAgeOnGet: true,\n updateAgeOnHas: true,\n })\n }\n\n /**\n * Get cache key for a data key (address or address:tokenId)\n */\n private getDataKeyCacheKey(key: DataKey): string {\n return key.toLowerCase()\n }\n\n // Transaction cache methods\n getTransaction(hash: string): DecoderResult | undefined {\n const result = this.transactionCache.get(hash.toLowerCase())\n if (result) {\n this.transactionStats.hits++\n return { ...result, cached: true }\n }\n this.transactionStats.misses++\n return undefined\n }\n\n setTransaction(hash: string, result: DecoderResult): void {\n this.transactionCache.set(hash.toLowerCase(), result)\n }\n\n // Address cache methods\n getAddress(key: DataKey): EnhancedInfo | undefined {\n const cacheKey = this.getDataKeyCacheKey(key)\n const result = this.addressCache.get(cacheKey)\n if (result) {\n this.addressStats.hits++\n return result\n }\n this.addressStats.misses++\n return undefined\n }\n\n setAddress(key: DataKey, data: EnhancedInfo): void {\n const cacheKey = this.getDataKeyCacheKey(key)\n this.addressCache.set(cacheKey, data)\n }\n\n hasAddress(key: DataKey): boolean {\n return this.addressCache.has(this.getDataKeyCacheKey(key))\n }\n\n getAddresses(keys: DataKey[]): Map<DataKey, EnhancedInfo> {\n const results = new Map<DataKey, EnhancedInfo>()\n for (const key of keys) {\n const data = this.getAddress(key)\n if (data) {\n results.set(key, data)\n }\n }\n return results\n }\n\n // ABI cache methods\n getAbi(address: string): Abi | undefined {\n const result = this.abiCache.get(address.toLowerCase())\n if (result) {\n this.abiStats.hits++\n return result\n }\n this.abiStats.misses++\n return undefined\n }\n\n setAbi(address: string, abi: Abi): void {\n this.abiCache.set(address.toLowerCase(), abi)\n }\n\n hasAbi(address: string): boolean {\n return this.abiCache.has(address.toLowerCase())\n }\n\n // Schema cache methods\n getSchema(key: string, value: string): Info | undefined {\n const cacheKey = `${key}:${value}`\n const result = this.schemaCache.get(cacheKey)\n if (result) {\n this.schemaStats.hits++\n return result\n }\n this.schemaStats.misses++\n return undefined\n }\n\n setSchema(key: string, value: string, info: Info): void {\n const cacheKey = `${key}:${value}`\n this.schemaCache.set(cacheKey, info)\n }\n\n // Cache management\n clear(): void {\n this.transactionCache.clear()\n this.addressCache.clear()\n this.abiCache.clear()\n this.schemaCache.clear()\n\n // Reset stats\n this.transactionStats = { hits: 0, misses: 0 }\n this.addressStats = { hits: 0, misses: 0 }\n this.abiStats = { hits: 0, misses: 0 }\n this.schemaStats = { hits: 0, misses: 0 }\n }\n\n getStats(): CacheStats {\n const calculateHitRate = (stats: { hits: number; misses: number }) => {\n const total = stats.hits + stats.misses\n return total > 0 ? stats.hits / total : 0\n }\n\n return {\n transactions: {\n size: this.transactionCache.size,\n maxSize: this.transactionCache.max,\n hits: this.transactionStats.hits,\n misses: this.transactionStats.misses,\n hitRate: calculateHitRate(this.transactionStats),\n },\n addresses: {\n size: this.addressCache.size,\n maxSize: this.addressCache.max,\n hits: this.addressStats.hits,\n misses: this.addressStats.misses,\n hitRate: calculateHitRate(this.addressStats),\n },\n abis: {\n size: this.abiCache.size,\n maxSize: this.abiCache.max,\n hits: this.abiStats.hits,\n misses: this.abiStats.misses,\n hitRate: calculateHitRate(this.abiStats),\n },\n schemas: {\n size: this.schemaCache.size,\n maxSize: this.schemaCache.max,\n hits: this.schemaStats.hits,\n misses: this.schemaStats.misses,\n hitRate: calculateHitRate(this.schemaStats),\n },\n }\n }\n}\n","import { type Address, type Hex, isHex, size } from 'viem'\nimport type { ArrayArgs } from '../decoder/types'\nimport { getArgByName } from '../decoder/utils'\nimport type { DataKey } from '../types'\n\nexport interface CollectedAddress {\n key: DataKey\n path: Array<string | number>\n parent?: Record<string, unknown>\n root: unknown\n}\n\n/**\n * Collect all DataKeys from a data structure\n * This is a simplified version that just returns the keys\n * @param data - The data to analyze\n * @param skipGqlTypes - Whether to skip GraphQL type fields\n * @param existingKeys - Optional existing keys to merge with\n */\nexport function collectDataKeys(\n data: unknown,\n skipGqlTypes = true,\n existingKeys?: DataKey[]\n): DataKey[] {\n const addresses = new Set<string>()\n\n // Add existing keys to the set first\n if (existingKeys) {\n for (const key of existingKeys) {\n if (typeof key === 'string') {\n addresses.add(key)\n } else {\n addresses.add(JSON.stringify(key))\n }\n }\n }\n\n // Check if this is an LSP8 decoded transaction and collect tokens\n function collectLSP8Tokens(obj: Record<string, unknown>): void {\n if (\n obj.standard !== 'LSP8IdentifiableDigitalAsset' ||\n !obj.to ||\n !obj.args\n ) {\n return\n }\n\n const contractAddress = obj.to as string\n const args = obj.args as ArrayArgs\n\n // Check for single tokenId\n const tokenId = getArgByName(args, 'tokenId') as string | undefined\n if (tokenId && tokenId !== null && tokenId !== '0x') {\n addresses.add(`${contractAddress}:${tokenId}`)\n }\n\n // Check for multiple tokenIds\n const tokenIds = getArgByName(args, 'tokenIds') as string[] | undefined\n if (Array.isArray(tokenIds)) {\n for (const tokenId of tokenIds) {\n // Skip null/undefined/empty tokens\n if (tokenId && tokenId !== null && tokenId !== '0x') {\n addresses.add(`${contractAddress}:${tokenId}`)\n }\n }\n }\n }\n\n function collect(\n obj: unknown,\n parent?: Record<string, unknown>,\n visited = new WeakSet(),\n path: string[] = []\n ): void {\n // Circular reference detection\n if (obj && typeof obj === 'object' && visited.has(obj)) {\n return\n }\n\n if (obj && typeof obj === 'object') {\n visited.add(obj)\n }\n // Handle string case first\n if (typeof obj === 'string' && obj.startsWith('0x')) {\n // Check if this is a composite address:tokenId format\n if (obj.includes(':')) {\n const [addressPart, tokenIdPart] = obj.split(':')\n // Validate both parts are hex strings\n if (\n addressPart.startsWith('0x') &&\n tokenIdPart.startsWith('0x') &&\n isHex(addressPart) &&\n size(addressPart as Hex) === 20\n ) {\n addresses.add(obj) // Just add the composite string directly\n return\n }\n }\n\n // Use regex to detect zero-padded addresses\n const isPaddedAddress = /^0x0*([a-fA-F0-9]{40})$/.test(obj)\n\n if (isPaddedAddress || (isHex(obj) && size(obj as Hex) === 20)) {\n // Skip if parent has __gqltype\n if (parent && skipGqlTypes && '__gqltype' in parent) {\n return\n }\n\n // Extract the actual address (remove padding if needed)\n const address = isPaddedAddress\n ? (obj.replace(/^0x0*([a-fA-F0-9]{40})$/, '0x$1') as Address)\n : obj\n\n // Skip if too many zeros (likely not an address)\n if (\n address\n .slice(2)\n .split('')\n .filter((c: string) => c === '0').length > 10\n ) {\n return\n }\n\n addresses.add(address)\n }\n return\n }\n\n if (!obj || typeof obj !== 'object') return\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n collect(obj[i], parent, visited, [...path, `[${i}]`])\n }\n } else {\n const record = obj as Record<string, unknown>\n\n // Check if this is an LSP8 transaction at the root level\n if ('standard' in record && 'to' in record && 'args' in record) {\n collectLSP8Tokens(record)\n }\n\n for (const [key, value] of Object.entries(record)) {\n collect(value, record, visited, [...path, key])\n }\n }\n }\n\n collect(data)\n\n // Convert to DataKey array (all as strings)\n return Array.from(addresses) as DataKey[]\n}\n","import {\n type Abi,\n type AbiFunction,\n AbiFunctionSignatureNotFoundError,\n type AbiParameter,\n type Address,\n type Chain,\n createPublicClient,\n type DecodeFunctionDataParameters,\n decodeAbiParameters,\n type Hex,\n http,\n type PublicClient,\n slice,\n toFunctionSelector,\n} from 'viem'\nimport { formatAbiItem } from 'viem/utils'\nimport type {\n ArrayArgs,\n AsyncOperations,\n CustomDecodeFunctionDataReturn,\n DecoderResult,\n EnhancedInfo,\n} from './types'\n\n/**\n * Custom decoder for function data with additional named args support\n * It's essentially the same code as decodeFunctionData, but also\n * returning a namedArgs where we zip together the args and the inputs.\n */\nexport function customDecodeFunctionData<\n const abi extends Abi | readonly unknown[],\n _preferError = false,\n>(\n parameters: Partial<\n DecodeFunctionDataParameters<abi> & {\n namedArgs?:\n | Record<number, AbiParameter & { value?: unknown }>\n | Record<string, unknown>\n }\n >,\n preferError?: boolean\n) {\n try {\n const { abi, data } = parameters as DecodeFunctionDataParameters\n const signature = slice(data, 0, 4)\n const description: AbiFunction | undefined = (abi.find(\n (x) =>\n x.type === (preferError ? 'error' : 'function') &&\n signature === toFunctionSelector(formatAbiItem(x))\n ) || undefined) as AbiFunction | undefined\n if (!description)\n throw new AbiFunctionSignatureNotFoundError(signature, {\n docsPath: '/docs/contract/decodeFunctionData',\n })\n const args = (\n 'inputs' in description &&\n description.inputs &&\n description.inputs.length > 0\n ? decodeAbiParameters(description.inputs, slice(data, 4))\n : undefined\n ) as readonly unknown[] | undefined\n const result: {\n functionName: string\n sig: Hex\n input: Hex\n args?: ArrayArgs\n } = {\n functionName: (description as { name: string }).name,\n sig: signature,\n input: data,\n }\n if (args) {\n const { args: namedArgs } = createNamedArgs(args, description.inputs)\n result.args = namedArgs\n }\n return result as CustomDecodeFunctionDataReturn<abi>\n } catch {}\n}\n\nexport function createNamedArgs(\n args: unknown[] | readonly unknown[],\n inputs?: AbiParameter[] | readonly AbiParameter[]\n): { args: ArrayArgs } {\n const array = args.map((value, index) => {\n return {\n name: `args${index + 1}`,\n ...inputs?.[index],\n value,\n } as AbiParameter & { value: unknown }\n })\n return { args: array }\n}\n\n/**\n * Get an argument value by its name from the args array.\n * This utility function allows accessing arguments by name without needing namedArgs.\n *\n * @param args - The array of arguments with their metadata\n * @param name - The name of the argument to find\n * @returns The value of the argument if found, undefined otherwise\n */\nexport function getArgByName(\n args: ArrayArgs | undefined,\n name: string\n): unknown {\n if (!args) return undefined\n\n const arg = args.find((arg) => arg.name === name)\n return arg?.value\n}\n\nexport function extractAddress(address?: Address | EnhancedInfo) {\n if (typeof address === 'object') {\n return address.address\n }\n return address\n}\n\nconst clients: Record<number, PublicClient> = {} as Record<number, PublicClient>\nexport function getPublicClient(chain: Chain): PublicClient {\n const { id } = chain\n if (!id) {\n throw new Error('Chain ID is required to create a public client')\n }\n if (!clients[id]) {\n clients[id] = createPublicClient({\n chain,\n transport: http(),\n batch: {\n multicall: {\n batchSize: 100,\n },\n },\n })\n }\n const result = clients[id]\n if (!result) {\n throw new Error(`Public client for chain ID ${id} not found`)\n }\n return result\n}\n\n/**\n * Helper to check if a specific async operation is enabled\n */\nexport function isAsyncOperationEnabled(\n asyncOption: boolean | AsyncOperations | undefined,\n operation: AsyncOperations\n): boolean {\n // Handle backward compatibility\n if (typeof asyncOption === 'boolean') {\n return asyncOption\n }\n // If not specified, default to DISABLED\n if (asyncOption === undefined) {\n return false\n }\n // Check bitmap\n return (asyncOption & operation) !== 0\n}\n\n/**\n * Check if a single decoded item needs enhancement\n * @param item - A single decoded result (not checking children)\n * @returns true if this specific item needs enhancement\n */\nfunction needsEnhancementSingle(item: DecoderResult): boolean {\n // If sig is \"0x\", there's no function signature to decode\n if ('sig' in item && item.sig === '0x') {\n return false\n }\n\n // If it has a standard, it's already identified\n if (item.standard) {\n return false\n }\n\n // Otherwise it needs enhancement\n return true\n}\n\n/**\n * Check if a decoded result needs enhancement\n * Returns true if the result OR any of its children need enhancement\n */\nexport function needsEnhancement(result: DecoderResult): boolean {\n // Check if the main result needs enhancement\n if (needsEnhancementSingle(result)) {\n return true\n }\n\n // Check if any children need enhancement\n if ('children' in result && Array.isArray(result.children)) {\n return result.children.some((child) => {\n // Children might be ResultType or ResultSetData, which don't have all DecoderResult fields\n // We only check for standard property which is common to all\n if (child.standard) {\n return false\n }\n // If sig is \"0x\", there's no function signature to decode\n if ('sig' in child && child.sig === '0x') {\n return false\n }\n // Otherwise it needs enhancement\n return true\n })\n }\n\n // Nothing needs enhancement\n return false\n}\n","import type { Hex } from 'viem'\nimport type { DecoderPlugin, Info, SchemaPlugin } from './types'\n\n/**\n * Plugin metadata for registry\n */\nexport interface PluginMetadata {\n name: string\n plugin: DecoderPlugin\n priority?: number\n required?: boolean // Cannot be overridden, always runs first\n description?: string\n version?: string\n usesAsync?: boolean // Whether this plugin performs async operations\n}\n\n/**\n * Schema plugin metadata\n */\nexport interface SchemaPluginMetadata {\n name: string\n plugin: SchemaPlugin\n priority?: number\n required?: boolean // Cannot be overridden, always runs first\n description?: string\n version?: string\n}\n\n/**\n * Global plugin registry for auto-registration\n */\nclass PluginRegistry {\n private plugins: Map<string, PluginMetadata> = new Map()\n private schemaPlugins: Map<string, SchemaPluginMetadata> = new Map()\n\n /**\n * Register a decoder plugin\n * @param name - Unique plugin name\n * @param plugin - Plugin instance\n * @param options - Registration options\n */\n register(\n name: string,\n plugin: DecoderPlugin,\n options?: {\n priority?: number\n required?: boolean\n override?: boolean\n description?: string\n version?: string\n usesAsync?: boolean\n }\n ): void {\n const {\n override = false,\n priority = 0,\n required = false,\n description,\n version,\n usesAsync = false,\n } = options || {}\n\n const existing = this.plugins.get(name)\n\n if (existing) {\n if (existing.required) {\n console.error(\n `Plugin \"${name}\" is marked as required and cannot be overridden.`\n )\n return\n }\n if (!override) {\n console.warn(\n `Plugin \"${name}\" is already registered. Use override: true to replace.`\n )\n return\n }\n }\n\n this.plugins.set(name, {\n name,\n plugin: Object.freeze(plugin),\n priority,\n required,\n description,\n version,\n usesAsync,\n })\n }\n\n /**\n * Register a schema plugin\n * @param name - Unique plugin name\n * @param plugin - Schema plugin instance\n * @param options - Registration options\n */\n registerSchema(\n name: string,\n plugin: SchemaPlugin,\n options?: {\n priority?: number\n required?: boolean\n override?: boolean\n description?: string\n version?: string\n }\n ): void {\n const {\n override = false,\n priority = 0,\n required = false,\n description,\n version,\n } = options || {}\n\n const existing = this.schemaPlugins.get(name)\n\n if (existing) {\n if (existing.required) {\n console.error(\n `Schema plugin \"${name}\" is marked as required and cannot be overridden.`\n )\n return\n }\n if (!override) {\n console.warn(\n `Schema plugin \"${name}\" is already registered. Use override: true to replace.`\n )\n return\n }\n }\n\n this.schemaPlugins.set(name, {\n name,\n plugin: Object.freeze(plugin),\n priority,\n required,\n description,\n version,\n })\n }\n\n /**\n * Unregister a plugin\n */\n unregister(name: string): boolean {\n return this.plugins.delete(name)\n }\n\n /**\n * Get all registered decoder plugins (excluding overridden ones)\n * @param options - Filter options\n */\n async getAll(options?: {\n excludeNames?: string[]\n syncOnly?: boolean\n }): Promise<DecoderPlugin[]> {\n const { excludeNames = [], syncOnly = false } = options || {}\n const exclude = new Set(excludeNames)\n let plugins = Array.from(this.plugins.values())\n\n // Filter by syncOnly if requested\n if (syncOnly) {\n plugins = plugins.filter((meta) => !meta.usesAsync)\n }\n\n // Check if any required plugins are being excluded\n for (const name of exclude) {\n const plugin = this.plugins.get(name)\n if (plugin?.required) {\n console.warn(\n `Warning: Plugin \"${name}\" is required and cannot be excluded. It will run first.`\n )\n }\n }\n\n // Separate required and optional plugins\n return plugins\n .sort((a, b) => (b.priority || 0) - (a.priority || 0))\n .map(({ plugin }) => plugin)\n }\n\n /**\n * Get all schema plugins (excluding overridden ones)\n * @param excludeNames - Plugin names to exclude\n */\n getAllSchema(excludeNames?: string[]): SchemaPlugin[] {\n const exclude = new Set(excludeNames || [])\n const plugins = Array.from(this.schemaPlugins.values())\n\n // Check if any required plugins are being excluded\n for (const name of exclude) {\n const plugin = this.schemaPlugins.get(name)\n if (plugin?.required) {\n console.warn(\n `Warning: Schema plugin \"${name}\" is required and cannot be excluded. It will run first.`\n )\n }\n }\n\n // Separate required and optional plugins\n const required = plugins\n .filter((meta) => meta.required)\n .sort((a, b) => (b.priority || 0) - (a.priority || 0))\n\n const optional = plugins\n .filter((meta) => !meta.required && !exclude.has(meta.name))\n .sort((a, b) => (b.priority || 0) - (a.priority || 0))\n\n // Required plugins always come first, then optional ones\n return [...required, ...optional].map((meta) => meta.plugin)\n }\n\n /**\n * Get a specific plugin by name\n */\n async get(name: string): Promise<DecoderPlugin | undefined> {\n const meta = this.plugins.get(name)\n return meta?.plugin\n }\n\n /**\n * Get plugin metadata\n */\n getMetadata(name: string): PluginMetadata | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get schema plugin metadata\n */\n getSchemaMetadata(name: string): SchemaPluginMetadata | undefined {\n return this.schemaPlugins.get(name)\n }\n\n /**\n * Check if a plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Clear all plugins\n */\n clear(): void {\n this.plugins.clear()\n this.schemaPlugins.clear()\n }\n\n /**\n * Get the number of registered plugins\n */\n get size(): number {\n return this.plugins.size + this.schemaPlugins.size\n }\n\n /**\n * List all registered plugins with metadata\n */\n list(): { plugins: PluginMetadata[]; schemaPlugins: SchemaPluginMetadata[] } {\n return {\n plugins: Array.from(this.plugins.values()),\n schemaPlugins: Array.from(this.schemaPlugins.values()),\n }\n }\n}\n\n// Freeze the PluginRegistry prototype to prevent modifications\nObject.freeze(PluginRegistry.prototype)\nObject.freeze(PluginRegistry)\n\n// Global singleton instance\nexport const pluginRegistry = new PluginRegistry()\n\n// Convenience function for plugin authors\nexport function registerPlugin(\n name: string,\n plugin: DecoderPlugin,\n options?: {\n priority?: number\n required?: boolean\n override?: boolean\n description?: string\n version?: string\n usesAsync?: boolean\n }\n): void {\n pluginRegistry.register(name, plugin, options)\n}\n\n// Convenience function for schema plugin authors\nexport function registerSchemaPlugin(\n name: string,\n plugin: SchemaPlugin,\n options?: {\n priority?: number\n required?: boolean\n override?: boolean\n description?: string\n version?: string\n }\n): void {\n pluginRegistry.registerSchema(name, plugin, options)\n}\n\n// Helper to create a named schema plugin\nexport function createNamedSchemaPlugin(\n name: string,\n plugin: (key: Hex, value: Hex) => Promise<Info | undefined>\n): SchemaPlugin {\n const namedPlugin = Object.assign(plugin, { name })\n return namedPlugin as SchemaPlugin\n}\n\n// Helper to create a named decoder plugin\nexport function createNamedPlugin(\n name: string,\n plugin: Omit<DecoderPlugin, 'name'>\n): DecoderPlugin {\n return { ...plugin, name }\n}\n","import { type Hex, isAddress, isAddressEqual, slice, zeroAddress } from 'viem'\nimport {\n type DecodeEventResult,\n type DecoderOptions,\n type DecoderResult,\n ErrorType,\n} from './types'\nimport { createNamedArgs } from './utils'\n\n/**\n * Decode transaction\n * @param transaction Transaction to decode (should have data/input)\n * @param options Decoder options\n * @returns Promise<DecoderResult>\n */\nexport async function decodeTransaction(\n fullTransaction: DecoderResult,\n options: DecoderOptions & {\n preferError?: boolean\n }\n): Promise<DecoderResult | undefined> {\n const { preferError } = options\n // Normalize input field - ensure we only have input, not data\n const {\n to,\n from,\n value,\n input: rawInput,\n data: rawData,\n ...restTransaction\n } = fullTransaction as DecoderResult & { data?: Hex }\n const { logs, ...transaction } = {\n ...restTransaction,\n to,\n from,\n value,\n input: rawInput || rawData,\n }\n const data = rawInput || rawData\n if (!data || data === '0x') {\n if (preferError) {\n return {\n ...transaction,\n isDecoded: true,\n functionName: undefined,\n __decoder: undefined,\n sig: slice(data || '0x', 0, 4),\n resultType: 'error',\n errorType: ErrorType.INVALID,\n ...createNamedArgs([], []),\n standard: undefined,\n phase: 'enhanced',\n } as DecoderResult\n }\n return {\n ...transaction,\n isDecoded: true,\n functionName: undefined,\n __decoder: undefined,\n standard: undefined,\n sig: slice(data || '0x', 0, 4),\n ...createNamedArgs([], []),\n resultType: 'execute',\n phase: 'enhanced',\n } as DecoderResult\n }\n let _lastError: Error | undefined\n\n // The caller is responsible for providing the appropriate plugin set\n // For sync-only decoding, use pluginRegistry.getAll({ syncOnly: true })\n // For full decoding, use pluginRegistry.getAll()\n const activePlugins = options.plugins\n\n for (const plugin of activePlugins) {\n if (to && isAddress(to) && isAddressEqual(to, zeroAddress)) {\n return {\n ...transaction,\n isDecoded: true,\n ...createNamedArgs([], []),\n resultType: 'create',\n to,\n from,\n value,\n logs,\n phase: 'immediate',\n } as DecoderResult\n }\n\n try {\n const check = await plugin.enhance(transaction, options)\n if (check) {\n const output: DecodeEventResult[] = []\n if (logs) {\n for (const log of logs) {\n const data = await plugin.decodeEvent(log, options)\n if (data) {\n output.push(data)\n continue\n }\n let done = false\n for (const eventPlugin of activePlugins) {\n if (eventPlugin !== plugin) {\n const data = await eventPlugin.decodeEvent(log, options)\n if (data) {\n output.push(data)\n done = true\n break\n }\n }\n }\n if (!done) {\n output.push(log as DecodeEventResult)\n }\n }\n check.logs = output\n }\n let phase: 'immediate' | 'enhanced' | 'complete' =\n plugin.usesAsync ||\n ('functionName' in check && check.functionName && check.standard) ||\n check.input === '0x' ||\n !check.input\n ? 'enhanced'\n : 'immediate'\n\n // If result has children, check if ALL children are enhanced\n // If any child is not enhanced, downgrade parent to 'immediate'\n const resultWithChildren = check as { children?: DecoderResult[] }\n if (\n phase === 'enhanced' &&\n resultWithChildren.children &&\n Array.isArray(resultWithChildren.children) &&\n resultWithChildren.children.length > 0\n ) {\n const allChildrenEnhanced = resultWithChildren.children.every(\n (child: DecoderResult) => (child as any).phase === 'enhanced'\n )\n if (!allChildrenEnhanced) {\n phase = 'immediate'\n }\n }\n\n const result = {\n ...transaction,\n ...check,\n phase,\n } as DecoderResult\n return result\n }\n } catch (e) {\n console.error(e)\n }\n }\n let phase: 'immediate' | 'enhanced' | 'complete' =\n ('functionName' in transaction &&\n transaction.functionName &&\n transaction.standard) ||\n transaction.input === '0x' ||\n !transaction.input\n ? 'enhanced'\n : 'immediate'\n\n // If result has children, check if ALL children are enhanced\n // If any child is not enhanced, downgrade parent to 'immediate'\n const transactionWithChildren = transaction as { children?: DecoderResult[] }\n if (\n phase === 'enhanced' &&\n transactionWithChildren.children &&\n Array.isArray(transactionWithChildren.children) &&\n transactionWithChildren.children.length > 0\n ) {\n const allChildrenEnhanced = transactionWithChildren.children.every(\n (child: DecoderResult) => (child as any).phase === 'enhanced'\n )\n if (!allChildrenEnhanced) {\n phase = 'immediate'\n }\n }\n\n const result = {\n ...transaction,\n standard: undefined,\n __decoder: undefined,\n resultType: 'raw',\n phase,\n sig: slice(\n fullTransaction.input ||\n ('data' in fullTransaction && (fullTransaction.data as Hex)) ||\n '0x',\n 0,\n 4\n ),\n ...createNamedArgs([], []),\n ...(options.wrappers.length ? { wrappers: options.wrappers } : {}),\n logs,\n } as DecoderResult\n return result\n}\n","import { collectDataKeys } from '../core/addressCollector'\nimport { pluginRegistry } from '../decoder/registry'\nimport { decodeTransaction as decodeTransactionCore } from '../decoder/transaction'\nimport type { DecoderResult } from '../decoder/types'\nimport { needsEnhancement } from '../decoder/utils'\nimport type { ServerDecoderCaches } from './caches'\nimport type { ServerDecoderOptions } from './types'\n\n/**\n * Decode a single transaction with time-bounded enhancement\n */\nexport async function decodeTransactionSync(\n transaction: DecoderResult,\n options: ServerDecoderOptions,\n caches: ServerDecoderCaches\n): Promise<DecoderResult> {\n const startTime = Date.now()\n const { timeoutMs = 800, enableEnhancement = true, chain } = options\n\n // Check transaction cache first\n if (transaction.hash) {\n const cached = caches.getTransaction(transaction.hash)\n if (cached) {\n return cached\n }\n }\n\n try {\n // Phase 1: Immediate decode (sync plugins only)\n const phase1Start = Date.now()\n const plugins = await pluginRegistry.getAll({ syncOnly: true })\n const schemaPlugins = pluginRegistry.getAllSchema()\n\n const immediateOptions = {\n chain,\n plugins,\n schemaPlugins,\n wrappers: [],\n async: false,\n }\n const immediateResult = await decodeTransactionCore(\n transaction,\n immediateOptions\n )\n\n if (!immediateResult) {\n return {\n ...createErrorResult(transaction),\n phase: 'immediate',\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n }\n\n let currentResult: DecoderResult = immediateResult\n let phase: 'immediate' | 'enhanced' | 'complete' = 'immediate'\n\n // Transfer collected wrappers if any\n if (immediateOptions.wrappers.length > 0) {\n ;(currentResult as any).wrappers = immediateOptions.wrappers\n }\n\n // Collect addresses from the decoded result\n const addresses = collectDataKeys(currentResult)\n currentResult.addresses = addresses\n\n // Check if we have time for enhancement\n const phase1Time = Date.now() - phase1Start\n if (enableEnhancement && phase1Time < timeoutMs * 0.6) {\n // Check if enhancement is actually needed\n if (!needsEnhancement(currentResult)) {\n // Already fully decoded during immediate phase\n phase = 'enhanced'\n } else {\n // Phase 2: Enhancement with async plugins\n try {\n const allPlugins = await pluginRegistry.getAll()\n const enhancedOptions = {\n chain,\n plugins: allPlugins,\n schemaPlugins,\n wrappers: [],\n async: true,\n }\n const enhancedResult = await Promise.race([\n decodeTransactionCore(transaction, enhancedOptions),\n // Timeout for phase 2\n new Promise<null>((resolve) =>\n setTimeout(() => resolve(null), timeoutMs * 0.6 - phase1Time)\n ),\n ])\n\n if (enhancedResult) {\n currentResult = enhancedResult\n phase = 'enhanced'\n\n // Merge wrappers from both phases (immediate + enhanced)\n const allWrappers = [\n ...((immediateOptions.wrappers || []) as any[]),\n ...(enhancedOptions.wrappers || []),\n ].filter(\n (w, i, arr) =>\n // Deduplicate by checking if this is the first occurrence\n arr.findIndex(\n (x) => JSON.stringify(x) === JSON.stringify(w)\n ) === i\n )\n\n if (allWrappers.length > 0) {\n ;(currentResult as any).wrappers = allWrappers\n }\n\n // Re-collect addresses from enhanced result\n currentResult.addresses = collectDataKeys(currentResult)\n }\n } catch (error) {\n console.error('Enhancement failed:', error)\n }\n }\n }\n\n const result: DecoderResult = {\n ...currentResult,\n phase,\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n\n // Cache the result if we have a hash\n if (transaction.hash) {\n caches.setTransaction(transaction.hash, result)\n }\n\n return result\n } catch (error) {\n console.error('Failed to decode transaction:', error)\n return {\n ...createErrorResult(transaction),\n phase: 'immediate',\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n }\n}\n\nfunction createErrorResult(transaction: DecoderResult): DecoderResult {\n return {\n ...transaction,\n isDecoded: false,\n resultType: 'error',\n errorType: 'UNKNOWN',\n sig: '0x' as `0x${string}`,\n addresses: [],\n } as DecoderResult\n}\n","import { collectDataKeys } from '../core/addressCollector'\nimport { pluginRegistry } from '../decoder/registry'\nimport { decodeTransaction as decodeTransactionCore } from '../decoder/transaction'\nimport type { DecoderResult, ResultShared } from '../decoder/types'\nimport { needsEnhancement } from '../decoder/utils'\nimport type { ServerDecoderCaches } from './caches'\nimport type { BatchDecodeResult, ServerDecoderOptions } from './types'\n\n/**\n * Decode multiple transactions with batching and time budget\n */\nexport async function decodeTransactionsBatch(\n transactions: DecoderResult[],\n options: ServerDecoderOptions,\n caches: ServerDecoderCaches\n): Promise<BatchDecodeResult> {\n const startTime = Date.now()\n const { timeoutMs = 800, enableEnhancement = true, chain } = options\n\n // Step 1: Check cache for all transactions\n const results: (DecoderResult | null)[] = transactions.map((tx) => {\n if (tx.transactionHash) {\n const cached = caches.getTransaction(tx.transactionHash)\n if (cached) return cached\n }\n return null\n })\n\n // Find uncached transactions\n const uncachedIndexes: number[] = []\n const uncachedTransactions: DecoderResult[] = []\n results.forEach((result, index) => {\n if (!result) {\n uncachedIndexes.push(index)\n uncachedTransactions.push(transactions[index])\n }\n })\n\n // If all are cached, return early\n if (uncachedTransactions.length === 0) {\n return {\n results: results as DecoderResult[],\n }\n }\n\n try {\n // Get plugins once for all transactions\n const syncPlugins = await pluginRegistry.getAll({ syncOnly: true })\n const allPlugins = await pluginRegistry.getAll()\n const schemaPlugins = pluginRegistry.getAllSchema()\n\n // Phase 1: Immediate decode for all uncached transactions\n const phase1Start = Date.now()\n const immediateOptionsArray = uncachedTransactions.map(() => ({\n chain,\n plugins: syncPlugins,\n schemaPlugins,\n wrappers: [],\n async: false,\n }))\n\n const immediateResults: DecoderResult[] = (\n await Promise.all(\n uncachedTransactions.map(async (tx, i) => {\n return await decodeTransactionCore(tx, immediateOptionsArray[i])\n })\n )\n ).filter(Boolean) as DecoderResult[]\n\n // Create result objects and collect addresses\n const newResults: DecoderResult[] = immediateResults\n .map((result, i) => {\n const data = result || createErrorResult(uncachedTransactions[i])\n\n // Transfer wrappers from immediate phase options\n if (immediateOptionsArray[i].wrappers.length > 0) {\n ;(data as any).wrappers = immediateOptionsArray[i].wrappers\n }\n\n // Collect addresses from the decoded result\n data.addresses = collectDataKeys(data)\n ;(data as ResultShared).timeTaken = Date.now() - startTime\n return data\n })\n .filter(Boolean) as DecoderResult[]\n\n // Check if we have time for enhancement\n const phase1Time = Date.now() - phase1Start\n if (enableEnhancement && phase1Time < timeoutMs * 0.6) {\n // Phase 2: Enhancement with async plugins (batch all transactions)\n try {\n const enhancedOptionsArray = uncachedTransactions.map(() => ({\n chain,\n plugins: allPlugins,\n schemaPlugins,\n wrappers: [],\n async: true,\n }))\n\n const enhancePromises = uncachedTransactions.map((tx, i) => {\n // Only enhance if immediate decode succeeded\n if (!immediateResults[i]) return null\n\n // Check if enhancement is actually needed\n if (!needsEnhancement(immediateResults[i])) {\n // Already fully decoded during immediate phase\n return null\n }\n\n return decodeTransactionCore(tx, enhancedOptionsArray[i])\n })\n\n // Wait for all enhancements with remaining time budget\n const _remainingTime = timeoutMs * 0.6 - phase1Time\n const enhancedResults = await Promise.all(enhancePromises)\n\n // Update results with enhanced data\n enhancedResults.forEach((enhanced, i) => {\n if (enhanced) {\n // Merge wrappers from both phases (immediate + enhanced)\n const immediateWrappers = immediateOptionsArray[i].wrappers || []\n const enhancedWrappers = enhancedOptionsArray[i].wrappers || []\n const allWrappers = [\n ...immediateWrappers,\n ...enhancedWrappers,\n ].filter(\n (w, idx, arr) =>\n // Deduplicate by checking if this is the first occurrence\n arr.findIndex(\n (x) => JSON.stringify(x) === JSON.stringify(w)\n ) === idx\n )\n\n // Enhancement returned a new result\n newResults[i] = enhanced\n\n // Add merged wrappers if any\n if (allWrappers.length > 0) {\n ;(newResults[i] as any).wrappers = allWrappers\n }\n\n // Re-collect addresses from enhanced result\n newResults[i].addresses = collectDataKeys(enhanced)\n newResults[i].phase = 'enhanced'\n } else if (\n immediateResults[i] &&\n !needsEnhancement(immediateResults[i])\n ) {\n // Enhancement was skipped because already fully decoded\n newResults[i].phase = 'enhanced'\n }\n })\n } catch (error) {\n console.error('Batch enhancement failed:', error)\n }\n }\n\n // Update timings\n const totalTime = Date.now() - startTime\n newResults.forEach((result) => {\n result.timeTaken = totalTime\n })\n\n // Cache all new results\n newResults.forEach((result, i) => {\n const tx = uncachedTransactions[i]\n if (tx.hash) {\n caches.setTransaction(tx.hash, result)\n }\n })\n\n // Merge cached and new results\n uncachedIndexes.forEach((originalIndex, i) => {\n results[originalIndex] = newResults[i]\n })\n\n return {\n results: results as DecoderResult[],\n }\n } catch (error) {\n console.error('Batch decode failed:', error)\n // Return error results for uncached transactions\n uncachedIndexes.forEach((originalIndex) => {\n results[originalIndex] = {\n ...createErrorResult(transactions[originalIndex]),\n phase: 'immediate',\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n })\n\n return {\n results: results as DecoderResult[],\n }\n }\n}\n\nfunction createErrorResult(transaction: DecoderResult): DecoderResult {\n return {\n ...transaction,\n isDecoded: false,\n resultType: 'error',\n errorType: 'UNKNOWN',\n sig: '0x' as `0x${string}`,\n addresses: [],\n } as DecoderResult\n}\n","/**\n * Debug wrapper for edge/worker environments\n * This avoids the tty dependency in the debug module\n */\n\nconst debugInstances = new Map<string, boolean>()\n\n// Simple debug implementation that doesn't rely on Node.js modules\nexport function createDebug(namespace: string) {\n // Check if this namespace is enabled\n const DEBUG = (typeof process !== 'undefined' && process.env?.DEBUG) || ''\n\n // Simple pattern matching\n const isEnabled = () => {\n if (!DEBUG) return false\n if (DEBUG === '*') return true\n\n const patterns = DEBUG.split(',').map((p) => p.trim())\n for (const pattern of patterns) {\n if (pattern === namespace) return true\n if (pattern.endsWith('*') && namespace.startsWith(pattern.slice(0, -1)))\n return true\n if (pattern.startsWith('-')) {\n const negPattern = pattern.slice(1)\n if (negPattern === namespace) return false\n if (\n negPattern.endsWith('*') &&\n namespace.startsWith(negPattern.slice(0, -1))\n )\n return false\n }\n }\n return false\n }\n\n debugInstances.set(namespace, isEnabled())\n\n return (...args: any[]) => {\n if (!debugInstances.get(namespace)) return\n\n const timestamp = new Date().toISOString()\n const prefix = `[${timestamp}] ${namespace}`\n\n // In Cloudflare Workers, console.log is the only option\n console.log(prefix, ...args)\n }\n}\n\nexport default createDebug\n","import { pluginRegistry } from '../decoder/registry'\nimport { decodeTransaction as decodeTransactionCore } from '../decoder/transaction'\nimport type { DecoderResult } from '../decoder/types'\nimport { createDebug } from '../utils/debug'\nimport type { ServerDecoderCaches } from './caches'\nimport type { ServerDecoderOptions } from './types'\n\nconst _debug = createDebug('decoder:finishDecoding')\n\n/**\n * Finish decoding a transaction by running enhancement phase\n * This only does phase 2 (async plugins) - address resolution should be done separately\n */\nexport async function finishDecoding(\n transaction: DecoderResult,\n options: ServerDecoderOptions,\n caches: ServerDecoderCaches\n): Promise<DecoderResult> {\n const startTime = Date.now()\n const { chain } = options\n\n try {\n // Check cache first\n const txHash = transaction.hash || transaction.transactionHash\n if (txHash) {\n const cached = caches.getTransaction(txHash)\n if (cached?.enhancementAttempted) {\n return {\n ...cached,\n cached: true,\n timeTaken: 0,\n } as DecoderResult\n }\n }\n\n // Get all plugins\n const allPlugins = await pluginRegistry.getAll()\n const schemaPlugins = pluginRegistry.getAllSchema()\n\n const enhancedOptions = {\n chain,\n plugins: allPlugins,\n schemaPlugins,\n wrappers: [],\n async: true,\n }\n\n // Wrappers and children must be removed when finishing decoding, because otherwise\n // the decoder will build hierarchical structures which are infinite.\n const {\n wrappers,\n children: _children,\n addresses: _addresses,\n ...transactionWithoutWrappers\n } = transaction as DecoderResult & {\n children?: unknown[]\n wrappers?: unknown[]\n addresses?: unknown[]\n }\n\n // Simply pass the entire transaction hierarchy to decodeTransactionCore\n // It will handle children properly and return a fully enhanced copy\n const enhancedResult = await decodeTransactionCore(\n transactionWithoutWrappers as DecoderResult,\n enhancedOptions\n )\n\n if (!enhancedResult) {\n if (txHash) {\n caches.setTransaction(txHash, {\n ...transaction,\n enhancementAttempted: true,\n })\n }\n return transaction\n }\n\n const result = {\n ...enhancedResult,\n // Only add wrappers if there are any\n ...((wrappers?.length || 0) > 0 ? { wrappers } : {}),\n cached: false,\n timeTaken: Date.now() - startTime,\n enhancementAttempted: true,\n } as DecoderResult\n\n // Always update cache with the enhanced result\n if (txHash) {\n caches.setTransaction(txHash, result)\n }\n\n return result\n } catch (error) {\n console.error('Failed to finish decoding transaction:', error)\n return {\n ...createErrorResult(transaction),\n phase: 'immediate',\n cached: false,\n timeTaken: Date.now() - startTime,\n }\n }\n}\n\nfunction createErrorResult(transaction: DecoderResult): DecoderResult {\n return {\n ...transaction,\n resultType: 'error',\n errorType: 'UNKNOWN',\n sig: '0x' as `0x${string}`,\n addresses: [],\n } as DecoderResult\n}\n","import {\n type DecodeDataOutput,\n decodeData,\n decodeMappingKey,\n decodePermissions,\n decodeValueContent,\n type ERC725JSONSchema,\n isDynamicKeyName,\n type Permissions,\n} from '@erc725/erc725.js'\nimport { type Hex, isHex } from 'viem'\nimport { ARRAY_MAX, defaultSchema, IPFS_GATEWAY } from '../constants'\nimport { getDataFromExternalSources } from '../getDataFromExternalSources'\nimport type { Info } from '../types'\n\nexport const schemaDefaultPlugin = decodeKeyValuePlugin(defaultSchema)\nexport default schemaDefaultPlugin\n\n/**\n * Decode key/value pair as per erc725 schema\n * @param key\n * @param value\n * @returns\n */\nexport function decodeKeyValuePlugin(\n defaultSchema: ERC725JSONSchema[],\n process?: (output: Info) => Promise<Info>\n) {\n const preProcess = async (key: Hex, value: Hex): Promise<Info> => {\n // Search for the schema entry.\n const schema =\n defaultSchema.find((item) => {\n if (key === item.key) {\n return true\n }\n const index = item.key.indexOf('<')\n if (index !== -1) {\n return key.slice(0, index) === item.key.slice(0, index)\n }\n return false\n }) ||\n defaultSchema.find((item) => {\n if (key.slice(0, 34) === item.key.slice(0, 34)) {\n return true\n }\n return false\n })\n if (schema) {\n try {\n // Get the raw name.\n const name = schema.name.replace(/[:[\\]]|<.*?>/g, '')\n if (schema.keyType === 'Array') {\n if (schema.key === key) {\n // Convert hex string to Uint8Array without using Buffer\n const hexString = value.slice(2)\n const all = new Uint8Array(hexString.length / 2)\n for (let i = 0; i < hexString.length; i += 2) {\n all[i / 2] = Number.parseInt(hexString.substring(i, i + 2), 16)\n }\n // Figure out the first and last byte of the value (this is to allow\n // the older and newer ways to store the array length i.e. uint256, uint128 and so on.)\n const [{ start: _start, end } = { start: 0, end: 0 }] = all.reduce(\n (\n acc: Array<{ isZero: boolean; start: number; end: number }>,\n byte,\n index_\n ) => {\n let isZero = byte === 0 || index_ === 0\n const last = acc.at(-1)\n let index = index_\n if (\n !last ||\n last.isZero !== isZero ||\n index === all.length - 1\n ) {\n if (index === all.length - 1) {\n index = all.length\n } else if (index === 0) {\n isZero = true\n }\n if (last) {\n last.end = index\n last.isZero = isZero\n }\n if (isZero) {\n acc.push({\n isZero,\n start: index,\n end: index === 0 ? index + 1 : index,\n })\n }\n }\n return acc\n },\n []\n )\n const picked =\n Math.abs(end - all.length + 1) <= 4\n ? all.length + 1\n : Math.abs(end - all.length / 2 + 1) <= 4\n ? all.length / 2\n : end\n const segment = value.slice(0, picked * 2 + 2)\n const length = BigInt(segment)\n if (length > ARRAY_MAX) {\n // We don't support arrays larger than 1000. Inside of the indexer it's a problem because of a single array column\n // and we had to pick some kind of maximum size to prevent the SQL from crashing.\n return {\n ...schema,\n type: 'Error',\n key,\n value: 'Array length too large',\n }\n }\n return {\n ...schema,\n type: 'ArrayLength',\n pretty: name,\n value: Number(length),\n }\n }\n // Extract array index.\n const index = BigInt(`0x${key.slice(34)}`)\n if (index > ARRAY_MAX) {\n return {\n ...schema,\n type: 'Error',\n key,\n value: 'Array index too large',\n }\n }\n let data =\n value !== '0x'\n ? decodeValueContent(schema.valueContent, value)\n : undefined\n if (schema.valueContent.startsWith('0x')) {\n data = data === schema.valueContent\n }\n return {\n ...schema,\n type: 'ArrayItem',\n pretty: name,\n dynamic: Number(index),\n value: data,\n }\n }\n // Decode dynamic parts.\n let dynamicKeyParts: string[] | string | undefined\n if (isDynamicKeyName(schema.name)) {\n dynamicKeyParts = decodeMappingKey(key, schema).map(({ value }) =>\n isHex(value) ? (value as string).toLowerCase() : `${value}`\n )\n }\n // Decode value\n let rawData =\n value !== '0x'\n ? (decodeData(\n [\n dynamicKeyParts\n ? {\n keyName: schema.name,\n dynamicKeyParts,\n value,\n }\n : { keyName: schema.name, value },\n ],\n defaultSchema\n ) as unknown as Record<string, unknown>[])\n : [{ value: undefined }]\n let data = rawData?.[0]?.value\n // Some special cases.\n if (schema.name === 'LSP8TokenMetadataBaseURI') {\n const { url: _url } = (data as { url: string | undefined }) || {}\n const url = _url?.replace(/\\0*$/g, '')\n if (!url && url?.includes('\\0')) {\n return {\n ...schema,\n pretty: name,\n type: 'Error',\n key,\n value: 'Invalid URL (contains \\\\0)',\n }\n }\n return { ...schema, type: 'Value', name, value: url }\n }\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const { url: _url } = (data as { url: string | undefined }) || {}\n const url = _url?.replace(/\\0*$/g, '')\n if (!url || url?.includes('\\0')) {\n const newURL = url?.replace(/\\0/g, '\\\\0')\n const { error, data, method } = rawData?.[0] as {\n error: string\n data?: string\n method?: string\n url?: string\n }\n return {\n ...schema,\n pretty: name,\n type: 'Error',\n key,\n value: `${error ? `${error} ` : ''}Invalid URL (contains \\\\0 ${newURL})`,\n data,\n method,\n url: newURL,\n }\n }\n const newURL = (data as { url: string }).url.replace(\n 'https://2eff.lukso.dev/ipfs/',\n 'ipfs://'\n )\n if (newURL !== (data as { url: string }).url) {\n ;(data as { url: string }).url = newURL\n }\n rawData = (await getDataFromExternalSources(\n defaultSchema,\n rawData as unknown as DecodeDataOutput[],\n IPFS_GATEWAY,\n false\n )) as unknown as Record<string, unknown>[]\n if (rawData?.[0]?.error) {\n const { error, data, method, url } = rawData?.[0] as {\n error: string\n data?: string\n method?: string\n url?: string\n }\n return {\n ...schema,\n type: 'Error',\n pretty: name,\n value: error,\n data,\n method,\n url,\n }\n }\n data =\n (rawData?.[0]?.value as Record<string, unknown>)?.[schema.name] ||\n (rawData?.[0]?.value as Record<string, unknown>)\n } else if (schema.valueContent.startsWith('0x')) {\n data = data === schema.valueContent\n }\n const {\n data: _data,\n method,\n src,\n url,\n } = rawData?.[0] as {\n data?: string\n method?: string\n url?: string\n src?: string\n }\n if (schema.name === 'AddressPermissions:Permissions:<address>') {\n let _value: string | object = data as string | object\n try {\n const {\n ERC4337_PERMISSION: _ignore1,\n ALL_PERMISSIONS: _ignore2,\n ...rest\n } = decodePermissions(data as Hex) as unknown as Permissions & {\n ISRECOVERY?: boolean\n }\n if (Object.keys('rest').length === 1 && rest.ADDCONTROLLER) {\n rest.ISRECOVERY = true\n }\n _value = rest\n } catch {\n // Ignore\n }\n return {\n ...schema,\n type: 'Value',\n pretty: name,\n value: _value,\n dynamic:\n dynamicKeyParts?.length === 1\n ? dynamicKeyParts[0]\n : dynamicKeyParts,\n data: _data,\n method,\n src,\n url,\n }\n }\n return {\n ...schema,\n type: 'Value',\n pretty: name,\n value: data,\n dynamic:\n dynamicKeyParts?.length === 1\n ? dynamicKeyParts[0]\n : dynamicKeyParts,\n data: _data,\n method,\n src,\n url,\n }\n } catch (error) {\n return { ...schema, type: 'Error', key, value: error as Error }\n }\n }\n return { type: 'Undecoded', name: undefined, key, value }\n }\n return async (key: Hex, value: Hex) => {\n try {\n const result = await preProcess(key, value)\n if (process) {\n return await process(result)\n }\n return result\n } catch {}\n return undefined\n }\n}\n","[\n {\n \"name\": \"LSP1UniversalReceiverDelegate\",\n \"key\": \"0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate:<bytes32>\",\n \"key\": \"0x0cfc51aec37c55a4d0b10000<bytes32>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","[\n {\n \"name\": \"SupportedStandards:LSP3Profile\",\n \"key\": \"0xeafec4d89fa9619884b600005ef83ad9559033e6e941db7d7c495acdce616347\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"bytes4\",\n \"valueContent\": \"0x5ef83ad9\"\n },\n {\n \"name\": \"LSP3Profile\",\n \"key\": \"0x5ef83ad9559033e6e941db7d7c495acdce616347d28e90c7ce47cbfcfcad3bc5\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"bytes\",\n \"valueContent\": \"VerifiableURI\"\n },\n {\n \"name\": \"LSP12IssuedAssets[]\",\n \"key\": \"0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP12IssuedAssetsMap:<address>\",\n \"key\": \"0x74ac2555c10b9349e78f0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n },\n {\n \"name\": \"LSP5ReceivedAssets[]\",\n \"key\": \"0x6460ee3c0aac563ccbf76d6e1d07bada78e3a9514e6382b736ed3f478ab7b90b\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP5ReceivedAssetsMap:<address>\",\n \"key\": \"0x812c4334633eb816c80d0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate\",\n \"key\": \"0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate:<bytes32>\",\n \"key\": \"0x0cfc51aec37c55a4d0b10000<bytes32>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP17Extension:<bytes4>\",\n \"key\": \"0xcee78b4094da860110960000<bytes4>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","[\n {\n \"name\": \"SupportedStandards:LSP4DigitalAsset\",\n \"key\": \"0xeafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"bytes4\",\n \"valueContent\": \"0xa4d96624\"\n },\n {\n \"name\": \"LSP4TokenName\",\n \"key\": \"0xdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af1\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"string\",\n \"valueContent\": \"String\"\n },\n {\n \"name\": \"LSP4TokenSymbol\",\n \"key\": \"0x2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db932756\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"string\",\n \"valueContent\": \"String\"\n },\n {\n \"name\": \"LSP4TokenType\",\n \"key\": \"0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"uint256\",\n \"valueContent\": \"Number\"\n },\n {\n \"name\": \"LSP4Metadata\",\n \"key\": \"0x9afb95cacc9f95858ec44aa8c3b685511002e30ae54415823f406128b85b238e\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"bytes\",\n \"valueContent\": \"VerifiableURI\"\n },\n {\n \"name\": \"LSP4Creators[]\",\n \"key\": \"0x114bd03b3a46d48759680d81ebb2b414fda7d030a7105a851867accf1c2352e7\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP4CreatorsMap:<address>\",\n \"key\": \"0x6de85eaf5d982b4e5da00000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n }\n]\n","[\n {\n \"name\": \"SupportedStandards:LSP4DigitalCertificate\",\n \"key\": \"0xeafec4d89fa9619884b6b89135626455000000000000000000000000abf0613c\",\n \"keyType\": \"Mapping\",\n \"valueContent\": \"0xabf0613c\",\n \"valueType\": \"bytes\"\n }\n]\n","[\n {\n \"name\": \"LSP5ReceivedAssets[]\",\n \"key\": \"0x6460ee3c0aac563ccbf76d6e1d07bada78e3a9514e6382b736ed3f478ab7b90b\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP5ReceivedAssetsMap:<address>\",\n \"key\": \"0x812c4334633eb816c80d0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n }\n]\n","[\n {\n \"name\": \"AddressPermissions[]\",\n \"key\": \"0xdf30dba06db6a30e65354d9a64c609861f089545ca58c6b4dbe31a5f338cb0e3\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"AddressPermissions:Permissions:<address>\",\n \"key\": \"0x4b80742de2bf82acb3630000<address>\",\n \"keyType\": \"MappingWithGrouping\",\n \"valueType\": \"bytes32\",\n \"valueContent\": \"BitArray\"\n },\n {\n \"name\": \"AddressPermissions:AllowedCalls:<address>\",\n \"key\": \"0x4b80742de2bf393a64c70000<address>\",\n \"keyType\": \"MappingWithGrouping\",\n \"valueType\": \"(bytes4,address,bytes4,bytes4)[CompactBytesArray]\",\n \"valueContent\": \"(BitArray,Address,Bytes4,Bytes4)\"\n },\n {\n \"name\": \"AddressPermissions:AllowedERC725YDataKeys:<address>\",\n \"key\": \"0x4b80742de2bf866c29110000<address>\",\n \"keyType\": \"MappingWithGrouping\",\n \"valueType\": \"bytes[CompactBytesArray]\",\n \"valueContent\": \"Bytes\"\n }\n]\n","[\n {\n \"name\": \"LSP8TokenIdFormat\",\n \"key\": \"0xf675e9361af1c1664c1868cfa3eb97672d6b1a513aa5b81dec34c9ee330e818d\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"uint256\",\n \"valueContent\": \"Number\"\n },\n {\n \"name\": \"LSP8TokenMetadataBaseURI\",\n \"key\": \"0x1a7628600c3bac7101f53697f48df381ddc36b9015e7d7c9c5633d1252aa2843\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"bytes\",\n \"valueContent\": \"VerifiableURI\"\n },\n {\n \"name\": \"LSP8ReferenceContract\",\n \"key\": \"0x708e7b881795f2e6b6c2752108c177ec89248458de3bf69d0d43480b3e5034e6\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"(address,bytes32)\",\n \"valueContent\": \"(Address,Bytes32)\"\n }\n]\n","[\n {\n \"name\": \"SupportedStandards:LSP9Vault\",\n \"key\": \"0xeafec4d89fa9619884b600007c0334a14085fefa8b51ae5a40895018882bdb90\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"bytes4\",\n \"valueContent\": \"0x7c0334a1\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate\",\n \"key\": \"0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47\",\n \"keyType\": \"Singleton\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP1UniversalReceiverDelegate:<bytes32>\",\n \"key\": \"0x0cfc51aec37c55a4d0b10000<bytes32>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP17Extension:<bytes4>\",\n \"key\": \"0xcee78b4094da860110960000<bytes4>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","[\n {\n \"name\": \"LSP10VaultsMap:<address>\",\n \"key\": \"0x192448c3c0f88c7f238c0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n },\n {\n \"name\": \"LSP10Vaults[]\",\n \"key\": \"0x55482936e01da86729a45d2b87a6b1d3bc582bea0ec00e38bdb340e3af6f9f06\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","[\n {\n \"name\": \"LSP12IssuedAssets[]\",\n \"key\": \"0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd\",\n \"keyType\": \"Array\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n },\n {\n \"name\": \"LSP12IssuedAssetsMap:<address>\",\n \"key\": \"0x74ac2555c10b9349e78f0000<address>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"(bytes4,uint128)\",\n \"valueContent\": \"(Bytes4,Number)\"\n }\n]\n","[\n {\n \"name\": \"LSP17Extension:<bytes4>\",\n \"key\": \"0xcee78b4094da860110960000<bytes4>\",\n \"keyType\": \"Mapping\",\n \"valueType\": \"address\",\n \"valueContent\": \"Address\"\n }\n]\n","import type { ERC725JSONSchema } from '@erc725/erc725.js'\nimport LSP1Schema from '@erc725/erc725.js/schemas/LSP1UniversalReceiverDelegate.json' with {\n type: 'json',\n}\nimport LSP3Schema from '@erc725/erc725.js/schemas/LSP3ProfileMetadata.json' with {\n type: 'json',\n}\nimport LSP4Schema from '@erc725/erc725.js/schemas/LSP4DigitalAsset.json' with {\n type: 'json',\n}\nimport LSP4LegacySchema from '@erc725/erc725.js/schemas/LSP4DigitalAssetLegacy.json' with {\n type: 'json',\n}\nimport LSP5Schema from '@erc725/erc725.js/schemas/LSP5ReceivedAssets.json' with {\n type: 'json',\n}\nimport LSP6Schema from '@erc725/erc725.js/schemas/LSP6KeyManager.json' with {\n type: 'json',\n}\nimport LSP8Schema from '@erc725/erc725.js/schemas/LSP8IdentifiableDigitalAsset.json' with {\n type: 'json',\n}\nimport LSP9Schema from '@erc725/erc725.js/schemas/LSP9Vault.json' with {\n type: 'json',\n}\nimport LSP10Schema from '@erc725/erc725.js/schemas/LSP10ReceivedVaults.json' with {\n type: 'json',\n}\nimport LSP12Schema from '@erc725/erc725.js/schemas/LSP12IssuedAssets.json' with {\n type: 'json',\n}\nimport LSP17Schema from '@erc725/erc725.js/schemas/LSP17ContractExtension.json' with {\n type: 'json',\n}\n\nexport const IPFS_GATEWAY = 'https://api.universalprofile.cloud/ipfs/'\nexport const FUNCTION_DICTIONARY_URL =\n 'https://4bytesdictionary.universalprofile.cloud'\nexport const OPENCHAIN_DICTIONARY_URL =\n 'https://api.openchain.xyz/signature-database/v1/lookup'\nexport const ARRAY_MAX = 1000\n\n/**\n * Concatenation of all the schemas\n */\nexport const defaultSchema: ERC725JSONSchema[] = [\n ...LSP8Schema,\n ...LSP4Schema,\n ...LSP5Schema,\n ...LSP3Schema,\n ...LSP1Schema,\n ...LSP4LegacySchema,\n ...LSP6Schema,\n ...LSP9Schema,\n ...LSP10Schema,\n ...LSP12Schema,\n ...LSP17Schema,\n {\n name: 'LSP28TheGrid',\n key: '0x724141d9918ce69e6b8afcf53a91748466086ba2c74b94cab43c649ae2ac23ff',\n keyType: 'Singleton',\n valueType: 'bytes',\n valueContent: 'VerifiableURI',\n },\n]\n\n/**\n * The important standards for profile, lsp7 and lsp8\n */\ntype Standards =\n | 'LSP0ERC725Account'\n | 'LSP7DigitalAsset'\n | 'LSP8IdentifiableDigitalAsset'\n\n/**\n * Interface id entry for interface id items.\n */\ntype StandardID = {\n key: `0x${string}`\n name: string\n standard: Standards\n}\n\n/**\n * Array of our standard interfaceIDs\n */\nexport const ITEMS: StandardID[] = [\n {\n key: '0x24871b3d' as `0x${string}`,\n name: 'isProfile',\n standard: 'LSP0ERC725Account' as Standards,\n },\n\n {\n key: '0xc52d6008' as `0x${string}`,\n name: 'isLSP7',\n standard: 'LSP7DigitalAsset' as Standards,\n },\n {\n key: '0xb3c4928f' as `0x${string}`,\n name: 'isLSP7',\n standard: 'LSP7DigitalAsset' as Standards,\n },\n {\n key: '0xdaa746b7' as `0x${string}`,\n name: 'isLSP7',\n standard: 'LSP7DigitalAsset' as Standards,\n },\n\n {\n key: '0x3a271706' as `0x${string}`,\n name: 'isLSP8',\n standard: 'LSP8IdentifiableDigitalAsset' as Standards,\n },\n {\n key: '0xecad9f75' as `0x${string}`,\n name: 'isLSP8',\n standard: 'LSP8IdentifiableDigitalAsset' as Standards,\n },\n {\n key: '0x30dc5278' as `0x${string}`,\n name: 'isLSP8',\n standard: 'LSP8IdentifiableDigitalAsset' as Standards,\n },\n]\n","import type {\n DecodeDataOutput,\n ERC725JSONSchema,\n GetDataExternalSourcesOutput,\n URLDataWithHash,\n} from '@erc725/erc725.js'\nimport { isDataAuthentic, patchIPFSUrlsIfApplicable } from '@erc725/erc725.js'\n\nexport async function loadFile(\n _url: string,\n ipfsGateway: string\n): Promise<ArrayBuffer | null> {\n let url = _url\n if (url.startsWith('data:')) {\n // Handle data URLs\n const base64Data = url.split(',')[1]\n const binaryString = atob(base64Data)\n const len = binaryString.length\n const bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i)\n }\n return Promise.resolve(bytes.buffer)\n }\n if (url.startsWith('ipfs://')) {\n // Handle IPFS URLs\n const ipfsHash = url.replace('ipfs://', '')\n url = `${ipfsGateway}${ipfsHash}`\n }\n return fetch(url)\n .then((response) => {\n if (!response.ok) {\n throw new Error('Network response was not ok')\n }\n return response.arrayBuffer()\n })\n .catch(() => null)\n}\n\nexport const getDataFromExternalSources = (\n schemas: ERC725JSONSchema[],\n dataFromChain: DecodeDataOutput[],\n ipfsGateway: string,\n throwException = true\n): Promise<\n Array<\n GetDataExternalSourcesOutput & {\n error?: string\n method?: string\n data?: string\n url?: string\n src?: string\n }\n >\n> => {\n const promises = dataFromChain.map(async (dataEntry) => {\n const schemaElement = schemas.find((schema) => schema.key === dataEntry.key)\n\n if (!schemaElement) {\n // It is weird if we can't find the schema element for the key...\n // Let's simply ignore and return it...\n return dataEntry\n }\n\n if (\n !['jsonurl', 'asseturl', 'verifiableuri'].includes(\n schemaElement.valueContent.toLowerCase()\n )\n ) {\n return dataEntry\n }\n\n const urlDataWithHash: URLDataWithHash = dataEntry.value as URLDataWithHash // Type URLDataWithHash\n let url: string | undefined\n let src: string | undefined\n try {\n // At this stage, value should be of type jsonurl, verifiableuri or asseturl\n if (typeof dataEntry.value === 'string') {\n throw new Error(\n `Value is string instead of ${schemaElement.valueContent}`\n )\n }\n\n if (!dataEntry.value) {\n throw new Error(`${schemaElement.valueContent} empty`)\n }\n\n if (Array.isArray(dataEntry.value)) {\n throw new Error(\n `Value is Array instead of ${schemaElement.valueContent}`\n )\n }\n\n url = urlDataWithHash.url\n ;({ url: src } = patchIPFSUrlsIfApplicable(\n urlDataWithHash as URLDataWithHash,\n ipfsGateway\n ))\n let _length = 'unknown'\n if (!url.startsWith('data:') && /[=?/]$/.test(url)) {\n // this URL is not verifiable and the URL ends with a / or ? or = meaning it's not a file\n // and more likely to be some kind of directory or query BaseU=== \"errorRI\n return dataEntry\n }\n const receivedData = /^data:|^ipfs:\\/\\/|\\/ipfs\\//.test(url)\n ? await loadFile(src, ipfsGateway).then((buffer) =>\n buffer\n ? new Uint8Array(buffer)\n : Promise.reject(new Error('No Data'))\n )\n : await fetch(src).then(async (response) => {\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return response\n .arrayBuffer()\n .then((buffer) => new Uint8Array(buffer))\n })\n _length = receivedData.length.toString()\n const captureHashes: Record<string, string> = {}\n const captureErrors: string[] = []\n if (receivedData.length >= 2) {\n // JSON data cannot be less than 2 characters long.\n try {\n // - Build a string containing the first and last byte of the received data\n // and try to convert it to utf8. If that succeeds then\n // - check whether those could represent valid JSON data.\n // - then validate the data as JSON\n // - then verfiy the data against the verification method\n // Improved JSON detection. We now check the first and up to the last 3 bytes.\n // The 3 bytes can be `]` or '}' with either SPACE, LF or CRLF at the end.\n // When editing JSON using a text editor, a lot of time it's pretty printed\n // and an empty line added to the end. This is a common pattern.\n const capture: number[] = []\n capture.push(receivedData[0])\n if (receivedData.length > 3) {\n capture.push(receivedData[receivedData.length - 3])\n }\n if (receivedData.length > 2) {\n capture.push(receivedData[receivedData.length - 2])\n }\n if (receivedData.length > 1) {\n capture.push(receivedData[receivedData.length - 1])\n }\n const key = String.fromCharCode.apply(null, capture)\n // Currently not supported even though they could be added and can represent valid JSON.\n // \" \" => JSON.stringify(\"\") NOT SUPPORTED as valid JSON\n // t or f and e => JSON.stringify(true) or JSON.stringify(false) NOT SUPPORTED as valid JSON\n // 0-9 => JSON.stringify(0) integer or float (note .5 is not legitimate JSON) NOT SUPPORTED as valid JSON\n // if (/^(\\[\\]|\\{\\}|(tf)e|\\d\\d)$/.test(key)) {\n // Check if the beginning or end are\n // { and } => JSON.stringify({...}) => pretty much 100% of our JSON will be this.\n // [ and ] => JSON.stringify([...])\n if (/^(\\[.*\\]|\\{.*\\})\\s*$/s.test(key)) {\n const json = new TextDecoder().decode(new Uint8Array(receivedData))\n const value = JSON.parse(json)\n if (\n isDataAuthentic(\n value,\n urlDataWithHash.verification,\n captureErrors\n )\n ) {\n return {\n ...dataEntry,\n value,\n data: urlDataWithHash.verification?.data,\n method: urlDataWithHash.verification?.method,\n url,\n src,\n }\n }\n captureHashes[captureErrors.pop() || ''] =\n urlDataWithHash.verification?.data || ''\n if (\n isDataAuthentic(\n receivedData,\n urlDataWithHash.verification,\n captureErrors\n )\n ) {\n return {\n ...dataEntry,\n value,\n data: urlDataWithHash.verification?.data,\n method: urlDataWithHash.verification?.method,\n url,\n src,\n }\n }\n captureHashes[captureErrors.pop() || ''] =\n urlDataWithHash.verification?.data || ''\n throw new Error(\n `Data does not validate, ignored ${Object.entries(captureHashes)\n .map(\n ([expected, got]) =>\n `calculated(${got}) != expected(${expected})`\n )\n .join(', ')}`\n )\n }\n } catch {\n // ignore\n }\n }\n if (\n isDataAuthentic(\n receivedData,\n urlDataWithHash.verification,\n captureErrors\n )\n ) {\n return {\n ...dataEntry,\n value: receivedData,\n data: urlDataWithHash.verification?.data,\n method: urlDataWithHash.verification?.method,\n url,\n src,\n }\n }\n captureHashes[captureErrors.pop() || ''] =\n urlDataWithHash.verification?.data || ''\n throw new Error(\n `Data does not validate, ignored ${Object.entries(captureHashes)\n .map(\n ([expected, got]) => `calculated(${got}) != expected(${expected})`\n )\n .join(', ')}`\n )\n } catch (error) {\n const message = (error as { message: string }).message\n if (throwException) {\n throw error\n }\n return {\n ...dataEntry,\n value: null,\n error: message,\n data: urlDataWithHash.verification?.data,\n method: urlDataWithHash.verification?.method,\n url,\n src,\n }\n }\n })\n return Promise.all(promises)\n}\n","import type { ERC725JSONSchema } from '@erc725/erc725.js'\nimport type { Abi, AbiParameter, Log, Transaction } from 'viem'\nimport { pluginRegistry } from '../registry'\nimport type {\n Aggregation,\n DecodeEventCallback,\n DecodeEventResult,\n DecoderOptions,\n DecoderPlugin,\n DecoderResult,\n EnhancerAggregationKeyCallback,\n EnhancerCallback,\n EnhancerSummarizeCallback,\n Info,\n PluginOptions,\n ResultType,\n SchemaPlugin,\n} from '../types'\nimport { customDecodeFunctionData } from '../utils'\nimport { decodeKeyValuePlugin } from './schemaDefault'\n\n/**\n * Helper to create aggregation keys with plugin prefix\n */\nexport function createAggregationKey(\n pluginOptions: PluginOptions,\n key: string\n): string {\n return `${pluginOptions.name || pluginOptions.decoderName || 'unknown'}:${key}`\n}\n\n/**\n *\n * @param abi abi to use for decoding\n * @param pluginOptions options to name abi, decoder or module (optional since the enhancer can provide some or all)\n * @param enhance callback to do the actual enhancement once the abi function was decoded.\n * @returns enhanced transaction\n */\nexport function standardPlugin<T extends Abi | readonly unknown[]>(\n abi: T,\n pluginOptions: PluginOptions,\n callbacks: {\n enhance: EnhancerCallback\n decodeEvent: DecodeEventCallback\n overrideEnhance?: EnhancerCallback\n getAggregationKey?: EnhancerAggregationKeyCallback\n summarize?: EnhancerSummarizeCallback\n aggregations?: Aggregation[]\n }\n): DecoderPlugin {\n const {\n abiName,\n decoderName = 'unknown',\n moduleHint,\n required,\n priority,\n name,\n usesAsync,\n } = pluginOptions\n const plugin: DecoderPlugin = {\n enhance: async (transaction: DecoderResult, options: DecoderOptions) => {\n if (callbacks.overrideEnhance) {\n return await callbacks.overrideEnhance(\n transaction,\n pluginOptions,\n options\n )\n }\n const { preferError } = options\n const {\n to: _to,\n from: _from,\n value: _value,\n input,\n blockNumber: _blockNumber,\n // logs,\n } = transaction as Partial<Transaction> & {\n data?: `0x${string}`\n logs?: Log[]\n }\n const to = _to || undefined\n const from = _from || undefined\n const value = _value ? BigInt(_value) : 0n\n const decoded = customDecodeFunctionData(\n {\n abi,\n data: input || '0x',\n },\n preferError\n )\n if (!decoded) {\n // Most of the time decoded will through an error,\n // but if the result is undefined, then assume it also\n // didn't work.\n return\n }\n const { functionName, sig, args } = decoded as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n const output: DecoderResult = {\n isDecoded: true,\n ...transaction,\n resultType: 'execute',\n functionName,\n sig,\n input,\n __decoder: decoderName,\n standard: abiName || 'unknown',\n moduleHint,\n args,\n to,\n from,\n value,\n } as DecoderResult\n const enhanced = await callbacks.enhance(output, pluginOptions, options)\n if (enhanced) {\n return enhanced\n }\n return // This enhancement was denied by the enhancer so we need to re-try.\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return callbacks.decodeEvent(log, options)\n },\n getAggregationKey: async (result, pluginOptions, options) => {\n if (!callbacks.getAggregationKey) {\n return\n }\n return callbacks.getAggregationKey(result, pluginOptions, options)\n },\n summarize: async (aggregationKey, result, pluginOptions, options) => {\n if (!callbacks.summarize) {\n return\n }\n return callbacks.summarize(aggregationKey, result, pluginOptions, options)\n },\n }\n\n // Add optional properties to the plugin\n if (name !== undefined) {\n plugin.name = name\n }\n if (required !== undefined) {\n plugin.required = required\n }\n if (priority !== undefined) {\n plugin.priority = priority\n }\n\n if (usesAsync !== undefined) {\n plugin.usesAsync = usesAsync\n }\n\n if (callbacks.aggregations !== undefined) {\n plugin.aggregations = callbacks.aggregations\n }\n\n // Freeze the plugin to prevent modifications\n const frozenPlugin = Object.freeze(plugin)\n\n // Auto-register the plugin if it has a name\n // Use direct import of registry to avoid circular dependency\n if (name) {\n pluginRegistry.register(name, frozenPlugin, {\n priority,\n required,\n usesAsync, // Include async flag for registration\n })\n }\n\n return frozenPlugin\n}\n\n/**\n * Creates a standard schema plugin from ERC725 schemas\n * @param schemas Array of ERC725JSONSchema objects\n * @param pluginOptions Options including name, required, priority\n * @param process Optional post-processing function\n * @returns SchemaPlugin\n */\nexport function standardSchemaPlugin(\n schemas: ERC725JSONSchema[],\n pluginOptions?: {\n name?: string\n required?: boolean\n priority?: number\n },\n process?: (output: Info) => Promise<Info>\n): SchemaPlugin {\n const basePlugin = decodeKeyValuePlugin(schemas, process)\n\n // Create a proper SchemaPlugin by assigning properties to the function\n const plugin = Object.assign(basePlugin, {\n name: pluginOptions?.name,\n required: pluginOptions?.required,\n priority: pluginOptions?.priority ?? 50,\n })\n\n // Freeze the plugin to prevent modifications\n return Object.freeze(plugin)\n}\n","import createDebug from '../utils/debug'\nimport type { Aggregation, DecoderResult } from './types'\n\n/**\n * Helper function to create a typed aggregation configuration\n * @param config The aggregation configuration\n * @returns A frozen aggregation object\n */\nexport function standardAggregation<T>(config: {\n key: string\n map: (tx: DecoderResult) => T | undefined\n reduce: (state: T | undefined, mapped: T) => T\n finalize: (state: T) => Omit<import('./types').ResultAggregate, 'resultType'>\n}): Aggregation<T> {\n return Object.freeze(config)\n}\n\n/**\n * Aggregation engine for processing transactions with map/reduce pattern\n */\nexport interface AggregationState<T = unknown> {\n data: T\n lastTransaction: DecoderResult\n}\n\nconst debug = createDebug('decoder:aggregation')\n\nexport class PluginAggregationEngine {\n private plugins = new Map<string, import('./types').DecoderPlugin>()\n private states = new Map<string, Map<string, AggregationState>>() // plugin -> key -> state\n\n /**\n * Register a plugin with aggregations\n */\n registerPlugin(plugin: import('./types').DecoderPlugin) {\n if (plugin.name && plugin.aggregations && plugin.aggregations.length > 0) {\n debug(\n `Registering plugin ${plugin.name} with ${plugin.aggregations.length} aggregations`\n )\n this.plugins.set(plugin.name, plugin)\n this.states.set(plugin.name, new Map())\n }\n }\n\n /**\n * Process a transaction through relevant aggregations\n */\n processTransaction(tx: DecoderResult) {\n // Skip if no aggregations needed\n if (!tx.aggregationKeys || tx.aggregationKeys.length === 0) return\n\n // Process aggregations based on the full aggregation keys\n for (const fullKey of tx.aggregationKeys) {\n // Split the full key to get plugin name and aggregation key\n const [pluginName, ...keyParts] = fullKey.split(':')\n const aggregationKey = keyParts.join(':') // Handle keys with colons\n\n const plugin = this.plugins.get(pluginName)\n if (!plugin || !plugin.aggregations) {\n debug(`processTransaction: No plugin found for ${pluginName}`)\n continue\n }\n\n const pluginStates = this.states.get(pluginName)\n if (!pluginStates) {\n debug(`processTransaction: No states for plugin ${pluginName}`)\n continue\n }\n\n const agg = plugin.aggregations.find((a) => a.key === aggregationKey)\n if (!agg) {\n debug(\n `processTransaction: No aggregation found for key ${aggregationKey} in plugin ${pluginName}`\n )\n continue\n }\n\n const mapped = agg.map(tx)\n if (mapped !== undefined) {\n const currentState = pluginStates.get(aggregationKey)\n if (!currentState) {\n // First transaction for this aggregation\n debug(\n `processTransaction: First transaction for ${pluginName}:${aggregationKey}`\n )\n pluginStates.set(aggregationKey, {\n data: mapped,\n lastTransaction: tx,\n })\n } else {\n // Update existing state\n const newData = agg.reduce(currentState.data, mapped)\n pluginStates.set(aggregationKey, {\n data: newData,\n lastTransaction: tx, // Always update to latest transaction\n })\n }\n } else {\n debug(\n `processTransaction: map returned undefined for ${pluginName}:${aggregationKey}`\n )\n }\n }\n }\n\n /**\n * Process a batch of transactions\n */\n processBatch(txs: DecoderResult[]) {\n debug(`Processing batch of ${txs.length} transactions`)\n let processedCount = 0\n for (const tx of txs) {\n this.processTransaction(tx)\n if (tx.aggregationKeys && tx.aggregationKeys.length > 0) {\n processedCount++\n }\n }\n debug(`Processed ${processedCount} transactions with aggregationKeys`)\n }\n\n /**\n * Get finalized result for a specific plugin and aggregation key\n */\n getResult(pluginName: string, key: string): DecoderResult | undefined {\n const plugin = this.plugins.get(pluginName)\n const pluginStates = this.states.get(pluginName)\n\n if (!plugin || !pluginStates) return undefined\n\n const agg = plugin.aggregations?.find((a) => a.key === key)\n const state = pluginStates.get(key)\n\n if (!agg || state === undefined) return undefined\n\n // Merge aggregation result with last transaction metadata\n const aggregationResult = agg.finalize(state.data)\n\n return {\n ...state.lastTransaction,\n ...aggregationResult,\n resultType: 'aggregate' as const,\n } as DecoderResult\n }\n\n /**\n * Get all aggregation results\n */\n getAllResults(): Array<{\n plugin: string\n key: string\n result: DecoderResult\n }> {\n const results: Array<{\n plugin: string\n key: string\n result: DecoderResult\n }> = []\n\n for (const [pluginName, plugin] of this.plugins) {\n const pluginStates = this.states.get(pluginName)\n\n // Skip if this plugin has no states (hasn't processed any transactions yet)\n if (!pluginStates) {\n continue\n }\n\n for (const agg of plugin.aggregations || []) {\n const state = pluginStates.get(agg.key)\n if (state !== undefined) {\n results.push({\n plugin: pluginName,\n key: agg.key,\n result: {\n ...state.lastTransaction,\n ...agg.finalize(state.data),\n resultType: 'aggregate' as const,\n } as DecoderResult,\n })\n }\n }\n }\n\n return results\n }\n\n /**\n * Clear all aggregation states\n */\n clear() {\n for (const states of this.states.values()) {\n states.clear()\n }\n }\n\n /**\n * Clear states for a specific plugin\n */\n clearPlugin(pluginName: string) {\n this.states.get(pluginName)?.clear()\n }\n\n /**\n * Get current state (for persistence)\n */\n getStates(): Map<string, Map<string, AggregationState>> {\n return new Map(this.states)\n }\n\n /**\n * Restore states (from persistence)\n */\n restoreStates(states: Map<string, Map<string, AggregationState>>) {\n // Merge states instead of replacing to preserve plugin initialization\n for (const [pluginName, pluginStates] of states) {\n this.states.set(pluginName, new Map(pluginStates))\n }\n }\n}\n","import {\n type Abi,\n AbiDecodingDataSizeTooSmallError,\n AbiEventSignatureEmptyTopicsError,\n AbiEventSignatureNotFoundError,\n type AbiParameter,\n BaseError,\n type Chain,\n type ContractEventName,\n type DecodeEventLogParameters,\n type DecodeEventLogReturnType,\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n decodeAbiParameters,\n type EventDefinition,\n type Hex,\n type Log,\n size,\n toEventSelector,\n} from 'viem'\nimport { formatAbiItem } from 'viem/utils'\nimport type { ArrayArgs, DecodeEventResult } from './types'\nimport { createNamedArgs } from './utils'\n\nconst docsPath = '/docs/contract/decodeEventLog'\n\nfunction decodeTopic({ param, value }: { param: AbiParameter; value: Hex }) {\n if (\n param.type === 'string' ||\n param.type === 'bytes' ||\n param.type === 'tuple' ||\n param.type.match(/^(.*)\\[(\\d+)?\\]$/)\n )\n return value\n const decodedArg = decodeAbiParameters([param], value) || []\n return decodedArg[0]\n}\n\nexport type PositionOutOfBoundsErrorType = PositionOutOfBoundsError & {\n name: 'PositionOutOfBoundsError'\n}\nexport class PositionOutOfBoundsError extends BaseError {\n constructor({ length, position }: { length: number; position: number }) {\n super(\n `Position \\`${position}\\` is out of bounds (\\`0 < position < ${length}\\`).`,\n { name: 'PositionOutOfBoundsError' }\n )\n }\n}\n\n/**\n * Custom copy of decodeEventLog which can assemble named args.\n * @param parameters\n * @returns\n */\nexport function customDecodeEventLog<\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName<abi> | undefined = undefined,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n>(\n parameters: DecodeEventLogParameters<abi, eventName, topics, data, strict>\n): DecodeEventLogReturnType<abi, eventName, topics, data, strict> {\n const {\n abi,\n data,\n strict: strict_,\n topics,\n } = parameters as DecodeEventLogParameters\n\n const strict = strict_ ?? true\n const [signature, ...argTopics] = topics\n if (!signature) throw new AbiEventSignatureEmptyTopicsError({ docsPath })\n\n const abiItem = (() => {\n if (abi.length === 1) return abi[0]\n return abi.find(\n (x) =>\n x.type === 'event' &&\n signature === toEventSelector(formatAbiItem(x) as EventDefinition)\n )\n })()\n\n if (!(abiItem && 'name' in abiItem) || abiItem.type !== 'event')\n throw new AbiEventSignatureNotFoundError(signature, { docsPath })\n\n const { name, inputs } = abiItem\n const isUnnamed = inputs?.some((x) => !('name' in x && x.name))\n\n let args: unknown[] | Record<string, unknown> = isUnnamed ? [] : {}\n\n // Decode topics (indexed args).\n const indexedInputs = inputs.filter((x) => 'indexed' in x && x.indexed)\n for (let i = 0; i < indexedInputs.length; i++) {\n const param = indexedInputs[i]\n const topic = argTopics[i]\n if (!topic)\n throw new DecodeLogTopicsMismatch({\n abiItem,\n param: param as AbiParameter & { indexed: boolean },\n })\n if (isUnnamed && Array.isArray(args)) {\n args[i] = decodeTopic({ param, value: topic })\n } else if (!isUnnamed && !Array.isArray(args)) {\n args[param.name || i] = decodeTopic({ param, value: topic })\n }\n }\n\n // Decode data (non-indexed args).\n const nonIndexedInputs = inputs.filter((x) => !('indexed' in x && x.indexed))\n if (nonIndexedInputs.length > 0) {\n if (data && data !== '0x') {\n try {\n const decodedData = decodeAbiParameters(nonIndexedInputs, data)\n if (decodedData) {\n if (isUnnamed && Array.isArray(args)) {\n args = [...args, ...decodedData]\n } else if (!isUnnamed && !Array.isArray(args)) {\n for (let i = 0; i < nonIndexedInputs.length; i++) {\n const name = nonIndexedInputs[i].name\n if (name) {\n args[name] = decodedData[i]\n }\n }\n }\n }\n } catch (err) {\n if (strict) {\n if (\n err instanceof AbiDecodingDataSizeTooSmallError ||\n (err as { name?: string }).name === 'PositionOutOfBoundsError' // Unfortunately, this is not exported from viem\n )\n throw new DecodeLogDataMismatch({\n abiItem,\n data: data,\n params: nonIndexedInputs,\n size: size(data),\n })\n throw err\n }\n }\n } else if (strict) {\n throw new DecodeLogDataMismatch({\n abiItem,\n data: '0x',\n params: nonIndexedInputs,\n size: 0,\n })\n }\n }\n const { args: namedArgs } = createNamedArgs(\n Array.isArray(args) ? args : Object.values(args),\n inputs\n )\n return {\n eventName: name,\n args: namedArgs,\n } as unknown as DecodeEventLogReturnType<abi, eventName, topics, data, strict>\n}\n\n/**\n * Decode events\n *\n * @param log Transaction to decode (should have data/input)\n * @returns Promise<ResultType>\n */\nexport function decodeEvent<abi extends Abi | readonly unknown[] = Abi>(\n _chain: Chain,\n abi: abi,\n log: DecodeEventResult\n):\n | ({\n eventName: string\n args: ArrayArgs\n } & DecodeEventResult)\n | undefined {\n const { data: _data } = log as Log\n\n let _lastError: Error | undefined\n try {\n const result = customDecodeEventLog({\n abi,\n data: _data,\n topics: (log as Log).topics || [],\n })\n return { ...log, ...result } as unknown as {\n eventName: string\n args: ArrayArgs\n } & DecodeEventResult\n } catch {}\n}\n","export default [\n {\n inputs: [\n { internalType: 'address', name: 'creator', type: 'address' },\n { internalType: 'address', name: '_codehub', type: 'address' },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n { inputs: [], name: 'ERC725Y_DataKeysValuesEmptyArray', type: 'error' },\n { inputs: [], name: 'ERC725Y_DataKeysValuesLengthMismatch', type: 'error' },\n { inputs: [], name: 'ERC725Y_MsgValueDisallowed', type: 'error' },\n {\n inputs: [{ internalType: 'bytes', name: 'storedData', type: 'bytes' }],\n name: 'InvalidExtensionAddress',\n type: 'error',\n },\n {\n inputs: [{ internalType: 'bytes', name: 'data', type: 'bytes' }],\n name: 'InvalidFunctionSelector',\n type: 'error',\n },\n { inputs: [], name: 'LSP4TokenNameNotEditable', type: 'error' },\n { inputs: [], name: 'LSP4TokenSymbolNotEditable', type: 'error' },\n { inputs: [], name: 'LSP4TokenTypeNotEditable', type: 'error' },\n {\n inputs: [{ internalType: 'uint256', name: 'callIndex', type: 'uint256' }],\n name: 'LSP8BatchCallFailed',\n type: 'error',\n },\n { inputs: [], name: 'LSP8CannotSendToAddressZero', type: 'error' },\n { inputs: [], name: 'LSP8CannotSendToSelf', type: 'error' },\n { inputs: [], name: 'LSP8CannotUseAddressZeroAsOperator', type: 'error' },\n { inputs: [], name: 'LSP8InvalidTransferBatch', type: 'error' },\n {\n inputs: [{ internalType: 'bytes32', name: 'tokenId', type: 'bytes32' }],\n name: 'LSP8NonExistentTokenId',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n ],\n name: 'LSP8NonExistingOperator',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'address', name: 'caller', type: 'address' },\n ],\n name: 'LSP8NotTokenOperator',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'tokenOwner', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'address', name: 'caller', type: 'address' },\n ],\n name: 'LSP8NotTokenOwner',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'tokenReceiver', type: 'address' },\n ],\n name: 'LSP8NotifyTokenReceiverContractMissingLSP1Interface',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'tokenReceiver', type: 'address' },\n ],\n name: 'LSP8NotifyTokenReceiverIsEOA',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n ],\n name: 'LSP8OperatorAlreadyAuthorized',\n type: 'error',\n },\n { inputs: [], name: 'LSP8TokenContractCannotHoldValue', type: 'error' },\n {\n inputs: [{ internalType: 'bytes32', name: 'tokenId', type: 'bytes32' }],\n name: 'LSP8TokenIdAlreadyMinted',\n type: 'error',\n },\n { inputs: [], name: 'LSP8TokenIdFormatNotEditable', type: 'error' },\n { inputs: [], name: 'LSP8TokenIdsDataEmptyArray', type: 'error' },\n { inputs: [], name: 'LSP8TokenIdsDataLengthMismatch', type: 'error' },\n { inputs: [], name: 'LSP8TokenOwnerCannotBeOperator', type: 'error' },\n {\n inputs: [\n { internalType: 'bytes4', name: 'functionSelector', type: 'bytes4' },\n ],\n name: 'NoExtensionFoundForFunctionSelector',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'callerAddress', type: 'address' },\n ],\n name: 'OwnableCallerNotTheOwner',\n type: 'error',\n },\n { inputs: [], name: 'OwnableCannotSetZeroAddressAsOwner', type: 'error' },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'dataKey',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'dataValue',\n type: 'bytes',\n },\n ],\n name: 'DataChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'tokenOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'tokenId',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'operatorNotificationData',\n type: 'bytes',\n },\n ],\n name: 'OperatorAuthorizationChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'tokenOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'tokenId',\n type: 'bytes32',\n },\n { indexed: false, internalType: 'bool', name: 'notified', type: 'bool' },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'operatorNotificationData',\n type: 'bytes',\n },\n ],\n name: 'OperatorRevoked',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'previousOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'tokenId',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'dataKey',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'dataValue',\n type: 'bytes',\n },\n ],\n name: 'TokenIdDataChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'operator',\n type: 'address',\n },\n { indexed: true, internalType: 'address', name: 'from', type: 'address' },\n { indexed: true, internalType: 'address', name: 'to', type: 'address' },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'tokenId',\n type: 'bytes32',\n },\n { indexed: false, internalType: 'bool', name: 'force', type: 'bool' },\n { indexed: false, internalType: 'bytes', name: 'data', type: 'bytes' },\n ],\n name: 'Transfer',\n type: 'event',\n },\n { stateMutability: 'payable', type: 'fallback' },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n {\n internalType: 'bytes',\n name: 'operatorNotificationData',\n type: 'bytes',\n },\n ],\n name: 'authorizeOperator',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'tokenOwner', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'banner',\n outputs: [{ internalType: 'contract Fractal', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes[]', name: 'data', type: 'bytes[]' }],\n name: 'batchCalls',\n outputs: [{ internalType: 'bytes[]', name: 'results', type: 'bytes[]' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'dataKey', type: 'bytes32' }],\n name: 'getData',\n outputs: [{ internalType: 'bytes', name: 'dataValue', type: 'bytes' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32[]', name: 'dataKeys', type: 'bytes32[]' },\n ],\n name: 'getDataBatch',\n outputs: [{ internalType: 'bytes[]', name: 'dataValues', type: 'bytes[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32[]', name: 'tokenIds', type: 'bytes32[]' },\n { internalType: 'bytes32[]', name: 'dataKeys', type: 'bytes32[]' },\n ],\n name: 'getDataBatchForTokenIds',\n outputs: [{ internalType: 'bytes[]', name: 'dataValues', type: 'bytes[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'bytes32', name: 'dataKey', type: 'bytes32' },\n ],\n name: 'getDataForTokenId',\n outputs: [{ internalType: 'bytes', name: 'dataValue', type: 'bytes' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'tokenId', type: 'bytes32' }],\n name: 'getOperatorsOf',\n outputs: [{ internalType: 'address[]', name: '', type: 'address[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'uint32', name: 'seed', type: 'uint32' },\n { internalType: 'address', name: 'fractal', type: 'address' },\n ],\n name: 'inject',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n ],\n name: 'isOperatorFor',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'fractal', type: 'address' },\n { internalType: 'address', name: 'owner', type: 'address' },\n { internalType: 'address', name: 'registry', type: 'address' },\n ],\n name: 'migrate',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'uint32', name: 'seed', type: 'uint32' },\n ],\n name: 'mint',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint32', name: '', type: 'uint32' }],\n name: 'minted',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bool', name: '_paused', type: 'bool' }],\n name: 'pause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'paused',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'uint256', name: 'iters', type: 'uint256' },\n ],\n name: 'refine',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'renounceOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'operator', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'bool', name: 'notify', type: 'bool' },\n {\n internalType: 'bytes',\n name: 'operatorNotificationData',\n type: 'bytes',\n },\n ],\n name: 'revokeOperator',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: '', type: 'address' }],\n name: 'seeds',\n outputs: [{ internalType: 'uint32', name: '', type: 'uint32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'dataKey', type: 'bytes32' },\n { internalType: 'bytes', name: 'dataValue', type: 'bytes' },\n ],\n name: 'setData',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32[]', name: 'dataKeys', type: 'bytes32[]' },\n { internalType: 'bytes[]', name: 'dataValues', type: 'bytes[]' },\n ],\n name: 'setDataBatch',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32[]', name: 'tokenIds', type: 'bytes32[]' },\n { internalType: 'bytes32[]', name: 'dataKeys', type: 'bytes32[]' },\n { internalType: 'bytes[]', name: 'dataValues', type: 'bytes[]' },\n ],\n name: 'setDataBatchForTokenIds',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'bytes32', name: 'dataKey', type: 'bytes32' },\n { internalType: 'bytes', name: 'dataValue', type: 'bytes' },\n ],\n name: 'setDataForTokenId',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }],\n name: 'supportsInterface',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'index', type: 'uint256' }],\n name: 'tokenAt',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'tokenOwner', type: 'address' }],\n name: 'tokenIdsOf',\n outputs: [{ internalType: 'bytes32[]', name: '', type: 'bytes32[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'tokenId', type: 'bytes32' }],\n name: 'tokenOwnerOf',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'totalSupply',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'from', type: 'address' },\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'bytes32', name: 'tokenId', type: 'bytes32' },\n { internalType: 'bool', name: 'force', type: 'bool' },\n { internalType: 'bytes', name: 'data', type: 'bytes' },\n ],\n name: 'transfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address[]', name: 'from', type: 'address[]' },\n { internalType: 'address[]', name: 'to', type: 'address[]' },\n { internalType: 'bytes32[]', name: 'tokenId', type: 'bytes32[]' },\n { internalType: 'bool[]', name: 'force', type: 'bool[]' },\n { internalType: 'bytes[]', name: 'data', type: 'bytes[]' },\n ],\n name: 'transferBatch',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n { stateMutability: 'payable', type: 'receive' },\n]\n","import { standardAggregation } from '../aggregation'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultAggregate,\n} from '../types'\nimport { createAggregationKey, standardPlugin } from '.'\nimport RegistryAbi from './RegistryAbi'\n\n// Define aggregation state type\ninterface RefineAggregationState {\n callerCounts: Record<\n string,\n { count: number; tokenIds: Record<`0x${string}:${string}`, number> }\n >\n minBlock: number\n maxBlock: number\n count: number\n}\n\n// Create the refine aggregation\nconst refineAggregation = standardAggregation<RefineAggregationState>({\n key: 'refine',\n\n map: (tx) => {\n // Only process refine calls\n if ('functionName' in tx && tx.functionName === 'refine' && tx.from) {\n return {\n callerCounts: {\n [tx.from.toLowerCase()]: {\n count: 1,\n tokenIds: {\n [`${tx.to}:${('args' in tx ? tx?.args?.[0]?.value : undefined) ?? 'none'}`]: 1,\n },\n },\n },\n minBlock: Number(tx.blockNumber),\n maxBlock: Number(tx.blockNumber),\n count: 1,\n }\n }\n return undefined\n },\n\n reduce: (state, mapped) => {\n if (!state) return mapped\n\n // Merge caller counts\n const callerCounts = { ...state.callerCounts }\n for (const [caller, { count, tokenIds }] of Object.entries(\n mapped.callerCounts\n )) {\n const item = callerCounts[caller] ?? { count: 0, tokenIds: {} }\n item.count += count\n item.tokenIds = {\n ...item.tokenIds,\n ...tokenIds,\n }\n }\n\n return {\n callerCounts,\n minBlock: Math.min(state.minBlock, mapped.minBlock),\n maxBlock: Math.max(state.maxBlock, mapped.maxBlock),\n count: state.count + mapped.count,\n }\n },\n\n finalize: (state): Omit<ResultAggregate, 'resultType'> => {\n const stats = Object.entries(state.callerCounts)\n .sort(([, a], [, b]) => b.count - a.count)\n .slice(0, 10)\n .map(([address, { count, tokenIds }]) => {\n const tokens = Object.entries(tokenIds)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5)\n .map(([token]) => token)\n return { address, count, tokens }\n })\n return {\n aggregate: {\n count: state.count,\n from: stats.map(({ address }) => address),\n tokens: stats.flatMap(({ tokens }) => tokens),\n blockRange: {\n from: state.minBlock,\n to: state.maxBlock,\n },\n },\n }\n },\n})\n\nexport const enhanceBurntPixPlugin = standardPlugin(\n RegistryAbi,\n {\n name: 'burntpix',\n abiName: 'BurntPix',\n decoderName: '@lukso/burntpix',\n priority: 50,\n },\n {\n enhance: enhanceBurntPix,\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, RegistryAbi, log)\n },\n aggregations: [refineAggregation],\n }\n)\n\nexport async function enhanceBurntPix(\n result: DecoderResult,\n pluginOptions: PluginOptions,\n _options: DecoderOptions\n): Promise<DecoderResult | undefined> {\n // Mark refine transactions as aggregatable\n if ('functionName' in result && result.functionName === 'refine') {\n return {\n ...result,\n standard: pluginOptions.abiName,\n __decoder: pluginOptions.decoderName,\n aggregationKeys: [createAggregationKey(pluginOptions, 'refine')],\n } as DecoderResult\n }\n return undefined\n}\n\nexport default enhanceBurntPixPlugin\n","import { bytesToString, type Hex, hexToBytes, size, slice } from 'viem'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderPlugin,\n DecoderResult,\n PluginOptions,\n ResultType,\n} from '../types'\n\n// Since this plugin doesn't use an abi, we need to short circuit with \"as DecoderResult\"\nexport const enhanceGraffitiPlugin: DecoderPlugin = Object.freeze({\n enhance: async (result: DecoderResult, options: DecoderOptions) =>\n enhanceGraffiti(\n result,\n { abiName: 'graffiti', decoderName: 'graffiti' },\n options\n ),\n decodeEvent: async (_log: DecodeEventResult, _options: DecoderOptions) =>\n undefined,\n required: true,\n priority: 1000,\n name: 'graffiti',\n})\n\nexport async function enhanceGraffiti(\n result: DecoderResult,\n _pluginOptions: PluginOptions,\n _options: DecoderOptions\n) {\n const { input } = result as ResultType\n if (\n input &&\n size(input || '0x') >= 4 &&\n slice(input || '0x', 0, 4) === '0x00000000'\n ) {\n let graffiti: string = slice(input, 4)\n try {\n graffiti = bytesToString(hexToBytes(graffiti as Hex))\n } catch {\n // Ignore\n }\n return {\n ...result,\n resultType: 'grafitti',\n sig: '0x',\n functionName: '',\n input,\n graffiti,\n __decoder: 'grafitti',\n } as DecoderResult\n }\n return undefined\n}\n\nexport default enhanceGraffitiPlugin\n","import { universalProfileAbi as UniversalProfile } from '@lukso/universalprofile-contracts/abi'\nimport type { Address, Hex, Log } from 'viem'\nimport { decodeEvent } from '../events'\nimport { decodeTransaction } from '../transaction'\nimport type {\n ArrayArgs,\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultExecute,\n ResultShared,\n ResultType,\n} from '../types'\nimport { createNamedArgs } from '../utils'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\nimport { unwrapUniversalReceiver } from './universalReceiverTypeIds'\n\nexport const enhanceLSP0ERC725AccountPlugin = standardPlugin(\n UniversalProfile,\n {\n name: 'profile',\n abiName: 'LSP0ERC725Account',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: enhanceLSP0ERC725Account,\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n const decoded = decodeEvent(options.chain, UniversalProfile, log)\n if (!decoded || decoded.eventName !== 'UniversalReceiver') {\n return decoded\n }\n\n // Extract UniversalReceiver args\n const typeId = decoded.args.find((a) => a.name === 'typeId')?.value as Hex\n const receivedData = decoded.args.find((a) => a.name === 'receivedData')\n ?.value as Hex\n const from = decoded.args.find((a) => a.name === 'from')?.value as Address\n const profileAddress = (decoded as unknown as Log).address as Address\n\n if (!typeId || !receivedData || !from) {\n return decoded\n }\n\n // Unwrap based on typeId (always succeeds — falls back to generic Notification)\n const unwrapped = unwrapUniversalReceiver(\n typeId,\n receivedData,\n from,\n profileAddress\n )\n\n // Rewrite the event: inner event becomes the main event,\n // original UniversalReceiver goes into wrappers.\n // Topics and data are rewritten to match the inner event's ABI.\n const { wrappers: _w, standard: _s, ...logBase } = decoded\n return {\n ...logBase,\n eventName: unwrapped.eventName,\n args: unwrapped.args,\n standard: unwrapped.standard,\n topics: unwrapped.topics,\n data: unwrapped.data,\n wrappers: [logBase],\n } as DecodeEventResult\n },\n }\n)\n\nexport async function enhanceLSP0ERC725Account(\n result: DecoderResult,\n pluginOptions: PluginOptions,\n options: DecoderOptions\n): Promise<DecoderResult | undefined> {\n const setData = await enhanceSetData(\n result,\n { ...pluginOptions, abiName: '', decoderName: '' },\n options\n )\n if (setData) {\n return setData\n }\n const {\n functionName,\n sig,\n args,\n input,\n blockNumber,\n to: _to,\n from: _from,\n value,\n } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: ArrayArgs\n }\n let to = _to\n let from = _from\n switch (functionName) {\n case 'executeBatch': {\n // executeBatch\n const children: Array<ResultType> = []\n const [executeTypes, targets, values, inputs] = args.map(\n ({ value }) => value\n ) as [bigint[], Address[], bigint[], `0x${string}`[]]\n const {\n functionName: _functionName,\n sig: _sig,\n args: _args,\n resultType: _resultType,\n ...plainResult\n } = result as ResultExecute & ResultShared\n for (let i = 0; i < values.length; i++) {\n const _data = inputs[i] as `0x${string}`\n const _value = BigInt(values[i])\n const _to = targets[i]\n const decoded = await decodeTransaction(\n {\n input: _data,\n to: _to,\n from: from,\n value: _value,\n } as DecoderResult,\n options\n )\n children.push(\n executeTypes[i] === 1n\n ? ({\n ...plainResult,\n ...decoded,\n resultType: 'create',\n } as DecoderResult)\n : ({ ...plainResult, ...decoded } as DecoderResult)\n )\n }\n options.wrappers.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n functionName,\n sig,\n standard: pluginOptions.abiName,\n args,\n to,\n from,\n value,\n input,\n __decoder: pluginOptions.decoderName,\n } as DecoderResult)\n const execute: ResultType = {\n ...result,\n resultType: 'executeBatch',\n standard: pluginOptions.abiName,\n __decoder: pluginOptions.decoderName,\n children,\n to,\n from,\n value,\n } as unknown as ResultType\n return {\n blockNumber,\n ...execute,\n } as unknown as DecoderResult\n }\n case 'execute': {\n // LSP0 execute\n const [executeType, target, value, _data] = args.map(\n ({ value }) => value\n ) as [bigint, Address, bigint, `0x${string}`]\n // const _target = await getKMTarget(chain, to)\n const decoded = await decodeTransaction(\n {\n input: _data,\n to: target,\n from: to || from, // This should be decoded to the profile address if it's a controller.\n value,\n } as DecoderResult,\n options\n )\n from = to || from\n to = target || to\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n functionName,\n sig,\n input,\n __decoder: pluginOptions.decoderName,\n to,\n from,\n value,\n standard: pluginOptions.abiName,\n ...createNamedArgs(\n [executeType, target, value, _data],\n [\n { name: 'executeType', type: 'uint256' },\n { name: 'target', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ]\n ),\n } as DecoderResult)\n return {\n ...result,\n functionName,\n sig,\n standard: pluginOptions.abiName,\n __decoder: pluginOptions.decoderName,\n ...decoded,\n resultType: executeType === 1n ? 'create' : 'execute',\n } as unknown as DecoderResult\n }\n }\n}\n\nexport default enhanceLSP0ERC725AccountPlugin\n","import type { AbiParameter } from 'viem'\nimport type {\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultSetData,\n ResultShared,\n ResultType,\n} from '../types'\nimport { createNamedArgs } from '../utils'\nimport { decodeKeyValueRaw } from '.'\n\n/**\n *\n * @param result decode setData and setDataBatch as either a single or many setData items.\n * @returns\n */\nexport async function enhanceSetData(\n result: ResultType & ResultShared & { moduleHint?: string },\n pluginOptions: PluginOptions,\n options: DecoderOptions\n): Promise<DecoderResult | undefined> {\n const { functionName, sig, args, input, blockNumber, to, from, value } =\n result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n namedArgs?:\n | Record<number, AbiParameter & { value?: unknown }>\n | Record<string, unknown>\n }\n switch (functionName) {\n case 'setData': {\n const [_key, _value] = args.map(({ value }) => value) as `0x${string}`[]\n // Single setData\n return {\n ...result,\n resultType: 'setDataBatch',\n functionName,\n standard: result.standard || pluginOptions.abiName || 'LSPContract',\n __decoder:\n result.__decoder ||\n pluginOptions.decoderName ||\n '@lukso/lsp-smart-contracts',\n input,\n blockNumber,\n sig,\n args,\n children: [\n {\n ...result,\n info: await decodeKeyValueRaw(_key, _value, options),\n standard: result.standard || pluginOptions.abiName || 'LSPContract',\n __decoder:\n result.__decoder ||\n pluginOptions.decoderName ||\n '@lukso/lsp-smart-contracts',\n phase: 'enhanced',\n to,\n from,\n value,\n ...(args\n ? {\n ...createNamedArgs(\n [_key, _value],\n [\n { name: 'key', type: 'bytes32' },\n { name: 'value', type: 'bytes' },\n ]\n ),\n }\n : {}),\n },\n ] as unknown as Array<ResultSetData>,\n to,\n from,\n value,\n } as DecoderResult\n }\n case 'setDataBatch': {\n // Multiple setDataBatch\n const children: Array<ResultType> = []\n const [keys, values] = args.map(({ value }) => value) as [\n `0x${string}`[],\n `0x${string}`[],\n ]\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i] as `0x${string}`\n const _value = values[i] as `0x${string}`\n children.push({\n ...result,\n resultType: 'setData',\n standard: result.standard || pluginOptions.abiName || 'LSPContract',\n __decoder:\n result.__decoder ||\n pluginOptions.decoderName ||\n '@lukso/lsp-smart-contracts',\n phase: 'enhanced',\n to,\n from,\n value,\n ...createNamedArgs(\n [key, _value],\n [\n { name: 'key', type: 'bytes32' },\n { name: 'value', type: 'bytes' },\n ]\n ),\n info: await decodeKeyValueRaw(key, _value, options),\n } as DecoderResult)\n }\n const setDataBatchResult = {\n ...result,\n resultType: 'setDataBatch',\n functionName,\n sig,\n input,\n ...(args ? { args } : {}),\n standard: result.standard || pluginOptions.abiName || 'LSPContract',\n __decoder:\n result.__decoder ||\n pluginOptions.decoderName ||\n '@lukso/lsp-smart-contracts',\n to,\n from,\n value,\n children,\n } as DecoderResult\n return setDataBatchResult\n }\n }\n return undefined\n}\n\nexport default enhanceSetData\n","import type { AbiParameter, Address, Hex } from 'viem'\nimport {\n decodeAbiParameters,\n encodeAbiParameters,\n getAddress,\n keccak256,\n slice,\n toHex,\n} from 'viem'\nimport type { ArrayArgs } from '../types'\nimport { createNamedArgs } from '../utils'\n\n/**\n * Result of unwrapping a UniversalReceiver event based on its typeId.\n * Contains the inner event that was wrapped by the UniversalReceiver notification,\n * including rewritten topics and data fields matching the inner event's ABI.\n */\nexport type UnwrapResult = {\n eventName: string\n args: ArrayArgs\n standard?: string\n topics: [Hex, ...Hex[]]\n data: Hex\n}\n\ntype UnwrapFn = (\n receivedData: Hex,\n from: Address,\n profileAddress: Address,\n eventName: string\n) => UnwrapResult | undefined\n\n/**\n * Compute topic0 (event signature hash) and ABI-encode the data field\n * for an event with all non-indexed parameters.\n */\nfunction encodeEventLog(\n eventName: string,\n params: AbiParameter[],\n values: unknown[]\n): { topics: [Hex, ...Hex[]]; data: Hex } {\n const sig = `${eventName}(${params.map((p) => p.type).join(',')})`\n const topic0 = keccak256(toHex(sig))\n const data = encodeAbiParameters(params, values)\n return { topics: [topic0], data }\n}\n\n// --- LSP26 FollowerSystem ---\n\n// keccak256('LSP26FollowerSystem_FollowNotification')\nconst TYPEID_LSP26_FOLLOW: Hex =\n '0x71e02f9f05bcd5816ec4f3134aa2e5a916669537ec6c77fe66ea595fabc2d51a'\n\n// keccak256('LSP26FollowerSystem_UnfollowNotification')\nconst TYPEID_LSP26_UNFOLLOW: Hex =\n '0x9d3c0b4012b69658977b099bdaa51eff0f0460f421fba96d15669506c00d1c4f'\n\n// --- LSP7 DigitalAsset ---\n\n// keccak256('LSP7Tokens_SenderNotification')\nconst TYPEID_LSP7_TOKENSSENDER: Hex =\n '0x429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea'\n\n// keccak256('LSP7Tokens_RecipientNotification')\nconst TYPEID_LSP7_TOKENSRECIPIENT: Hex =\n '0x20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c'\n\n// --- LSP8 IdentifiableDigitalAsset ---\n\n// keccak256('LSP8Tokens_SenderNotification')\nconst TYPEID_LSP8_TOKENSSENDER: Hex =\n '0xb23eae7e6d1564b295b4c3e3be402d9a2f0776c57bdf365903496f6fa481ab00'\n\n// keccak256('LSP8Tokens_RecipientNotification')\nconst TYPEID_LSP8_TOKENSRECIPIENT: Hex =\n '0x0b084a55ebf70fd3c06fd755269dac2212c4d3f0f4d09079780bfa50c1b2984d'\n\n// --- Event parameter definitions ---\n\nconst followParams: AbiParameter[] = [\n { name: 'follower', type: 'address' },\n { name: 'addr', type: 'address' },\n]\n\nconst unfollowParams: AbiParameter[] = [\n { name: 'unfollower', type: 'address' },\n { name: 'addr', type: 'address' },\n]\n\nconst lsp7TransferParams: AbiParameter[] = [\n { name: 'operator', type: 'address' },\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'force', type: 'bool' },\n { name: 'data', type: 'bytes' },\n]\n\nconst lsp8TransferParams: AbiParameter[] = [\n { name: 'operator', type: 'address' },\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'tokenId', type: 'bytes32' },\n { name: 'force', type: 'bool' },\n { name: 'data', type: 'bytes' },\n]\n\nconst notificationParams: AbiParameter[] = [\n { name: 'from', type: 'address' },\n { name: 'typeId', type: 'bytes32' },\n { name: 'data', type: 'bytes' },\n]\n\n/**\n * Decode LSP26 Follow notification.\n * receivedData is abi.encodePacked(followerAddress) — raw 20 bytes.\n */\nfunction unwrapLSP26Follow(\n receivedData: Hex,\n _from: Address,\n profileAddress: Address,\n _eventName: string\n): UnwrapResult | undefined {\n if (!receivedData || receivedData.length < 42) {\n return undefined\n }\n const followerAddress = getAddress(slice(receivedData, 0, 20))\n const values = [followerAddress, profileAddress]\n return {\n eventName: 'URDFollow',\n ...createNamedArgs(values, followParams),\n ...encodeEventLog('URDFollow', followParams, values),\n standard: 'LSP26FollowerSystem',\n }\n}\n\n/**\n * Decode LSP26 Unfollow notification.\n * receivedData is abi.encodePacked(unfollowerAddress) — raw 20 bytes.\n */\nfunction unwrapLSP26Unfollow(\n receivedData: Hex,\n _from: Address,\n profileAddress: Address,\n _eventName: string\n): UnwrapResult | undefined {\n if (!receivedData || receivedData.length < 42) {\n return undefined\n }\n const unfollowerAddress = getAddress(slice(receivedData, 0, 20))\n const values = [unfollowerAddress, profileAddress]\n return {\n eventName: 'URDUnfollow',\n ...createNamedArgs(values, unfollowParams),\n ...encodeEventLog('URDUnfollow', unfollowParams, values),\n standard: 'LSP26FollowerSystem',\n }\n}\n\n/**\n * Decode LSP7 token transfer notification.\n * receivedData is abi.encode(operator, from, to, amount, data).\n */\nfunction unwrapLSP7Transfer(\n receivedData: Hex,\n _from: Address,\n _profileAddress: Address,\n eventName: string\n): UnwrapResult | undefined {\n try {\n const [operator, sender, recipient, amount, data] = decodeAbiParameters(\n [\n { name: 'operator', type: 'address' },\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n receivedData\n )\n const values = [operator, sender, recipient, amount, true, data]\n return {\n eventName,\n ...createNamedArgs(values, lsp7TransferParams),\n ...encodeEventLog(eventName, lsp7TransferParams, values),\n standard: 'LSP7DigitalAsset',\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * Decode LSP8 token transfer notification.\n * receivedData is abi.encode(operator, from, to, tokenId, data).\n */\nfunction unwrapLSP8Transfer(\n receivedData: Hex,\n _from: Address,\n _profileAddress: Address,\n eventName: string\n): UnwrapResult | undefined {\n try {\n const [operator, sender, recipient, tokenId, data] = decodeAbiParameters(\n [\n { name: 'operator', type: 'address' },\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'tokenId', type: 'bytes32' },\n { name: 'data', type: 'bytes' },\n ],\n receivedData\n )\n const values = [operator, sender, recipient, tokenId, true, data]\n return {\n eventName,\n ...createNamedArgs(values, lsp8TransferParams),\n ...encodeEventLog(eventName, lsp8TransferParams, values),\n standard: 'LSP8IdentifiableDigitalAsset',\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * Registry mapping typeId → unwrap function.\n */\nconst typeIdUnwrappers: Record<Hex, { fn: UnwrapFn; eventName: string }> = {\n [TYPEID_LSP26_FOLLOW]: { fn: unwrapLSP26Follow, eventName: 'Follow' },\n [TYPEID_LSP26_UNFOLLOW]: { fn: unwrapLSP26Unfollow, eventName: 'Unfollow' },\n [TYPEID_LSP7_TOKENSSENDER]: {\n fn: unwrapLSP7Transfer,\n eventName: 'URDTokensSent',\n },\n [TYPEID_LSP7_TOKENSRECIPIENT]: {\n fn: unwrapLSP7Transfer,\n eventName: 'URDTokensReceived',\n },\n [TYPEID_LSP8_TOKENSSENDER]: {\n fn: unwrapLSP8Transfer,\n eventName: 'URDTokensSent',\n },\n [TYPEID_LSP8_TOKENSRECIPIENT]: {\n fn: unwrapLSP8Transfer,\n eventName: 'URDTokensReceived',\n },\n}\n\n/**\n * Unwrap a UniversalReceiver event based on its typeId.\n * For known typeIds, decodes receivedData into specific event args.\n * For unknown typeIds, returns a generic Notification with raw receivedData.\n * Always rewrites topics and data to match the inner event's ABI.\n */\nexport function unwrapUniversalReceiver(\n typeId: Hex,\n receivedData: Hex,\n from: Address,\n profileAddress: Address\n): UnwrapResult {\n const entry = typeIdUnwrappers[typeId]\n if (entry) {\n const result = entry.fn(receivedData, from, profileAddress, entry.eventName)\n if (result) {\n return result\n }\n }\n\n // Fallback: generic notification with raw data\n const values = [from, typeId, receivedData]\n return {\n eventName: 'URDNotification',\n ...createNamedArgs(values, notificationParams),\n ...encodeEventLog('Notification', notificationParams, values),\n }\n}\n","import { lsp6KeyManagerAbi as KeyManager } from '@lukso/lsp6-contracts/abi'\nimport type { AbiParameter } from 'viem'\nimport { decodeEvent } from '../events'\nimport { getKMTarget } from '../interfaces'\nimport { decodeTransaction } from '../transaction'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultExecute,\n ResultShared,\n ResultType,\n} from '../types'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nexport const enhanceLSP6KeyManagerPlugin = standardPlugin(\n KeyManager,\n {\n name: 'keyManager',\n abiName: 'LSP6KeyManager',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(result, pluginOptions, options)\n if (setData) {\n return setData\n }\n return enhanceKeyManager(result, pluginOptions, options)\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, KeyManager, log)\n },\n }\n)\n\nexport async function enhanceKeyManager(\n result: ResultType & ResultShared & { moduleHint?: string },\n pluginOptions: PluginOptions,\n options: DecoderOptions\n): Promise<DecoderResult | undefined> {\n const {\n functionName,\n sig,\n args,\n input,\n to: _to,\n from: _from,\n value,\n } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n\n let to = _to\n let from = _from\n\n switch (functionName) {\n case 'execute': {\n // LSP6 execute\n const decoded = await decodeTransaction(\n {\n input: args?.[0]?.value as `0x${string}` | undefined,\n to,\n from,\n value,\n } as DecoderResult,\n options\n )\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n __decoder: pluginOptions.decoderName,\n functionName,\n sig,\n input,\n standard: pluginOptions.abiName,\n args,\n } as DecoderResult)\n const execute: ResultType = {\n ...result,\n ...decoded,\n to,\n from,\n value,\n } as unknown as ResultType\n return {\n ...execute,\n } as unknown as DecoderResult\n }\n case 'executeBatch': {\n // LSP6 executeBatch\n const children: Array<ResultType> = []\n const [values, inputs] = args.map(({ value }) => value) as [\n `0x${string}`[],\n `0x${string}`[],\n ]\n const {\n functionName: _functionName,\n sig: _sig,\n args: _args,\n resultType: _resultType,\n ...plainResult\n } = result as ResultExecute & ResultShared\n\n for (let i = 0; i < values.length; i++) {\n const _data = inputs[i] as `0x${string}`\n const _value = BigInt(values[i])\n const decoded = await decodeTransaction(\n {\n input: _data,\n to,\n from,\n value: _value,\n } as DecoderResult,\n options\n )\n children.push({ ...plainResult, ...decoded } as DecoderResult)\n }\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n functionName,\n sig,\n __decoder: pluginOptions.decoderName,\n standard: pluginOptions.abiName,\n args,\n input,\n } as DecoderResult)\n return {\n ...result,\n resultType: 'executeBatch',\n __decoder: '@lukso/lsp-smart-contracts',\n standard: pluginOptions.abiName,\n children,\n to,\n from,\n value,\n } as unknown as DecoderResult\n }\n case 'executeRelayerCallBatch': {\n // executeRelayerCallBatch\n const [signatures, nonces, validityTimestamps, values, payloads] =\n args.map(({ value }) => value) as [\n `0x${string}`[],\n bigint[],\n bigint[],\n bigint[],\n `0x${string}`[],\n ]\n const children: Array<ResultType> = []\n for (let i = 0; i < values.length; i++) {\n const _data = payloads[i] as `0x${string}`\n const _value = BigInt(values[i])\n const _signature = signatures[i] as `0x${string}`\n const _nonce = nonces[i]\n const _validityTimestamp = validityTimestamps[i]\n const decoded = await decodeTransaction(\n {\n input: _data,\n to,\n from,\n value: _value,\n } as DecoderResult,\n options\n )\n children.push({ ...result, ...decoded } as DecoderResult)\n }\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n __decoder: pluginOptions.decoderName,\n functionName,\n sig,\n input,\n standard: pluginOptions.abiName,\n args,\n } as DecoderResult)\n return {\n ...result,\n resultType: 'executeBatch',\n __decoder: pluginOptions.decoderName,\n standard: pluginOptions.abiName,\n children,\n to,\n from,\n value,\n } as unknown as DecoderResult\n }\n // -> executeRelayCall\n case 'executeRelayCall': {\n const [_signature, _nonce, _validityTimestamps, _input] = args.map(\n ({ value }) => value\n ) as [`0x${string}`, bigint, bigint, `0x${string}`]\n const _target = await getKMTarget(options.chain, to)\n const decoded = await decodeTransaction(\n {\n input: _input,\n to: _target ?? to,\n from,\n value,\n } as DecoderResult,\n options\n )\n from = to || from\n to = _target || to\n options.wrappers?.splice(0, 0, {\n ...result,\n resultType: 'wrapper',\n __decoder: pluginOptions.decoderName,\n functionName,\n sig,\n input,\n standard: pluginOptions.abiName,\n to,\n from,\n value,\n args,\n } as DecoderResult)\n return {\n ...decoded,\n } as unknown as DecoderResult\n }\n }\n}\n\nexport default enhanceLSP6KeyManagerPlugin\n","{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"LSP6KeyManager\",\n \"sourceName\": \"contracts/LSP6KeyManager.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"target_\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"BatchExecuteParamsLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"BatchExecuteRelayCallParamsLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"CallingKeyManagerNotAllowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"DelegateCallDisallowedViaKeyManager\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ExecuteParametersEmptyArray\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ExecuteParametersLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725Y_DataKeysValuesLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"dataValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidDataValuesForDataKeys\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"invalidFunction\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"InvalidERC725Function\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"allowedCallsValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidEncodedAllowedCalls\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"value\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"context\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"InvalidEncodedAllowedERC725YDataKeys\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidLSP6Target\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"payload\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidPayload\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"signer\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"invalidNonce\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidRelayNonce\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"InvalidWhitelistedCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"KeyManagerCannotBeSetAsExtensionForLSP20Functions\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"totalValues\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"msgValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"LSP6BatchExcessiveValueSent\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"totalValues\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"msgValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"LSP6BatchInsufficientValueSent\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"NoCallsAllowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"NoERC725YDataKeysAllowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"NoPermissionsSet\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"NotAllowedCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"disallowedKey\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"NotAllowedERC725YDataKey\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"permission\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"NotAuthorised\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"NotRecognisedPermissionKey\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"RelayCallBeforeStartTime\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"RelayCallExpired\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"signer\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"PermissionsVerified\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"VERSION\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"payload\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"execute\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"values\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"payloads\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"executeBatch\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"nonce\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"validityTimestamps\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"payload\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"executeRelayCall\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"signatures\",\n \"type\": \"bytes[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"nonces\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"validityTimestamps\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"values\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"payloads\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"executeRelayCallBatch\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"channelId\",\n \"type\": \"uint128\"\n }\n ],\n \"name\": \"getNonce\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataHash\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"isValidSignature\",\n \"outputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"returnedStatus\",\n \"type\": \"bytes4\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"targetContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"msgValue\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"callData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"lsp20VerifyCall\",\n \"outputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"\",\n \"type\": \"bytes4\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"lsp20VerifyCallResult\",\n \"outputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"\",\n \"type\": \"bytes4\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"interfaceId\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"supportsInterface\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"target\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x60806040523480156200001157600080fd5b50604051620041e1380380620041e1833981016040819052620000349162000082565b6001600160a01b0381166200005c5760405163fc85457960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055620000b4565b6000602082840312156200009557600080fd5b81516001600160a01b0381168114620000ad57600080fd5b9392505050565b61411d80620000c46000396000f3fe6080604052600436106100bc5760003560e01c8063b44581d911610074578063d4b839921161004e578063d4b83992146101e3578063de928f141461020b578063ffa1ad741461022b57600080fd5b8063b44581d914610182578063bf0176ff146101b0578063d3fc45d3146101c357600080fd5b80631626ba7e116100a55780631626ba7e146101165780634c8a4e741461014f578063a20856a51461016257600080fd5b806301ffc9a7146100c157806309c5eabe146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046133ab565b610274565b60405190151581526020015b60405180910390f35b610109610104366004613417565b610347565b6040516100ed91906134a9565b34801561012257600080fd5b50610136610131366004613581565b61035b565b6040516001600160e01b031990911681526020016100ed565b61010961015d3660046135c8565b6103e4565b61017561017036600461373a565b6103fe565b6040516100ed9190613825565b34801561018e57600080fd5b506101a261019d36600461389c565b610600565b6040519081526020016100ed565b6101756101be3660046138ea565b610652565b3480156101cf57600080fd5b506101366101de366004613581565b6107db565b3480156101ef57600080fd5b506001546040516001600160a01b0390911681526020016100ed565b34801561021757600080fd5b50610136610226366004613956565b610817565b34801561023757600080fd5b506101096040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b60006001600160e01b031982167f23f34c620000000000000000000000000000000000000000000000000000000014806102be57506001600160e01b03198216630b135d3f60e11b145b806102f257506001600160e01b031982167f0d6ecac700000000000000000000000000000000000000000000000000000000145b8061032657506001600160e01b031982167f5ac7990800000000000000000000000000000000000000000000000000000000145b8061034157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060610354348484610981565b9392505050565b600080600061036a8585610ab4565b90925090506000816004811115610383576103836139db565b1461039b57506001600160e01b031991506103419050565b6001546103c09062200000906103ba906001600160a01b031685610af9565b81161490565b6103d2576001600160e01b03196103db565b630b135d3f60e11b5b95945050505050565b60606103f4868686348787610bba565b9695505050505050565b8851606090881415806104115750878614155b8061041c5750858414155b806104275750838214155b1561045e576040517fb4d50d2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff811115610479576104796134bc565b6040519080825280602002602001820160405280156104ac57816020015b60608152602001906001900390816104975790505b5090506000805b848110156105c657348888838181106104ce576104ce6139f1565b90506020020135836104e09190613a1d565b925082111561051057604051630c28c92b60e21b8152600481018390523460248201526044015b60405180910390fd5b6105a18d8281518110610525576105256139f1565b60200260200101518d8d8481811061053f5761053f6139f1565b905060200201358c8c85818110610558576105586139f1565b905060200201358b8b86818110610571576105716139f1565b905060200201358a8a8781811061058a5761058a6139f1565b905060200281019061059c9190613a30565b610bba565b8382815181106105b3576105b36139f1565b60209081029190910101526001016104b3565b50348110156105f15760405163528c345b60e11b815260048101829052346024820152604401610507565b509a9950505050505050505050565b6001600160a01b0382166000908152602081815260408083206fffffffffffffffffffffffffffffffff85168452909152812054608083901b6fffffffffffffffffffffffffffffffff191617610354565b606083821461068d576040517f55a187db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff8111156106a8576106a86134bc565b6040519080825280602002602001820160405280156106db57816020015b60608152602001906001900390816106c65790505b5090506000805b848110156107a457348888838181106106fd576106fd6139f1565b905060200201358361070f9190613a1d565b925082111561073a57604051630c28c92b60e21b815260048101839052346024820152604401610507565b61077f88888381811061074f5761074f6139f1565b90506020020135878784818110610768576107686139f1565b905060200281019061077a9190613a30565b610981565b838281518110610791576107916139f1565b60209081029190910101526001016106e2565b50348110156107cf5760405163528c345b60e11b815260048101829052346024820152604401610507565b5090505b949350505050565b6001546000906001600160a01b0316330361080857336000908152600260205260409020805460ff191690555b5063d3fc45d360e01b92915050565b600080631fc8da4360e21b61082c8486613a77565b6001600160e01b031916148061085b5750639790242160e01b61084f8486613a77565b6001600160e01b031916145b90506001600160a01b038716330361091a57600061087a888389610db8565b905061088a888860008888610e25565b6108948486613a77565b6001600160e01b03191686886001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a481806108de5750805b6108ef5763de928f0160e01b610911565b7fde928f00000000000000000000000000000000000000000000000000000000005b925050506103f4565b6001600160a01b03871660009081526002602052604090205460ff16801561095a5761095a876109536001600160a01b038b1682610af9565b6080611246565b610968888860008888610e25565b81806108de5750806108ef5763de928f0160e01b610911565b606060048210156109a9578282604051630d886ef360e21b8152600401610507929190613aa7565b6000631fc8da4360e21b6109bd8486613a77565b6001600160e01b03191614806109ec5750639790242160e01b6109e08486613a77565b6001600160e01b031916145b6001549091506001600160a01b03166000610a08828433610db8565b9050610a18823360008989610e25565b610a228587613a77565b6001600160e01b03191687336001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610a7183898989611256565b905081158015610a7f575083155b15610aa957610aa9836001600160a01b03166000908152600260205260409020805460ff19169055565b979650505050505050565b6000808251604103610aea5760208301516040840151606085015160001a610ade8782858561130e565b94509450505050610af2565b506000905060025b9250929050565b6000806001600160a01b0384166354f6127f610b397f4b80742de2bf82acb36300000000000000000000000000000000000000000000606087901b6113d2565b6040518263ffffffff1660e01b8152600401610b5791815260200190565b600060405180830381865afa158015610b74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b9c9190810190613ad6565b90508051602014610bb1575060009050610341565b6107d381613b44565b60606004821015610be2578282604051630d886ef360e21b8152600401610507929190613aa7565b6001546001600160a01b03166000610bfe89898989898961143b565b6001600160a01b03811660009081526020818152604080832060808d901c84529091529020549091506fffffffffffffffffffffffffffffffff891614610c775780888a6040517fc9bd9eb900000000000000000000000000000000000000000000000000000000815260040161050793929190613b6b565b6001600160a01b03811660009081526020818152604080832060808c901c84529091528120805491610ca883613b93565b9190505550610cb687611493565b6000631fc8da4360e21b610cca8688613a77565b6001600160e01b0319161480610cf95750639790242160e01b610ced8688613a77565b6001600160e01b031916145b90506000610d08848385610db8565b9050610d18848460018a8a610e25565b610d228688613a77565b6001600160e01b03191688846001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610d71858a8a8a611256565b905081158015610d7f575082155b15610da957610da9856001600160a01b03166000908152600260205260409020805460ff19169055565b9b9a5050505050505050505050565b6001600160a01b03831660009081526002602052604090205460ff168015610df657610df1826109536001600160a01b03871682610af9565b610354565b82610354576001600160a01b0384166000908152600260205260409020805460ff191660011790559392505050565b6000610e3a6001600160a01b03871686610af9565b905080610e7e576040517ff292052a0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610507565b8315610e8e57610e8e8582611548565b6000610e9a8385613a77565b90507f80dc96f4000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f0257600080610edd8560048189613bac565b810190610eea9190613581565b91509150610efb89898685856115b2565b505061123d565b7f686fdbdf000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f6157600080610f438560048189613bac565b810190610f509190613bd6565b91509150610efb898986858561162e565b7fbb3fd702000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610fd1576000808080610fa4876004818b613bac565b810190610fb19190613c85565b9350935093509350610fc88b8b88878787876117b1565b5050505061123d565b7fce7a7bae000000000000000000000000000000000000000000000000000000006001600160e01b0319821601611156576000808080611014876004818b613bac565b8101906110219190613d43565b93509350935093508251845114158061103c57508151835114155b8061104957508051825114155b15611080576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83516000036110bb576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b845181101561114c5761113a8c8c898885815181106110df576110df6139f1565b60200260200101518886815181106110f9576110f96139f1565b6020026020010151888781518110611113576111136139f1565b602002602001015188888151811061112d5761112d6139f1565b60200260200101516117b1565b8061114481613b93565b9150506110be565b505050505061123d565b6001600160e01b031981167ff2fde38b0000000000000000000000000000000000000000000000000000000014806111b757506001600160e01b031981167f79ba509700000000000000000000000000000000000000000000000000000000145b806111eb57506001600160e01b031981167f715018a600000000000000000000000000000000000000000000000000000000145b156111ff576111fa868361187e565b61123d565b6040517f2ba8851c0000000000000000000000000000000000000000000000000000000081526001600160e01b031982166004820152602401610507565b50505050505050565b6112518383836118b3565b505050565b6060600080866001600160a01b0316865a908787604051611278929190613e41565b600060405180830381858888f193505050503d80600081146112b6576040519150601f19603f3d011682016040523d82523d6000602084013e6112bb565b606091505b5091509150600061130283836040518060400160405280601e81526020017f4c5350363a206661696c656420657865637574696e67207061796c6f616400008152506118e6565b98975050505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561134557506000905060036113c9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611399573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113c2576000600192509250506113c9565b9150600090505b94509492505050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c830152918291016040516020818303038152906040529050806107d390613b44565b600080601946888888888860405160200161145c9796959493929190613e51565b60408051601f198184030181529190529050600061147a30836118ff565b9050611486818a611932565b9998505050505050505050565b8060000361149e5750565b608081901c81428211156114dd576040517ede4b8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff166000036114fc57505050565b806fffffffffffffffffffffffffffffffff16421115611251576040517f5c53a98c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62400000808216146115ae5760408051631ded6b7360e11b81526001600160a01b03841660048201526024810191909152601260448201527f455845435554455f52454c41595f43414c4c00000000000000000000000000006064820152608401610507565b5050565b60006115c086858585611956565b90506203ffff19810161160f5762020000808516036115df5750611627565b6115ed858562040000611246565b61160a85846116056001600160a01b038a1683611d0d565b611dad565b611625565b8061161a5750611627565b611625858583611246565b505b5050505050565b8051825114611669576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080835167ffffffffffffffff811115611686576116866134bc565b6040519080825280602002602001820160405280156116af578160200160208202803683370190505b509050600080805b6116f58a898984815181106116ce576116ce6139f1565b60200260200101518985815181106116e8576116e86139f1565b6020026020010151611956565b91506203ffff19820161170b576001945061174e565b811561171c5761171c898984611246565b6001848281518110611730576117306139f1565b911515602092830291909101909101528261174a81613b93565b9350505b806001019050865181106116b75784156117a5576202000080891603611778575050505050611627565b611786898962040000611246565b6117a5898861179e6001600160a01b038e1683611d0d565b8787611f0d565b50505050505050505050565b306001600160a01b038416036117f3576040517fa431b23600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83611806576111fa878787868686612151565b60018414806118155750600284145b1561182e5781151561182887878361222d565b5061123d565b60038403611844576111fa8787878686866122b2565b6004840361123d576040517f80d6ebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808216146115ae57600061189460016122e1565b90508281604051631ded6b7360e11b8152600401610507929190613e87565b80821681146112515760006118c7826122e1565b90508381604051631ded6b7360e11b8152600401610507929190613e87565b606083156118f5575081610354565b61035483836126de565b60008282604051602001611914929190613ea9565b60405160208183030381529060405280519060200120905092915050565b60008060006119418585610ab4565b9150915061194e81612708565b509392505050565b60007f20cf245f92495cf19acab2659b39f67a000000000000000000000000000000006fffffffffffffffffffffffffffffffff198416016119ac576006848116146119a486858584612870565b9150506107d3565b7fb47f8bd21d4100000000000000000000000000000000000000000000000000007fffffffffffff0000000000000000000000000000000000000000000000000000841601611b29576006848116146001600160a01b031984167fb47f8bd21d407d534c9d0000000000000000000000000000000000000000000001611a7a578251602014158015611a3e5750825115155b15611a60578383604051631fa4139760e01b8152600401610507929190613f07565b8015611a705750600090506107d3565b6119a48685612a5a565b7fb47f8bd21d40c6c59b39000000000000000000000000000000000000000000006001600160a01b0319851601611ab7576119a486858584612a90565b7fb47f8bd21d407993d6ef000000000000000000000000000000000000000000006001600160a01b0319851601611af4576119a486858584612afb565b6040517f0f7d735b00000000000000000000000000000000000000000000000000000000815260048101859052602401610507565b7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47831480611b8057506001600160a01b031983167f0cfc51aec37c55a4d0b100000000000000000000000000000000000000000000145b15611bdc578151601414158015611b975750815115155b15611bb9578282604051631fa4139760e01b8152600401610507929190613f07565b606080851603611bcb575060006107d3565b611bd58584612b25565b90506107d3565b7f311874bf6b2579feef6a000000000000000000000000000000000000000000006001600160a01b0319841601611d03578151601414158015611c2157508151601514155b8015611c2d5750815115155b15611c4f578282604051631fa4139760e01b8152600401610507929190613f07565b606083901b6001600160e01b031981167fde928f14000000000000000000000000000000000000000000000000000000001480611c9c57506001600160e01b0319811663d3fc45d360e01b145b15611ce55730611cab84613f20565b60601c03611ce5576040517f4a9fa8cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601880861603611cf95750600090506107d3565b6119a48685612bab565b50620400006107d3565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf866c29110000000000000000000000000000000000000000000085851b6113d2565b6040518263ffffffff1660e01b8152600401611d6891815260200190565b600060405180830381865afa158015611d85573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103549190810190613ad6565b8051600003611dda5760405163ed7fa50960e01b81526001600160a01b0384166004820152602401610507565b6000806000805b8451841015611ee257848481518110611dfc57611dfc6139f1565b01602001516001600160f81b03191685611e17866001613a1d565b81518110611e2757611e276139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611e6890613f5c565b60f01c9250821580611e7a5750602083115b15611e9a578460405163ae6cbd3760e01b81526004016105079190613fa8565b611ea5836020613ffa565b611eb090600861400d565b8585016022015160001990911b908116925090508581168203611ed65750505050505050565b92820160020192611de1565b60405163557ae07960e01b81526001600160a01b038816600482015260248101879052604401610507565b8251600003611f3a5760405163ed7fa50960e01b81526001600160a01b0386166004820152602401610507565b835160008080805b87518410156120cb57878481518110611f5d57611f5d6139f1565b01602001516001600160f81b03191688611f78866001613a1d565b81518110611f8857611f886139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611fc990613f5c565b60f01c9250821580611fdb5750602083115b15611ffb578760405163ae6cbd3760e01b81526004016105079190613fa8565b612006836020613ffa565b61201190600861400d565b8885016022015160001990911b9081169250905060005b858110156120be57878181518110612042576120426139f1565b60200260200101511561205757600101612028565b82828b838151811061206b5761206b6139f1565b602002602001015116036120b657600188828151811061208d5761208d6139f1565b91151560209283029190910190910152600180880197879003016120b657505050505050611627565b600101612028565b5092820160020192611f42565b60005b85811015612144578781815181106120e8576120e86139f1565b602002602001015161213c578a8a8281518110612107576121076139f1565b602090810291909101015160405163557ae07960e01b81526001600160a01b0390921660048301526024820152604401610507565b6001016120ce565b5050505050505050505050565b80518215801591610100878116149190159061040080891614908490612175575082155b15612187576121878989610200611246565b818015612192575083155b801561219c575080155b156121ae576121ae8989610800611246565b811580156121ba575080155b156121cc576121cc8989610800611246565b831580156121d75750805b156121e55750505050611625565b8180156121ef5750835b80156121f85750825b156122065750505050611625565b8080156122105750825b1561221e5750505050611625565b6117a58a8a60008a8a8a612c31565b61223b838362010000611246565b6101008281161481801561224d575080155b156122ac5760408051631ded6b7360e11b81526001600160a01b03861660048201526024810191909152601360448201527f53555045525f5452414e5346455256414c5545000000000000000000000000006064820152608401610507565b50505050565b6110008481161480156122c55750611625565b6122d28686612000611246565b61123d87876003878787612c31565b6060600019820161232557505060408051808201909152601181527f5452414e534645524f574e455253484950000000000000000000000000000000602082015290565b600319820161236757505060408051808201909152600f81527f454449545045524d495353494f4e530000000000000000000000000000000000602082015290565b60011982016123a957505060408051808201909152600d81527f414444434f4e54524f4c4c455200000000000000000000000000000000000000602082015290565b60071982016123eb57505060408051808201909152600d81527f414444455854454e53494f4e5300000000000000000000000000000000000000602082015290565b600f19820161242d57505060408051808201909152601081527f4348414e4745455854454e53494f4e5300000000000000000000000000000000602082015290565b601f19820161246f57505060408051808201909152601c81527f414444554e4956455253414c524543454956455244454c454741544500000000602082015290565b603f1982016124b157505060408051808201909152601f81527f4348414e4745554e4956455253414c524543454956455244454c454741544500602082015290565b607f1982016124f357505060408051808201909152600a81527f5245454e5452414e435900000000000000000000000000000000000000000000602082015290565b6203ffff19820161253757505060408051808201909152600781527f5345544441544100000000000000000000000000000000000000000000000000602082015290565b6107ff19820161257a57505060408051808201909152600481527f43414c4c00000000000000000000000000000000000000000000000000000000602082015290565b611fff1982016125bd57505060408051808201909152600a81527f53544154494343414c4c00000000000000000000000000000000000000000000602082015290565b617fff19820161260057505060408051808201909152600c81527f44454c454741544543414c4c0000000000000000000000000000000000000000602082015290565b61ffff19820161264357505060408051808201909152600681527f4445504c4f590000000000000000000000000000000000000000000000000000602082015290565b6101ff19820161268657505060408051808201909152600d81527f5452414e5346455256414c554500000000000000000000000000000000000000602082015290565b621fffff1982016126ca57505060408051808201909152600481527f5349474e00000000000000000000000000000000000000000000000000000000602082015290565b505060408051602081019091526000815290565b8151156126ee5781518083602001fd5b8060405162461bcd60e51b815260040161050791906134a9565b600081600481111561271c5761271c6139db565b036127245750565b6001816004811115612738576127386139db565b036127855760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610507565b6002816004811115612799576127996139db565b036127e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610507565b60038160048111156127fa576127fa6139db565b0361286d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610507565b50565b60007f20cf245f92495cf19acab2659b39f679e0f76aba35a7394b241ce5a0cc734f1d84016129935782516010141580156128ab5750825115155b156128cd578383604051631fa4139760e01b8152600401610507929190613f07565b81156128db575060006107d3565b60006128e684614024565b60801c9050856001600160a01b03166354f6127f866040518263ffffffff1660e01b815260040161291991815260200190565b600060405180830381865afa158015612936573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261295e9190810190613ad6565b61296790614024565b60801c6fffffffffffffffffffffffffffffffff8216116129895760046119a4565b60029150506107d3565b8251158015906129a557508251601414155b156129c7578383604051631fa4139760e01b8152600401610507929190613f07565b81156129d5575060006107d3565b6040516354f6127f60e01b8152600481018590526001600160a01b038616906354f6127f90602401600060405180830381865afa158015612a1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a429190810190613ad6565b5115612a4f5760046103db565b600295945050505050565b60006001600160a01b03808316908290612a7690861683610af9565b90508015612a855760046103db565b506002949350505050565b6000612a9b83612e0d565b612aba578260405163187e77ab60e01b815260040161050791906134a9565b8115612ac8575060006107d3565b6001600160a01b0380851690600090612ae390881683610af9565b14612aef5760046103f4565b60029695505050505050565b6000612b0683612f03565b612aba578260405163ae6cbd3760e01b81526004016105079190614061565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b959190810190613ad6565b5115612ba2576040610354565b50602092915050565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612bf3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c1b9190810190613ad6565b5115612c28576010610354565b50600892915050565b6000612c466001600160a01b03881687612fe9565b90508051600003612c8e576040517f6cb605870000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610507565b6000612c9b868585613026565b905060005b8251811015612dab578251612cb6826022613a1d565b1115612cd7578260405163187e77ab60e01b815260040161050791906134a9565b6000612cef84612ce8846002613a1d565b6020613102565b905063ffffffff196020612d0283613b44565b63ffffffff19911b1603612d4d576040517f6fd203c50000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602401610507565b612d57818461322a565b8015612d685750612d688188613251565b8015612d795750612d798188613294565b8015612d8a5750612d8a81866132cc565b15612d985750505050611625565b50612da4602282613a1d565b9050612ca0565b508685612db7856140b3565b6040517f45147bce0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529290911660248301526001600160e01b0319166044820152606401610507565b6000805b8251811015612ee9578251612e27826001613a1d565b10612e355750600092915050565b6000838281518110612e4957612e496139f1565b01602001516001600160f81b03191684612e64846001613a1d565b81518110612e7457612e746139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612eb590613f5c565b60f01c905060208114612ecc575060009392505050565b612ed7816002613a1d565b612ee19083613a1d565b915050612e11565b82518103612efa5750600192915050565b50600092915050565b6000805b8251811015612ee9578251612f1d826001613a1d565b10612f2b5750600092915050565b6000838281518110612f3f57612f3f6139f1565b01602001516001600160f81b03191684612f5a846001613a1d565b81518110612f6a57612f6a6139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612fab90613f5c565b60f01c9050801580612fbd5750602081115b15612fcc575060009392505050565b612fd7816002613a1d565b612fe19083613a1d565b915050612f07565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf393a64c70000000000000000000000000000000000000000000085851b6113d2565b6000821561304e577c0100000000000000000000000000000000000000000000000000000000175b81511580159060009082613060575084155b9050818061306b5750805b156130f9578561309d577c020000000000000000000000000000000000000000000000000000000092909217916130f9565b600386036130cd577c040000000000000000000000000000000000000000000000000000000092909217916130f9565b600486036130f9577c080000000000000000000000000000000000000000000000000000000092909217915b50509392505050565b60608161311081601f613a1d565b101561315e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610507565b6131688284613a1d565b845110156131b85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610507565b6060821580156131d75760405191506000825260208201604052613221565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132105780518352602092830192016131f8565b5050858452601f01601f1916604052505b50949350505050565b600080613236846140b3565b83166001600160e01b03199081169084161491505092915050565b600080602061325f85613b44565b901b60601c90506001600160a01b038114806107d35750806001600160a01b0316836001600160a01b03161491505092915050565b60008060c06132a285613b44565b901b90506001600160e01b031980821614806107d357506107d36001600160a01b03841682613326565b60008060e06132da85613b44565b8451911b91506004111560006132ef856140b3565b90506001600160e01b031983811614806103f457508180156103f457506001600160e01b0319818116908416149695505050505050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613398575060208210155b8015610aa9575015159695505050505050565b6000602082840312156133bd57600080fd5b81356001600160e01b03198116811461035457600080fd5b60008083601f8401126133e757600080fd5b50813567ffffffffffffffff8111156133ff57600080fd5b602083019150836020828501011115610af257600080fd5b6000806020838503121561342a57600080fd5b823567ffffffffffffffff81111561344157600080fd5b61344d858286016133d5565b90969095509350505050565b60005b8381101561347457818101518382015260200161345c565b50506000910152565b60008151808452613495816020860160208601613459565b601f01601f19169290920160200192915050565b602081526000610354602083018461347d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134fb576134fb6134bc565b604052919050565b600067ffffffffffffffff82111561351d5761351d6134bc565b50601f01601f191660200190565b600082601f83011261353c57600080fd5b813561354f61354a82613503565b6134d2565b81815284602083860101111561356457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561359457600080fd5b82359150602083013567ffffffffffffffff8111156135b257600080fd5b6135be8582860161352b565b9150509250929050565b6000806000806000608086880312156135e057600080fd5b853567ffffffffffffffff808211156135f857600080fd5b61360489838a0161352b565b96506020880135955060408801359450606088013591508082111561362857600080fd5b50613635888289016133d5565b969995985093965092949392505050565b600067ffffffffffffffff821115613660576136606134bc565b5060051b60200190565b600082601f83011261367b57600080fd5b8135602061368b61354a83613646565b82815260059290921b840181019181810190868411156136aa57600080fd5b8286015b848110156136ea57803567ffffffffffffffff8111156136ce5760008081fd5b6136dc8986838b010161352b565b8452509183019183016136ae565b509695505050505050565b60008083601f84011261370757600080fd5b50813567ffffffffffffffff81111561371f57600080fd5b6020830191508360208260051b8501011115610af257600080fd5b600080600080600080600080600060a08a8c03121561375857600080fd5b893567ffffffffffffffff8082111561377057600080fd5b61377c8d838e0161366a565b9a5060208c013591508082111561379257600080fd5b61379e8d838e016136f5565b909a50985060408c01359150808211156137b757600080fd5b6137c38d838e016136f5565b909850965060608c01359150808211156137dc57600080fd5b6137e88d838e016136f5565b909650945060808c013591508082111561380157600080fd5b5061380e8c828d016136f5565b915080935050809150509295985092959850929598565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561387a57603f1988860301845261386885835161347d565b9450928501929085019060010161384c565b5092979650505050505050565b6001600160a01b038116811461286d57600080fd5b600080604083850312156138af57600080fd5b82356138ba81613887565b915060208301356fffffffffffffffffffffffffffffffff811681146138df57600080fd5b809150509250929050565b6000806000806040858703121561390057600080fd5b843567ffffffffffffffff8082111561391857600080fd5b613924888389016136f5565b9096509450602087013591508082111561393d57600080fd5b5061394a878288016136f5565b95989497509550505050565b60008060008060008060a0878903121561396f57600080fd5b863561397a81613887565b9550602087013561398a81613887565b9450604087013561399a81613887565b935060608701359250608087013567ffffffffffffffff8111156139bd57600080fd5b6139c989828a016133d5565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561034157610341613a07565b6000808335601e19843603018112613a4757600080fd5b83018035915067ffffffffffffffff821115613a6257600080fd5b602001915036819003821315610af257600080fd5b6001600160e01b03198135818116916004851015613a9f5780818660040360031b1b83161692505b505092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b600060208284031215613ae857600080fd5b815167ffffffffffffffff811115613aff57600080fd5b8201601f81018413613b1057600080fd5b8051613b1e61354a82613503565b818152856020838501011115613b3357600080fd5b6103db826020830160208601613459565b80516020808301519190811015613b65576000198160200360031b1b821691505b50919050565b6001600160a01b03841681528260208201526060604082015260006103db606083018461347d565b600060018201613ba557613ba5613a07565b5060010190565b60008085851115613bbc57600080fd5b83861115613bc957600080fd5b5050820193919092039150565b60008060408385031215613be957600080fd5b823567ffffffffffffffff80821115613c0157600080fd5b818501915085601f830112613c1557600080fd5b81356020613c2561354a83613646565b82815260059290921b84018101918181019089841115613c4457600080fd5b948201945b83861015613c6257853582529482019490820190613c49565b96505086013592505080821115613c7857600080fd5b506135be8582860161366a565b60008060008060808587031215613c9b57600080fd5b843593506020850135613cad81613887565b925060408501359150606085013567ffffffffffffffff811115613cd057600080fd5b613cdc8782880161352b565b91505092959194509250565b600082601f830112613cf957600080fd5b81356020613d0961354a83613646565b82815260059290921b84018101918181019086841115613d2857600080fd5b8286015b848110156136ea5780358352918301918301613d2c565b60008060008060808587031215613d5957600080fd5b843567ffffffffffffffff80821115613d7157600080fd5b613d7d88838901613ce8565b9550602091508187013581811115613d9457600080fd5b8701601f81018913613da557600080fd5b8035613db361354a82613646565b81815260059190911b8201840190848101908b831115613dd257600080fd5b928501925b82841015613df9578335613dea81613887565b82529285019290850190613dd7565b97505050506040870135915080821115613e1257600080fd5b613e1e88838901613ce8565b93506060870135915080821115613e3457600080fd5b50613cdc8782880161366a565b8183823760009101908152919050565b878152866020820152856040820152846060820152836080820152818360a08301376000910160a0019081529695505050505050565b6001600160a01b03831681526040602082015260006107d3604083018461347d565b7f190000000000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff198360601b16600282015260008251613ef9816016850160208701613459565b919091016016019392505050565b8281526040602082015260006107d3604083018461347d565b805160208201516bffffffffffffffffffffffff198082169291906014831015613f545780818460140360031b1b83161693505b505050919050565b6000815160208301517fffff00000000000000000000000000000000000000000000000000000000000080821693506002831015613f545760029290920360031b82901b161692915050565b604081526000613fbb604083018461347d565b8281036020840152601c81527f636f756c646e2774204445434f44452066726f6d2073746f726167650000000060208201526040810191505092915050565b8181038181111561034157610341613a07565b808202811582820484141761034157610341613a07565b6000815160208301516fffffffffffffffffffffffffffffffff1980821693506010831015613f545760109290920360031b82901b161692915050565b604081526000614074604083018461347d565b8281036020840152602081527f636f756c646e27742056414c49444154452074686520646174612076616c756560208201526040810191505092915050565b6000815160208301516001600160e01b031980821693506004831015613f545760049290920360031b82901b16169291505056fea264697066735822122048e22213f43f6c90a59e8e745a3ab0a66cd70af874d6f25bd1675165a369861464736f6c63430008110033\",\n \"deployedBytecode\": \"0x6080604052600436106100bc5760003560e01c8063b44581d911610074578063d4b839921161004e578063d4b83992146101e3578063de928f141461020b578063ffa1ad741461022b57600080fd5b8063b44581d914610182578063bf0176ff146101b0578063d3fc45d3146101c357600080fd5b80631626ba7e116100a55780631626ba7e146101165780634c8a4e741461014f578063a20856a51461016257600080fd5b806301ffc9a7146100c157806309c5eabe146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046133ab565b610274565b60405190151581526020015b60405180910390f35b610109610104366004613417565b610347565b6040516100ed91906134a9565b34801561012257600080fd5b50610136610131366004613581565b61035b565b6040516001600160e01b031990911681526020016100ed565b61010961015d3660046135c8565b6103e4565b61017561017036600461373a565b6103fe565b6040516100ed9190613825565b34801561018e57600080fd5b506101a261019d36600461389c565b610600565b6040519081526020016100ed565b6101756101be3660046138ea565b610652565b3480156101cf57600080fd5b506101366101de366004613581565b6107db565b3480156101ef57600080fd5b506001546040516001600160a01b0390911681526020016100ed565b34801561021757600080fd5b50610136610226366004613956565b610817565b34801561023757600080fd5b506101096040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b60006001600160e01b031982167f23f34c620000000000000000000000000000000000000000000000000000000014806102be57506001600160e01b03198216630b135d3f60e11b145b806102f257506001600160e01b031982167f0d6ecac700000000000000000000000000000000000000000000000000000000145b8061032657506001600160e01b031982167f5ac7990800000000000000000000000000000000000000000000000000000000145b8061034157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060610354348484610981565b9392505050565b600080600061036a8585610ab4565b90925090506000816004811115610383576103836139db565b1461039b57506001600160e01b031991506103419050565b6001546103c09062200000906103ba906001600160a01b031685610af9565b81161490565b6103d2576001600160e01b03196103db565b630b135d3f60e11b5b95945050505050565b60606103f4868686348787610bba565b9695505050505050565b8851606090881415806104115750878614155b8061041c5750858414155b806104275750838214155b1561045e576040517fb4d50d2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff811115610479576104796134bc565b6040519080825280602002602001820160405280156104ac57816020015b60608152602001906001900390816104975790505b5090506000805b848110156105c657348888838181106104ce576104ce6139f1565b90506020020135836104e09190613a1d565b925082111561051057604051630c28c92b60e21b8152600481018390523460248201526044015b60405180910390fd5b6105a18d8281518110610525576105256139f1565b60200260200101518d8d8481811061053f5761053f6139f1565b905060200201358c8c85818110610558576105586139f1565b905060200201358b8b86818110610571576105716139f1565b905060200201358a8a8781811061058a5761058a6139f1565b905060200281019061059c9190613a30565b610bba565b8382815181106105b3576105b36139f1565b60209081029190910101526001016104b3565b50348110156105f15760405163528c345b60e11b815260048101829052346024820152604401610507565b509a9950505050505050505050565b6001600160a01b0382166000908152602081815260408083206fffffffffffffffffffffffffffffffff85168452909152812054608083901b6fffffffffffffffffffffffffffffffff191617610354565b606083821461068d576040517f55a187db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff8111156106a8576106a86134bc565b6040519080825280602002602001820160405280156106db57816020015b60608152602001906001900390816106c65790505b5090506000805b848110156107a457348888838181106106fd576106fd6139f1565b905060200201358361070f9190613a1d565b925082111561073a57604051630c28c92b60e21b815260048101839052346024820152604401610507565b61077f88888381811061074f5761074f6139f1565b90506020020135878784818110610768576107686139f1565b905060200281019061077a9190613a30565b610981565b838281518110610791576107916139f1565b60209081029190910101526001016106e2565b50348110156107cf5760405163528c345b60e11b815260048101829052346024820152604401610507565b5090505b949350505050565b6001546000906001600160a01b0316330361080857336000908152600260205260409020805460ff191690555b5063d3fc45d360e01b92915050565b600080631fc8da4360e21b61082c8486613a77565b6001600160e01b031916148061085b5750639790242160e01b61084f8486613a77565b6001600160e01b031916145b90506001600160a01b038716330361091a57600061087a888389610db8565b905061088a888860008888610e25565b6108948486613a77565b6001600160e01b03191686886001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a481806108de5750805b6108ef5763de928f0160e01b610911565b7fde928f00000000000000000000000000000000000000000000000000000000005b925050506103f4565b6001600160a01b03871660009081526002602052604090205460ff16801561095a5761095a876109536001600160a01b038b1682610af9565b6080611246565b610968888860008888610e25565b81806108de5750806108ef5763de928f0160e01b610911565b606060048210156109a9578282604051630d886ef360e21b8152600401610507929190613aa7565b6000631fc8da4360e21b6109bd8486613a77565b6001600160e01b03191614806109ec5750639790242160e01b6109e08486613a77565b6001600160e01b031916145b6001549091506001600160a01b03166000610a08828433610db8565b9050610a18823360008989610e25565b610a228587613a77565b6001600160e01b03191687336001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610a7183898989611256565b905081158015610a7f575083155b15610aa957610aa9836001600160a01b03166000908152600260205260409020805460ff19169055565b979650505050505050565b6000808251604103610aea5760208301516040840151606085015160001a610ade8782858561130e565b94509450505050610af2565b506000905060025b9250929050565b6000806001600160a01b0384166354f6127f610b397f4b80742de2bf82acb36300000000000000000000000000000000000000000000606087901b6113d2565b6040518263ffffffff1660e01b8152600401610b5791815260200190565b600060405180830381865afa158015610b74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b9c9190810190613ad6565b90508051602014610bb1575060009050610341565b6107d381613b44565b60606004821015610be2578282604051630d886ef360e21b8152600401610507929190613aa7565b6001546001600160a01b03166000610bfe89898989898961143b565b6001600160a01b03811660009081526020818152604080832060808d901c84529091529020549091506fffffffffffffffffffffffffffffffff891614610c775780888a6040517fc9bd9eb900000000000000000000000000000000000000000000000000000000815260040161050793929190613b6b565b6001600160a01b03811660009081526020818152604080832060808c901c84529091528120805491610ca883613b93565b9190505550610cb687611493565b6000631fc8da4360e21b610cca8688613a77565b6001600160e01b0319161480610cf95750639790242160e01b610ced8688613a77565b6001600160e01b031916145b90506000610d08848385610db8565b9050610d18848460018a8a610e25565b610d228688613a77565b6001600160e01b03191688846001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610d71858a8a8a611256565b905081158015610d7f575082155b15610da957610da9856001600160a01b03166000908152600260205260409020805460ff19169055565b9b9a5050505050505050505050565b6001600160a01b03831660009081526002602052604090205460ff168015610df657610df1826109536001600160a01b03871682610af9565b610354565b82610354576001600160a01b0384166000908152600260205260409020805460ff191660011790559392505050565b6000610e3a6001600160a01b03871686610af9565b905080610e7e576040517ff292052a0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610507565b8315610e8e57610e8e8582611548565b6000610e9a8385613a77565b90507f80dc96f4000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f0257600080610edd8560048189613bac565b810190610eea9190613581565b91509150610efb89898685856115b2565b505061123d565b7f686fdbdf000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f6157600080610f438560048189613bac565b810190610f509190613bd6565b91509150610efb898986858561162e565b7fbb3fd702000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610fd1576000808080610fa4876004818b613bac565b810190610fb19190613c85565b9350935093509350610fc88b8b88878787876117b1565b5050505061123d565b7fce7a7bae000000000000000000000000000000000000000000000000000000006001600160e01b0319821601611156576000808080611014876004818b613bac565b8101906110219190613d43565b93509350935093508251845114158061103c57508151835114155b8061104957508051825114155b15611080576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83516000036110bb576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b845181101561114c5761113a8c8c898885815181106110df576110df6139f1565b60200260200101518886815181106110f9576110f96139f1565b6020026020010151888781518110611113576111136139f1565b602002602001015188888151811061112d5761112d6139f1565b60200260200101516117b1565b8061114481613b93565b9150506110be565b505050505061123d565b6001600160e01b031981167ff2fde38b0000000000000000000000000000000000000000000000000000000014806111b757506001600160e01b031981167f79ba509700000000000000000000000000000000000000000000000000000000145b806111eb57506001600160e01b031981167f715018a600000000000000000000000000000000000000000000000000000000145b156111ff576111fa868361187e565b61123d565b6040517f2ba8851c0000000000000000000000000000000000000000000000000000000081526001600160e01b031982166004820152602401610507565b50505050505050565b6112518383836118b3565b505050565b6060600080866001600160a01b0316865a908787604051611278929190613e41565b600060405180830381858888f193505050503d80600081146112b6576040519150601f19603f3d011682016040523d82523d6000602084013e6112bb565b606091505b5091509150600061130283836040518060400160405280601e81526020017f4c5350363a206661696c656420657865637574696e67207061796c6f616400008152506118e6565b98975050505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561134557506000905060036113c9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611399573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113c2576000600192509250506113c9565b9150600090505b94509492505050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c830152918291016040516020818303038152906040529050806107d390613b44565b600080601946888888888860405160200161145c9796959493929190613e51565b60408051601f198184030181529190529050600061147a30836118ff565b9050611486818a611932565b9998505050505050505050565b8060000361149e5750565b608081901c81428211156114dd576040517ede4b8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff166000036114fc57505050565b806fffffffffffffffffffffffffffffffff16421115611251576040517f5c53a98c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62400000808216146115ae5760408051631ded6b7360e11b81526001600160a01b03841660048201526024810191909152601260448201527f455845435554455f52454c41595f43414c4c00000000000000000000000000006064820152608401610507565b5050565b60006115c086858585611956565b90506203ffff19810161160f5762020000808516036115df5750611627565b6115ed858562040000611246565b61160a85846116056001600160a01b038a1683611d0d565b611dad565b611625565b8061161a5750611627565b611625858583611246565b505b5050505050565b8051825114611669576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080835167ffffffffffffffff811115611686576116866134bc565b6040519080825280602002602001820160405280156116af578160200160208202803683370190505b509050600080805b6116f58a898984815181106116ce576116ce6139f1565b60200260200101518985815181106116e8576116e86139f1565b6020026020010151611956565b91506203ffff19820161170b576001945061174e565b811561171c5761171c898984611246565b6001848281518110611730576117306139f1565b911515602092830291909101909101528261174a81613b93565b9350505b806001019050865181106116b75784156117a5576202000080891603611778575050505050611627565b611786898962040000611246565b6117a5898861179e6001600160a01b038e1683611d0d565b8787611f0d565b50505050505050505050565b306001600160a01b038416036117f3576040517fa431b23600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83611806576111fa878787868686612151565b60018414806118155750600284145b1561182e5781151561182887878361222d565b5061123d565b60038403611844576111fa8787878686866122b2565b6004840361123d576040517f80d6ebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808216146115ae57600061189460016122e1565b90508281604051631ded6b7360e11b8152600401610507929190613e87565b80821681146112515760006118c7826122e1565b90508381604051631ded6b7360e11b8152600401610507929190613e87565b606083156118f5575081610354565b61035483836126de565b60008282604051602001611914929190613ea9565b60405160208183030381529060405280519060200120905092915050565b60008060006119418585610ab4565b9150915061194e81612708565b509392505050565b60007f20cf245f92495cf19acab2659b39f67a000000000000000000000000000000006fffffffffffffffffffffffffffffffff198416016119ac576006848116146119a486858584612870565b9150506107d3565b7fb47f8bd21d4100000000000000000000000000000000000000000000000000007fffffffffffff0000000000000000000000000000000000000000000000000000841601611b29576006848116146001600160a01b031984167fb47f8bd21d407d534c9d0000000000000000000000000000000000000000000001611a7a578251602014158015611a3e5750825115155b15611a60578383604051631fa4139760e01b8152600401610507929190613f07565b8015611a705750600090506107d3565b6119a48685612a5a565b7fb47f8bd21d40c6c59b39000000000000000000000000000000000000000000006001600160a01b0319851601611ab7576119a486858584612a90565b7fb47f8bd21d407993d6ef000000000000000000000000000000000000000000006001600160a01b0319851601611af4576119a486858584612afb565b6040517f0f7d735b00000000000000000000000000000000000000000000000000000000815260048101859052602401610507565b7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47831480611b8057506001600160a01b031983167f0cfc51aec37c55a4d0b100000000000000000000000000000000000000000000145b15611bdc578151601414158015611b975750815115155b15611bb9578282604051631fa4139760e01b8152600401610507929190613f07565b606080851603611bcb575060006107d3565b611bd58584612b25565b90506107d3565b7f311874bf6b2579feef6a000000000000000000000000000000000000000000006001600160a01b0319841601611d03578151601414158015611c2157508151601514155b8015611c2d5750815115155b15611c4f578282604051631fa4139760e01b8152600401610507929190613f07565b606083901b6001600160e01b031981167fde928f14000000000000000000000000000000000000000000000000000000001480611c9c57506001600160e01b0319811663d3fc45d360e01b145b15611ce55730611cab84613f20565b60601c03611ce5576040517f4a9fa8cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601880861603611cf95750600090506107d3565b6119a48685612bab565b50620400006107d3565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf866c29110000000000000000000000000000000000000000000085851b6113d2565b6040518263ffffffff1660e01b8152600401611d6891815260200190565b600060405180830381865afa158015611d85573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103549190810190613ad6565b8051600003611dda5760405163ed7fa50960e01b81526001600160a01b0384166004820152602401610507565b6000806000805b8451841015611ee257848481518110611dfc57611dfc6139f1565b01602001516001600160f81b03191685611e17866001613a1d565b81518110611e2757611e276139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611e6890613f5c565b60f01c9250821580611e7a5750602083115b15611e9a578460405163ae6cbd3760e01b81526004016105079190613fa8565b611ea5836020613ffa565b611eb090600861400d565b8585016022015160001990911b908116925090508581168203611ed65750505050505050565b92820160020192611de1565b60405163557ae07960e01b81526001600160a01b038816600482015260248101879052604401610507565b8251600003611f3a5760405163ed7fa50960e01b81526001600160a01b0386166004820152602401610507565b835160008080805b87518410156120cb57878481518110611f5d57611f5d6139f1565b01602001516001600160f81b03191688611f78866001613a1d565b81518110611f8857611f886139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611fc990613f5c565b60f01c9250821580611fdb5750602083115b15611ffb578760405163ae6cbd3760e01b81526004016105079190613fa8565b612006836020613ffa565b61201190600861400d565b8885016022015160001990911b9081169250905060005b858110156120be57878181518110612042576120426139f1565b60200260200101511561205757600101612028565b82828b838151811061206b5761206b6139f1565b602002602001015116036120b657600188828151811061208d5761208d6139f1565b91151560209283029190910190910152600180880197879003016120b657505050505050611627565b600101612028565b5092820160020192611f42565b60005b85811015612144578781815181106120e8576120e86139f1565b602002602001015161213c578a8a8281518110612107576121076139f1565b602090810291909101015160405163557ae07960e01b81526001600160a01b0390921660048301526024820152604401610507565b6001016120ce565b5050505050505050505050565b80518215801591610100878116149190159061040080891614908490612175575082155b15612187576121878989610200611246565b818015612192575083155b801561219c575080155b156121ae576121ae8989610800611246565b811580156121ba575080155b156121cc576121cc8989610800611246565b831580156121d75750805b156121e55750505050611625565b8180156121ef5750835b80156121f85750825b156122065750505050611625565b8080156122105750825b1561221e5750505050611625565b6117a58a8a60008a8a8a612c31565b61223b838362010000611246565b6101008281161481801561224d575080155b156122ac5760408051631ded6b7360e11b81526001600160a01b03861660048201526024810191909152601360448201527f53555045525f5452414e5346455256414c5545000000000000000000000000006064820152608401610507565b50505050565b6110008481161480156122c55750611625565b6122d28686612000611246565b61123d87876003878787612c31565b6060600019820161232557505060408051808201909152601181527f5452414e534645524f574e455253484950000000000000000000000000000000602082015290565b600319820161236757505060408051808201909152600f81527f454449545045524d495353494f4e530000000000000000000000000000000000602082015290565b60011982016123a957505060408051808201909152600d81527f414444434f4e54524f4c4c455200000000000000000000000000000000000000602082015290565b60071982016123eb57505060408051808201909152600d81527f414444455854454e53494f4e5300000000000000000000000000000000000000602082015290565b600f19820161242d57505060408051808201909152601081527f4348414e4745455854454e53494f4e5300000000000000000000000000000000602082015290565b601f19820161246f57505060408051808201909152601c81527f414444554e4956455253414c524543454956455244454c454741544500000000602082015290565b603f1982016124b157505060408051808201909152601f81527f4348414e4745554e4956455253414c524543454956455244454c454741544500602082015290565b607f1982016124f357505060408051808201909152600a81527f5245454e5452414e435900000000000000000000000000000000000000000000602082015290565b6203ffff19820161253757505060408051808201909152600781527f5345544441544100000000000000000000000000000000000000000000000000602082015290565b6107ff19820161257a57505060408051808201909152600481527f43414c4c00000000000000000000000000000000000000000000000000000000602082015290565b611fff1982016125bd57505060408051808201909152600a81527f53544154494343414c4c00000000000000000000000000000000000000000000602082015290565b617fff19820161260057505060408051808201909152600c81527f44454c454741544543414c4c0000000000000000000000000000000000000000602082015290565b61ffff19820161264357505060408051808201909152600681527f4445504c4f590000000000000000000000000000000000000000000000000000602082015290565b6101ff19820161268657505060408051808201909152600d81527f5452414e5346455256414c554500000000000000000000000000000000000000602082015290565b621fffff1982016126ca57505060408051808201909152600481527f5349474e00000000000000000000000000000000000000000000000000000000602082015290565b505060408051602081019091526000815290565b8151156126ee5781518083602001fd5b8060405162461bcd60e51b815260040161050791906134a9565b600081600481111561271c5761271c6139db565b036127245750565b6001816004811115612738576127386139db565b036127855760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610507565b6002816004811115612799576127996139db565b036127e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610507565b60038160048111156127fa576127fa6139db565b0361286d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610507565b50565b60007f20cf245f92495cf19acab2659b39f679e0f76aba35a7394b241ce5a0cc734f1d84016129935782516010141580156128ab5750825115155b156128cd578383604051631fa4139760e01b8152600401610507929190613f07565b81156128db575060006107d3565b60006128e684614024565b60801c9050856001600160a01b03166354f6127f866040518263ffffffff1660e01b815260040161291991815260200190565b600060405180830381865afa158015612936573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261295e9190810190613ad6565b61296790614024565b60801c6fffffffffffffffffffffffffffffffff8216116129895760046119a4565b60029150506107d3565b8251158015906129a557508251601414155b156129c7578383604051631fa4139760e01b8152600401610507929190613f07565b81156129d5575060006107d3565b6040516354f6127f60e01b8152600481018590526001600160a01b038616906354f6127f90602401600060405180830381865afa158015612a1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a429190810190613ad6565b5115612a4f5760046103db565b600295945050505050565b60006001600160a01b03808316908290612a7690861683610af9565b90508015612a855760046103db565b506002949350505050565b6000612a9b83612e0d565b612aba578260405163187e77ab60e01b815260040161050791906134a9565b8115612ac8575060006107d3565b6001600160a01b0380851690600090612ae390881683610af9565b14612aef5760046103f4565b60029695505050505050565b6000612b0683612f03565b612aba578260405163ae6cbd3760e01b81526004016105079190614061565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b959190810190613ad6565b5115612ba2576040610354565b50602092915050565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612bf3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c1b9190810190613ad6565b5115612c28576010610354565b50600892915050565b6000612c466001600160a01b03881687612fe9565b90508051600003612c8e576040517f6cb605870000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610507565b6000612c9b868585613026565b905060005b8251811015612dab578251612cb6826022613a1d565b1115612cd7578260405163187e77ab60e01b815260040161050791906134a9565b6000612cef84612ce8846002613a1d565b6020613102565b905063ffffffff196020612d0283613b44565b63ffffffff19911b1603612d4d576040517f6fd203c50000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602401610507565b612d57818461322a565b8015612d685750612d688188613251565b8015612d795750612d798188613294565b8015612d8a5750612d8a81866132cc565b15612d985750505050611625565b50612da4602282613a1d565b9050612ca0565b508685612db7856140b3565b6040517f45147bce0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529290911660248301526001600160e01b0319166044820152606401610507565b6000805b8251811015612ee9578251612e27826001613a1d565b10612e355750600092915050565b6000838281518110612e4957612e496139f1565b01602001516001600160f81b03191684612e64846001613a1d565b81518110612e7457612e746139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612eb590613f5c565b60f01c905060208114612ecc575060009392505050565b612ed7816002613a1d565b612ee19083613a1d565b915050612e11565b82518103612efa5750600192915050565b50600092915050565b6000805b8251811015612ee9578251612f1d826001613a1d565b10612f2b5750600092915050565b6000838281518110612f3f57612f3f6139f1565b01602001516001600160f81b03191684612f5a846001613a1d565b81518110612f6a57612f6a6139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612fab90613f5c565b60f01c9050801580612fbd5750602081115b15612fcc575060009392505050565b612fd7816002613a1d565b612fe19083613a1d565b915050612f07565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf393a64c70000000000000000000000000000000000000000000085851b6113d2565b6000821561304e577c0100000000000000000000000000000000000000000000000000000000175b81511580159060009082613060575084155b9050818061306b5750805b156130f9578561309d577c020000000000000000000000000000000000000000000000000000000092909217916130f9565b600386036130cd577c040000000000000000000000000000000000000000000000000000000092909217916130f9565b600486036130f9577c080000000000000000000000000000000000000000000000000000000092909217915b50509392505050565b60608161311081601f613a1d565b101561315e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610507565b6131688284613a1d565b845110156131b85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610507565b6060821580156131d75760405191506000825260208201604052613221565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132105780518352602092830192016131f8565b5050858452601f01601f1916604052505b50949350505050565b600080613236846140b3565b83166001600160e01b03199081169084161491505092915050565b600080602061325f85613b44565b901b60601c90506001600160a01b038114806107d35750806001600160a01b0316836001600160a01b03161491505092915050565b60008060c06132a285613b44565b901b90506001600160e01b031980821614806107d357506107d36001600160a01b03841682613326565b60008060e06132da85613b44565b8451911b91506004111560006132ef856140b3565b90506001600160e01b031983811614806103f457508180156103f457506001600160e01b0319818116908416149695505050505050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613398575060208210155b8015610aa9575015159695505050505050565b6000602082840312156133bd57600080fd5b81356001600160e01b03198116811461035457600080fd5b60008083601f8401126133e757600080fd5b50813567ffffffffffffffff8111156133ff57600080fd5b602083019150836020828501011115610af257600080fd5b6000806020838503121561342a57600080fd5b823567ffffffffffffffff81111561344157600080fd5b61344d858286016133d5565b90969095509350505050565b60005b8381101561347457818101518382015260200161345c565b50506000910152565b60008151808452613495816020860160208601613459565b601f01601f19169290920160200192915050565b602081526000610354602083018461347d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134fb576134fb6134bc565b604052919050565b600067ffffffffffffffff82111561351d5761351d6134bc565b50601f01601f191660200190565b600082601f83011261353c57600080fd5b813561354f61354a82613503565b6134d2565b81815284602083860101111561356457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561359457600080fd5b82359150602083013567ffffffffffffffff8111156135b257600080fd5b6135be8582860161352b565b9150509250929050565b6000806000806000608086880312156135e057600080fd5b853567ffffffffffffffff808211156135f857600080fd5b61360489838a0161352b565b96506020880135955060408801359450606088013591508082111561362857600080fd5b50613635888289016133d5565b969995985093965092949392505050565b600067ffffffffffffffff821115613660576136606134bc565b5060051b60200190565b600082601f83011261367b57600080fd5b8135602061368b61354a83613646565b82815260059290921b840181019181810190868411156136aa57600080fd5b8286015b848110156136ea57803567ffffffffffffffff8111156136ce5760008081fd5b6136dc8986838b010161352b565b8452509183019183016136ae565b509695505050505050565b60008083601f84011261370757600080fd5b50813567ffffffffffffffff81111561371f57600080fd5b6020830191508360208260051b8501011115610af257600080fd5b600080600080600080600080600060a08a8c03121561375857600080fd5b893567ffffffffffffffff8082111561377057600080fd5b61377c8d838e0161366a565b9a5060208c013591508082111561379257600080fd5b61379e8d838e016136f5565b909a50985060408c01359150808211156137b757600080fd5b6137c38d838e016136f5565b909850965060608c01359150808211156137dc57600080fd5b6137e88d838e016136f5565b909650945060808c013591508082111561380157600080fd5b5061380e8c828d016136f5565b915080935050809150509295985092959850929598565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561387a57603f1988860301845261386885835161347d565b9450928501929085019060010161384c565b5092979650505050505050565b6001600160a01b038116811461286d57600080fd5b600080604083850312156138af57600080fd5b82356138ba81613887565b915060208301356fffffffffffffffffffffffffffffffff811681146138df57600080fd5b809150509250929050565b6000806000806040858703121561390057600080fd5b843567ffffffffffffffff8082111561391857600080fd5b613924888389016136f5565b9096509450602087013591508082111561393d57600080fd5b5061394a878288016136f5565b95989497509550505050565b60008060008060008060a0878903121561396f57600080fd5b863561397a81613887565b9550602087013561398a81613887565b9450604087013561399a81613887565b935060608701359250608087013567ffffffffffffffff8111156139bd57600080fd5b6139c989828a016133d5565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561034157610341613a07565b6000808335601e19843603018112613a4757600080fd5b83018035915067ffffffffffffffff821115613a6257600080fd5b602001915036819003821315610af257600080fd5b6001600160e01b03198135818116916004851015613a9f5780818660040360031b1b83161692505b505092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b600060208284031215613ae857600080fd5b815167ffffffffffffffff811115613aff57600080fd5b8201601f81018413613b1057600080fd5b8051613b1e61354a82613503565b818152856020838501011115613b3357600080fd5b6103db826020830160208601613459565b80516020808301519190811015613b65576000198160200360031b1b821691505b50919050565b6001600160a01b03841681528260208201526060604082015260006103db606083018461347d565b600060018201613ba557613ba5613a07565b5060010190565b60008085851115613bbc57600080fd5b83861115613bc957600080fd5b5050820193919092039150565b60008060408385031215613be957600080fd5b823567ffffffffffffffff80821115613c0157600080fd5b818501915085601f830112613c1557600080fd5b81356020613c2561354a83613646565b82815260059290921b84018101918181019089841115613c4457600080fd5b948201945b83861015613c6257853582529482019490820190613c49565b96505086013592505080821115613c7857600080fd5b506135be8582860161366a565b60008060008060808587031215613c9b57600080fd5b843593506020850135613cad81613887565b925060408501359150606085013567ffffffffffffffff811115613cd057600080fd5b613cdc8782880161352b565b91505092959194509250565b600082601f830112613cf957600080fd5b81356020613d0961354a83613646565b82815260059290921b84018101918181019086841115613d2857600080fd5b8286015b848110156136ea5780358352918301918301613d2c565b60008060008060808587031215613d5957600080fd5b843567ffffffffffffffff80821115613d7157600080fd5b613d7d88838901613ce8565b9550602091508187013581811115613d9457600080fd5b8701601f81018913613da557600080fd5b8035613db361354a82613646565b81815260059190911b8201840190848101908b831115613dd257600080fd5b928501925b82841015613df9578335613dea81613887565b82529285019290850190613dd7565b97505050506040870135915080821115613e1257600080fd5b613e1e88838901613ce8565b93506060870135915080821115613e3457600080fd5b50613cdc8782880161366a565b8183823760009101908152919050565b878152866020820152856040820152846060820152836080820152818360a08301376000910160a0019081529695505050505050565b6001600160a01b03831681526040602082015260006107d3604083018461347d565b7f190000000000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff198360601b16600282015260008251613ef9816016850160208701613459565b919091016016019392505050565b8281526040602082015260006107d3604083018461347d565b805160208201516bffffffffffffffffffffffff198082169291906014831015613f545780818460140360031b1b83161693505b505050919050565b6000815160208301517fffff00000000000000000000000000000000000000000000000000000000000080821693506002831015613f545760029290920360031b82901b161692915050565b604081526000613fbb604083018461347d565b8281036020840152601c81527f636f756c646e2774204445434f44452066726f6d2073746f726167650000000060208201526040810191505092915050565b8181038181111561034157610341613a07565b808202811582820484141761034157610341613a07565b6000815160208301516fffffffffffffffffffffffffffffffff1980821693506010831015613f545760109290920360031b82901b161692915050565b604081526000614074604083018461347d565b8281036020840152602081527f636f756c646e27742056414c49444154452074686520646174612076616c756560208201526040810191505092915050565b6000815160208301516001600160e01b031980821693506004831015613f545760049290920360031b82901b16169291505056fea264697066735822122048e22213f43f6c90a59e8e745a3ab0a66cd70af874d6f25bd1675165a369861464736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n","import { abi as KeyManager } from '@lukso/lsp6-contracts/artifacts/LSP6KeyManager.json'\nimport { LRUCache } from 'lru-cache'\nimport {\n type Chain,\n type ChainContract,\n encodeFunctionData,\n getContract,\n} from 'viem'\nimport { ITEMS } from './constants'\nimport type { AddressModifier } from './types'\nimport { getPublicClient } from './utils'\n\nconst TARGETS = new LRUCache<string, Promise<`0x${string}` | undefined>>({\n max: 1000,\n ttl: 1000 * 60 * 60,\n})\n\n/**\n * Get the profile from the key manager.\n *\n * @param chain which chain to use\n * @param address address of key manager\n * @returns\n */\nexport async function getKMTarget(\n chain: Chain,\n address?: `0x${string}` | null\n): Promise<`0x${string}` | undefined> {\n if (!address) {\n return undefined\n }\n const info = TARGETS.get(address)\n if (info) {\n return info\n }\n const client = getPublicClient(chain)\n const out = client\n .readContract({\n address,\n abi: KeyManager,\n functionName: 'target',\n })\n .catch(() => undefined) as Promise<`0x${string}` | undefined>\n TARGETS.set(address, out)\n return out\n}\n\nconst INTERFACE_INFO = new LRUCache<string, Promise<string | undefined>>({\n max: 1000,\n ttl: 1000 * 60 * 60,\n})\n\n/**\n * Retrieve interface information, LSP7/8/0 for an address\n *\n * @param address\n * @param blockNumber\n * @param log\n * @returns\n */\nexport async function retrieveInterfaces(\n chain: Chain,\n modifier: AddressModifier\n): Promise<string | undefined> {\n const info = INTERFACE_INFO.get(modifier.address)\n if (info) {\n return info\n }\n const out = _retrieveInterfaces(chain, modifier)\n INTERFACE_INFO.set(modifier.address, out)\n return out\n}\n\nconst LSP2Fetcher = [\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'interfaceId',\n type: 'bytes4',\n },\n ],\n name: 'supportsInterface',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n type: 'function',\n name: 'aggregate3',\n inputs: [\n {\n name: 'calls',\n type: 'tuple[]',\n internalType: 'struct LSP2FetcherWithMulticall3.Call3[]',\n components: [\n { name: 'target', type: 'address', internalType: 'address' },\n { name: 'allowFailure', type: 'bool', internalType: 'bool' },\n { name: 'callData', type: 'bytes', internalType: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n internalType: 'struct LSP2FetcherWithMulticall3.Result[]',\n components: [\n { name: 'success', type: 'bool', internalType: 'bool' },\n { name: 'returnData', type: 'bytes', internalType: 'bytes' },\n ],\n },\n ],\n stateMutability: 'payable',\n },\n]\n\n/**\n * Lowlevel function to retrieve interface information\n *\n * @param address\n * @returns\n */\nasync function _retrieveInterfaces(\n chain: Chain,\n modifier: AddressModifier\n): Promise<string | undefined> {\n const { multicall3 } = chain.contracts as Record<string, ChainContract>\n if (!multicall3) {\n return undefined\n }\n const client = getPublicClient(chain)\n const _contract = getContract({\n client,\n address: multicall3.address,\n abi: LSP2Fetcher,\n })\n const args = ITEMS.map(({ key }) => {\n return {\n target: modifier.address,\n allowFailure: true,\n callData: encodeFunctionData({\n abi: LSP2Fetcher,\n functionName: 'supportsInterface',\n args: [key],\n }),\n }\n })\n return client\n .readContract({\n address: multicall3.address,\n abi: LSP2Fetcher,\n functionName: 'aggregate3',\n args: [args],\n })\n .catch((error) => {\n console.error(error)\n return []\n })\n .then((val) => {\n const response = val as Array<{ success: boolean; returnData: boolean }>\n for (const [index, value] of response.map(\n ({ success, returnData }, index: number) =>\n [index, success && Number(returnData)] as [number, boolean]\n )) {\n const item = ITEMS[index]\n if (!item) {\n continue\n }\n if (value) {\n return item.standard\n }\n }\n return undefined\n })\n .then((type) => {\n return type\n })\n}\n","import {\n lsp7BurnableAbi,\n lsp7CappedSupplyAbi,\n lsp7DigitalAssetAbi,\n lsp7MintableAbi,\n lsp7VotesAbi,\n} from '@lukso/lsp7-contracts/abi'\nimport type { AbiParameter } from 'viem'\nimport { CacheKeyPrefix, makeCacheKey } from '../cache'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultType,\n} from '../types'\nimport { getPublicClient } from '../utils'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nconst LSP7 = [\n ...lsp7DigitalAssetAbi,\n ...lsp7MintableAbi,\n ...lsp7BurnableAbi,\n ...lsp7CappedSupplyAbi,\n ...lsp7VotesAbi,\n]\n\nexport const enhanceLSP7DigitalAssetPlugin = standardPlugin(\n LSP7,\n {\n name: 'lsp7',\n abiName: 'LSP7DigitalAsset',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(\n result,\n { ...pluginOptions, abiName: '', decoderName: '' },\n options\n )\n if (setData) {\n return setData\n }\n\n // Add token metadata for LSP7 contracts for view matching\n if (options.async) {\n await enhanceLSP7Metadata(result, options)\n }\n\n const follow = await enhanceLSP26FollowerSystem(\n result,\n pluginOptions,\n options\n )\n if (follow) {\n return follow\n }\n return result\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, LSP7, log)\n },\n }\n)\n\n/**\n * Fetch and cache LSP7 contract metadata for view matching.\n * This function reads LSP4TokenType from the contract to determine if it's a token, NFT, or collection.\n * Results are cached per contract address to avoid redundant RPC calls for batch operations.\n *\n * @param result - The decoder result to enhance with metadata\n * @param options - Decoder options containing cache and chain client\n */\nasync function enhanceLSP7Metadata(\n result: DecoderResult,\n options: DecoderOptions\n): Promise<void> {\n if (!options.cache || !result.to) return\n\n const contractAddress = result.to\n const cacheKey = makeCacheKey(\n CacheKeyPrefix.CONTRACT_METADATA,\n contractAddress,\n 'lsp4-token-type'\n )\n\n try {\n // Use cache.getOrSet for automatic deduplication\n // If 5 transactions hit the same contract, only 1 RPC call is made\n const metadata = await options.cache.getOrSet(\n cacheKey,\n async () => {\n const client = getPublicClient(options.chain)\n\n // Read LSP4TokenType from contract\n // Key: keccak256('LSP4TokenType') = 0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3\n const tokenTypeData = await client.readContract({\n address: contractAddress,\n abi: LSP7,\n functionName: 'getData',\n args: [\n '0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3',\n ],\n })\n\n // Parse token type (0 = Token, 1 = NFT, 2 = Collection)\n const typeValue = tokenTypeData\n ? Number.parseInt(tokenTypeData as string, 16)\n : 0\n\n return {\n tokenType: typeValue,\n isToken: typeValue === 0,\n isNFT: typeValue === 1,\n isCollection: typeValue === 2,\n }\n },\n {\n ttl: 1000 * 60 * 60 * 24, // Cache for 24 hours (metadata rarely changes)\n signal: options.signal,\n }\n )\n\n // Add to result.custom for view matching\n result.custom = result.custom || {}\n Object.assign(result.custom, metadata)\n } catch (error) {\n console.warn('Failed to fetch LSP7 metadata:', error)\n // Set defaults on error (assume token)\n result.custom = result.custom || {}\n result.custom.tokenType = 0\n result.custom.isToken = true\n result.custom.isNFT = false\n result.custom.isCollection = false\n }\n}\n\n/**\n *\n * @param result enhanced if it's LSP7DigitalAsset\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceLSP26FollowerSystem(\n result: DecoderResult,\n _pluginOptions: PluginOptions,\n _options: DecoderOptions\n) {\n const { functionName } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n switch (functionName) {\n }\n return undefined\n}\n\nexport default enhanceLSP7DigitalAssetPlugin\n","/**\n * Cache interface for decoder with support for different backends\n * (LRU, Cloudflare KV, Redis, etc.)\n */\n\nimport type { Hex } from 'viem'\n\n/**\n * Cache entry with metadata\n */\nexport interface CacheEntry<T> {\n /** The cached value */\n value: T\n /** Timestamp when the entry expires (ms since epoch) */\n expires?: number\n /** Timestamp when the entry becomes stale (for stale-while-revalidate) */\n stale?: number\n /** Whether this entry resulted from an error */\n isError?: boolean\n}\n\n/**\n * Options for cache operations\n */\nexport interface CacheOptions {\n /** Time to live in milliseconds */\n ttl?: number\n /** TTL for error responses (typically shorter) */\n errorTTL?: number\n /** Time in ms after which the value is stale but still usable */\n staleWhileRevalidate?: number\n}\n\n/**\n * Generic cache interface that can be implemented by different backends\n */\nexport interface DecoderCache {\n /**\n * Get a value from the cache\n */\n get<T>(key: string): Promise<CacheEntry<T> | undefined>\n\n /**\n * Set a value in the cache\n */\n set<T>(key: string, value: T, options?: CacheOptions): Promise<void>\n\n /**\n * Delete a value from the cache\n */\n delete(key: string): Promise<void>\n\n /**\n * Get multiple values at once (for batch operations)\n */\n getMany?<T>(keys: string[]): Promise<Map<string, CacheEntry<T>>>\n\n /**\n * Set multiple values at once (for batch operations)\n */\n setMany?<T>(\n entries: Array<{ key: string; value: T; options?: CacheOptions }>\n ): Promise<void>\n\n /**\n * Clear all entries (optional)\n */\n clear?(): Promise<void>\n\n /**\n * Get or set with automatic promise deduplication\n * This is the main method for async operations\n */\n getOrSet<T>(\n key: string,\n factory: (signal?: AbortSignal) => Promise<T>,\n options?: CacheOptions & { signal?: AbortSignal }\n ): Promise<T>\n}\n\n/**\n * In-flight promise tracking for deduplication\n */\nexport class PromiseTracker<T> {\n private promises = new Map<string, Promise<T>>()\n\n /**\n * Get or create a promise for the given key\n */\n async getOrCreate(key: string, factory: () => Promise<T>): Promise<T> {\n const existing = this.promises.get(key)\n if (existing) {\n return existing\n }\n\n const promise = factory().finally(() => {\n // Clean up after completion\n this.promises.delete(key)\n })\n\n this.promises.set(key, promise)\n return promise\n }\n\n /**\n * Check if a promise is in flight\n */\n has(key: string): boolean {\n return this.promises.has(key)\n }\n\n /**\n * Clear all tracked promises\n */\n clear(): void {\n this.promises.clear()\n }\n}\n\n/**\n * Helper to create cache keys\n */\nexport function makeCacheKey(type: string, ...parts: (string | Hex)[]): string {\n return `${type}:${parts.join(':')}`\n}\n\n/**\n * Cache key prefixes for different resource types\n */\nexport enum CacheKeyPrefix {\n ABI = 'abi',\n FUNCTION_SIGNATURE = 'sig',\n ADDRESS = 'addr',\n TOKEN = 'token',\n PROFILE = 'profile',\n EXTERNAL_DATA = 'ext',\n SCHEMA = 'schema',\n CONTRACT_METADATA = 'contract-meta',\n}\n","import {\n lsp8BurnableAbi,\n lsp8CappedSupplyAbi,\n lsp8EnumerableAbi,\n lsp8IdentifiableDigitalAssetAbi,\n lsp8MintableAbi,\n lsp8VotesAbi,\n} from '@lukso/lsp8-contracts/abi'\nimport type { AbiParameter } from 'viem'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultShared,\n ResultType,\n} from '../types'\nimport { createNamedArgs } from '../utils'\nimport { decodeKeyValueRaw, standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nconst LSP8 = [\n ...lsp8IdentifiableDigitalAssetAbi,\n ...lsp8MintableAbi,\n ...lsp8BurnableAbi,\n ...lsp8CappedSupplyAbi,\n ...lsp8EnumerableAbi,\n ...lsp8VotesAbi,\n]\n\nexport const enhanceLSP8IdentifiableDigitalAssetPlugin = standardPlugin(\n LSP8,\n {\n name: 'lsp8',\n abiName: 'LSP8IdentifiableDigitalAsset',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(result, pluginOptions, options)\n if (setData) {\n return setData\n }\n return await enhanceLSP8IdentifiableDigitalAsset(\n result,\n pluginOptions,\n options\n )\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n const event = decodeEvent(options.chain, LSP8, log)\n if (event) {\n const tokenId = event.args.find(({ name }) => name === 'tokenId')?.value\n if (tokenId) {\n event.address = `${event.address}:${tokenId}`\n }\n }\n return event\n },\n }\n)\n\n/**\n *\n * @param result enhanced if it's LSP8\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceLSP8IdentifiableDigitalAsset(\n result: ResultType & ResultShared & { moduleHint?: string },\n pluginOptions: PluginOptions,\n options: DecoderOptions\n) {\n const setData = await enhanceSetData(\n result,\n { ...pluginOptions, abiName: '', decoderName: '' },\n options\n )\n if (setData) {\n return setData\n }\n const { functionName, sig, args, input, blockNumber, to, from, value } =\n result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n switch (functionName) {\n case 'setDataForTokenId': {\n // Single setDataForTokenId\n const [tokenId, _key, _value] = args.map(({ value }) => value) as [\n `0x${string}`,\n `0x${string}`,\n `0x${string}`,\n ]\n return {\n blockNumber,\n ...result,\n __decoder: pluginOptions.decoderName,\n resultType: 'setDataBatch',\n standard: pluginOptions.abiName,\n input,\n children: [\n {\n ...result,\n standard: pluginOptions.abiName,\n tokenId,\n to: `${to}:${tokenId}`,\n from,\n value,\n info: await decodeKeyValueRaw(_key, _value, options),\n },\n ] as Array<DecoderResult>,\n } as DecoderResult\n }\n case 'setDataBatchForTokenIds': {\n // Multiple setDataBatchForTokenIds\n const children: Array<ResultType> = []\n const [tokenIds, keys, values] = args.map(({ value }) => value) as [\n `0x${string}`[],\n `0x${string}`[],\n `0x${string}`[],\n ]\n for (let i = 0; i < tokenIds.length; i++) {\n const tokenId = tokenIds[i] as `0x${string}`\n const key = keys[i] as `0x${string}`\n const _value = values[i] as `0x${string}`\n children.push({\n ...result,\n resultType: 'setData',\n __decoder: '@lukso/lsp-smart-contracts',\n standard: key,\n ...createNamedArgs(\n [tokenId, key, _value],\n [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'key', type: 'bytes32' },\n { name: 'value', type: 'bytes' },\n ]\n ),\n tokenId,\n phase: 'enhanced',\n to: `${to}:${tokenId}`,\n from,\n value,\n info: await decodeKeyValueRaw(key, _value, options),\n } as DecoderResult)\n }\n return {\n ...result,\n __decoder: pluginOptions.decoderName,\n functionName,\n sig,\n input,\n standard: pluginOptions.abiName,\n resultType: 'setDataBatch',\n ...(args ? { args } : {}),\n to,\n from,\n value,\n children,\n } as DecoderResult\n }\n }\n return result\n}\n\nexport default enhanceLSP8IdentifiableDigitalAssetPlugin\n","import { lsp9VaultAbi as LSP9 } from '@lukso/lsp9-contracts/abi'\nimport type { AbiParameter } from 'viem'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n PluginOptions,\n ResultShared,\n ResultType,\n} from '../types'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nexport const enhanceLSP9VaultPlugin = standardPlugin(\n LSP9,\n {\n name: 'lsp9',\n abiName: 'LSP9Vault',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(result, pluginOptions, options)\n if (setData) {\n return setData\n }\n return await enhanceLSP9Vault(result, pluginOptions, options)\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, LSP9, log)\n },\n }\n)\n/**\n *\n * @param result enhanced if it's LSP8\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceLSP9Vault(\n result: ResultType & ResultShared & { moduleHint?: string },\n _pluginOptions: PluginOptions,\n _options: DecoderOptions\n) {\n const { functionName } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n switch (functionName) {\n }\n return undefined\n}\n\nexport default enhanceLSP9VaultPlugin\n","import { lsp26FollowerSystemAbi as LSP26 } from '@lukso/lsp26-contracts/abi'\nimport type { AbiParameter, Address } from 'viem'\nimport { decodeEvent } from '../events'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultExecute,\n ResultType,\n} from '../types'\nimport { standardPlugin } from '.'\nimport { enhanceSetData } from './enhanceSetData'\n\nexport const enhanceLSP26FollowerSystemPlugin = standardPlugin(\n LSP26,\n {\n name: 'lsp26',\n abiName: 'LSP26FollowerSystem',\n decoderName: '@lukso/lsp-smart-contracts',\n },\n {\n enhance: async (result, pluginOptions, options) => {\n const setData = await enhanceSetData(result, pluginOptions, options)\n if (setData) {\n return setData\n }\n return await enhanceLSP26FollowerSystem(result, pluginOptions, options)\n },\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n return decodeEvent(options.chain, LSP26, log)\n },\n }\n)\n/**\n *\n * @param result enhanced if it's LSP8\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceLSP26FollowerSystem(\n result: DecoderResult,\n _pluginOptions: PluginOptions,\n _options: DecoderOptions\n) {\n const { functionName, args } = result as ResultType & {\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n const { args: _args, ...partialResult } = result as ResultExecute\n switch (functionName) {\n case 'follow':\n case 'unfollow':\n return {\n ...result,\n children: [\n {\n ...partialResult,\n resultType: 'followProfile',\n phase: 'enhanced',\n address: args[0]?.value as Address,\n } as DecoderResult,\n ],\n } as DecoderResult\n case 'followBatch':\n case 'unfollowBatch':\n return {\n ...result,\n children: (result.resultType === 'execute'\n ? (result.args?.[0]?.value as Array<Address>) || []\n : []\n ).map((address: Address) => ({\n ...partialResult,\n phase: 'enhanced',\n resultType: 'followProfile',\n address,\n })),\n } as DecoderResult\n }\n return undefined\n}\n\nexport default enhanceLSP26FollowerSystemPlugin\n","{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"LSP9Vault\",\n \"sourceName\": \"@lukso/lsp9-contracts/contracts/LSP9Vault.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ContractDeploymentFailed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_CreateOperationsRequireEmptyRecipientAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ExecuteParametersEmptyArray\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_ExecuteParametersLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"balance\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ERC725X_InsufficientBalance\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_MsgValueDisallowedInStaticCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725X_NoContractBytecodeProvided\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"operationTypeProvided\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ERC725X_UnknownOperationType\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725Y_DataKeysValuesLengthMismatch\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC725Y_MsgValueDisallowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"LSP14CallerNotPendingOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"LSP14CannotTransferOwnershipToSelf\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"LSP14MustAcceptOwnershipInSeparateTransaction\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"renounceOwnershipStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"renounceOwnershipEnd\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"LSP14NotInRenounceOwnershipInterval\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"LSP1DelegateNotAllowedToSetDataKey\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"functionSelector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"NoExtensionFoundForFunctionSelector\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"callerAddress\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableCallerNotTheOwner\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"operationType\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"contractAddress\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"salt\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"ContractCreated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"dataValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"DataChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"operationType\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"target\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"Executed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [],\n \"name\": \"OwnershipRenounced\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [],\n \"name\": \"RenounceOwnershipStarted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"typeId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"receivedData\",\n \"type\": \"bytes\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"returnedValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"UniversalReceiver\",\n \"type\": \"event\"\n },\n {\n \"stateMutability\": \"payable\",\n \"type\": \"fallback\"\n },\n {\n \"inputs\": [],\n \"name\": \"RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VERSION\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"acceptOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"data\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"batchCalls\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"results\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"operationType\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"target\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"execute\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"operationsType\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"address[]\",\n \"name\": \"targets\",\n \"type\": \"address[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"values\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"datas\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"executeBatch\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getData\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"dataValue\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"dataKeys\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"name\": \"getDataBatch\",\n \"outputs\": [\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"dataValues\",\n \"type\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pendingOwner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"dataKey\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"dataValue\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"setData\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"dataKeys\",\n \"type\": \"bytes32[]\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"dataValues\",\n \"type\": \"bytes[]\"\n }\n ],\n \"name\": \"setDataBatch\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"interfaceId\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"supportsInterface\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"typeId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"receivedData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"universalReceiver\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"returnedValues\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"stateMutability\": \"payable\",\n \"type\": \"receive\"\n }\n ],\n \"bytecode\": \"0x60806040526040516200332e3803806200332e833981016040819052620000269162000366565b3415620000ad577f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b34336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c2604051620000a4906040808252600090820181905260606020830181905282015260800190565b60405180910390a45b620000c3816200016360201b620011ce1760201c565b6040805180820190915260048152637c0334a160e01b60208201526200010b907feafec4d89fa9619884b600007c0334a14085fefa8b51ae5a40895018882bdb9090620001d1565b604080516020808201909252600081526200015c916001600160a01b038416917f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c916200123c6200022a821b17901c565b5062000641565b6000546001600160a01b03828116911614620001ce57600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0383161790555b50565b6000828152600160205260409020620001eb82826200043c565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516200021e91906200055c565b60405180910390a25050565b62000254636bb56a1460e01b846001600160a01b0316620002db60201b620012d01790919060201c565b15620002d657604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906200028a908590859060040162000571565b6000604051808303816000875af1158015620002aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002d4919081019062000594565b505b505050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d915060005190508280156200034e575060208210155b80156200035b5750600081115b979650505050505050565b6000602082840312156200037957600080fd5b81516001600160a01b03811681146200039157600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003c357607f821691505b602082108103620003e457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002d657600081815260208120601f850160051c81016020861015620004135750805b601f850160051c820191505b8181101562000434578281556001016200041f565b505050505050565b81516001600160401b0381111562000458576200045862000398565b6200047081620004698454620003ae565b84620003ea565b602080601f831160018114620004a857600084156200048f5750858301515b600019600386901b1c1916600185901b17855562000434565b600085815260208120601f198616915b82811015620004d957888601518255948401946001909101908401620004b8565b5085821015620004f85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60005b83811015620005255781810151838201526020016200050b565b50506000910152565b600081518084526200054881602086016020860162000508565b601f01601f19169290920160200192915050565b6020815260006200039160208301846200052e565b8281526040602082015260006200058c60408301846200052e565b949350505050565b600060208284031215620005a757600080fd5b81516001600160401b0380821115620005bf57600080fd5b818401915084601f830112620005d457600080fd5b815181811115620005e957620005e962000398565b604051601f8201601f19908116603f0116810190838211818310171562000614576200061462000398565b816040528281528760208487010111156200062e57600080fd5b6200035b83602083016020880162000508565b612cdd80620006516000396000f3fe6080604052600436106101125760003560e01c806379ba5097116100a5578063dedff9c611610074578063ead3fbdf11610059578063ead3fbdf14610203578063f2fde38b146103ae578063ffa1ad74146103ce5761015d565b8063dedff9c614610370578063e30c3978146103905761015d565b806379ba5097146103035780637f23690c146103185780638da5cb5b1461032b578063979024211461035d5761015d565b806354f6127f116100e157806354f6127f1461029b5780636963d438146102bb5780636bb56a14146102db578063715018a6146102ee5761015d565b806301bfba611461020357806301ffc9a71461022b578063318584521461025b57806344c028fe1461027b5761015d565b3661015d57341561015b576101597f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b60405180602001604052806000815250610417565b505b005b600036606060048210156101eb5734156101d6576101d47f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b506040805160208101909152600081526101f8565b6101f5838361070e565b90505b915050805190602001f35b34801561020f57600080fd5b5061021860c881565b6040519081526020015b60405180910390f35b34801561023757600080fd5b5061024b61024636600461231b565b6108ea565b6040519015158152602001610222565b61026e610269366004612530565b610986565b6040516102229190612688565b61028e6102893660046126ea565b610a30565b604051610222919061273f565b3480156102a757600080fd5b5061028e6102b6366004612752565b610acf565b3480156102c757600080fd5b5061026e6102d636600461276b565b610ada565b61028e6102e93660046127e0565b610417565b3480156102fa57600080fd5b5061015b610c3d565b34801561030f57600080fd5b5061015b610cd3565b61015b6103263660046127e0565b610dcb565b34801561033757600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610222565b61015b61036b366004612827565b610e9c565b34801561037c57600080fd5b5061026e61038b366004612881565b611058565b34801561039c57600080fd5b506003546001600160a01b0316610345565b3480156103ba57600080fd5b5061015b6103c93660046128b6565b611103565b3480156103da57600080fd5b5061028e6040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b6060341580159061044857507f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc8314155b156104b3576104b17f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b60006104de7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47611359565b9050606060148251106105a15760006104f6836128d1565b60601c905061050c81635122dded60e11b6112d0565b1561059f57600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161055591339134918c918c910161290d565b6000604051808303816000875af1158015610574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261059c919081019061293b565b91505b505b60006105ba690cfc51aec37c55a4d0b160b01b876113fb565b905060006105c782611359565b90506060601482511061068a5760006105df836128d1565b60601c90506105f581635122dded60e11b6112d0565b1561068857600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161063e91339134918f918f910161290d565b6000604051808303816000875af115801561065d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610685919081019061293b565b91505b505b600480546001600160a01b03191690556040516106ad90859083906020016129a9565b60405160208183030381529060405295508734336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c28a8a6040516106fb9291906129a9565b60405180910390a4505050505092915050565b60606000806107286000356001600160e01b031916611464565b915091503460001415801561073b575080155b156107a5576107a37f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b6000356001600160e01b0319161580156107c657506001600160a01b038216155b156107e45760405180602001604052806000815250925050506108e4565b6001600160a01b038216610837576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081526001600160e01b03196000351660048201526024015b60405180910390fd5b600080836001600160a01b031683610850576000610852565b345b8888333460405160200161086994939291906129ce565b60408051601f1981840301815290829052610883916129fe565b60006040518083038185875af1925050503d80600081146108c0576040519150601f19603f3d011682016040523d82523d6000602084013e6108c5565b606091505b509150915081156108db5793506108e492505050565b80518060208301fd5b92915050565b60006001600160e01b031982167f28af17e600000000000000000000000000000000000000000000000000000000148061093457506001600160e01b03198216631aed5a8560e21b145b8061096857506001600160e01b031982167f94be599900000000000000000000000000000000000000000000000000000000145b80610977575061097782611548565b806108e457506108e482611586565b60606109906115c4565b3415610a19576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610a1091612a1a565b60405180910390a45b610a258585858561161b565b90505b949350505050565b6060610a3a6115c4565b3415610ac3576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610aba91612a1a565b60405180910390a45b610a25858585856117ab565b60606108e482611359565b60608167ffffffffffffffff811115610af557610af5612345565b604051908082528060200260200182016040528015610b2857816020015b6060815260200190600190039081610b135790505b50905060005b82811015610c365760008030868685818110610b4c57610b4c612a44565b9050602002810190610b5e9190612a5a565b604051610b6c929190612aa8565b600060405180830381855af49150503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b509150915081610c0e57805115610bc65780518082602001fd5b60405162461bcd60e51b815260206004820152601960248201527f4c5350393a20626174636843616c6c7320726576657274656400000000000000604482015260640161082e565b80848481518110610c2157610c21612a44565b60209081029190910101525050600101610b2e565b5092915050565b610c456115c4565b6000546001600160a01b0316610c596118b7565b6000546001600160a01b0316610cd057604080516001600160a01b0383166020820152600091810191909152610cd0907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471906060015b60408051601f198184030181529190526001600160a01b038416919061123c565b50565b600354600160a01b900460ff1615610d17576040517f5758dd0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b0316610d2b6119c3565b604080516001600160a01b03831660208201523391810191909152610d74907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa6516947190606001610caf565b604080516001600160a01b0383166020820152338183018190528251808303840181526060909201909252610cd091907f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c9061123c565b3415610dea5760405163f36ba73760e01b815260040160405180910390fd5b6000610df4611a29565b90508015610e8d576001600160a01b03198316690cfc51aec37c55a4d0b160b01b1480610e4b57507fffffffffffff00000000000000000000000000000000000000000000000000008316654b80742de2bf60d01b145b80610e6c57506001600160a01b03198316696773c5a04a6d4300884b60b11b145b15610e8d5760405163199611f160e01b81526004810184905260240161082e565b610e978383611ac3565b505050565b6000610ea6611a29565b90508151835114610ee3576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610f025760405163f36ba73760e01b815260040160405180910390fd5b60005b835181101561105257811561100e578351690cfc51aec37c55a4d0b160b01b90859083908110610f3757610f37612a44565b60200260200101516001600160a01b0319161480610f9657508351654b80742de2bf60d01b90859083908110610f6f57610f6f612a44565b602002602001015179ffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610fd357508351696773c5a04a6d4300884b60b11b90859083908110610fbf57610fbf612a44565b60200260200101516001600160a01b031916145b1561100e57838181518110610fea57610fea612a44565b602002602001015160405163199611f160e01b815260040161082e91815260200190565b61104a84828151811061102357611023612a44565b602002602001015184838151811061103d5761103d612a44565b6020026020010151611ac3565b600101610f05565b50505050565b6060815167ffffffffffffffff81111561107457611074612345565b6040519080825280602002602001820160405280156110a757816020015b60608152602001906001900390816110925790505b50905060005b82518110156110fd576110d88382815181106110cb576110cb612a44565b6020026020010151611359565b8282815181106110ea576110ea612a44565b60209081029190910101526001016110ad565b50919050565b61110b6115c4565b6003805460ff60a01b1916600160a01b17905561112781611b18565b600080546040516001600160a01b03918216929184169183917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a3604080516001600160a01b038381166020830152841681830181905282518083038401815260609092019092526111bd91907faefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f9061123c565b50506003805460ff60a01b19169055565b6000546001600160a01b03828116911614610cd057600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0383166001600160a01b031990911617905550565b6112566001600160a01b038416631aed5a8560e21b6112d0565b15610e9757604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906112899085908590600401612ab8565b6000604051808303816000875af11580156112a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611052919081019061293b565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015611342575060208210155b801561134e5750600081115b979650505050505050565b600081815260016020526040902080546060919061137690612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546113a290612ad1565b80156113ef5780601f106113c4576101008083540402835291602001916113ef565b820191906000526020600020905b8154815290600101906020018083116113d257829003601f168201915b50505050509050919050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c83015291829101604051602081830303815290604052905080610a2890612b05565b60008080611489696773c5a04a6d4300884b60b11b6001600160e01b031986166113fb565b9050600061149682611359565b90506014815110156114af575060009485945092505050565b805160150361153057806014815181106114cb576114cb612a44565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f01000000000000000000000000000000000000000000000000000000000000000361153057611521816128d1565b60601c95600195509350505050565b611539816128d1565b60601c95600095509350505050565b60006001600160e01b031982167fa918fa6b0000000000000000000000000000000000000000000000000000000014806108e457506108e482611b81565b6000806115996301ffc9a760e01b611464565b5090506001600160a01b0381166115b35750600092915050565b6115bd81846112d0565b9392505050565b336115d76000546001600160a01b031690565b6001600160a01b031614611619576040517fbf1169c500000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b565b60608351855114158061163c57508251845114158061163c57508151835114155b15611673576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516000036116ae576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000855167ffffffffffffffff8111156116ca576116ca612345565b6040519080825280602002602001820160405280156116fd57816020015b60608152602001906001900390816116e85790505b50905060005b86518110156117a15761177c87828151811061172157611721612a44565b602002602001015187838151811061173b5761173b612a44565b602002602001015187848151811061175557611755612a44565b602002602001015187858151811061176f5761176f612a44565b60200260200101516117ab565b82828151811061178e5761178e612a44565b6020908102919091010152600101611703565b5095945050505050565b6060846117c4576117bd848484611bbf565b9050610a28565b600185036117fe576001600160a01b038416156117f457604051631820c12560e11b815260040160405180910390fd5b6117bd8383611cf0565b60028503611838576001600160a01b0384161561182e57604051631820c12560e11b815260040160405180910390fd5b6117bd8383611e0a565b60038503611882578215611878576040517f72f2bc6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd8483611ef4565b6040517f7583b3bc0000000000000000000000000000000000000000000000000000000081526004810186905260240161082e565b60025443906000906118cb9060c890612b3f565b905060006118da60c883612b3f565b9050808311806118ea5750600254155b15611932576002839055600380546001600160a01b03191690556040517f81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e790600090a1505050565b81831015611976576040517f1b080942000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161082e565b61198060006111ce565b60006002819055600380546001600160a01b03191690556040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1505050565b6003546001600160a01b03163314611a09576040517f451e452800000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b611a12336111ce565b600380546001600160a01b03191690556000600255565b600080546001600160a01b03163314611ac0576004546001600160a01b03163314611abc5760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c79204f776e6572206f72207265656e746572656420556e69766572736160448201527f6c2052656365697665722044656c656761746520616c6c6f7765640000000000606482015260840161082e565b5060015b90565b6000828152600160205260409020611adb8282612ba0565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051611b0c919061273f565b60405180910390a25050565b306001600160a01b03821603611b5a576040517fe052a6f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03929092169190911790556000600255565b60006001600160e01b031982167f629aa6940000000000000000000000000000000000000000000000000000000014806108e457506108e482611ff8565b606082471015611beb576040516301bf351f60e31b81524760048201526024810184905260440161082e565b611bf482612c60565b6001600160e01b031916846001600160a01b031660007f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e86604051611c3b91815260200190565b60405180910390a4600080856001600160a01b03168585604051611c5f91906129fe565b60006040518083038185875af1925050503d8060008114611c9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ca1565b606091505b5091509150611ce682826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b9695505050505050565b606082471015611d1c576040516301bf351f60e31b81524760048201526024810184905260440161082e565b8151600003611d3e5760405163b81cd8d960e01b815260040160405180910390fd5b600082516020840185f090506001600160a01b038116611d8a576040517f0b07489b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000801b816001600160a01b031660017fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c387604051611dcb91815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b16602082015260340160405160208183030381529060405291505092915050565b60608151600003611e2e5760405163b81cd8d960e01b815260040160405180910390fd5b6000611e478360208551611e429190612c94565b61205f565b90506000611e6484600060208751611e5f9190612c94565b6120c5565b90506000611e738684846121ed565b905082816001600160a01b031660027fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c389604051611eb391815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052935050505092915050565b6060611eff82612c60565b6001600160e01b031916836001600160a01b031660037f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e6000604051611f4791815260200190565b60405180910390a4600080846001600160a01b031684604051611f6a91906129fe565b600060405180830381855afa9150503d8060008114611fa5576040519150601f19603f3d011682016040523d82523d6000602084013e611faa565b606091505b5091509150611fef82826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b95945050505050565b60006001600160e01b031982167f7545acac0000000000000000000000000000000000000000000000000000000014806108e457506301ffc9a760e01b6001600160e01b03198316146108e4565b606083156120555750816115bd565b6115bd83836122f1565b600061206c826020612b3f565b835110156120bc5760405162461bcd60e51b815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e64730000000000000000000000604482015260640161082e565b50016020015190565b6060816120d381601f612b3f565b10156121215760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161082e565b61212b8284612b3f565b8451101561217b5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161082e565b60608215801561219a57604051915060008252602082016040526121e4565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156121d35780518352602092830192016121bb565b5050858452601f01601f1916604052505b50949350505050565b60008347101561223f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161082e565b81516000036122905760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161082e565b8282516020840186f590506001600160a01b0381166115bd5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161082e565b8151156123015781518083602001fd5b8060405162461bcd60e51b815260040161082e919061273f565b60006020828403121561232d57600080fd5b81356001600160e01b0319811681146115bd57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561238457612384612345565b604052919050565b600067ffffffffffffffff8211156123a6576123a6612345565b5060051b60200190565b600082601f8301126123c157600080fd5b813560206123d66123d18361238c565b61235b565b82815260059290921b840181019181810190868411156123f557600080fd5b8286015b8481101561241057803583529183019183016123f9565b509695505050505050565b80356001600160a01b038116811461243257600080fd5b919050565b600067ffffffffffffffff82111561245157612451612345565b50601f01601f191660200190565b600082601f83011261247057600080fd5b813561247e6123d182612437565b81815284602083860101111561249357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126124c157600080fd5b813560206124d16123d18361238c565b82815260059290921b840181019181810190868411156124f057600080fd5b8286015b8481101561241057803567ffffffffffffffff8111156125145760008081fd5b6125228986838b010161245f565b8452509183019183016124f4565b6000806000806080858703121561254657600080fd5b843567ffffffffffffffff8082111561255e57600080fd5b61256a888389016123b0565b955060209150818701358181111561258157600080fd5b8701601f8101891361259257600080fd5b80356125a06123d18261238c565b81815260059190911b8201840190848101908b8311156125bf57600080fd5b928501925b828410156125e4576125d58461241b565b825292850192908501906125c4565b975050505060408701359150808211156125fd57600080fd5b612609888389016123b0565b9350606087013591508082111561261f57600080fd5b5061262c878288016124b0565b91505092959194509250565b60005b8381101561265357818101518382015260200161263b565b50506000910152565b60008151808452612674816020860160208601612638565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156126dd57603f198886030184526126cb85835161265c565b945092850192908501906001016126af565b5092979650505050505050565b6000806000806080858703121561270057600080fd5b843593506127106020860161241b565b925060408501359150606085013567ffffffffffffffff81111561273357600080fd5b61262c8782880161245f565b6020815260006115bd602083018461265c565b60006020828403121561276457600080fd5b5035919050565b6000806020838503121561277e57600080fd5b823567ffffffffffffffff8082111561279657600080fd5b818501915085601f8301126127aa57600080fd5b8135818111156127b957600080fd5b8660208260051b85010111156127ce57600080fd5b60209290920196919550909350505050565b600080604083850312156127f357600080fd5b82359150602083013567ffffffffffffffff81111561281157600080fd5b61281d8582860161245f565b9150509250929050565b6000806040838503121561283a57600080fd5b823567ffffffffffffffff8082111561285257600080fd5b61285e868387016123b0565b9350602085013591508082111561287457600080fd5b5061281d858286016124b0565b60006020828403121561289357600080fd5b813567ffffffffffffffff8111156128aa57600080fd5b610a28848285016123b0565b6000602082840312156128c857600080fd5b6115bd8261241b565b805160208201516bffffffffffffffffffffffff1980821692919060148310156129055780818460140360031b1b83161693505b505050919050565b6001600160a01b0385168152836020820152826040820152608060608201526000611ce6608083018461265c565b60006020828403121561294d57600080fd5b815167ffffffffffffffff81111561296457600080fd5b8201601f8101841361297557600080fd5b80516129836123d182612437565b81815285602083850101111561299857600080fd5b611fef826020830160208601612638565b6040815260006129bc604083018561265c565b8281036020840152611fef818561265c565b8385823760609290921b6bffffffffffffffffffffffff1916919092019081526014810191909152603401919050565b60008251612a10818460208701612638565b9190910192915050565b604081526000612a2d604083018461265c565b828103602093840152600081529190910192915050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612a7157600080fd5b83018035915067ffffffffffffffff821115612a8c57600080fd5b602001915036819003821315612aa157600080fd5b9250929050565b8183823760009101908152919050565b828152604060208201526000610a28604083018461265c565b600181811c90821680612ae557607f821691505b6020821081036110fd57634e487b7160e01b600052602260045260246000fd5b805160208083015191908110156110fd5760001960209190910360031b1b16919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108e4576108e4612b29565b601f821115610e9757600081815260208120601f850160051c81016020861015612b795750805b601f850160051c820191505b81811015612b9857828155600101612b85565b505050505050565b815167ffffffffffffffff811115612bba57612bba612345565b612bce81612bc88454612ad1565b84612b52565b602080601f831160018114612c035760008415612beb5750858301515b600019600386901b1c1916600185901b178555612b98565b600085815260208120601f198616915b82811015612c3257888601518255948401946001909101908401612c13565b5085821015612c505787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815160208301516001600160e01b0319808216935060048310156129055760049290920360031b82901b161692915050565b818103818111156108e4576108e4612b2956fea2646970667358221220983cd01c5c096dc341cad82320b7752212091ee642d60b9b2c6242b277561feb64736f6c63430008110033\",\n \"deployedBytecode\": \"0x6080604052600436106101125760003560e01c806379ba5097116100a5578063dedff9c611610074578063ead3fbdf11610059578063ead3fbdf14610203578063f2fde38b146103ae578063ffa1ad74146103ce5761015d565b8063dedff9c614610370578063e30c3978146103905761015d565b806379ba5097146103035780637f23690c146103185780638da5cb5b1461032b578063979024211461035d5761015d565b806354f6127f116100e157806354f6127f1461029b5780636963d438146102bb5780636bb56a14146102db578063715018a6146102ee5761015d565b806301bfba611461020357806301ffc9a71461022b578063318584521461025b57806344c028fe1461027b5761015d565b3661015d57341561015b576101597f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b60405180602001604052806000815250610417565b505b005b600036606060048210156101eb5734156101d6576101d47f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b506040805160208101909152600081526101f8565b6101f5838361070e565b90505b915050805190602001f35b34801561020f57600080fd5b5061021860c881565b6040519081526020015b60405180910390f35b34801561023757600080fd5b5061024b61024636600461231b565b6108ea565b6040519015158152602001610222565b61026e610269366004612530565b610986565b6040516102229190612688565b61028e6102893660046126ea565b610a30565b604051610222919061273f565b3480156102a757600080fd5b5061028e6102b6366004612752565b610acf565b3480156102c757600080fd5b5061026e6102d636600461276b565b610ada565b61028e6102e93660046127e0565b610417565b3480156102fa57600080fd5b5061015b610c3d565b34801561030f57600080fd5b5061015b610cd3565b61015b6103263660046127e0565b610dcb565b34801561033757600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610222565b61015b61036b366004612827565b610e9c565b34801561037c57600080fd5b5061026e61038b366004612881565b611058565b34801561039c57600080fd5b506003546001600160a01b0316610345565b3480156103ba57600080fd5b5061015b6103c93660046128b6565b611103565b3480156103da57600080fd5b5061028e6040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b6060341580159061044857507f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc8314155b156104b3576104b17f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b60006104de7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47611359565b9050606060148251106105a15760006104f6836128d1565b60601c905061050c81635122dded60e11b6112d0565b1561059f57600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161055591339134918c918c910161290d565b6000604051808303816000875af1158015610574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261059c919081019061293b565b91505b505b60006105ba690cfc51aec37c55a4d0b160b01b876113fb565b905060006105c782611359565b90506060601482511061068a5760006105df836128d1565b60601c90506105f581635122dded60e11b6112d0565b1561068857600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161063e91339134918f918f910161290d565b6000604051808303816000875af115801561065d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610685919081019061293b565b91505b505b600480546001600160a01b03191690556040516106ad90859083906020016129a9565b60405160208183030381529060405295508734336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c28a8a6040516106fb9291906129a9565b60405180910390a4505050505092915050565b60606000806107286000356001600160e01b031916611464565b915091503460001415801561073b575080155b156107a5576107a37f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b6000356001600160e01b0319161580156107c657506001600160a01b038216155b156107e45760405180602001604052806000815250925050506108e4565b6001600160a01b038216610837576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081526001600160e01b03196000351660048201526024015b60405180910390fd5b600080836001600160a01b031683610850576000610852565b345b8888333460405160200161086994939291906129ce565b60408051601f1981840301815290829052610883916129fe565b60006040518083038185875af1925050503d80600081146108c0576040519150601f19603f3d011682016040523d82523d6000602084013e6108c5565b606091505b509150915081156108db5793506108e492505050565b80518060208301fd5b92915050565b60006001600160e01b031982167f28af17e600000000000000000000000000000000000000000000000000000000148061093457506001600160e01b03198216631aed5a8560e21b145b8061096857506001600160e01b031982167f94be599900000000000000000000000000000000000000000000000000000000145b80610977575061097782611548565b806108e457506108e482611586565b60606109906115c4565b3415610a19576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610a1091612a1a565b60405180910390a45b610a258585858561161b565b90505b949350505050565b6060610a3a6115c4565b3415610ac3576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610aba91612a1a565b60405180910390a45b610a25858585856117ab565b60606108e482611359565b60608167ffffffffffffffff811115610af557610af5612345565b604051908082528060200260200182016040528015610b2857816020015b6060815260200190600190039081610b135790505b50905060005b82811015610c365760008030868685818110610b4c57610b4c612a44565b9050602002810190610b5e9190612a5a565b604051610b6c929190612aa8565b600060405180830381855af49150503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b509150915081610c0e57805115610bc65780518082602001fd5b60405162461bcd60e51b815260206004820152601960248201527f4c5350393a20626174636843616c6c7320726576657274656400000000000000604482015260640161082e565b80848481518110610c2157610c21612a44565b60209081029190910101525050600101610b2e565b5092915050565b610c456115c4565b6000546001600160a01b0316610c596118b7565b6000546001600160a01b0316610cd057604080516001600160a01b0383166020820152600091810191909152610cd0907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471906060015b60408051601f198184030181529190526001600160a01b038416919061123c565b50565b600354600160a01b900460ff1615610d17576040517f5758dd0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b0316610d2b6119c3565b604080516001600160a01b03831660208201523391810191909152610d74907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa6516947190606001610caf565b604080516001600160a01b0383166020820152338183018190528251808303840181526060909201909252610cd091907f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c9061123c565b3415610dea5760405163f36ba73760e01b815260040160405180910390fd5b6000610df4611a29565b90508015610e8d576001600160a01b03198316690cfc51aec37c55a4d0b160b01b1480610e4b57507fffffffffffff00000000000000000000000000000000000000000000000000008316654b80742de2bf60d01b145b80610e6c57506001600160a01b03198316696773c5a04a6d4300884b60b11b145b15610e8d5760405163199611f160e01b81526004810184905260240161082e565b610e978383611ac3565b505050565b6000610ea6611a29565b90508151835114610ee3576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610f025760405163f36ba73760e01b815260040160405180910390fd5b60005b835181101561105257811561100e578351690cfc51aec37c55a4d0b160b01b90859083908110610f3757610f37612a44565b60200260200101516001600160a01b0319161480610f9657508351654b80742de2bf60d01b90859083908110610f6f57610f6f612a44565b602002602001015179ffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610fd357508351696773c5a04a6d4300884b60b11b90859083908110610fbf57610fbf612a44565b60200260200101516001600160a01b031916145b1561100e57838181518110610fea57610fea612a44565b602002602001015160405163199611f160e01b815260040161082e91815260200190565b61104a84828151811061102357611023612a44565b602002602001015184838151811061103d5761103d612a44565b6020026020010151611ac3565b600101610f05565b50505050565b6060815167ffffffffffffffff81111561107457611074612345565b6040519080825280602002602001820160405280156110a757816020015b60608152602001906001900390816110925790505b50905060005b82518110156110fd576110d88382815181106110cb576110cb612a44565b6020026020010151611359565b8282815181106110ea576110ea612a44565b60209081029190910101526001016110ad565b50919050565b61110b6115c4565b6003805460ff60a01b1916600160a01b17905561112781611b18565b600080546040516001600160a01b03918216929184169183917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a3604080516001600160a01b038381166020830152841681830181905282518083038401815260609092019092526111bd91907faefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f9061123c565b50506003805460ff60a01b19169055565b6000546001600160a01b03828116911614610cd057600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0383166001600160a01b031990911617905550565b6112566001600160a01b038416631aed5a8560e21b6112d0565b15610e9757604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906112899085908590600401612ab8565b6000604051808303816000875af11580156112a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611052919081019061293b565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015611342575060208210155b801561134e5750600081115b979650505050505050565b600081815260016020526040902080546060919061137690612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546113a290612ad1565b80156113ef5780601f106113c4576101008083540402835291602001916113ef565b820191906000526020600020905b8154815290600101906020018083116113d257829003601f168201915b50505050509050919050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c83015291829101604051602081830303815290604052905080610a2890612b05565b60008080611489696773c5a04a6d4300884b60b11b6001600160e01b031986166113fb565b9050600061149682611359565b90506014815110156114af575060009485945092505050565b805160150361153057806014815181106114cb576114cb612a44565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f01000000000000000000000000000000000000000000000000000000000000000361153057611521816128d1565b60601c95600195509350505050565b611539816128d1565b60601c95600095509350505050565b60006001600160e01b031982167fa918fa6b0000000000000000000000000000000000000000000000000000000014806108e457506108e482611b81565b6000806115996301ffc9a760e01b611464565b5090506001600160a01b0381166115b35750600092915050565b6115bd81846112d0565b9392505050565b336115d76000546001600160a01b031690565b6001600160a01b031614611619576040517fbf1169c500000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b565b60608351855114158061163c57508251845114158061163c57508151835114155b15611673576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516000036116ae576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000855167ffffffffffffffff8111156116ca576116ca612345565b6040519080825280602002602001820160405280156116fd57816020015b60608152602001906001900390816116e85790505b50905060005b86518110156117a15761177c87828151811061172157611721612a44565b602002602001015187838151811061173b5761173b612a44565b602002602001015187848151811061175557611755612a44565b602002602001015187858151811061176f5761176f612a44565b60200260200101516117ab565b82828151811061178e5761178e612a44565b6020908102919091010152600101611703565b5095945050505050565b6060846117c4576117bd848484611bbf565b9050610a28565b600185036117fe576001600160a01b038416156117f457604051631820c12560e11b815260040160405180910390fd5b6117bd8383611cf0565b60028503611838576001600160a01b0384161561182e57604051631820c12560e11b815260040160405180910390fd5b6117bd8383611e0a565b60038503611882578215611878576040517f72f2bc6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd8483611ef4565b6040517f7583b3bc0000000000000000000000000000000000000000000000000000000081526004810186905260240161082e565b60025443906000906118cb9060c890612b3f565b905060006118da60c883612b3f565b9050808311806118ea5750600254155b15611932576002839055600380546001600160a01b03191690556040517f81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e790600090a1505050565b81831015611976576040517f1b080942000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161082e565b61198060006111ce565b60006002819055600380546001600160a01b03191690556040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1505050565b6003546001600160a01b03163314611a09576040517f451e452800000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b611a12336111ce565b600380546001600160a01b03191690556000600255565b600080546001600160a01b03163314611ac0576004546001600160a01b03163314611abc5760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c79204f776e6572206f72207265656e746572656420556e69766572736160448201527f6c2052656365697665722044656c656761746520616c6c6f7765640000000000606482015260840161082e565b5060015b90565b6000828152600160205260409020611adb8282612ba0565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051611b0c919061273f565b60405180910390a25050565b306001600160a01b03821603611b5a576040517fe052a6f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03929092169190911790556000600255565b60006001600160e01b031982167f629aa6940000000000000000000000000000000000000000000000000000000014806108e457506108e482611ff8565b606082471015611beb576040516301bf351f60e31b81524760048201526024810184905260440161082e565b611bf482612c60565b6001600160e01b031916846001600160a01b031660007f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e86604051611c3b91815260200190565b60405180910390a4600080856001600160a01b03168585604051611c5f91906129fe565b60006040518083038185875af1925050503d8060008114611c9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ca1565b606091505b5091509150611ce682826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b9695505050505050565b606082471015611d1c576040516301bf351f60e31b81524760048201526024810184905260440161082e565b8151600003611d3e5760405163b81cd8d960e01b815260040160405180910390fd5b600082516020840185f090506001600160a01b038116611d8a576040517f0b07489b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000801b816001600160a01b031660017fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c387604051611dcb91815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b16602082015260340160405160208183030381529060405291505092915050565b60608151600003611e2e5760405163b81cd8d960e01b815260040160405180910390fd5b6000611e478360208551611e429190612c94565b61205f565b90506000611e6484600060208751611e5f9190612c94565b6120c5565b90506000611e738684846121ed565b905082816001600160a01b031660027fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c389604051611eb391815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052935050505092915050565b6060611eff82612c60565b6001600160e01b031916836001600160a01b031660037f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e6000604051611f4791815260200190565b60405180910390a4600080846001600160a01b031684604051611f6a91906129fe565b600060405180830381855afa9150503d8060008114611fa5576040519150601f19603f3d011682016040523d82523d6000602084013e611faa565b606091505b5091509150611fef82826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b95945050505050565b60006001600160e01b031982167f7545acac0000000000000000000000000000000000000000000000000000000014806108e457506301ffc9a760e01b6001600160e01b03198316146108e4565b606083156120555750816115bd565b6115bd83836122f1565b600061206c826020612b3f565b835110156120bc5760405162461bcd60e51b815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e64730000000000000000000000604482015260640161082e565b50016020015190565b6060816120d381601f612b3f565b10156121215760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161082e565b61212b8284612b3f565b8451101561217b5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161082e565b60608215801561219a57604051915060008252602082016040526121e4565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156121d35780518352602092830192016121bb565b5050858452601f01601f1916604052505b50949350505050565b60008347101561223f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161082e565b81516000036122905760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161082e565b8282516020840186f590506001600160a01b0381166115bd5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161082e565b8151156123015781518083602001fd5b8060405162461bcd60e51b815260040161082e919061273f565b60006020828403121561232d57600080fd5b81356001600160e01b0319811681146115bd57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561238457612384612345565b604052919050565b600067ffffffffffffffff8211156123a6576123a6612345565b5060051b60200190565b600082601f8301126123c157600080fd5b813560206123d66123d18361238c565b61235b565b82815260059290921b840181019181810190868411156123f557600080fd5b8286015b8481101561241057803583529183019183016123f9565b509695505050505050565b80356001600160a01b038116811461243257600080fd5b919050565b600067ffffffffffffffff82111561245157612451612345565b50601f01601f191660200190565b600082601f83011261247057600080fd5b813561247e6123d182612437565b81815284602083860101111561249357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126124c157600080fd5b813560206124d16123d18361238c565b82815260059290921b840181019181810190868411156124f057600080fd5b8286015b8481101561241057803567ffffffffffffffff8111156125145760008081fd5b6125228986838b010161245f565b8452509183019183016124f4565b6000806000806080858703121561254657600080fd5b843567ffffffffffffffff8082111561255e57600080fd5b61256a888389016123b0565b955060209150818701358181111561258157600080fd5b8701601f8101891361259257600080fd5b80356125a06123d18261238c565b81815260059190911b8201840190848101908b8311156125bf57600080fd5b928501925b828410156125e4576125d58461241b565b825292850192908501906125c4565b975050505060408701359150808211156125fd57600080fd5b612609888389016123b0565b9350606087013591508082111561261f57600080fd5b5061262c878288016124b0565b91505092959194509250565b60005b8381101561265357818101518382015260200161263b565b50506000910152565b60008151808452612674816020860160208601612638565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156126dd57603f198886030184526126cb85835161265c565b945092850192908501906001016126af565b5092979650505050505050565b6000806000806080858703121561270057600080fd5b843593506127106020860161241b565b925060408501359150606085013567ffffffffffffffff81111561273357600080fd5b61262c8782880161245f565b6020815260006115bd602083018461265c565b60006020828403121561276457600080fd5b5035919050565b6000806020838503121561277e57600080fd5b823567ffffffffffffffff8082111561279657600080fd5b818501915085601f8301126127aa57600080fd5b8135818111156127b957600080fd5b8660208260051b85010111156127ce57600080fd5b60209290920196919550909350505050565b600080604083850312156127f357600080fd5b82359150602083013567ffffffffffffffff81111561281157600080fd5b61281d8582860161245f565b9150509250929050565b6000806040838503121561283a57600080fd5b823567ffffffffffffffff8082111561285257600080fd5b61285e868387016123b0565b9350602085013591508082111561287457600080fd5b5061281d858286016124b0565b60006020828403121561289357600080fd5b813567ffffffffffffffff8111156128aa57600080fd5b610a28848285016123b0565b6000602082840312156128c857600080fd5b6115bd8261241b565b805160208201516bffffffffffffffffffffffff1980821692919060148310156129055780818460140360031b1b83161693505b505050919050565b6001600160a01b0385168152836020820152826040820152608060608201526000611ce6608083018461265c565b60006020828403121561294d57600080fd5b815167ffffffffffffffff81111561296457600080fd5b8201601f8101841361297557600080fd5b80516129836123d182612437565b81815285602083850101111561299857600080fd5b611fef826020830160208601612638565b6040815260006129bc604083018561265c565b8281036020840152611fef818561265c565b8385823760609290921b6bffffffffffffffffffffffff1916919092019081526014810191909152603401919050565b60008251612a10818460208701612638565b9190910192915050565b604081526000612a2d604083018461265c565b828103602093840152600081529190910192915050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612a7157600080fd5b83018035915067ffffffffffffffff821115612a8c57600080fd5b602001915036819003821315612aa157600080fd5b9250929050565b8183823760009101908152919050565b828152604060208201526000610a28604083018461265c565b600181811c90821680612ae557607f821691505b6020821081036110fd57634e487b7160e01b600052602260045260246000fd5b805160208083015191908110156110fd5760001960209190910360031b1b16919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108e4576108e4612b29565b601f821115610e9757600081815260208120601f850160051c81016020861015612b795750805b601f850160051c820191505b81811015612b9857828155600101612b85565b505050505050565b815167ffffffffffffffff811115612bba57612bba612345565b612bce81612bc88454612ad1565b84612b52565b602080601f831160018114612c035760008415612beb5750858301515b600019600386901b1c1916600185901b178555612b98565b600085815260208120601f198616915b82811015612c3257888601518255948401946001909101908401612c13565b5085821015612c505787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815160208301516001600160e01b0319808216935060048310156129055760049290920360031b82901b161692915050565b818103818111156108e4576108e4612b2956fea2646970667358221220983cd01c5c096dc341cad82320b7752212091ee642d60b9b2c6242b277561feb64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n","import {\n type Abi,\n type AbiParameter,\n type Address,\n type Chain,\n decodeAbiParameters,\n encodeAbiParameters,\n getAddress,\n isAddress,\n isAddressEqual,\n parseAbiParameters,\n zeroAddress,\n} from 'viem'\nimport { CacheKeyPrefix, makeCacheKey } from './cache'\nimport { FUNCTION_DICTIONARY_URL, OPENCHAIN_DICTIONARY_URL } from './constants'\nimport { createLRUCache } from './lruCache'\nimport type { DecoderOptions, ResultType } from './types'\nimport { createNamedArgs, customDecodeFunctionData } from './utils'\n\n// Default cache for backward compatibility\nconst defaultCache = createLRUCache({\n max: 500,\n ttl: 60 * 1000, // 1 minute\n errorTTL: 30 * 1000, // 30 seconds\n})\n\n/**\n * Decode function parameter types from a function signature\n *\n * @param signature Function signature\n * @returns Array of parameter types\n * @throws Error if the signature is invalid\n */\nfunction generateNamedAbiParameters(signature: string): AbiParameter[] {\n const start = signature.indexOf('(')\n const end = signature.lastIndexOf(')')\n if (start === -1 || end === -1 || end <= start) {\n throw new Error(`Invalid signature: ${signature}`)\n }\n\n const paramString = signature.slice(start + 1, end)\n\n const rawParams = parseAbiParameters(paramString) as AbiParameter[]\n\n const assignNames = (params: AbiParameter[], prefix: string) => {\n return params.map((param: AbiParameter, index: number) => {\n const name = `${prefix}${index + 1}`\n if (param.type === 'tuple' && 'components' in param) {\n const components: AbiParameter[] = assignNames(\n param.components as AbiParameter[],\n `${name}_`\n )\n return { ...param, name, components } as AbiParameter\n }\n return { ...param, name } as AbiParameter\n })\n }\n\n return assignNames(rawParams, 'arg')\n}\n\nexport async function fetchAbi(\n chain: Chain,\n address: Address,\n options?: DecoderOptions\n) {\n const explorer = chain.blockExplorers?.default?.apiUrl\n if (!explorer) return undefined\n\n const cache = options?.cache ?? defaultCache\n let key = getAddress(address)\n const cacheKey = makeCacheKey(CacheKeyPrefix.ABI, key, String(chain.id))\n\n return cache.getOrSet(\n cacheKey,\n async (signal) => {\n let isProxy = false\n let decoderVerifiedContract = false\n let factoryName: string | undefined\n const _originalKey = key\n\n const addressUrl = new URL(`/api/v2/addresses/${key}`, explorer)\n const addressRes = await fetch(addressUrl, { signal })\n if (addressRes.ok) {\n const data = (await addressRes.json()) as {\n implementations?: { address?: Address; address_hash?: Address }[]\n is_contract?: boolean\n is_verified?: boolean\n proxy_type?: string\n name?: string\n }\n const {\n implementations: [\n { address: _address, address_hash: _addressHash } = {},\n ] = [],\n is_contract,\n is_verified: __decoderVerifiedContract,\n proxy_type,\n name: __factoryName,\n } = data\n const address = _address || _addressHash\n factoryName = __factoryName\n decoderVerifiedContract = Boolean(__decoderVerifiedContract || false)\n if (\n address &&\n is_contract &&\n proxy_type !== 'null' &&\n proxy_type != null\n ) {\n key = address as `0x${string}`\n isProxy = true // We resolved from proxy to implementation\n }\n }\n\n if (!decoderVerifiedContract) {\n // If the address is not a verified contract, return undefined\n return undefined\n }\n\n const url = new URL(`/api/v2/smart-contracts/${key}`, explorer)\n const res = await fetch(url, { signal })\n\n if (!res.ok) {\n return undefined\n }\n\n const result = await res.json()\n const {\n name = factoryName || 'UnknownName',\n abi,\n is_verified,\n } = result || {}\n\n if (abi && is_verified) {\n return {\n abi,\n __decoderVerifiedContract: decoderVerifiedContract, // If we have an ABI, treat it as verified\n __decoderIsProxy: isProxy,\n name,\n explorer,\n }\n }\n return undefined\n },\n { signal: options?.signal }\n ) as Promise<\n | {\n abi: Abi\n __decoderVerifiedContract: boolean\n __decoderIsProxy: boolean\n name: string\n explorer: string\n }\n | undefined\n >\n}\n\n/**\n * Gets a function signature. Returns an empty string if hexSignature\n * is not provided or an error is thrown.\n * If hexSignature is provided, it checks the cache storage.\n * If the signature is not found, it fetches 4bytes dictionary and stores\n * the result in the cache storage.\n *\n * @param string hexSignature - first 4 bytes of a payload\n * @param boolean preferError - if true, prefer error signatures\n * @returns function signature as a string\n */\nexport const getFunctionSignature = async (\n chain: Chain,\n input?: `0x${string}`,\n to?: `0x${string}`,\n preferError = false,\n options?: DecoderOptions\n): Promise<\n | (ResultType & {\n __decoder: string\n __decoderVerifiedContract?: boolean\n __decoderIsProxy?: boolean\n standard?: string\n })\n | undefined\n> => {\n // Remove 0x prefix\n if (to && isAddress(to) && isAddressEqual(to, zeroAddress)) {\n return {\n __decoder: 'none',\n standard: 'unknown',\n to,\n input,\n resultType: 'raw',\n }\n }\n const data = input?.slice(2) as string\n // Get the first 8 chars (4 bytes) of the data\n const selector = data.slice(0, 8)\n if (selector) {\n if (to) {\n // Wait for cached or new promise to resolve\n const info = await fetchAbi(chain, to, options)\n if (info) {\n // The explorer returned it as a verified abi.\n // Use the returned abi to decode the function signature.\n const decoded = customDecodeFunctionData({\n abi: info.abi,\n data: input || '0x',\n }) as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: readonly unknown[]\n }\n if (decoded) {\n return {\n ...decoded,\n __decoder: info.explorer,\n __decoderVerifiedContract: info.__decoderVerifiedContract,\n __decoderIsProxy: info.__decoderIsProxy,\n standard: info.name,\n }\n }\n }\n }\n // If we didn't resolve it yet, then try to fetch from one of the 4bytes dictionaries.\n const cache = options?.cache ?? defaultCache\n const cacheKey = makeCacheKey(CacheKeyPrefix.FUNCTION_SIGNATURE, selector)\n\n const signatureEntry = cache.getOrSet(\n cacheKey,\n async (signal) => {\n // Try our proxy first.\n const url = `${OPENCHAIN_DICTIONARY_URL}?function=0x${selector}`\n let __decoder = new URL(OPENCHAIN_DICTIONARY_URL).hostname\n\n try {\n const res = await fetch(url, { signal })\n if (res.ok) {\n const result = await res.json()\n if (result) {\n result.__decoder = __decoder\n return result\n }\n }\n } catch {\n // Continue to fallback\n }\n\n // Fallback to function dictionary\n __decoder = new URL(FUNCTION_DICTIONARY_URL).hostname\n const fallbackRes = await fetch(\n `${FUNCTION_DICTIONARY_URL}/${selector}`,\n { signal }\n )\n if (!fallbackRes.ok) {\n return undefined\n }\n const fallbackResult = await fallbackRes.json()\n if (fallbackResult) {\n fallbackResult.__decoder = __decoder\n }\n return fallbackResult\n },\n { signal: options?.signal }\n )\n // Wait for cached or new promise to resolve\n const methods = (await signatureEntry) as any\n if (methods?.results?.length > 0) {\n // We got one or more results.\n let search = methods.results.reverse()\n if (preferError) {\n // In case we're preferring Errors,\n // then look for all methods containing Error\n // and put them first.\n const withError = search.filter((result: Record<string, unknown>) =>\n /Error/.test(result.text_signature as string)\n )\n const withoutError = search.filter(\n (result: Record<string, unknown>) =>\n !/Error/.test(result.text_signature as string)\n )\n search = [...withError, ...withoutError]\n }\n // Go through each one and try to encode/decode the data\n // to make sure it works.\n for (const result of search) {\n try {\n const params: AbiParameter[] = generateNamedAbiParameters(\n result.text_signature || result.name\n )\n // Decode arguments according to function spec\n const args = decodeAbiParameters(params, `0x${data.slice(8)}`)\n\n // Build arg list (if there are bool values which are no 0 or 1 we can assume it's invalid)\n // Other values are validated in encodeParameters.\n const encodeArgs = Array.from({ length: params.length }).map(\n (_val, index) => {\n if (params[index].type === 'bool') {\n const val = args[`${index}`]\n if (val !== 1 && val !== 0 && val !== true && val !== false) {\n // Due to javascript truthyness any non-empty or non-zero value is encoded as true without a problem.\n // The output packet won't match but there is really no reason to even try.\n throw new Error('Invalid boolean value')\n }\n }\n if (params[index].type === 'address') {\n const val = args[`${index}`] as `0x${string}`\n if (!isAddress(val)) {\n throw new Error(`Invalid address value ${val}`)\n }\n }\n return args[`${index}`] ?? '0x'\n }\n )\n\n // Re-encode according to function spec.\n const newData = encodeAbiParameters(\n params,\n encodeArgs as never\n ).slice(2)\n\n if (data.slice(8) === newData) {\n return {\n resultType: 'execute',\n standard: 'unknown',\n sig: `0x${selector}`,\n functionName: result.text_signature.replace(/\\(.*$/, ''),\n ...(args\n ? {\n ...createNamedArgs(encodeArgs, params),\n }\n : {}),\n __decoder: methods.__decoder || FUNCTION_DICTIONARY_URL,\n } as ResultType & {\n __decoder: string\n __decoderVerifiedContract?: boolean\n }\n }\n } catch (_error) {\n // Ignore to try next record\n }\n }\n }\n }\n return undefined\n}\n","/**\n * LRU Cache implementation of DecoderCache interface\n */\n\nimport { LRUCache } from 'lru-cache'\nimport type { CacheEntry, CacheOptions, DecoderCache } from './cache'\n\n/**\n * Options for creating an LRU cache instance\n */\nexport interface LRUCacheOptions {\n /** Maximum number of items in cache */\n max?: number\n /** Default TTL in milliseconds */\n ttl?: number\n /** Default error TTL in milliseconds */\n errorTTL?: number\n /** Default stale-while-revalidate time in milliseconds */\n staleWhileRevalidate?: number\n}\n\n/**\n * LRU implementation of DecoderCache\n */\nexport class LRUDecoderCache implements DecoderCache {\n private cache: LRUCache<string, CacheEntry<unknown>>\n private promises: Map<string, Promise<unknown>>\n private defaultTTL: number\n private defaultErrorTTL: number\n private defaultStaleWhileRevalidate?: number\n\n constructor(options: LRUCacheOptions = {}) {\n this.defaultTTL = options.ttl ?? 5 * 60 * 1000 // 5 minutes\n this.defaultErrorTTL = options.errorTTL ?? 30 * 1000 // 30 seconds\n this.defaultStaleWhileRevalidate = options.staleWhileRevalidate\n\n this.cache = new LRUCache({\n max: options.max ?? 1000,\n })\n\n this.promises = new Map()\n }\n\n async get<T>(key: string): Promise<CacheEntry<T> | undefined> {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined\n if (!entry) {\n return undefined\n }\n\n // Check if expired\n if (entry.expires && Date.now() > entry.expires) {\n this.cache.delete(key)\n return undefined\n }\n\n return entry\n }\n\n async set<T>(key: string, value: T, options?: CacheOptions): Promise<void> {\n const now = Date.now()\n const ttl =\n options?.ttl ?? (options?.errorTTL ? options.errorTTL : this.defaultTTL)\n const isError = options?.errorTTL !== undefined\n\n const entry: CacheEntry<T> = {\n value,\n expires: now + ttl,\n isError,\n }\n\n const staleWhileRevalidate =\n options?.staleWhileRevalidate ?? this.defaultStaleWhileRevalidate\n if (staleWhileRevalidate) {\n entry.stale = now + ttl + staleWhileRevalidate\n }\n\n this.cache.set(key, entry as CacheEntry<unknown>)\n }\n\n async delete(key: string): Promise<void> {\n this.cache.delete(key)\n }\n\n async getMany<T>(keys: string[]): Promise<Map<string, CacheEntry<T>>> {\n const result = new Map<string, CacheEntry<T>>()\n\n for (const key of keys) {\n const entry = await this.get<T>(key)\n if (entry) {\n result.set(key, entry)\n }\n }\n\n return result\n }\n\n async setMany<T>(\n entries: Array<{ key: string; value: T; options?: CacheOptions }>\n ): Promise<void> {\n for (const { key, value, options } of entries) {\n await this.set(key, value, options)\n }\n }\n\n async clear(): Promise<void> {\n this.cache.clear()\n this.promises.clear()\n }\n\n async getOrSet<T>(\n key: string,\n factory: (signal?: AbortSignal) => Promise<T>,\n options?: CacheOptions & { signal?: AbortSignal }\n ): Promise<T> {\n // Check cache first\n const cached = await this.get<T>(key)\n const now = Date.now()\n\n // If we have a valid (non-expired) entry, return it\n if (cached && (!cached.expires || now < cached.expires)) {\n return cached.value\n }\n\n // If we have a stale entry and stale-while-revalidate is enabled\n if (cached?.stale && now < cached.stale && !this.promises.has(key)) {\n // Return stale value and revalidate in background\n const backgroundPromise = factory(options?.signal)\n .then(async (fresh) => {\n await this.set(key, fresh, options)\n return fresh\n })\n .catch(() => {\n // On error, keep the stale value\n return cached.value\n })\n .finally(() => {\n this.promises.delete(key)\n })\n\n this.promises.set(key, backgroundPromise)\n return cached.value\n }\n\n // Check if we have an in-flight promise\n const existingPromise = this.promises.get(key) as Promise<T> | undefined\n if (existingPromise) {\n return existingPromise\n }\n\n // No valid cache entry, fetch new value\n const promise = factory(options?.signal)\n .then(async (value) => {\n await this.set(key, value, options)\n return value\n })\n .catch(async (error) => {\n // Cache the error with shorter TTL\n await this.set(key, error as T, {\n ...options,\n ttl: options?.errorTTL ?? this.defaultErrorTTL,\n errorTTL: options?.errorTTL ?? this.defaultErrorTTL,\n })\n throw error\n })\n .finally(() => {\n this.promises.delete(key)\n })\n\n this.promises.set(key, promise)\n return promise as Promise<T>\n }\n}\n\n/**\n * Create a default LRU cache instance\n */\nexport function createLRUCache(options?: LRUCacheOptions): DecoderCache {\n return new LRUDecoderCache(options)\n}\n","import { abi as LSP9 } from '@lukso/lsp-smart-contracts/artifacts/LSP9Vault.json'\nimport type { AbiParameter } from 'viem'\nimport { decodeEvent } from '../events'\nimport { fetchAbi, getFunctionSignature } from '../functionSignature'\nimport type {\n DecodeEventResult,\n DecoderOptions,\n DecoderResult,\n PluginOptions,\n ResultShared,\n ResultType,\n} from '../types'\nimport { standardPlugin } from '.'\n\nexport const enhanceRetrieveAbiPlugin = standardPlugin(\n LSP9,\n {\n abiName: 'Internal',\n decoderName: 'explorer',\n name: 'abiRetrieve',\n usesAsync: true,\n priority: 0,\n },\n {\n enhance: async () => {\n return undefined\n },\n overrideEnhance: enhanceRetrieveAbi,\n decodeEvent: async (log: DecodeEventResult, options: DecoderOptions) => {\n if (!log) {\n return undefined\n }\n const info = await fetchAbi(options.chain, log.address)\n // TBD. This will only work with explorer download of abi\n if (info) {\n const result = decodeEvent(options.chain, info.abi, log)\n if (result) {\n return { ...result, __decoder: info.explorer }\n }\n }\n return undefined\n },\n }\n)\n/**\n *\n * @param result enhanced if it's LSP8\n * @param pluginOptions\n * @param options\n * @returns\n */\nexport async function enhanceRetrieveAbi(\n result: ResultType & ResultShared & { moduleHint?: string },\n _pluginOptions: PluginOptions,\n options: DecoderOptions\n) {\n const { input, to, from, value } = result as ResultType & {\n sig?: `0x${string}`\n functionName?: string\n args: Array<AbiParameter & { value?: unknown }>\n }\n try {\n const decoded = await getFunctionSignature(\n options.chain,\n input,\n (to || undefined) as `0x${string}` | undefined,\n options.preferError\n )\n if (decoded) {\n return {\n ...result,\n ...decoded,\n resultType: 'execute',\n to,\n from,\n value,\n input,\n } as DecoderResult\n }\n } catch {}\n return undefined\n}\n\nexport default enhanceRetrieveAbiPlugin\n","// Re-export standardPlugin and helpers from the new file\nexport {\n createAggregationKey,\n standardPlugin,\n standardSchemaPlugin,\n} from './standardPlugin'\n\nimport burntPix from './enhanceBurntPix'\n// Import plugins - now standardPlugin is available from ./standardPlugin\nimport graffiti from './enhanceGraffiti'\nimport profile from './enhanceLSP0ERC725Account'\nimport keyManager from './enhanceLSP6KeyManager'\nimport lsp7 from './enhanceLSP7DigitalAsset'\nimport lsp8 from './enhanceLSP8IdentifiableDigitalAsset'\nimport lsp9 from './enhanceLSP9Vault'\nimport lsp26 from './enhanceLSP26FollowerSystem'\nimport abiRetrieve from './enhanceRetrieveAbi'\nimport schemaDefaultPlugin from './schemaDefault'\n\n// Force evaluation of plugins to ensure they register (prevent tree-shaking)\n// These plugins self-register via standardPlugin when imported\n;[profile, keyManager, lsp7, lsp8, lsp9, lsp26, burntPix].forEach((p) => {\n p\n})\n\nimport type { Hex } from 'viem'\nimport type {\n DecoderOptions,\n DecoderPlugin,\n Info,\n ResultSetData,\n SchemaPlugin,\n} from '../types'\nimport { getArgByName } from '../utils'\n\nexport const defaultPlugins: ReadonlyArray<DecoderPlugin> = Object.freeze([\n graffiti,\n keyManager,\n profile,\n lsp7,\n lsp8,\n lsp9,\n lsp26,\n abiRetrieve,\n burntPix,\n])\n\nexport const defaultSchemaPlugins: ReadonlyArray<SchemaPlugin> = Object.freeze([\n schemaDefaultPlugin,\n])\n\nexport default defaultPlugins\n\nexport async function decodeKeyValue(\n result: ResultSetData,\n options: DecoderOptions\n): Promise<Info | undefined> {\n const key: Hex = (getArgByName(result.args, 'key') as Hex) ?? '0x'\n const value: Hex = (getArgByName(result.args, 'value') as Hex) ?? '0x'\n return await decodeKeyValueRaw(key, value, options)\n}\n\nexport async function decodeKeyValueRaw(\n key: Hex,\n value: Hex,\n options: DecoderOptions\n): Promise<Info | undefined> {\n for (const schemaPlugin of options.schemaPlugins) {\n try {\n const output = await schemaPlugin(key, value)\n if (output) {\n return output\n }\n } catch {}\n }\n return undefined\n}\n\n// Import registry and register default plugins when this module loads\nimport { pluginRegistry } from '../registry'\n\n// Register graffiti manually since it doesn't use standardPlugin\npluginRegistry.register('graffiti', graffiti, {\n priority: 100,\n required: false,\n})\n\n// Register abiRetrieve manually with async flag\npluginRegistry.register('abiRetrieve', abiRetrieve, {\n priority: 1,\n required: false,\n usesAsync: true,\n})\n\n// Register default schema plugin\npluginRegistry.registerSchema('default-schema', schemaDefaultPlugin, {\n priority: 100,\n required: false,\n})\n\n// Note: Other plugins using standardPlugin will auto-register when imported\n","import { ServerAddressResolver } from './addressResolver'\nimport { ServerDecoderCaches } from './caches'\nimport { decodeTransactionSync } from './decodeTransactionSync'\nimport { decodeTransactionsBatch } from './decodeTransactionsBatch'\nimport { finishDecoding } from './finishDecoding'\nimport type {\n ServerDecoder,\n ServerDecoderConfig,\n ServerDecoderOptions,\n} from './types'\n\n// Import plugins to ensure they are registered\nimport '../decoder/plugins'\n\n/**\n * Create a server-optimized decoder instance\n */\nexport function createServerDecoder(\n config: ServerDecoderConfig\n): ServerDecoder {\n // Create caches\n const caches = new ServerDecoderCaches({\n transactionCacheSize: config.transactionCacheSize,\n addressCacheSize: config.addressCacheSize,\n abiCacheSize: config.abiCacheSize,\n schemaCacheSize: config.schemaCacheSize,\n })\n\n // Create address resolver\n const addressResolver = new ServerAddressResolver(\n config.graphqlEndpoint,\n config.defaultChain,\n caches\n )\n\n // Return server decoder interface\n return {\n async decodeTransaction(transaction, options) {\n const opts: ServerDecoderOptions = {\n chain: config.defaultChain,\n timeoutMs: config.defaultTimeout,\n ...options,\n }\n return decodeTransactionSync(transaction, opts, caches)\n },\n\n async decodeTransactionsBatch(transactions, options) {\n const opts: ServerDecoderOptions = {\n chain: config.defaultChain,\n timeoutMs: config.defaultTimeout,\n ...options,\n }\n return decodeTransactionsBatch(transactions, opts, caches)\n },\n\n async finishDecoding(transaction, options) {\n const opts: ServerDecoderOptions = {\n chain: config.defaultChain,\n timeoutMs: config.defaultTimeout,\n ...options,\n }\n return finishDecoding(transaction, opts, caches)\n },\n\n clearCaches() {\n caches.clear()\n },\n\n getCacheStats() {\n return caches.getStats()\n },\n\n async warmAddressCache(addresses) {\n await addressResolver.warmCache(addresses)\n },\n\n async resolveAddresses(addresses, timeoutMs = 3000) {\n return addressResolver.resolveAddressesWithTimeout(addresses, timeoutMs)\n },\n }\n}\n"],"mappings":"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","names":["caches","abi","abi","arg","tokenId","slice","slice","data","phase","result","caches","caches","createErrorResult","caches","createErrorResult","isHex","defaultSchema","process","index","data","value","isHex","url","newURL","method","abi","pluginOptions","decodeAbiParameters","size","formatAbiItem","decodeAbiParameters","abi","formatAbiItem","decodeAbiParameters","name","size","size","slice","size","slice","value","decodeAbiParameters","slice","slice","decodeAbiParameters","value","_to","LRUCache","LRUCache","value","value","enhanceLSP26FollowerSystem","abi","decodeAbiParameters","encodeAbiParameters","getAddress","isAddress","isAddressEqual","zeroAddress","LRUCache","LRUCache","getAddress","address","abi","isAddress","isAddressEqual","zeroAddress","decodeAbiParameters","encodeAbiParameters","abi","caches"]}
|