@lukso/transaction-decoder 1.3.7-dev.30530d6 → 1.3.7-dev.caea45e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/decoder/utils.ts","../src/core/addressCollector.ts","../src/decoder/registry.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/plugins/schemaDefault.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"],"sourcesContent":["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 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 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","[\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 {\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","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"],"mappings":"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","names":["abi","arg","tokenId","isHex","defaultSchema","process","index","data","value","isHex","url","newURL","method","abi","pluginOptions","process","decodeAbiParameters","size","formatAbiItem","decodeAbiParameters","abi","formatAbiItem","decodeAbiParameters","name","size","size","slice","size","slice","slice","slice","data","phase","result","value","decodeAbiParameters","slice","slice","decodeAbiParameters","value","_to","value","value","enhanceLSP26FollowerSystem","abi","decodeAbiParameters","encodeAbiParameters","getAddress","isAddress","isAddressEqual","zeroAddress","LRUCache","LRUCache","getAddress","address","abi","isAddress","isAddressEqual","zeroAddress","decodeAbiParameters","encodeAbiParameters","abi"]}