From 20cb19a64d1d2adc9be50720a0e9df25e091b159 Mon Sep 17 00:00:00 2001 From: LexLuthr Date: Thu, 9 Oct 2025 14:45:20 +0400 Subject: [PATCH 1/2] Service registry UI --- pdp/contract/ServiceProviderRegistry.abi | 1693 +++++++++ pdp/contract/ServiceProviderRegistry.go | 3319 +++++++++++++++++ pdp/contract/ServiceProviderRegistry.json | 1 + .../ServiceProviderRegistryStorage.abi | 179 + .../ServiceProviderRegistryStorage.go | 451 +++ .../ServiceProviderRegistryStorage.json | 1 + pdp/contract/utils.go | 354 +- web/api/webrpc/pdp.go | 374 +- web/static/pages/market-settings/index.html | 2 +- web/static/pages/pdp/index.html | 34 +- web/static/pages/pdp/register.js | 604 +++ 11 files changed, 6994 insertions(+), 18 deletions(-) create mode 100644 pdp/contract/ServiceProviderRegistry.abi create mode 100644 pdp/contract/ServiceProviderRegistry.go create mode 100644 pdp/contract/ServiceProviderRegistry.json create mode 100644 pdp/contract/ServiceProviderRegistryStorage.abi create mode 100644 pdp/contract/ServiceProviderRegistryStorage.go create mode 100644 pdp/contract/ServiceProviderRegistryStorage.json create mode 100644 web/static/pages/pdp/register.js diff --git a/pdp/contract/ServiceProviderRegistry.abi b/pdp/contract/ServiceProviderRegistry.abi new file mode 100644 index 000000000..4ca288cf8 --- /dev/null +++ b/pdp/contract/ServiceProviderRegistry.abi @@ -0,0 +1,1693 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "BURN_ACTOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_CAPABILITIES", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_CAPABILITY_KEY_LENGTH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_CAPABILITY_VALUE_LENGTH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REGISTRATION_FEE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "activeProductTypeProviderCount", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "activeProviderCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addProduct", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addressToProviderId", + "inputs": [ + { + "name": "providerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decodePDPOffering", + "inputs": [ + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PDPOffering", + "components": [ + { + "name": "serviceURL", + "type": "string", + "internalType": "string" + }, + { + "name": "minPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ipniPiece", + "type": "bool", + "internalType": "bool" + }, + { + "name": "ipniIpfs", + "type": "bool", + "internalType": "bool" + }, + { + "name": "storagePricePerTibPerMonth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minProvingPeriodInEpochs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "location", + "type": "string", + "internalType": "string" + }, + { + "name": "paymentTokenAddress", + "type": "address", + "internalType": "contract IERC20" + } + ] + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "encodePDPOffering", + "inputs": [ + { + "name": "pdpOffering", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PDPOffering", + "components": [ + { + "name": "serviceURL", + "type": "string", + "internalType": "string" + }, + { + "name": "minPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ipniPiece", + "type": "bool", + "internalType": "bool" + }, + { + "name": "ipniIpfs", + "type": "bool", + "internalType": "bool" + }, + { + "name": "storagePricePerTibPerMonth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minProvingPeriodInEpochs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "location", + "type": "string", + "internalType": "string" + }, + { + "name": "paymentTokenAddress", + "type": "address", + "internalType": "contract IERC20" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "getActiveProvidersByProductType", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "result", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PaginatedProviders", + "components": [ + { + "name": "providers", + "type": "tuple[]", + "internalType": "struct ServiceProviderRegistryStorage.ProviderWithProduct[]", + "components": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "providerInfo", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProviderInfo", + "components": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "product", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProduct", + "components": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ] + } + ] + }, + { + "name": "hasMore", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllActiveProviders", + "inputs": [ + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "providerIds", + "type": "uint256[]", + "internalType": "uint256[]" + }, + { + "name": "hasMore", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNextProviderId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPDPService", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "pdpOffering", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PDPOffering", + "components": [ + { + "name": "serviceURL", + "type": "string", + "internalType": "string" + }, + { + "name": "minPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ipniPiece", + "type": "bool", + "internalType": "bool" + }, + { + "name": "ipniIpfs", + "type": "bool", + "internalType": "bool" + }, + { + "name": "storagePricePerTibPerMonth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minProvingPeriodInEpochs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "location", + "type": "string", + "internalType": "string" + }, + { + "name": "paymentTokenAddress", + "type": "address", + "internalType": "contract IERC20" + } + ] + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProduct", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProductCapabilities", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "keys", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [ + { + "name": "exists", + "type": "bool[]", + "internalType": "bool[]" + }, + { + "name": "values", + "type": "string[]", + "internalType": "string[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProductCapability", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "key", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "value", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProvider", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "info", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProviderInfo", + "components": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProviderByAddress", + "inputs": [ + { + "name": "providerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "info", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProviderInfo", + "components": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProviderCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProviderIdByAddress", + "inputs": [ + { + "name": "providerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProvidersByProductType", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "result", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PaginatedProviders", + "components": [ + { + "name": "providers", + "type": "tuple[]", + "internalType": "struct ServiceProviderRegistryStorage.ProviderWithProduct[]", + "components": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "providerInfo", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProviderInfo", + "components": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "product", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.ServiceProduct", + "components": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ] + } + ] + }, + { + "name": "hasMore", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isProviderActive", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isRegisteredProvider", + "inputs": [ + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "migrate", + "inputs": [ + { + "name": "newVersion", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "productCapabilities", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "key", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "value", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "productTypeProviderCount", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providerHasProduct", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providerProducts", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providers", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerProvider", + "inputs": [ + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "removeProduct", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeProvider", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updatePDPServiceWithCapabilities", + "inputs": [ + { + "name": "pdpOffering", + "type": "tuple", + "internalType": "struct ServiceProviderRegistryStorage.PDPOffering", + "components": [ + { + "name": "serviceURL", + "type": "string", + "internalType": "string" + }, + { + "name": "minPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxPieceSizeInBytes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ipniPiece", + "type": "bool", + "internalType": "bool" + }, + { + "name": "ipniIpfs", + "type": "bool", + "internalType": "bool" + }, + { + "name": "storagePricePerTibPerMonth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minProvingPeriodInEpochs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "location", + "type": "string", + "internalType": "string" + }, + { + "name": "paymentTokenAddress", + "type": "address", + "internalType": "contract IERC20" + } + ] + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateProduct", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateProviderInfo", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "ContractUpgraded", + "inputs": [ + { + "name": "version", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "implementation", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProductAdded", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "indexed": true, + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "serviceUrl", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "serviceProvider", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "indexed": false, + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "indexed": false, + "internalType": "string[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProductRemoved", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "indexed": true, + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProductUpdated", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "indexed": true, + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "serviceUrl", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "serviceProvider", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "capabilityKeys", + "type": "string[]", + "indexed": false, + "internalType": "string[]" + }, + { + "name": "capabilityValues", + "type": "string[]", + "indexed": false, + "internalType": "string[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProviderInfoUpdated", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProviderRegistered", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "serviceProvider", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProviderRemoved", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "FailedCall", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] \ No newline at end of file diff --git a/pdp/contract/ServiceProviderRegistry.go b/pdp/contract/ServiceProviderRegistry.go new file mode 100644 index 000000000..c498290ad --- /dev/null +++ b/pdp/contract/ServiceProviderRegistry.go @@ -0,0 +1,3319 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ServiceProviderRegistryStoragePDPOffering is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStoragePDPOffering struct { + ServiceURL string + MinPieceSizeInBytes *big.Int + MaxPieceSizeInBytes *big.Int + IpniPiece bool + IpniIpfs bool + StoragePricePerTibPerMonth *big.Int + MinProvingPeriodInEpochs *big.Int + Location string + PaymentTokenAddress common.Address +} + +// ServiceProviderRegistryStoragePaginatedProviders is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStoragePaginatedProviders struct { + Providers []ServiceProviderRegistryStorageProviderWithProduct + HasMore bool +} + +// ServiceProviderRegistryStorageProviderWithProduct is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStorageProviderWithProduct struct { + ProviderId *big.Int + ProviderInfo ServiceProviderRegistryStorageServiceProviderInfo + Product ServiceProviderRegistryStorageServiceProduct +} + +// ServiceProviderRegistryStorageServiceProduct is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStorageServiceProduct struct { + ProductType uint8 + ProductData []byte + CapabilityKeys []string + IsActive bool +} + +// ServiceProviderRegistryStorageServiceProviderInfo is an auto generated low-level Go binding around an user-defined struct. +type ServiceProviderRegistryStorageServiceProviderInfo struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +} + +// ServiceProviderRegistryMetaData contains all meta data concerning the ServiceProviderRegistry contract. +var ServiceProviderRegistryMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BURN_ACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_CAPABILITIES\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_CAPABILITY_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_CAPABILITY_VALUE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REGISTRATION_FEE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeProductTypeProviderCount\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeProviderCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addProduct\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressToProviderId\",\"inputs\":[{\"name\":\"providerAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decodePDPOffering\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PDPOffering\",\"components\":[{\"name\":\"serviceURL\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ipniPiece\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"ipniIpfs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"location\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"paymentTokenAddress\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"encodePDPOffering\",\"inputs\":[{\"name\":\"pdpOffering\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PDPOffering\",\"components\":[{\"name\":\"serviceURL\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ipniPiece\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"ipniIpfs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"location\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"paymentTokenAddress\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getActiveProvidersByProductType\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PaginatedProviders\",\"components\":[{\"name\":\"providers\",\"type\":\"tuple[]\",\"internalType\":\"structServiceProviderRegistryStorage.ProviderWithProduct[]\",\"components\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"providerInfo\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProviderInfo\",\"components\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"product\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProduct\",\"components\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"hasMore\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllActiveProviders\",\"inputs\":[{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"providerIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"hasMore\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextProviderId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPDPService\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"pdpOffering\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PDPOffering\",\"components\":[{\"name\":\"serviceURL\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ipniPiece\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"ipniIpfs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"location\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"paymentTokenAddress\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}]},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProduct\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProductCapabilities\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"keys\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"},{\"name\":\"values\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProductCapability\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"key\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"value\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProvider\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"info\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProviderInfo\",\"components\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderByAddress\",\"inputs\":[{\"name\":\"providerAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"info\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProviderInfo\",\"components\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderIdByAddress\",\"inputs\":[{\"name\":\"providerAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProvidersByProductType\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PaginatedProviders\",\"components\":[{\"name\":\"providers\",\"type\":\"tuple[]\",\"internalType\":\"structServiceProviderRegistryStorage.ProviderWithProduct[]\",\"components\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"providerInfo\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProviderInfo\",\"components\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"product\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.ServiceProduct\",\"components\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"hasMore\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProviderActive\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRegisteredProvider\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrate\",\"inputs\":[{\"name\":\"newVersion\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"productCapabilities\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"key\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"value\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"productTypeProviderCount\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerHasProduct\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerProducts\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providers\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerProvider\",\"inputs\":[{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"removeProduct\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeProvider\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updatePDPServiceWithCapabilities\",\"inputs\":[{\"name\":\"pdpOffering\",\"type\":\"tuple\",\"internalType\":\"structServiceProviderRegistryStorage.PDPOffering\",\"components\":[{\"name\":\"serviceURL\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ipniPiece\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"ipniIpfs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"location\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"paymentTokenAddress\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}]},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateProduct\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateProviderInfo\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"ContractUpgraded\",\"inputs\":[{\"name\":\"version\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProductAdded\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"serviceUrl\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"serviceProvider\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProductRemoved\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProductUpdated\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"serviceUrl\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"serviceProvider\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"capabilityKeys\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"capabilityValues\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderInfoUpdated\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistered\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"serviceProvider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRemoved\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", +} + +// ServiceProviderRegistryABI is the input ABI used to generate the binding from. +// Deprecated: Use ServiceProviderRegistryMetaData.ABI instead. +var ServiceProviderRegistryABI = ServiceProviderRegistryMetaData.ABI + +// ServiceProviderRegistry is an auto generated Go binding around an Ethereum contract. +type ServiceProviderRegistry struct { + ServiceProviderRegistryCaller // Read-only binding to the contract + ServiceProviderRegistryTransactor // Write-only binding to the contract + ServiceProviderRegistryFilterer // Log filterer for contract events +} + +// ServiceProviderRegistryCaller is an auto generated read-only Go binding around an Ethereum contract. +type ServiceProviderRegistryCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ServiceProviderRegistryTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ServiceProviderRegistryFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistrySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ServiceProviderRegistrySession struct { + Contract *ServiceProviderRegistry // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ServiceProviderRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ServiceProviderRegistryCallerSession struct { + Contract *ServiceProviderRegistryCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ServiceProviderRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ServiceProviderRegistryTransactorSession struct { + Contract *ServiceProviderRegistryTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ServiceProviderRegistryRaw is an auto generated low-level Go binding around an Ethereum contract. +type ServiceProviderRegistryRaw struct { + Contract *ServiceProviderRegistry // Generic contract binding to access the raw methods on +} + +// ServiceProviderRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ServiceProviderRegistryCallerRaw struct { + Contract *ServiceProviderRegistryCaller // Generic read-only contract binding to access the raw methods on +} + +// ServiceProviderRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ServiceProviderRegistryTransactorRaw struct { + Contract *ServiceProviderRegistryTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewServiceProviderRegistry creates a new instance of ServiceProviderRegistry, bound to a specific deployed contract. +func NewServiceProviderRegistry(address common.Address, backend bind.ContractBackend) (*ServiceProviderRegistry, error) { + contract, err := bindServiceProviderRegistry(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ServiceProviderRegistry{ServiceProviderRegistryCaller: ServiceProviderRegistryCaller{contract: contract}, ServiceProviderRegistryTransactor: ServiceProviderRegistryTransactor{contract: contract}, ServiceProviderRegistryFilterer: ServiceProviderRegistryFilterer{contract: contract}}, nil +} + +// NewServiceProviderRegistryCaller creates a new read-only instance of ServiceProviderRegistry, bound to a specific deployed contract. +func NewServiceProviderRegistryCaller(address common.Address, caller bind.ContractCaller) (*ServiceProviderRegistryCaller, error) { + contract, err := bindServiceProviderRegistry(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryCaller{contract: contract}, nil +} + +// NewServiceProviderRegistryTransactor creates a new write-only instance of ServiceProviderRegistry, bound to a specific deployed contract. +func NewServiceProviderRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*ServiceProviderRegistryTransactor, error) { + contract, err := bindServiceProviderRegistry(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryTransactor{contract: contract}, nil +} + +// NewServiceProviderRegistryFilterer creates a new log filterer instance of ServiceProviderRegistry, bound to a specific deployed contract. +func NewServiceProviderRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*ServiceProviderRegistryFilterer, error) { + contract, err := bindServiceProviderRegistry(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryFilterer{contract: contract}, nil +} + +// bindServiceProviderRegistry binds a generic wrapper to an already deployed contract. +func bindServiceProviderRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ServiceProviderRegistry *ServiceProviderRegistryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ServiceProviderRegistry.Contract.ServiceProviderRegistryCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ServiceProviderRegistry *ServiceProviderRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.ServiceProviderRegistryTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ServiceProviderRegistry *ServiceProviderRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.ServiceProviderRegistryTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ServiceProviderRegistry.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.contract.Transact(opts, method, params...) +} + +// BURNACTOR is a free data retrieval call binding the contract method 0x0a6a63f1. +// +// Solidity: function BURN_ACTOR() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) BURNACTOR(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "BURN_ACTOR") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// BURNACTOR is a free data retrieval call binding the contract method 0x0a6a63f1. +// +// Solidity: function BURN_ACTOR() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) BURNACTOR() (common.Address, error) { + return _ServiceProviderRegistry.Contract.BURNACTOR(&_ServiceProviderRegistry.CallOpts) +} + +// BURNACTOR is a free data retrieval call binding the contract method 0x0a6a63f1. +// +// Solidity: function BURN_ACTOR() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) BURNACTOR() (common.Address, error) { + return _ServiceProviderRegistry.Contract.BURNACTOR(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITIES is a free data retrieval call binding the contract method 0x6e36e974. +// +// Solidity: function MAX_CAPABILITIES() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) MAXCAPABILITIES(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "MAX_CAPABILITIES") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXCAPABILITIES is a free data retrieval call binding the contract method 0x6e36e974. +// +// Solidity: function MAX_CAPABILITIES() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) MAXCAPABILITIES() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITIES(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITIES is a free data retrieval call binding the contract method 0x6e36e974. +// +// Solidity: function MAX_CAPABILITIES() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) MAXCAPABILITIES() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITIES(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITYKEYLENGTH is a free data retrieval call binding the contract method 0x7f657567. +// +// Solidity: function MAX_CAPABILITY_KEY_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) MAXCAPABILITYKEYLENGTH(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "MAX_CAPABILITY_KEY_LENGTH") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXCAPABILITYKEYLENGTH is a free data retrieval call binding the contract method 0x7f657567. +// +// Solidity: function MAX_CAPABILITY_KEY_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) MAXCAPABILITYKEYLENGTH() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITYKEYLENGTH(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITYKEYLENGTH is a free data retrieval call binding the contract method 0x7f657567. +// +// Solidity: function MAX_CAPABILITY_KEY_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) MAXCAPABILITYKEYLENGTH() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITYKEYLENGTH(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITYVALUELENGTH is a free data retrieval call binding the contract method 0xdcea1c6f. +// +// Solidity: function MAX_CAPABILITY_VALUE_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) MAXCAPABILITYVALUELENGTH(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "MAX_CAPABILITY_VALUE_LENGTH") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXCAPABILITYVALUELENGTH is a free data retrieval call binding the contract method 0xdcea1c6f. +// +// Solidity: function MAX_CAPABILITY_VALUE_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) MAXCAPABILITYVALUELENGTH() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITYVALUELENGTH(&_ServiceProviderRegistry.CallOpts) +} + +// MAXCAPABILITYVALUELENGTH is a free data retrieval call binding the contract method 0xdcea1c6f. +// +// Solidity: function MAX_CAPABILITY_VALUE_LENGTH() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) MAXCAPABILITYVALUELENGTH() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.MAXCAPABILITYVALUELENGTH(&_ServiceProviderRegistry.CallOpts) +} + +// REGISTRATIONFEE is a free data retrieval call binding the contract method 0x64b4f751. +// +// Solidity: function REGISTRATION_FEE() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) REGISTRATIONFEE(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "REGISTRATION_FEE") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// REGISTRATIONFEE is a free data retrieval call binding the contract method 0x64b4f751. +// +// Solidity: function REGISTRATION_FEE() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) REGISTRATIONFEE() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.REGISTRATIONFEE(&_ServiceProviderRegistry.CallOpts) +} + +// REGISTRATIONFEE is a free data retrieval call binding the contract method 0x64b4f751. +// +// Solidity: function REGISTRATION_FEE() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) REGISTRATIONFEE() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.REGISTRATIONFEE(&_ServiceProviderRegistry.CallOpts) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) UPGRADEINTERFACEVERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "UPGRADE_INTERFACE_VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UPGRADEINTERFACEVERSION() (string, error) { + return _ServiceProviderRegistry.Contract.UPGRADEINTERFACEVERSION(&_ServiceProviderRegistry.CallOpts) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) UPGRADEINTERFACEVERSION() (string, error) { + return _ServiceProviderRegistry.Contract.UPGRADEINTERFACEVERSION(&_ServiceProviderRegistry.CallOpts) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) VERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) VERSION() (string, error) { + return _ServiceProviderRegistry.Contract.VERSION(&_ServiceProviderRegistry.CallOpts) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) VERSION() (string, error) { + return _ServiceProviderRegistry.Contract.VERSION(&_ServiceProviderRegistry.CallOpts) +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ActiveProductTypeProviderCount(opts *bind.CallOpts, productType uint8) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "activeProductTypeProviderCount", productType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ActiveProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ActiveProductTypeProviderCount(&_ServiceProviderRegistry.CallOpts, productType) +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ActiveProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ActiveProductTypeProviderCount(&_ServiceProviderRegistry.CallOpts, productType) +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ActiveProviderCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "activeProviderCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ActiveProviderCount() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ActiveProviderCount(&_ServiceProviderRegistry.CallOpts) +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ActiveProviderCount() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ActiveProviderCount(&_ServiceProviderRegistry.CallOpts) +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) AddressToProviderId(opts *bind.CallOpts, providerAddress common.Address) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "addressToProviderId", providerAddress) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) AddressToProviderId(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.AddressToProviderId(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) AddressToProviderId(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.AddressToProviderId(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// DecodePDPOffering is a free data retrieval call binding the contract method 0xdeb0e462. +// +// Solidity: function decodePDPOffering(bytes data) pure returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address)) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) DecodePDPOffering(opts *bind.CallOpts, data []byte) (ServiceProviderRegistryStoragePDPOffering, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "decodePDPOffering", data) + + if err != nil { + return *new(ServiceProviderRegistryStoragePDPOffering), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStoragePDPOffering)).(*ServiceProviderRegistryStoragePDPOffering) + + return out0, err + +} + +// DecodePDPOffering is a free data retrieval call binding the contract method 0xdeb0e462. +// +// Solidity: function decodePDPOffering(bytes data) pure returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address)) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) DecodePDPOffering(data []byte) (ServiceProviderRegistryStoragePDPOffering, error) { + return _ServiceProviderRegistry.Contract.DecodePDPOffering(&_ServiceProviderRegistry.CallOpts, data) +} + +// DecodePDPOffering is a free data retrieval call binding the contract method 0xdeb0e462. +// +// Solidity: function decodePDPOffering(bytes data) pure returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address)) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) DecodePDPOffering(data []byte) (ServiceProviderRegistryStoragePDPOffering, error) { + return _ServiceProviderRegistry.Contract.DecodePDPOffering(&_ServiceProviderRegistry.CallOpts, data) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) Eip712Domain(opts *bind.CallOpts) (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "eip712Domain") + + outstruct := new(struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.Fields = *abi.ConvertType(out[0], new([1]byte)).(*[1]byte) + outstruct.Name = *abi.ConvertType(out[1], new(string)).(*string) + outstruct.Version = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.ChainId = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) + outstruct.VerifyingContract = *abi.ConvertType(out[4], new(common.Address)).(*common.Address) + outstruct.Salt = *abi.ConvertType(out[5], new([32]byte)).(*[32]byte) + outstruct.Extensions = *abi.ConvertType(out[6], new([]*big.Int)).(*[]*big.Int) + + return *outstruct, err + +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _ServiceProviderRegistry.Contract.Eip712Domain(&_ServiceProviderRegistry.CallOpts) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _ServiceProviderRegistry.Contract.Eip712Domain(&_ServiceProviderRegistry.CallOpts) +} + +// EncodePDPOffering is a free data retrieval call binding the contract method 0x82ee4b34. +// +// Solidity: function encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering) pure returns(bytes) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) EncodePDPOffering(opts *bind.CallOpts, pdpOffering ServiceProviderRegistryStoragePDPOffering) ([]byte, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "encodePDPOffering", pdpOffering) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// EncodePDPOffering is a free data retrieval call binding the contract method 0x82ee4b34. +// +// Solidity: function encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering) pure returns(bytes) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) EncodePDPOffering(pdpOffering ServiceProviderRegistryStoragePDPOffering) ([]byte, error) { + return _ServiceProviderRegistry.Contract.EncodePDPOffering(&_ServiceProviderRegistry.CallOpts, pdpOffering) +} + +// EncodePDPOffering is a free data retrieval call binding the contract method 0x82ee4b34. +// +// Solidity: function encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering) pure returns(bytes) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) EncodePDPOffering(pdpOffering ServiceProviderRegistryStoragePDPOffering) ([]byte, error) { + return _ServiceProviderRegistry.Contract.EncodePDPOffering(&_ServiceProviderRegistry.CallOpts, pdpOffering) +} + +// GetActiveProvidersByProductType is a free data retrieval call binding the contract method 0x213c63b1. +// +// Solidity: function getActiveProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetActiveProvidersByProductType(opts *bind.CallOpts, productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getActiveProvidersByProductType", productType, offset, limit) + + if err != nil { + return *new(ServiceProviderRegistryStoragePaginatedProviders), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStoragePaginatedProviders)).(*ServiceProviderRegistryStoragePaginatedProviders) + + return out0, err + +} + +// GetActiveProvidersByProductType is a free data retrieval call binding the contract method 0x213c63b1. +// +// Solidity: function getActiveProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetActiveProvidersByProductType(productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + return _ServiceProviderRegistry.Contract.GetActiveProvidersByProductType(&_ServiceProviderRegistry.CallOpts, productType, offset, limit) +} + +// GetActiveProvidersByProductType is a free data retrieval call binding the contract method 0x213c63b1. +// +// Solidity: function getActiveProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetActiveProvidersByProductType(productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + return _ServiceProviderRegistry.Contract.GetActiveProvidersByProductType(&_ServiceProviderRegistry.CallOpts, productType, offset, limit) +} + +// GetAllActiveProviders is a free data retrieval call binding the contract method 0x2f67c065. +// +// Solidity: function getAllActiveProviders(uint256 offset, uint256 limit) view returns(uint256[] providerIds, bool hasMore) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetAllActiveProviders(opts *bind.CallOpts, offset *big.Int, limit *big.Int) (struct { + ProviderIds []*big.Int + HasMore bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getAllActiveProviders", offset, limit) + + outstruct := new(struct { + ProviderIds []*big.Int + HasMore bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProviderIds = *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int) + outstruct.HasMore = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +// GetAllActiveProviders is a free data retrieval call binding the contract method 0x2f67c065. +// +// Solidity: function getAllActiveProviders(uint256 offset, uint256 limit) view returns(uint256[] providerIds, bool hasMore) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetAllActiveProviders(offset *big.Int, limit *big.Int) (struct { + ProviderIds []*big.Int + HasMore bool +}, error) { + return _ServiceProviderRegistry.Contract.GetAllActiveProviders(&_ServiceProviderRegistry.CallOpts, offset, limit) +} + +// GetAllActiveProviders is a free data retrieval call binding the contract method 0x2f67c065. +// +// Solidity: function getAllActiveProviders(uint256 offset, uint256 limit) view returns(uint256[] providerIds, bool hasMore) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetAllActiveProviders(offset *big.Int, limit *big.Int) (struct { + ProviderIds []*big.Int + HasMore bool +}, error) { + return _ServiceProviderRegistry.Contract.GetAllActiveProviders(&_ServiceProviderRegistry.CallOpts, offset, limit) +} + +// GetNextProviderId is a free data retrieval call binding the contract method 0xd1329d4e. +// +// Solidity: function getNextProviderId() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetNextProviderId(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getNextProviderId") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetNextProviderId is a free data retrieval call binding the contract method 0xd1329d4e. +// +// Solidity: function getNextProviderId() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetNextProviderId() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetNextProviderId(&_ServiceProviderRegistry.CallOpts) +} + +// GetNextProviderId is a free data retrieval call binding the contract method 0xd1329d4e. +// +// Solidity: function getNextProviderId() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetNextProviderId() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetNextProviderId(&_ServiceProviderRegistry.CallOpts) +} + +// GetPDPService is a free data retrieval call binding the contract method 0xc439fd57. +// +// Solidity: function getPDPService(uint256 providerId) view returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetPDPService(opts *bind.CallOpts, providerId *big.Int) (struct { + PdpOffering ServiceProviderRegistryStoragePDPOffering + CapabilityKeys []string + IsActive bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getPDPService", providerId) + + outstruct := new(struct { + PdpOffering ServiceProviderRegistryStoragePDPOffering + CapabilityKeys []string + IsActive bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.PdpOffering = *abi.ConvertType(out[0], new(ServiceProviderRegistryStoragePDPOffering)).(*ServiceProviderRegistryStoragePDPOffering) + outstruct.CapabilityKeys = *abi.ConvertType(out[1], new([]string)).(*[]string) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + + return *outstruct, err + +} + +// GetPDPService is a free data retrieval call binding the contract method 0xc439fd57. +// +// Solidity: function getPDPService(uint256 providerId) view returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetPDPService(providerId *big.Int) (struct { + PdpOffering ServiceProviderRegistryStoragePDPOffering + CapabilityKeys []string + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.GetPDPService(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// GetPDPService is a free data retrieval call binding the contract method 0xc439fd57. +// +// Solidity: function getPDPService(uint256 providerId) view returns((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetPDPService(providerId *big.Int) (struct { + PdpOffering ServiceProviderRegistryStoragePDPOffering + CapabilityKeys []string + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.GetPDPService(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// GetProduct is a free data retrieval call binding the contract method 0xaca0988f. +// +// Solidity: function getProduct(uint256 providerId, uint8 productType) view returns(bytes productData, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProduct(opts *bind.CallOpts, providerId *big.Int, productType uint8) (struct { + ProductData []byte + CapabilityKeys []string + IsActive bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProduct", providerId, productType) + + outstruct := new(struct { + ProductData []byte + CapabilityKeys []string + IsActive bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProductData = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.CapabilityKeys = *abi.ConvertType(out[1], new([]string)).(*[]string) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + + return *outstruct, err + +} + +// GetProduct is a free data retrieval call binding the contract method 0xaca0988f. +// +// Solidity: function getProduct(uint256 providerId, uint8 productType) view returns(bytes productData, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProduct(providerId *big.Int, productType uint8) (struct { + ProductData []byte + CapabilityKeys []string + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.GetProduct(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// GetProduct is a free data retrieval call binding the contract method 0xaca0988f. +// +// Solidity: function getProduct(uint256 providerId, uint8 productType) view returns(bytes productData, string[] capabilityKeys, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProduct(providerId *big.Int, productType uint8) (struct { + ProductData []byte + CapabilityKeys []string + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.GetProduct(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// GetProductCapabilities is a free data retrieval call binding the contract method 0xa6433240. +// +// Solidity: function getProductCapabilities(uint256 providerId, uint8 productType, string[] keys) view returns(bool[] exists, string[] values) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProductCapabilities(opts *bind.CallOpts, providerId *big.Int, productType uint8, keys []string) (struct { + Exists []bool + Values []string +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProductCapabilities", providerId, productType, keys) + + outstruct := new(struct { + Exists []bool + Values []string + }) + if err != nil { + return *outstruct, err + } + + outstruct.Exists = *abi.ConvertType(out[0], new([]bool)).(*[]bool) + outstruct.Values = *abi.ConvertType(out[1], new([]string)).(*[]string) + + return *outstruct, err + +} + +// GetProductCapabilities is a free data retrieval call binding the contract method 0xa6433240. +// +// Solidity: function getProductCapabilities(uint256 providerId, uint8 productType, string[] keys) view returns(bool[] exists, string[] values) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProductCapabilities(providerId *big.Int, productType uint8, keys []string) (struct { + Exists []bool + Values []string +}, error) { + return _ServiceProviderRegistry.Contract.GetProductCapabilities(&_ServiceProviderRegistry.CallOpts, providerId, productType, keys) +} + +// GetProductCapabilities is a free data retrieval call binding the contract method 0xa6433240. +// +// Solidity: function getProductCapabilities(uint256 providerId, uint8 productType, string[] keys) view returns(bool[] exists, string[] values) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProductCapabilities(providerId *big.Int, productType uint8, keys []string) (struct { + Exists []bool + Values []string +}, error) { + return _ServiceProviderRegistry.Contract.GetProductCapabilities(&_ServiceProviderRegistry.CallOpts, providerId, productType, keys) +} + +// GetProductCapability is a free data retrieval call binding the contract method 0x1e35bdde. +// +// Solidity: function getProductCapability(uint256 providerId, uint8 productType, string key) view returns(bool exists, string value) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProductCapability(opts *bind.CallOpts, providerId *big.Int, productType uint8, key string) (struct { + Exists bool + Value string +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProductCapability", providerId, productType, key) + + outstruct := new(struct { + Exists bool + Value string + }) + if err != nil { + return *outstruct, err + } + + outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.Value = *abi.ConvertType(out[1], new(string)).(*string) + + return *outstruct, err + +} + +// GetProductCapability is a free data retrieval call binding the contract method 0x1e35bdde. +// +// Solidity: function getProductCapability(uint256 providerId, uint8 productType, string key) view returns(bool exists, string value) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProductCapability(providerId *big.Int, productType uint8, key string) (struct { + Exists bool + Value string +}, error) { + return _ServiceProviderRegistry.Contract.GetProductCapability(&_ServiceProviderRegistry.CallOpts, providerId, productType, key) +} + +// GetProductCapability is a free data retrieval call binding the contract method 0x1e35bdde. +// +// Solidity: function getProductCapability(uint256 providerId, uint8 productType, string key) view returns(bool exists, string value) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProductCapability(providerId *big.Int, productType uint8, key string) (struct { + Exists bool + Value string +}, error) { + return _ServiceProviderRegistry.Contract.GetProductCapability(&_ServiceProviderRegistry.CallOpts, providerId, productType, key) +} + +// GetProvider is a free data retrieval call binding the contract method 0x5c42d079. +// +// Solidity: function getProvider(uint256 providerId) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProvider(opts *bind.CallOpts, providerId *big.Int) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProvider", providerId) + + if err != nil { + return *new(ServiceProviderRegistryStorageServiceProviderInfo), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStorageServiceProviderInfo)).(*ServiceProviderRegistryStorageServiceProviderInfo) + + return out0, err + +} + +// GetProvider is a free data retrieval call binding the contract method 0x5c42d079. +// +// Solidity: function getProvider(uint256 providerId) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProvider(providerId *big.Int) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + return _ServiceProviderRegistry.Contract.GetProvider(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// GetProvider is a free data retrieval call binding the contract method 0x5c42d079. +// +// Solidity: function getProvider(uint256 providerId) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProvider(providerId *big.Int) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + return _ServiceProviderRegistry.Contract.GetProvider(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// GetProviderByAddress is a free data retrieval call binding the contract method 0x2335bde0. +// +// Solidity: function getProviderByAddress(address providerAddress) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProviderByAddress(opts *bind.CallOpts, providerAddress common.Address) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProviderByAddress", providerAddress) + + if err != nil { + return *new(ServiceProviderRegistryStorageServiceProviderInfo), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStorageServiceProviderInfo)).(*ServiceProviderRegistryStorageServiceProviderInfo) + + return out0, err + +} + +// GetProviderByAddress is a free data retrieval call binding the contract method 0x2335bde0. +// +// Solidity: function getProviderByAddress(address providerAddress) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProviderByAddress(providerAddress common.Address) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + return _ServiceProviderRegistry.Contract.GetProviderByAddress(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// GetProviderByAddress is a free data retrieval call binding the contract method 0x2335bde0. +// +// Solidity: function getProviderByAddress(address providerAddress) view returns((address,address,string,string,bool,uint256) info) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProviderByAddress(providerAddress common.Address) (ServiceProviderRegistryStorageServiceProviderInfo, error) { + return _ServiceProviderRegistry.Contract.GetProviderByAddress(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// GetProviderCount is a free data retrieval call binding the contract method 0x46ce4175. +// +// Solidity: function getProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProviderCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProviderCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetProviderCount is a free data retrieval call binding the contract method 0x46ce4175. +// +// Solidity: function getProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProviderCount() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetProviderCount(&_ServiceProviderRegistry.CallOpts) +} + +// GetProviderCount is a free data retrieval call binding the contract method 0x46ce4175. +// +// Solidity: function getProviderCount() view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProviderCount() (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetProviderCount(&_ServiceProviderRegistry.CallOpts) +} + +// GetProviderIdByAddress is a free data retrieval call binding the contract method 0x93ecb91e. +// +// Solidity: function getProviderIdByAddress(address providerAddress) view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProviderIdByAddress(opts *bind.CallOpts, providerAddress common.Address) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProviderIdByAddress", providerAddress) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetProviderIdByAddress is a free data retrieval call binding the contract method 0x93ecb91e. +// +// Solidity: function getProviderIdByAddress(address providerAddress) view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProviderIdByAddress(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetProviderIdByAddress(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// GetProviderIdByAddress is a free data retrieval call binding the contract method 0x93ecb91e. +// +// Solidity: function getProviderIdByAddress(address providerAddress) view returns(uint256) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProviderIdByAddress(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.GetProviderIdByAddress(&_ServiceProviderRegistry.CallOpts, providerAddress) +} + +// GetProvidersByProductType is a free data retrieval call binding the contract method 0xfc260f7b. +// +// Solidity: function getProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) GetProvidersByProductType(opts *bind.CallOpts, productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "getProvidersByProductType", productType, offset, limit) + + if err != nil { + return *new(ServiceProviderRegistryStoragePaginatedProviders), err + } + + out0 := *abi.ConvertType(out[0], new(ServiceProviderRegistryStoragePaginatedProviders)).(*ServiceProviderRegistryStoragePaginatedProviders) + + return out0, err + +} + +// GetProvidersByProductType is a free data retrieval call binding the contract method 0xfc260f7b. +// +// Solidity: function getProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) GetProvidersByProductType(productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + return _ServiceProviderRegistry.Contract.GetProvidersByProductType(&_ServiceProviderRegistry.CallOpts, productType, offset, limit) +} + +// GetProvidersByProductType is a free data retrieval call binding the contract method 0xfc260f7b. +// +// Solidity: function getProvidersByProductType(uint8 productType, uint256 offset, uint256 limit) view returns(((uint256,(address,address,string,string,bool,uint256),(uint8,bytes,string[],bool))[],bool) result) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) GetProvidersByProductType(productType uint8, offset *big.Int, limit *big.Int) (ServiceProviderRegistryStoragePaginatedProviders, error) { + return _ServiceProviderRegistry.Contract.GetProvidersByProductType(&_ServiceProviderRegistry.CallOpts, productType, offset, limit) +} + +// IsProviderActive is a free data retrieval call binding the contract method 0x83df54a5. +// +// Solidity: function isProviderActive(uint256 providerId) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) IsProviderActive(opts *bind.CallOpts, providerId *big.Int) (bool, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "isProviderActive", providerId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsProviderActive is a free data retrieval call binding the contract method 0x83df54a5. +// +// Solidity: function isProviderActive(uint256 providerId) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) IsProviderActive(providerId *big.Int) (bool, error) { + return _ServiceProviderRegistry.Contract.IsProviderActive(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// IsProviderActive is a free data retrieval call binding the contract method 0x83df54a5. +// +// Solidity: function isProviderActive(uint256 providerId) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) IsProviderActive(providerId *big.Int) (bool, error) { + return _ServiceProviderRegistry.Contract.IsProviderActive(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// IsRegisteredProvider is a free data retrieval call binding the contract method 0x51ca236f. +// +// Solidity: function isRegisteredProvider(address provider) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) IsRegisteredProvider(opts *bind.CallOpts, provider common.Address) (bool, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "isRegisteredProvider", provider) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsRegisteredProvider is a free data retrieval call binding the contract method 0x51ca236f. +// +// Solidity: function isRegisteredProvider(address provider) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) IsRegisteredProvider(provider common.Address) (bool, error) { + return _ServiceProviderRegistry.Contract.IsRegisteredProvider(&_ServiceProviderRegistry.CallOpts, provider) +} + +// IsRegisteredProvider is a free data retrieval call binding the contract method 0x51ca236f. +// +// Solidity: function isRegisteredProvider(address provider) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) IsRegisteredProvider(provider common.Address) (bool, error) { + return _ServiceProviderRegistry.Contract.IsRegisteredProvider(&_ServiceProviderRegistry.CallOpts, provider) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Owner() (common.Address, error) { + return _ServiceProviderRegistry.Contract.Owner(&_ServiceProviderRegistry.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) Owner() (common.Address, error) { + return _ServiceProviderRegistry.Contract.Owner(&_ServiceProviderRegistry.CallOpts) +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProductCapabilities(opts *bind.CallOpts, providerId *big.Int, productType uint8, key string) (string, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "productCapabilities", providerId, productType, key) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProductCapabilities(providerId *big.Int, productType uint8, key string) (string, error) { + return _ServiceProviderRegistry.Contract.ProductCapabilities(&_ServiceProviderRegistry.CallOpts, providerId, productType, key) +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProductCapabilities(providerId *big.Int, productType uint8, key string) (string, error) { + return _ServiceProviderRegistry.Contract.ProductCapabilities(&_ServiceProviderRegistry.CallOpts, providerId, productType, key) +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProductTypeProviderCount(opts *bind.CallOpts, productType uint8) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "productTypeProviderCount", productType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ProductTypeProviderCount(&_ServiceProviderRegistry.CallOpts, productType) +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistry.Contract.ProductTypeProviderCount(&_ServiceProviderRegistry.CallOpts, productType) +} + +// ProviderHasProduct is a free data retrieval call binding the contract method 0xcde24beb. +// +// Solidity: function providerHasProduct(uint256 providerId, uint8 productType) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProviderHasProduct(opts *bind.CallOpts, providerId *big.Int, productType uint8) (bool, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "providerHasProduct", providerId, productType) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// ProviderHasProduct is a free data retrieval call binding the contract method 0xcde24beb. +// +// Solidity: function providerHasProduct(uint256 providerId, uint8 productType) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProviderHasProduct(providerId *big.Int, productType uint8) (bool, error) { + return _ServiceProviderRegistry.Contract.ProviderHasProduct(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// ProviderHasProduct is a free data retrieval call binding the contract method 0xcde24beb. +// +// Solidity: function providerHasProduct(uint256 providerId, uint8 productType) view returns(bool) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProviderHasProduct(providerId *big.Int, productType uint8) (bool, error) { + return _ServiceProviderRegistry.Contract.ProviderHasProduct(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProviderProducts(opts *bind.CallOpts, providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "providerProducts", providerId, productType) + + outstruct := new(struct { + ProductType uint8 + ProductData []byte + IsActive bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProductType = *abi.ConvertType(out[0], new(uint8)).(*uint8) + outstruct.ProductData = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + + return *outstruct, err + +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProviderProducts(providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.ProviderProducts(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProviderProducts(providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + return _ServiceProviderRegistry.Contract.ProviderProducts(&_ServiceProviderRegistry.CallOpts, providerId, productType) +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) Providers(opts *bind.CallOpts, providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "providers", providerId) + + outstruct := new(struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.ServiceProvider = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.Payee = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.Name = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.Description = *abi.ConvertType(out[3], new(string)).(*string) + outstruct.IsActive = *abi.ConvertType(out[4], new(bool)).(*bool) + outstruct.ProviderId = *abi.ConvertType(out[5], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Providers(providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + return _ServiceProviderRegistry.Contract.Providers(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) Providers(providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + return _ServiceProviderRegistry.Contract.Providers(&_ServiceProviderRegistry.CallOpts, providerId) +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_ServiceProviderRegistry *ServiceProviderRegistryCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _ServiceProviderRegistry.contract.Call(opts, &out, "proxiableUUID") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) ProxiableUUID() ([32]byte, error) { + return _ServiceProviderRegistry.Contract.ProxiableUUID(&_ServiceProviderRegistry.CallOpts) +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_ServiceProviderRegistry *ServiceProviderRegistryCallerSession) ProxiableUUID() ([32]byte, error) { + return _ServiceProviderRegistry.Contract.ProxiableUUID(&_ServiceProviderRegistry.CallOpts) +} + +// AddProduct is a paid mutator transaction binding the contract method 0x02ff8437. +// +// Solidity: function addProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) AddProduct(opts *bind.TransactOpts, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "addProduct", productType, productData, capabilityKeys, capabilityValues) +} + +// AddProduct is a paid mutator transaction binding the contract method 0x02ff8437. +// +// Solidity: function addProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) AddProduct(productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.AddProduct(&_ServiceProviderRegistry.TransactOpts, productType, productData, capabilityKeys, capabilityValues) +} + +// AddProduct is a paid mutator transaction binding the contract method 0x02ff8437. +// +// Solidity: function addProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) AddProduct(productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.AddProduct(&_ServiceProviderRegistry.TransactOpts, productType, productData, capabilityKeys, capabilityValues) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "initialize") +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Initialize() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.Initialize(&_ServiceProviderRegistry.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) Initialize() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.Initialize(&_ServiceProviderRegistry.TransactOpts) +} + +// Migrate is a paid mutator transaction binding the contract method 0xc9c5b5b4. +// +// Solidity: function migrate(string newVersion) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) Migrate(opts *bind.TransactOpts, newVersion string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "migrate", newVersion) +} + +// Migrate is a paid mutator transaction binding the contract method 0xc9c5b5b4. +// +// Solidity: function migrate(string newVersion) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) Migrate(newVersion string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.Migrate(&_ServiceProviderRegistry.TransactOpts, newVersion) +} + +// Migrate is a paid mutator transaction binding the contract method 0xc9c5b5b4. +// +// Solidity: function migrate(string newVersion) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) Migrate(newVersion string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.Migrate(&_ServiceProviderRegistry.TransactOpts, newVersion) +} + +// RegisterProvider is a paid mutator transaction binding the contract method 0xb47be8ab. +// +// Solidity: function registerProvider(address payee, string name, string description, uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) payable returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) RegisterProvider(opts *bind.TransactOpts, payee common.Address, name string, description string, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "registerProvider", payee, name, description, productType, productData, capabilityKeys, capabilityValues) +} + +// RegisterProvider is a paid mutator transaction binding the contract method 0xb47be8ab. +// +// Solidity: function registerProvider(address payee, string name, string description, uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) payable returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) RegisterProvider(payee common.Address, name string, description string, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RegisterProvider(&_ServiceProviderRegistry.TransactOpts, payee, name, description, productType, productData, capabilityKeys, capabilityValues) +} + +// RegisterProvider is a paid mutator transaction binding the contract method 0xb47be8ab. +// +// Solidity: function registerProvider(address payee, string name, string description, uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) payable returns(uint256 providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) RegisterProvider(payee common.Address, name string, description string, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RegisterProvider(&_ServiceProviderRegistry.TransactOpts, payee, name, description, productType, productData, capabilityKeys, capabilityValues) +} + +// RemoveProduct is a paid mutator transaction binding the contract method 0xa9d239b6. +// +// Solidity: function removeProduct(uint8 productType) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) RemoveProduct(opts *bind.TransactOpts, productType uint8) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "removeProduct", productType) +} + +// RemoveProduct is a paid mutator transaction binding the contract method 0xa9d239b6. +// +// Solidity: function removeProduct(uint8 productType) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) RemoveProduct(productType uint8) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RemoveProduct(&_ServiceProviderRegistry.TransactOpts, productType) +} + +// RemoveProduct is a paid mutator transaction binding the contract method 0xa9d239b6. +// +// Solidity: function removeProduct(uint8 productType) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) RemoveProduct(productType uint8) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RemoveProduct(&_ServiceProviderRegistry.TransactOpts, productType) +} + +// RemoveProvider is a paid mutator transaction binding the contract method 0xb6363b99. +// +// Solidity: function removeProvider() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) RemoveProvider(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "removeProvider") +} + +// RemoveProvider is a paid mutator transaction binding the contract method 0xb6363b99. +// +// Solidity: function removeProvider() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) RemoveProvider() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RemoveProvider(&_ServiceProviderRegistry.TransactOpts) +} + +// RemoveProvider is a paid mutator transaction binding the contract method 0xb6363b99. +// +// Solidity: function removeProvider() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) RemoveProvider() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RemoveProvider(&_ServiceProviderRegistry.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) RenounceOwnership() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RenounceOwnership(&_ServiceProviderRegistry.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.RenounceOwnership(&_ServiceProviderRegistry.TransactOpts) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.TransferOwnership(&_ServiceProviderRegistry.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.TransferOwnership(&_ServiceProviderRegistry.TransactOpts, newOwner) +} + +// UpdatePDPServiceWithCapabilities is a paid mutator transaction binding the contract method 0x0b5c0125. +// +// Solidity: function updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) UpdatePDPServiceWithCapabilities(opts *bind.TransactOpts, pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "updatePDPServiceWithCapabilities", pdpOffering, capabilityKeys, capabilityValues) +} + +// UpdatePDPServiceWithCapabilities is a paid mutator transaction binding the contract method 0x0b5c0125. +// +// Solidity: function updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UpdatePDPServiceWithCapabilities(pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdatePDPServiceWithCapabilities(&_ServiceProviderRegistry.TransactOpts, pdpOffering, capabilityKeys, capabilityValues) +} + +// UpdatePDPServiceWithCapabilities is a paid mutator transaction binding the contract method 0x0b5c0125. +// +// Solidity: function updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address) pdpOffering, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) UpdatePDPServiceWithCapabilities(pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdatePDPServiceWithCapabilities(&_ServiceProviderRegistry.TransactOpts, pdpOffering, capabilityKeys, capabilityValues) +} + +// UpdateProduct is a paid mutator transaction binding the contract method 0x8c9a7b56. +// +// Solidity: function updateProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) UpdateProduct(opts *bind.TransactOpts, productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "updateProduct", productType, productData, capabilityKeys, capabilityValues) +} + +// UpdateProduct is a paid mutator transaction binding the contract method 0x8c9a7b56. +// +// Solidity: function updateProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UpdateProduct(productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdateProduct(&_ServiceProviderRegistry.TransactOpts, productType, productData, capabilityKeys, capabilityValues) +} + +// UpdateProduct is a paid mutator transaction binding the contract method 0x8c9a7b56. +// +// Solidity: function updateProduct(uint8 productType, bytes productData, string[] capabilityKeys, string[] capabilityValues) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) UpdateProduct(productType uint8, productData []byte, capabilityKeys []string, capabilityValues []string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdateProduct(&_ServiceProviderRegistry.TransactOpts, productType, productData, capabilityKeys, capabilityValues) +} + +// UpdateProviderInfo is a paid mutator transaction binding the contract method 0xd1c21b5b. +// +// Solidity: function updateProviderInfo(string name, string description) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) UpdateProviderInfo(opts *bind.TransactOpts, name string, description string) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "updateProviderInfo", name, description) +} + +// UpdateProviderInfo is a paid mutator transaction binding the contract method 0xd1c21b5b. +// +// Solidity: function updateProviderInfo(string name, string description) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UpdateProviderInfo(name string, description string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdateProviderInfo(&_ServiceProviderRegistry.TransactOpts, name, description) +} + +// UpdateProviderInfo is a paid mutator transaction binding the contract method 0xd1c21b5b. +// +// Solidity: function updateProviderInfo(string name, string description) returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) UpdateProviderInfo(name string, description string) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpdateProviderInfo(&_ServiceProviderRegistry.TransactOpts, name, description) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _ServiceProviderRegistry.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_ServiceProviderRegistry *ServiceProviderRegistrySession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpgradeToAndCall(&_ServiceProviderRegistry.TransactOpts, newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_ServiceProviderRegistry *ServiceProviderRegistryTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _ServiceProviderRegistry.Contract.UpgradeToAndCall(&_ServiceProviderRegistry.TransactOpts, newImplementation, data) +} + +// ServiceProviderRegistryContractUpgradedIterator is returned from FilterContractUpgraded and is used to iterate over the raw logs and unpacked data for ContractUpgraded events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryContractUpgradedIterator struct { + Event *ServiceProviderRegistryContractUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryContractUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryContractUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryContractUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryContractUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryContractUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryContractUpgraded represents a ContractUpgraded event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryContractUpgraded struct { + Version string + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterContractUpgraded is a free log retrieval operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. +// +// Solidity: event ContractUpgraded(string version, address implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterContractUpgraded(opts *bind.FilterOpts) (*ServiceProviderRegistryContractUpgradedIterator, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ContractUpgraded") + if err != nil { + return nil, err + } + return &ServiceProviderRegistryContractUpgradedIterator{contract: _ServiceProviderRegistry.contract, event: "ContractUpgraded", logs: logs, sub: sub}, nil +} + +// WatchContractUpgraded is a free log subscription operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. +// +// Solidity: event ContractUpgraded(string version, address implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchContractUpgraded(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryContractUpgraded) (event.Subscription, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ContractUpgraded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryContractUpgraded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ContractUpgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseContractUpgraded is a log parse operation binding the contract event 0x2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c3. +// +// Solidity: event ContractUpgraded(string version, address implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseContractUpgraded(log types.Log) (*ServiceProviderRegistryContractUpgraded, error) { + event := new(ServiceProviderRegistryContractUpgraded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ContractUpgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryEIP712DomainChangedIterator is returned from FilterEIP712DomainChanged and is used to iterate over the raw logs and unpacked data for EIP712DomainChanged events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryEIP712DomainChangedIterator struct { + Event *ServiceProviderRegistryEIP712DomainChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryEIP712DomainChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryEIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryEIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryEIP712DomainChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryEIP712DomainChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryEIP712DomainChanged represents a EIP712DomainChanged event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryEIP712DomainChanged struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEIP712DomainChanged is a free log retrieval operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterEIP712DomainChanged(opts *bind.FilterOpts) (*ServiceProviderRegistryEIP712DomainChangedIterator, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return &ServiceProviderRegistryEIP712DomainChangedIterator{contract: _ServiceProviderRegistry.contract, event: "EIP712DomainChanged", logs: logs, sub: sub}, nil +} + +// WatchEIP712DomainChanged is a free log subscription operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchEIP712DomainChanged(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryEIP712DomainChanged) (event.Subscription, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryEIP712DomainChanged) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEIP712DomainChanged is a log parse operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseEIP712DomainChanged(log types.Log) (*ServiceProviderRegistryEIP712DomainChanged, error) { + event := new(ServiceProviderRegistryEIP712DomainChanged) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryInitializedIterator struct { + Event *ServiceProviderRegistryInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryInitialized represents a Initialized event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterInitialized(opts *bind.FilterOpts) (*ServiceProviderRegistryInitializedIterator, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ServiceProviderRegistryInitializedIterator{contract: _ServiceProviderRegistry.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryInitialized) (event.Subscription, error) { + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryInitialized) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseInitialized(log types.Log) (*ServiceProviderRegistryInitialized, error) { + event := new(ServiceProviderRegistryInitialized) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryOwnershipTransferredIterator struct { + Event *ServiceProviderRegistryOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryOwnershipTransferred represents a OwnershipTransferred event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ServiceProviderRegistryOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryOwnershipTransferredIterator{contract: _ServiceProviderRegistry.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryOwnershipTransferred) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseOwnershipTransferred(log types.Log) (*ServiceProviderRegistryOwnershipTransferred, error) { + event := new(ServiceProviderRegistryOwnershipTransferred) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProductAddedIterator is returned from FilterProductAdded and is used to iterate over the raw logs and unpacked data for ProductAdded events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductAddedIterator struct { + Event *ServiceProviderRegistryProductAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProductAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProductAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProductAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProductAdded represents a ProductAdded event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductAdded struct { + ProviderId *big.Int + ProductType uint8 + ServiceUrl string + ServiceProvider common.Address + CapabilityKeys []string + CapabilityValues []string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProductAdded is a free log retrieval operation binding the contract event 0x93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717. +// +// Solidity: event ProductAdded(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProductAdded(opts *bind.FilterOpts, providerId []*big.Int, productType []uint8) (*ServiceProviderRegistryProductAddedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProductAdded", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProductAddedIterator{contract: _ServiceProviderRegistry.contract, event: "ProductAdded", logs: logs, sub: sub}, nil +} + +// WatchProductAdded is a free log subscription operation binding the contract event 0x93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717. +// +// Solidity: event ProductAdded(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProductAdded(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProductAdded, providerId []*big.Int, productType []uint8) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProductAdded", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProductAdded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProductAdded is a log parse operation binding the contract event 0x93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717. +// +// Solidity: event ProductAdded(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProductAdded(log types.Log) (*ServiceProviderRegistryProductAdded, error) { + event := new(ServiceProviderRegistryProductAdded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProductRemovedIterator is returned from FilterProductRemoved and is used to iterate over the raw logs and unpacked data for ProductRemoved events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductRemovedIterator struct { + Event *ServiceProviderRegistryProductRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProductRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProductRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProductRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProductRemoved represents a ProductRemoved event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductRemoved struct { + ProviderId *big.Int + ProductType uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProductRemoved is a free log retrieval operation binding the contract event 0x4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d. +// +// Solidity: event ProductRemoved(uint256 indexed providerId, uint8 indexed productType) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProductRemoved(opts *bind.FilterOpts, providerId []*big.Int, productType []uint8) (*ServiceProviderRegistryProductRemovedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProductRemoved", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProductRemovedIterator{contract: _ServiceProviderRegistry.contract, event: "ProductRemoved", logs: logs, sub: sub}, nil +} + +// WatchProductRemoved is a free log subscription operation binding the contract event 0x4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d. +// +// Solidity: event ProductRemoved(uint256 indexed providerId, uint8 indexed productType) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProductRemoved(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProductRemoved, providerId []*big.Int, productType []uint8) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProductRemoved", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProductRemoved) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProductRemoved is a log parse operation binding the contract event 0x4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d. +// +// Solidity: event ProductRemoved(uint256 indexed providerId, uint8 indexed productType) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProductRemoved(log types.Log) (*ServiceProviderRegistryProductRemoved, error) { + event := new(ServiceProviderRegistryProductRemoved) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProductUpdatedIterator is returned from FilterProductUpdated and is used to iterate over the raw logs and unpacked data for ProductUpdated events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductUpdatedIterator struct { + Event *ServiceProviderRegistryProductUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProductUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProductUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProductUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProductUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProductUpdated represents a ProductUpdated event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProductUpdated struct { + ProviderId *big.Int + ProductType uint8 + ServiceUrl string + ServiceProvider common.Address + CapabilityKeys []string + CapabilityValues []string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProductUpdated is a free log retrieval operation binding the contract event 0xc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6. +// +// Solidity: event ProductUpdated(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProductUpdated(opts *bind.FilterOpts, providerId []*big.Int, productType []uint8) (*ServiceProviderRegistryProductUpdatedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProductUpdated", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProductUpdatedIterator{contract: _ServiceProviderRegistry.contract, event: "ProductUpdated", logs: logs, sub: sub}, nil +} + +// WatchProductUpdated is a free log subscription operation binding the contract event 0xc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6. +// +// Solidity: event ProductUpdated(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProductUpdated(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProductUpdated, providerId []*big.Int, productType []uint8) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var productTypeRule []interface{} + for _, productTypeItem := range productType { + productTypeRule = append(productTypeRule, productTypeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProductUpdated", providerIdRule, productTypeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProductUpdated) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProductUpdated is a log parse operation binding the contract event 0xc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6. +// +// Solidity: event ProductUpdated(uint256 indexed providerId, uint8 indexed productType, string serviceUrl, address serviceProvider, string[] capabilityKeys, string[] capabilityValues) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProductUpdated(log types.Log) (*ServiceProviderRegistryProductUpdated, error) { + event := new(ServiceProviderRegistryProductUpdated) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProductUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProviderInfoUpdatedIterator is returned from FilterProviderInfoUpdated and is used to iterate over the raw logs and unpacked data for ProviderInfoUpdated events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderInfoUpdatedIterator struct { + Event *ServiceProviderRegistryProviderInfoUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProviderInfoUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderInfoUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderInfoUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProviderInfoUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProviderInfoUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProviderInfoUpdated represents a ProviderInfoUpdated event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderInfoUpdated struct { + ProviderId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProviderInfoUpdated is a free log retrieval operation binding the contract event 0xae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f76. +// +// Solidity: event ProviderInfoUpdated(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProviderInfoUpdated(opts *bind.FilterOpts, providerId []*big.Int) (*ServiceProviderRegistryProviderInfoUpdatedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProviderInfoUpdated", providerIdRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProviderInfoUpdatedIterator{contract: _ServiceProviderRegistry.contract, event: "ProviderInfoUpdated", logs: logs, sub: sub}, nil +} + +// WatchProviderInfoUpdated is a free log subscription operation binding the contract event 0xae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f76. +// +// Solidity: event ProviderInfoUpdated(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProviderInfoUpdated(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProviderInfoUpdated, providerId []*big.Int) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProviderInfoUpdated", providerIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProviderInfoUpdated) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderInfoUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProviderInfoUpdated is a log parse operation binding the contract event 0xae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f76. +// +// Solidity: event ProviderInfoUpdated(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProviderInfoUpdated(log types.Log) (*ServiceProviderRegistryProviderInfoUpdated, error) { + event := new(ServiceProviderRegistryProviderInfoUpdated) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderInfoUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProviderRegisteredIterator is returned from FilterProviderRegistered and is used to iterate over the raw logs and unpacked data for ProviderRegistered events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderRegisteredIterator struct { + Event *ServiceProviderRegistryProviderRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProviderRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProviderRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProviderRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProviderRegistered represents a ProviderRegistered event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderRegistered struct { + ProviderId *big.Int + ServiceProvider common.Address + Payee common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProviderRegistered is a free log retrieval operation binding the contract event 0xaff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a5. +// +// Solidity: event ProviderRegistered(uint256 indexed providerId, address indexed serviceProvider, address indexed payee) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProviderRegistered(opts *bind.FilterOpts, providerId []*big.Int, serviceProvider []common.Address, payee []common.Address) (*ServiceProviderRegistryProviderRegisteredIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var serviceProviderRule []interface{} + for _, serviceProviderItem := range serviceProvider { + serviceProviderRule = append(serviceProviderRule, serviceProviderItem) + } + var payeeRule []interface{} + for _, payeeItem := range payee { + payeeRule = append(payeeRule, payeeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProviderRegistered", providerIdRule, serviceProviderRule, payeeRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProviderRegisteredIterator{contract: _ServiceProviderRegistry.contract, event: "ProviderRegistered", logs: logs, sub: sub}, nil +} + +// WatchProviderRegistered is a free log subscription operation binding the contract event 0xaff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a5. +// +// Solidity: event ProviderRegistered(uint256 indexed providerId, address indexed serviceProvider, address indexed payee) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProviderRegistered(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProviderRegistered, providerId []*big.Int, serviceProvider []common.Address, payee []common.Address) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + var serviceProviderRule []interface{} + for _, serviceProviderItem := range serviceProvider { + serviceProviderRule = append(serviceProviderRule, serviceProviderItem) + } + var payeeRule []interface{} + for _, payeeItem := range payee { + payeeRule = append(payeeRule, payeeItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProviderRegistered", providerIdRule, serviceProviderRule, payeeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProviderRegistered) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProviderRegistered is a log parse operation binding the contract event 0xaff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a5. +// +// Solidity: event ProviderRegistered(uint256 indexed providerId, address indexed serviceProvider, address indexed payee) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProviderRegistered(log types.Log) (*ServiceProviderRegistryProviderRegistered, error) { + event := new(ServiceProviderRegistryProviderRegistered) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryProviderRemovedIterator is returned from FilterProviderRemoved and is used to iterate over the raw logs and unpacked data for ProviderRemoved events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderRemovedIterator struct { + Event *ServiceProviderRegistryProviderRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryProviderRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryProviderRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryProviderRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryProviderRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryProviderRemoved represents a ProviderRemoved event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryProviderRemoved struct { + ProviderId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProviderRemoved is a free log retrieval operation binding the contract event 0x452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc4. +// +// Solidity: event ProviderRemoved(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterProviderRemoved(opts *bind.FilterOpts, providerId []*big.Int) (*ServiceProviderRegistryProviderRemovedIterator, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "ProviderRemoved", providerIdRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryProviderRemovedIterator{contract: _ServiceProviderRegistry.contract, event: "ProviderRemoved", logs: logs, sub: sub}, nil +} + +// WatchProviderRemoved is a free log subscription operation binding the contract event 0x452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc4. +// +// Solidity: event ProviderRemoved(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchProviderRemoved(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryProviderRemoved, providerId []*big.Int) (event.Subscription, error) { + + var providerIdRule []interface{} + for _, providerIdItem := range providerId { + providerIdRule = append(providerIdRule, providerIdItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "ProviderRemoved", providerIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryProviderRemoved) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProviderRemoved is a log parse operation binding the contract event 0x452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc4. +// +// Solidity: event ProviderRemoved(uint256 indexed providerId) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseProviderRemoved(log types.Log) (*ServiceProviderRegistryProviderRemoved, error) { + event := new(ServiceProviderRegistryProviderRemoved) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "ProviderRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ServiceProviderRegistryUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryUpgradedIterator struct { + Event *ServiceProviderRegistryUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ServiceProviderRegistryUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ServiceProviderRegistryUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ServiceProviderRegistryUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ServiceProviderRegistryUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ServiceProviderRegistryUpgraded represents a Upgraded event raised by the ServiceProviderRegistry contract. +type ServiceProviderRegistryUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*ServiceProviderRegistryUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryUpgradedIterator{contract: _ServiceProviderRegistry.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *ServiceProviderRegistryUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _ServiceProviderRegistry.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ServiceProviderRegistryUpgraded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_ServiceProviderRegistry *ServiceProviderRegistryFilterer) ParseUpgraded(log types.Log) (*ServiceProviderRegistryUpgraded, error) { + event := new(ServiceProviderRegistryUpgraded) + if err := _ServiceProviderRegistry.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pdp/contract/ServiceProviderRegistry.json b/pdp/contract/ServiceProviderRegistry.json new file mode 100644 index 000000000..ec2bb6260 --- /dev/null +++ b/pdp/contract/ServiceProviderRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"BURN_ACTOR","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MAX_CAPABILITIES","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_CAPABILITY_KEY_LENGTH","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_CAPABILITY_VALUE_LENGTH","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"REGISTRATION_FEE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"activeProductTypeProviderCount","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"activeProviderCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addProduct","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"capabilityValues","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addressToProviderId","inputs":[{"name":"providerAddress","type":"address","internalType":"address"}],"outputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decodePDPOffering","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PDPOffering","components":[{"name":"serviceURL","type":"string","internalType":"string"},{"name":"minPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"maxPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"ipniPiece","type":"bool","internalType":"bool"},{"name":"ipniIpfs","type":"bool","internalType":"bool"},{"name":"storagePricePerTibPerMonth","type":"uint256","internalType":"uint256"},{"name":"minProvingPeriodInEpochs","type":"uint256","internalType":"uint256"},{"name":"location","type":"string","internalType":"string"},{"name":"paymentTokenAddress","type":"address","internalType":"contract IERC20"}]}],"stateMutability":"pure"},{"type":"function","name":"eip712Domain","inputs":[],"outputs":[{"name":"fields","type":"bytes1","internalType":"bytes1"},{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"verifyingContract","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"extensions","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"encodePDPOffering","inputs":[{"name":"pdpOffering","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PDPOffering","components":[{"name":"serviceURL","type":"string","internalType":"string"},{"name":"minPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"maxPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"ipniPiece","type":"bool","internalType":"bool"},{"name":"ipniIpfs","type":"bool","internalType":"bool"},{"name":"storagePricePerTibPerMonth","type":"uint256","internalType":"uint256"},{"name":"minProvingPeriodInEpochs","type":"uint256","internalType":"uint256"},{"name":"location","type":"string","internalType":"string"},{"name":"paymentTokenAddress","type":"address","internalType":"contract IERC20"}]}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"function","name":"getActiveProvidersByProductType","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"result","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PaginatedProviders","components":[{"name":"providers","type":"tuple[]","internalType":"struct ServiceProviderRegistryStorage.ProviderWithProduct[]","components":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"providerInfo","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","components":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}]},{"name":"product","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProduct","components":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"isActive","type":"bool","internalType":"bool"}]}]},{"name":"hasMore","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"getAllActiveProviders","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"providerIds","type":"uint256[]","internalType":"uint256[]"},{"name":"hasMore","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getNextProviderId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getPDPService","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"pdpOffering","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PDPOffering","components":[{"name":"serviceURL","type":"string","internalType":"string"},{"name":"minPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"maxPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"ipniPiece","type":"bool","internalType":"bool"},{"name":"ipniIpfs","type":"bool","internalType":"bool"},{"name":"storagePricePerTibPerMonth","type":"uint256","internalType":"uint256"},{"name":"minProvingPeriodInEpochs","type":"uint256","internalType":"uint256"},{"name":"location","type":"string","internalType":"string"},{"name":"paymentTokenAddress","type":"address","internalType":"contract IERC20"}]},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getProduct","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getProductCapabilities","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"keys","type":"string[]","internalType":"string[]"}],"outputs":[{"name":"exists","type":"bool[]","internalType":"bool[]"},{"name":"values","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"getProductCapability","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"exists","type":"bool","internalType":"bool"},{"name":"value","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"getProvider","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"info","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","components":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getProviderByAddress","inputs":[{"name":"providerAddress","type":"address","internalType":"address"}],"outputs":[{"name":"info","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","components":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getProviderCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getProviderIdByAddress","inputs":[{"name":"providerAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getProvidersByProductType","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"result","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PaginatedProviders","components":[{"name":"providers","type":"tuple[]","internalType":"struct ServiceProviderRegistryStorage.ProviderWithProduct[]","components":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"providerInfo","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","components":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}]},{"name":"product","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.ServiceProduct","components":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"isActive","type":"bool","internalType":"bool"}]}]},{"name":"hasMore","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isProviderActive","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isRegisteredProvider","inputs":[{"name":"provider","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"migrate","inputs":[{"name":"newVersion","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"productCapabilities","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"productTypeProviderCount","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"providerHasProduct","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"providerProducts","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"providers","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"registerProvider","inputs":[{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"capabilityValues","type":"string[]","internalType":"string[]"}],"outputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"removeProduct","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeProvider","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updatePDPServiceWithCapabilities","inputs":[{"name":"pdpOffering","type":"tuple","internalType":"struct ServiceProviderRegistryStorage.PDPOffering","components":[{"name":"serviceURL","type":"string","internalType":"string"},{"name":"minPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"maxPieceSizeInBytes","type":"uint256","internalType":"uint256"},{"name":"ipniPiece","type":"bool","internalType":"bool"},{"name":"ipniIpfs","type":"bool","internalType":"bool"},{"name":"storagePricePerTibPerMonth","type":"uint256","internalType":"uint256"},{"name":"minProvingPeriodInEpochs","type":"uint256","internalType":"uint256"},{"name":"location","type":"string","internalType":"string"},{"name":"paymentTokenAddress","type":"address","internalType":"contract IERC20"}]},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"capabilityValues","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateProduct","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"capabilityKeys","type":"string[]","internalType":"string[]"},{"name":"capabilityValues","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateProviderInfo","inputs":[{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"ContractUpgraded","inputs":[{"name":"version","type":"string","indexed":false,"internalType":"string"},{"name":"implementation","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProductAdded","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"productType","type":"uint8","indexed":true,"internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"serviceUrl","type":"string","indexed":false,"internalType":"string"},{"name":"serviceProvider","type":"address","indexed":false,"internalType":"address"},{"name":"capabilityKeys","type":"string[]","indexed":false,"internalType":"string[]"},{"name":"capabilityValues","type":"string[]","indexed":false,"internalType":"string[]"}],"anonymous":false},{"type":"event","name":"ProductRemoved","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"productType","type":"uint8","indexed":true,"internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"anonymous":false},{"type":"event","name":"ProductUpdated","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"productType","type":"uint8","indexed":true,"internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"serviceUrl","type":"string","indexed":false,"internalType":"string"},{"name":"serviceProvider","type":"address","indexed":false,"internalType":"address"},{"name":"capabilityKeys","type":"string[]","indexed":false,"internalType":"string[]"},{"name":"capabilityValues","type":"string[]","indexed":false,"internalType":"string[]"}],"anonymous":false},{"type":"event","name":"ProviderInfoUpdated","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ProviderRegistered","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"serviceProvider","type":"address","indexed":true,"internalType":"address"},{"name":"payee","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProviderRemoved","inputs":[{"name":"providerId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x60a080604052346100c257306080525f51602061523c5f395f51905f525460ff8160401c166100b3576002600160401b03196001600160401b03821601610060575b60405161517590816100c78239608051818181612561015261494b0152f35b6001600160401b0319166001600160401b039081175f51602061523c5f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80610041565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806302ff8437146131c65780630a6a63f1146131a45780630b5c012514612a485780631e35bdde14612983578063213c63b1146129695780632335bde01461291d5780632f67c065146128db5780634368bafb1461285857806346ce41751461283c5780634f1ef286146126c357806350f3fc811461261357806351ca236f146125b557806352d1902d1461254f5780635c42d079146124c957806364b4f751146124a75780636bf6d74f146124385780636e36e9741461241d578063715018a6146123b65780637f6575671461239c5780638129fc1c14611eff57806382ee4b3414611eb057806383df54a514611e3f57806384b0196e14611b9c5780638bdc774714611b745780638c9a7b561461165f5780638da5cb5b1461162b57806393ecb91e146102d0578063a643324014611430578063a9d239b6146112a1578063aca0988f14611201578063ad3cb1cc146111ba578063b47be8ab14610b85578063b6363b9914610992578063c439fd57146108ac578063c9c5b5b41461070a578063cde24beb14610698578063d1329d4e1461065c578063d1c21b5b146103a3578063dcea1c6f14610388578063deb0e46214610339578063e459382f14610308578063e835440e146102d0578063f08bbda0146102b3578063f2fde38b14610288578063fc260f7b146102625763ffa1ad7414610213575f80fd5b3461025e575f36600319011261025e5761025a604051610234604082613491565b6005815264302e302e3160d81b6020820152604051918291602083526020830190613690565b0390f35b5f80fd5b3461025e5761025a61027c610276366136b4565b9161460b565b60405191829182613749565b3461025e57602036600319011261025e576102b16102a461386d565b6102ac61499f565b61459a565b005b3461025e575f36600319011261025e576020600754604051908152f35b3461025e57602036600319011261025e576001600160a01b036102f161386d565b165f526003602052602060405f2054604051908152f35b3461025e57602036600319011261025e57600435600181101561025e576103306020916138cd565b54604051908152f35b3461025e57602036600319011261025e576004356001600160401b03811161025e5761037461036f61025a923690600401613503565b61457e565b604051918291602083526020830190613a2a565b3461025e575f36600319011261025e57602060405160808152f35b3461025e57604036600319011261025e576004356001600160401b03811161025e576103d3903690600401613347565b6024356001600160401b03811161025e576103f2903690600401613347565b9092335f52600360205260405f20549283151561040e81613b09565b80610651575b61041d90613b55565b5f8481526001602052604090205461043f906001600160a01b03161515613ba1565b835f52600160205261045a60ff600460405f20015416614407565b610467608082111561422d565b610475610100841115614269565b835f526001602052600260405f2001916001600160401b0382116105ce576104a7826104a185546138fa565b856142c2565b5f90601f83116001146105ed576104d592915f91836105e2575b50508160011b915f199060031b1c19161790565b90555b815f526001602052600360405f2001906001600160401b0381116105ce5761050a8161050484546138fa565b846142c2565b5f601f821160011461056c5781906105389394955f926105615750508160011b915f199060031b1c19161790565b90555b7fae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f765f80a2005b0135905085806104c1565b601f19821694835f5260205f20915f5b8781106105b657508360019596971061059d575b505050811b01905561053b565b01355f19600384901b60f8161c19169055848080610590565b9092602060018192868601358155019401910161057c565b634e487b7160e01b5f52604160045260245ffd5b0135905087806104c1565b601f19831691845f5260205f20925f5b8181106106395750908460019594939210610620575b505050811b0190556104d8565b01355f19600384901b60f8161c19169055868080610613565b919360206001819287870135815501950192016105fd565b505f54841115610414565b3461025e575f36600319011261025e575f546001810180911161068457602090604051908152f35b634e487b7160e01b5f52601160045260245ffd5b3461025e57602060ff60036106f26106af366139b3565b90801515806106ff575b6106c290613b55565b5f8181526001875260409020546106e3906001600160a01b03161515613ba1565b5f526002855260405f206138e4565b0154166040519015158152f35b505f548111156106b9565b3461025e57602036600319011261025e576004356001600160401b03811161025e5761073a903690600401613503565b610742614941565b5f5160206151205f395f51905f525460ff8160401c16908115610897575b506108885760026001600160401b03195f5160206151205f395f51905f525416175f5160206151205f395f51905f525560ff60401b195f5160206151205f395f51905f52541690303303610843576107fe7f2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c39160018060a01b035f5160206151005f395f51905f525416604051928392604084526040840190613690565b9060208301520390a15f5160206151205f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160028152a1005b60405162461bcd60e51b815260206004820152601a60248201527f4f6e6c792073656c662063616e2063616c6c206d6967726174650000000000006044820152606490fd5b63f92ee8a960e01b5f5260045ffd5b600291506001600160401b0316101582610760565b3461025e57602036600319011261025e576109476004356108cb6143c2565b81151580610987575b6108dd90613b55565b5f828152600160205260409020546108ff906001600160a01b03161515613ba1565b9060605f915f52600260205260405f205f805260205261092160405f20613dfe565b60208101518051610961575b505061095590604051948594606086526060860190613a2a565b9084820360208601526139d2565b90151560408301520390f35b9150925061096f915061457e565b9061095560606040830151920151151591908561092d565b505f548211156108d4565b3461025e575f36600319011261025e57335f52600360205260405f20548015156109bb81613b09565b80610b7a575b6109ca90613b55565b5f818152600160205260409020546109ec906001600160a01b03161515613ba1565b805f526001602052610a0760ff600460405f20015416614407565b5f81815260016020526040902054610a29906001600160a01b0316331461473c565b805f526001602052600460405f200160ff198154169055610a4b6007546149d2565b600755805f52600260205260405f205f8052602052610a70600160405f2001546138fa565b610abd575b805f52600160205260018060a01b0360405f2054165f5260036020525f60408120557f452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc45f80a2005b805f52600260205260405f205f805260205260405f206003810160ff815416610b3f575b90825f52600460205260405f205f805260205260405f209260025f9201915b8254811015610b2e5780610b28610b2387610b1d60019588614841565b50614856565b6148db565b01610b00565b5092505060ff198154169055610a75565b5f805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f88054610b73906149d2565b9055610ae1565b505f548111156109c1565b60e036600319011261025e57610b9961386d565b6024356001600160401b03811161025e57610bb8903690600401613347565b6044929192356001600160401b03811161025e57610bda903690600401613347565b93909160643591600183101561025e576084356001600160401b03811161025e57610c09903690600401613347565b929060a4356001600160401b03811161025e57610c2a903690600401613374565b909760c4356001600160401b03811161025e57610c4b903690600401613374565b949095610c588915613aab565b6001600160a01b0383161561117557335f52600360205260405f205461113057674563918244f4000034036110f457610c94608083111561422d565b610ca26101008d1115614269565b5f54610cad90613d6b565b998a5f556040519c8d92610cc084613424565b3384526001600160a01b0386166020850190815294610ce1913691906134cd565b926040019283523690610cf3926134cd565b60608d01908152600160808e0181905260a08e018c90525f8c81526020829052604090208e5181546001600160a01b03199081166001600160a01b03928316178355955192820180549096169216919091179093559051805160028401916001600160401b0382116105ce57610d6d826104a185546138fa565b602090601f831160011461109157610d9b92915f918361100d5750508160011b915f199060031b1c19161790565b90555b519a8b519b6001600160401b038d116105ce578c90610dcd82610dc460038701546138fa565b600387016142c2565b601f602092116001146110185791610e058e8d9e9f60a0949d9e9d6005965f9261100d5750508160011b915f199060031b1c19161790565b60038501555b610e2a60808201511515600486019060ff801983541691151516179055565b0151910155335f5260036020528660405f2055610e48600754613d6b565b6007556001600160a01b031633877faff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a55f80a4610ea6610e883687856134cd565b610e9336848d61360a565b610e9e36878961360a565b918a8a6149de565b6020988992604051610eb88582613491565b5f8152968915610f9f575b505092610f2e610f3c93610f1d96937f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af71798968a5f526001835260018060a01b0360405f205416604051998a9960808b5260808b0190613690565b9389015287830360408901526142fc565b9184830360608601526142fc565b0390a35f808080674563918244f40000606360ff60981b015af1610f5e614393565b5015610f6c57604051908152f35b60405162461bcd60e51b815260048101839052600b60248201526a109d5c9b8819985a5b195960aa1b6044820152606490fd5b929597509250929450810194888287031261025e578135946001600160401b03861161025e57610f2e8a610f1d96610ffe8c9a7f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af7179a610f3c980161352e565b51985093965093949194610ec3565b015190505f806104c1565b908d91600385015f52815f20925f905b601f1916811061107857508e8d9e9f93600595939d9e9d60019360a096601f19811610611060575b505050811b016003850155610e0b565b01515f1960f88460031b161c191690555f8080611050565b818301518455600190930192602092830192018f611028565b90601f19831691845f52815f20925f5b8181106110dc57509084600195949392106110c4575b505050811b019055610d9e565b01515f1960f88460031b161c191690558f80806110b7565b929360206001819287860151815501950193016110a1565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0819995948185b5bdd5b9d60621b6044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920726567697374657265640000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f50617965652063616e6e6f74206265207a65726f2061646472657373000000006044820152606490fd5b3461025e575f36600319011261025e5761025a6040516111db604082613491565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613690565b3461025e5761094761126261125d611218366139b3565b9080151580611296575b61122b90613b55565b5f8181526001602052604090205461124d906001600160a01b03161515613ba1565b5f52600260205260405f206138e4565b613dfe565b60208101519061128c60606040830151920151151591604051948594606086526060860190613690565b9060408301520390f35b505f54811115611222565b3461025e57602036600319011261025e57600435600181101561025e576112c88115613aab565b335f52600360205260405f20548015156112e181613b09565b80611425575b6112f090613b55565b5f81815260016020526040902054611312906001600160a01b03161515613ba1565b805f52600160205261132d60ff600460405f20015416614407565b5f8181526001602052604090205461134f906001600160a01b0316331461473c565b805f52600260205261137360ff600361136b8560405f206138e4565b0154166147e4565b805f5260026020526113888260405f206138e4565b815f52600460205261139d8360405f206138e4565b9260025f9201915b82548110156113c857806113c2610b2387610b1d60019588614841565b016113a5565b5082805f52600260205260036113e18360405f206138e4565b01805460ff191690556113f3826138b6565b6113fd81546149d2565b90557f4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d5f80a3005b505f548111156112e7565b3461025e57606036600319011261025e57600435602435600181101561025e576044356001600160401b03811161025e5761146f903690600401613374565b9083151580611620575b61148590939293613b55565b5f848152600160205260409020546114a7906001600160a01b03161515613ba1565b6114b0836135f3565b916114be6040519384613491565b8383526114ca846135f3565b602084019190601f19013683376114e0856135f3565b956114ee6040519788613491565b858752601f196114fd876135f3565b015f5b81811061160d5750509061151e915f52600460205260405f206138e4565b9136819003601e1901915f5b868110156115be578060051b8301358481121561025e578301908135916001600160401b03831161025e5760200191803603831361025e576115886115758861158193600196613be2565b60405192838092613932565b0382613491565b8051611596575b500161152a565b826115a1838a613ea9565b526115ac828b613ea9565b526115b7818a613ea9565b508961158f565b50848760405191604083019060408452518091526060830193905f5b8181106115f557848061025a888783820360208501526139d2565b825115158652602095860195909201916001016115da565b60606020828b0181019190915201611500565b505f54841115611479565b3461025e575f36600319011261025e575f5160206150c05f395f51905f52546040516001600160a01b039091168152602090f35b3461025e5761166d366133a4565b9293906001871015611b60576116c1906116b988159661168c88613aab565b335f5260036020526116b160405f2054998a1515966116aa88613b09565b36916134cd565b95369161360a565b94369161360a565b9080611b55575b6116d490969596613b55565b5f868152600160205260409020546116f6906001600160a01b03161515613ba1565b855f52600160205261171160ff600460405f20015416614407565b5f86815260016020526040902054611733906001600160a01b0316331461473c565b855f5260026020526117488560405f206138e4565b94600386019661175b60ff8954166147e4565b6117658483614d9f565b61176f8386614e4f565b805f5260046020526117848260405f206138e4565b955f9860028901995b8a548110156117b157806117ab610b238b610b1d8f95600196614841565b0161178d565b508960018a999798996117c48782614929565b0188516001600160401b0381116105ce576117e38161050484546138fa565b6020601f8211600114611af3579080611810925f91611ae8575b508160011b915f199060031b1c19161790565b90555b8851600160401b81116105ce578154818355808210611abb575b5060208a01915f5260205f20915f905b8282106119e65750505050600160ff198254161790555f5b875181101561195c576118688186613ea9565b51602080611876848c613ea9565b51604051928184925191829101835e81018a815203019020908051906001600160401b0382116105ce576118ae826104a185546138fa565b602090601f83116001146118f55791806118e19260019695945f926118ea5750508160011b915f199060031b1c19161790565b90555b01611855565b015190508d806104c1565b90601f19831691845f52815f20925f5b81811061194457509160019695949291838895931061192c575b505050811b0190556118e4565b01515f1960f88460031b161c191690558c808061191f565b92936020600181928786015181550195019301611905565b50867fc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6918588604051611990602082613491565b5f8152926119c5575b506119c090855f52600160205260018060a01b0360405f205416936040519485948561479d565b0390a3005b6119c0919250806020806119de9351830101910161449f565b519190611999565b80518051906001600160401b0382116105ce57611a0d82611a0788546138fa565b886142c2565b602090601f8311600114611a525792611a43836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b0194019101909261183d565b90601f19831691875f52815f20925f5b818110611aa35750936020936001969387969383889510611a8b575b505050811b018755611a46565b01515f1960f88460031b161c191690555f8080611a7e565b92936020600181928786015181550195019301611a62565b825f528160205f2091820191015b818110611ad6575061182d565b80611ae26001926148db565b01611ac9565b90508b01518d6117fd565b601f19821690835f52805f20915f5b8d828210611b3d5750509083600194939210611b25575b5050811b019055611813565b8c01515f1960f88460031b161c191690558c80611b19565b60018495602093958493015181550194019201611b02565b505f548511156116c8565b634e487b7160e01b5f52602160045260245ffd5b3461025e57602036600319011261025e57600435600181101561025e576103306020916138b6565b3461025e575f36600319011261025e577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580611e16575b15611dd9576040515f5160206150a05f395f51905f5254815f611bf7836138fa565b8083529260018116908115611dba5750600114611d4f575b611c1b92500382613491565b604051905f5f5160206150e05f395f51905f5254611c38816138fa565b8085529060018116908115611d2d5750600114611cc9575b5082611c64611c9b9461025a930382613491565b611ca960405191611c76602084613491565b5f83525f368137604051958695600f60f81b875260e0602088015260e0870190613690565b908582036040870152613690565b904660608501523060808501525f60a085015283820360c0850152613883565b5f5160206150e05f395f51905f525f90815291507f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b818310611d13575050820160200182611c50565b600181602092949394548385890101520191019190611cff565b60ff191660208087019190915291151560051b85019091019150839050611c50565b505f5160206150a05f395f51905f525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b818310611d9e575050906020611c1b92820101611c0f565b6020919350806001915483858801015201910190918392611d86565b60209250611c1b94915060ff191682840152151560051b820101611c0f565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415611bd5565b3461025e57602036600319011261025e5760043580151580611ea5575b611e6590613b55565b5f81815260016020526040902054611e87906001600160a01b03161515613ba1565b5f526001602052602060ff600460405f200154166040519015158152f35b505f54811115611e5c565b3461025e57602036600319011261025e576004356001600160401b03811161025e57611eeb611ee661025a92369060040161352e565b614202565b604051918291602083526020830190613690565b3461025e575f36600319011261025e575f5160206151205f395f51905f52546001600160401b0360ff8260401c1615911680159081612394575b600114908161238a575b159081612381575b50610888578060016001600160401b03195f5160206151205f395f51905f525416175f5160206151205f395f51905f5255612351575b611f89615016565b611f91615016565b611f9a3361459a565b611fa2615016565b604090815191611fb28184613491565b601783527f5365727669636550726f766964657252656769737472790000000000000000006020840152805191611fe98284613491565b60018352603160f81b6020840152611fff615016565b612007615016565b83516001600160401b0381116105ce5761202e5f5160206150a05f395f51905f52546138fa565b601f81116122f7575b50602094601f821160011461227c576120699293949582915f926122715750508160011b915f199060031b1c19161790565b5f5160206150a05f395f51905f52555b82516001600160401b0381116105ce576120a05f5160206150e05f395f51905f52546138fa565b601f811161220c575b506020601f82116001146121915781906120d99394955f926121865750508160011b915f199060031b1c19161790565b5f5160206150e05f395f51905f52555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015561213557005b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29160ff60401b195f5160206151205f395f51905f5254165f5160206151205f395f51905f52555160018152a1005b0151905085806104c1565b601f198216905f5160206150e05f395f51905f525f52805f20915f5b8181106121f4575095836001959697106121dc575b505050811b015f5160206150e05f395f51905f52556120e9565b01515f1960f88460031b161c191690558480806121c2565b9192602060018192868b0151815501940192016121ad565b5f5160206150e05f395f51905f525f52612261907f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510612267575b601f0160051c01906142ac565b846120a9565b9091508190612254565b0151905086806104c1565b601f198216955f5160206150a05f395f51905f525f52805f20915f5b8881106122df575083600195969798106122c7575b505050811b015f5160206150a05f395f51905f5255612079565b01515f1960f88460031b161c191690558580806122ad565b91926020600181928685015181550194019201612298565b5f5160206150a05f395f51905f525f5261234b907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c8101916020851061226757601f0160051c01906142ac565b85612037565b600160401b60ff60401b195f5160206151205f395f51905f525416175f5160206151205f395f51905f5255611f81565b90501582611f4b565b303b159150611f43565b829150611f39565b3461025e575f36600319011261025e576020604051818152f35b3461025e575f36600319011261025e576123ce61499f565b5f5160206150c05f395f51905f5280546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461025e575f36600319011261025e576020604051600a8152f35b3461025e5761249661245d61244c366139b3565b905f52600260205260405f206138e4565b60ff8154169061095560ff6003604051936124868561247f8160018501613932565b0386613491565b015416916040519485809561373c565b606060208501526060840190613690565b3461025e575f36600319011261025e576020604051674563918244f400008152f35b3461025e57602036600319011261025e576004356124e5613c24565b5080151580612544575b6124f890613b55565b5f8181526001602052604090205461251a906001600160a01b03161515613ba1565b5f52600160205261025a61253060405f20613d79565b6040519182916020835260208301906136d7565b505f548111156124ef565b3461025e575f36600319011261025e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036125a65760206040515f5160206151005f395f51905f528152f35b63703e46dd60e11b5f5260045ffd5b3461025e57602036600319011261025e576001600160a01b036125d661386d565b165f52600360205260405f2054801515806125f9575b6020906040519015158152f35b505f526001602052602060ff600460405f200154166125ec565b3461025e57602036600319011261025e576004355f52600160205260405f2060018060a01b0381541660018060a01b036001830154169160405161265e816115818160028601613932565b6126b2604051612675816115818160038801613932565b6126a4600560ff600487015416950154936040519788978852602088015260c0604088015260c0870190613690565b908582036060870152613690565b911515608084015260a08301520390f35b604036600319011261025e576126d761386d565b6024356001600160401b03811161025e576126f6903690600401613503565b6126fe614941565b61270661499f565b6040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f9181612808575b506127485783634c9c8ce360e01b5f5260045260245ffd5b805f5160206151005f395f51905f528592036127f65750813b156127e4575f5160206151005f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156127cc575f808360206102b195519101845af46127c6614393565b91615041565b5050346127d557005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011612834575b8161282460209383613491565b8101031261025e57519085612730565b3d9150612817565b3461025e575f36600319011261025e5760205f54604051908152f35b3461025e57606036600319011261025e57602435600181101561025e57604435906001600160401b03821161025e57611eeb602080611581936128b86128a561025a973690600401613503565b916004355f526004845260405f206138e4565b604051938285935191829101845e82019081520301902060405192838092613932565b3461025e57604036600319011261025e576129116128fd6024356004356140b3565b604051928392604084526040840190613883565b90151560208301520390f35b3461025e57602036600319011261025e5761293661386d565b61293e613c24565b5060018060a01b03165f52600360205260405f20545f52600160205261025a61253060405f20613d79565b3461025e5761025a61027c61297d366136b4565b91613ed1565b3461025e57606036600319011261025e57600435602435600181101561025e576044356001600160401b03811161025e5761158192612a1d92612a176129d0611575943690600401613347565b92909380151580612a3d575b6129e590613b55565b5f81815260016020526040902054612a07906001600160a01b03161515613ba1565b5f52600460205260405f206138e4565b91613be2565b8051151561025a6040519283928352604060208401526040830190613690565b505f548111156129dc565b3461025e57606036600319011261025e576004356001600160401b03811161025e57612a7890369060040161352e565b6024356001600160401b03811161025e57612a97903690600401613675565b6044356001600160401b03811161025e57612ab6903690600401613675565b90335f52600360205260405f205490612ad582151594611ee686613b09565b9380613199575b612ae590613b55565b5f82815260016020526040902054612b07906001600160a01b03161515613ba1565b815f526001602052612b2260ff600460405f20015416614407565b5f82815260016020526040902054612b44906001600160a01b0316331461473c565b815f52600260205260405f205f805260205260405f20936003850193612b6d60ff8654166147e4565b815193612b826020808501968501018661449f565b80515115613154576101008151511161311857602081018051156130c557604082015190511161306f5760c0810151156130185760e00180515115612fd357608090515111612f9a57612bd88285989798614e4f565b805f52600460205260405f205f805260205260405f20945f9760028801985b8954811015612c1a5780612c14610b238a610b1d6001958f614841565b01612bf7565b50886001899896979860ff1981541681550187516001600160401b0381116105ce57612c4a8161050484546138fa565b6020601f8211600114612f38579080612c76925f91612f2d57508160011b915f199060031b1c19161790565b90555b8751600160401b81116105ce578154818355808210612f00575b5060208901915f5260205f20915f905b828210612e315750505050600160ff198254161790555f5b8651811015612dc257612cce8185613ea9565b51602080612cdc848b613ea9565b51604051928184925191829101835e810189815203019020908051906001600160401b0382116105ce57612d14826104a185546138fa565b602090601f8311600114612d5b579180612d479260019695945f92612d505750508160011b915f199060031b1c19161790565b90555b01612cbb565b015190508c806104c1565b90601f19831691845f52815f20925f5b818110612daa575091600196959492918388959310612d92575b505050811b019055612d4a565b01515f1960f88460031b161c191690558b8080612d85565b92936020600181928786015181550195019301612d6b565b50855f936119c0612e0a7fc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed69460208a89604051612dff8482613491565b52805101019061449f565b51858752600160205260408088205490519485949290916001600160a01b0316908561479d565b80518051906001600160401b0382116105ce57612e5282611a0788546138fa565b602090601f8311600114612e975792612e88836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b01940191019092612ca3565b90601f19831691875f52815f20925f5b818110612ee85750936020936001969387969383889510612ed0575b505050811b018755612e8b565b01515f1960f88460031b161c191690555f8080612ec3565b92936020600181928786015181550195019301612ea7565b825f528160205f2091820191015b818110612f1b5750612c93565b80612f276001926148db565b01612f0e565b90508a01518c6117fd565b601f19821690835f52805f20915f5b8c828210612f825750509083600194939210612f6a575b5050811b019055612c79565b8b01515f1960f88460031b161c191690558b80612f5e565b60018495602093958493015181550194019201612f47565b60405162461bcd60e51b81526020600482015260116024820152704c6f636174696f6e20746f6f206c6f6e6760781b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f4c6f636174696f6e2063616e6e6f7420626520656d70747900000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152602960248201527f4d696e2070726f76696e6720706572696f64206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602860248201527f4d61782070696563652073697a65206d757374206265203e3d206d696e2070696044820152676563652073697a6560c01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f4d696e2070696563652073697a65206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526014602482015273536572766963652055524c20746f6f206c6f6e6760601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601b60248201527f536572766963652055524c2063616e6e6f7420626520656d70747900000000006044820152606490fd5b505f54821115612adc565b3461025e575f36600319011261025e57604051606360ff60981b018152602090f35b3461025e576131d4366133a4565b929193906001871015611b605761321a906116b98815946131f486613aab565b335f52600360205261321260405f2054998a1515966116aa88613b09565b97369161360a565b908061333c575b61322a90613b55565b5f8581526001602052604090205461324c906001600160a01b03161515613ba1565b845f52600160205261326760ff600460405f20015416614407565b5f85815260016020526040902054613289906001600160a01b0316331461473c565b845f52600260205260ff60036132a28860405f206138e4565b0154166132e657836132d882857f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717978a8a6149de565b604051611990602082613491565b60405162461bcd60e51b815260206004820152602860248201527f50726f6475637420616c72656164792065786973747320666f72207468697320604482015267383937bb34b232b960c11b6064820152608490fd5b505f54851115613221565b9181601f8401121561025e578235916001600160401b03831161025e576020838186019501011161025e57565b9181601f8401121561025e578235916001600160401b03831161025e576020808501948460051b01011161025e57565b90608060031983011261025e57600435600181101561025e57916024356001600160401b03811161025e57816133dc91600401613347565b929092916044356001600160401b03811161025e57816133fe91600401613374565b92909291606435906001600160401b03821161025e5761342091600401613374565b9091565b60c081019081106001600160401b038211176105ce57604052565b61012081019081106001600160401b038211176105ce57604052565b606081019081106001600160401b038211176105ce57604052565b608081019081106001600160401b038211176105ce57604052565b90601f801991011681019081106001600160401b038211176105ce57604052565b6001600160401b0381116105ce57601f01601f191660200190565b9291926134d9826134b2565b916134e76040519384613491565b82948184528183011161025e578281602093845f960137010152565b9080601f8301121561025e5781602061351e933591016134cd565b90565b3590811515820361025e57565b91906101208382031261025e57604051906135488261343f565b819380356001600160401b03811161025e5782613566918301613503565b8352602081013560208401526040810135604084015261358860608201613521565b606084015261359960808201613521565b608084015260a081013560a084015260c081013560c084015260e08101356001600160401b03811161025e57610100926135d4918301613503565b60e08401520135906001600160a01b038216820361025e576101000152565b6001600160401b0381116105ce5760051b60200190565b929190613616816135f3565b936136246040519586613491565b602085838152019160051b81019183831161025e5781905b83821061364a575050505050565b81356001600160401b03811161025e5760209161366a8784938701613503565b81520191019061363c565b9080601f8301121561025e5781602061351e9335910161360a565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b606090600319011261025e57600435600181101561025e57906024359060443590565b9060018060a01b03825116815260018060a01b03602083015116602082015260a080613727613715604086015160c0604087015260c0860190613690565b60608601518582036060870152613690565b93608081015115156080850152015191015290565b906001821015611b605752565b6020815260608101918051926040602084015283518091526080830190602060808260051b8601019501915f905b828210613791575050505060206040910151151591015290565b90919295607f1986820301825286518051825260406137bf60208301516060602086015260608501906136d7565b9101519160408183039101526137d681835161373c565b6137ef6020830151608060208401526080830190613690565b916040810151928281036040840152835180825260208201906020808260051b8501019601925f5b8281106138425750505050606091820151151591909201525095602090810193926001019101613777565b9091929396602080613860600193601f198782030189528b51613690565b9901950193929101613817565b600435906001600160a01b038216820361025e57565b90602080835192838152019201905f5b8181106138a05750505090565b8251845260209384019390920191600101613893565b6001811015611b60575f52600660205260405f2090565b6001811015611b60575f52600560205260405f2090565b906001811015611b60575f5260205260405f2090565b90600182811c92168015613928575b602083101461391457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613909565b5f9291815491613941836138fa565b8083529260018116908115613996575060011461395d57505050565b5f9081526020812093945091925b83831061397c575060209250010190565b60018160209294939454838587010152019101919061396b565b915050602093945060ff929192191683830152151560051b010190565b604090600319011261025e5760043590602435600181101561025e5790565b9080602083519182815201916020808360051b8301019401925f915b8383106139fd57505050505090565b9091929394602080613a1b600193601f198682030187528951613690565b970193019301919392906139ee565b90610100613a98613a4684516101208552610120850190613690565b602085015160208501526040850151604085015260608501511515606085015260808501511515608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152613690565b928101516001600160a01b031691015290565b15613ab257565b60405162461bcd60e51b815260206004820152602960248201527f4f6e6c79205044502070726f6475637420747970652063757272656e746c79206044820152681cdd5c1c1bdc9d195960ba1b6064820152608490fd5b15613b1057565b60405162461bcd60e51b815260206004820152601760248201527f50726f7669646572206e6f7420726567697374657265640000000000000000006044820152606490fd5b15613b5c57565b60405162461bcd60e51b815260206004820152601760248201527f50726f766964657220646f6573206e6f742065786973740000000000000000006044820152606490fd5b15613ba857565b60405162461bcd60e51b8152602060048201526012602482015271141c9bdd9a59195c881b9bdd08199bdd5b9960721b6044820152606490fd5b6020919283604051948593843782019081520301902090565b60405190604082018281106001600160401b038211176105ce576040525f602083606081520152565b60405190613c3182613424565b5f60a083828152826020820152606060408201526060808201528260808201520152565b60405190613c64602083613491565b5f80835282815b828110613c7757505050565b602090604051613c868161345b565b5f8152613c91613c24565b83820152604051613ca181613476565b5f8152606084820152606060408201525f6060820152604082015282828501015201613c6b565b90613cd2826135f3565b613cdf6040519182613491565b8281528092613cf0601f19916135f3565b01905f5b828110613d0057505050565b602090604051613d0f8161345b565b5f8152613d1a613c24565b83820152604051613d2a81613476565b5f8152606084820152606060408201525f6060820152604082015282828501015201613cf4565b9190820180921161068457565b9190820391821161068457565b5f1981146106845760010190565b90604051613d8681613424565b82546001600160a01b03908116825260018401541660208201526040519092839160a091600591613dbe816115818160028601613932565b6040850152604051613dd7816115818160038601613932565b606085015260ff600482015416151560808501520154910152565b6001821015611b605752565b90604051613e0b81613476565b8092613e1b60ff82541683613df2565b604051613e2f816115818160018601613932565b6020830152600281018054613e43816135f3565b91613e516040519384613491565b81835260208301905f5260205f205f915b838310613e845750505050600360609260ff9260408601520154161515910152565b600160208192604051613e9b816115818189613932565b815201920192019190613e62565b8051821015613ebd5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b92919092613edd613bfb565b613ee6826138b6565b548086108015906140ab575b6140925780613f018588613d51565b11614080575b613f1084613cc8565b8252613f1c8487613d51565b1060208201525f915f906001955f54965b8781111580614077575b1561406c57805f52600160205260ff600460405f200154168061404a575b80614021575b613f6e575b613f6990613d6b565b613f2d565b94888110158061400f575b613f92575b613f8a613f6991613d6b565b959050613f60565b92613f8a614006613f6992885f526001602052614000818a613fe860405f20825f526002602052613fde613fc98c60405f206138e4565b9160405194613fd78661345b565b8552613d79565b6020840152613dfe565b60408201528a5190613ffa8383613ea9565b52613ea9565b50613d6b565b94915050613f7e565b5061401a878a613d51565b8110613f79565b50805f526002602052614043600161403c8560405f206138e4565b01546138fa565b1515613f5b565b50805f52600260205260ff60036140648560405f206138e4565b015416613f55565b509550505093505050565b50868410613f37565b925061408c8584613d5e565b92613f07565b5092935050506140a0613c55565b81525f602082015290565b508315613ef2565b91906007548084108015906141fa575b6141dc57806140d28386613d51565b116141ca575b6140e1826135f3565b936140ef6040519586613491565b828552601f196140fe846135f3565b0136602087013784916141118483613d51565b10905f925f926001965f54975b88811115806141c1575b156141b557805f52600160205260ff600460405f20015416614153575b61414e90613d6b565b61411e565b95898786831015806141a3575b61417b575b505061417361414e91613d6b565b969050614145565b9161414e9261419889614192614173959b91613d6b565b9a613ea9565b529150508987614165565b506141ae8a88613d51565b8310614160565b50955095509550505050565b50878610614128565b90506141d68382613d5e565b906140d8565b505090506040516141ee602082613491565b5f81525f368137905f90565b5081156140c3565b61351e61421f916040519283916020808401526040830190613a2a565b03601f198101835282613491565b1561423457565b60405162461bcd60e51b815260206004820152600d60248201526c4e616d6520746f6f206c6f6e6760981b6044820152606490fd5b1561427057565b60405162461bcd60e51b81526020600482015260146024820152734465736372697074696f6e20746f6f206c6f6e6760601b6044820152606490fd5b8181106142b7575050565b5f81556001016142ac565b9190601f81116142d157505050565b6142fa925f5260205f20906020601f840160051c8301931061226757601f0160051c01906142ac565b565b90602083828152019060208160051b85010193835f915b8383106143235750505050505090565b909192939495601f198282030186528635601e198436030181121561025e57830190602082359201916001600160401b03811161025e57803603831361025e576020828280600196849695859652848401375f828201840152601f01601f19160101980196019493019190614313565b3d156143bd573d906143a4826134b2565b916143b26040519384613491565b82523d5f602084013e565b606090565b604051906143cf8261343f565b5f61010083606081528260208201528260408201528260608201528260808201528260a08201528260c0820152606060e08201520152565b1561440e57565b60405162461bcd60e51b815260206004820152601660248201527550726f7669646572206973206e6f742061637469766560501b6044820152606490fd5b81601f8201121561025e57805190614463826134b2565b926144716040519485613491565b8284526020838301011161025e57815f9260208093018386015e8301015290565b5190811515820361025e57565b60208183031261025e578051906001600160401b03821161025e5701906101208282031261025e57604051916144d48361343f565b80516001600160401b03811161025e57826144f091830161444c565b8352602081015160208401526040810151604084015261451260608201614492565b606084015261452360808201614492565b608084015260a081015160a084015260c081015160c084015260e08101516001600160401b03811161025e576101009261455e91830161444c565b60e084015201516001600160a01b038116810361025e5761010082015290565b61351e9061458a6143c2565b506020808251830101910161449f565b6001600160a01b031680156145f8575f5160206150c05f395f51905f5280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b631e4fbdf760e01b5f525f60045260245ffd5b92919092614617613bfb565b614620826138cd565b54808610801590614734575b614092578061463b8588613d51565b11614722575b61464a84613cc8565b82526146568487613d51565b1060208201525f915f906001955f54965b8781111580614719575b1561406c57805f526002602052614690600161403c8560405f206138e4565b6146a3575b61469e90613d6b565b614667565b948881101580614707575b6146c7575b6146bf61469e91613d6b565b959050614695565b926146bf6146fe61469e92885f526001602052614000818a613fe860405f20825f526002602052613fde613fc98c60405f206138e4565b949150506146b3565b50614712878a613d51565b81106146ae565b50868410614671565b925061472e8584613d5e565b92614641565b50831561462c565b1561474357565b60405162461bcd60e51b815260206004820152602c60248201527f4f6e6c7920736572766963652070726f76696465722063616e2063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608490fd5b929161351e94926147b96147d693608087526080870190613690565b6001600160a01b03909216602086015284820360408601526139d2565b9160608184039101526139d2565b156147eb57565b60405162461bcd60e51b815260206004820152602860248201527f50726f6475637420646f6573206e6f7420657869737420666f72207468697320604482015267383937bb34b232b960c11b6064820152608490fd5b8054821015613ebd575f5260205f2001905f90565b9060405180925f9080549061486a826138fa565b91600181169081156148c3575060011461488d575b505060209281520301902090565b9091505f5260205f205f905b8282106148ac575050810160205f61487f565b805482870152859350602090910190600101614899565b60ff191685525050801515028201905060205f61487f565b6148e581546138fa565b90816148ef575050565b81601f5f9311600114614900575055565b8183526020832061491c91601f0160051c8101906001016142ac565b8082528160208120915555565b906001811015611b605760ff80198354169116179055565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630811490811561497d575b506125a657565b5f5160206151005f395f51905f52546001600160a01b0316141590505f614976565b5f5160206150c05f395f51905f52546001600160a01b031633036149bf57565b63118cdaa760e01b5f523360045260245ffd5b8015610684575f190190565b9093919492946149ee8186614d9f565b6149f88387614e4f565b60405190614a0582613476565b614a0f8683613df2565b6020820190815260408201878152606083019160018352845f526002602052614a3b8860405f206138e4565b93516001811015611b6057614a509085614929565b51805160018501916001600160401b0382116105ce57614a74826104a185546138fa565b602090601f8311600114614d3c57614aa292915f918361100d5750508160011b915f199060031b1c19161790565b90555b5180516002840191600160401b82116105ce578254828455808310614d0f575b50602001915f5260205f20915f905b828210614c405750505050906003614afc9251151591019060ff801983541691151516179055565b5f526004602052614b108360405f206138e4565b915f5b8551811015614c0f57614b268184613ea9565b51602080614b34848a613ea9565b51604051928184925191829101835e810188815203019020908051906001600160401b0382116105ce57614b6c826104a185546138fa565b602090601f8311600114614ba8579180614b9f9260019695945f9261100d5750508160011b915f199060031b1c19161790565b90555b01614b13565b90601f19831691845f52815f20925f5b818110614bf7575091600196959492918388959310614bdf575b505050811b019055614ba2565b01515f1960f88460031b161c191690555f8080614bd2565b92936020600181928786015181550195019301614bb8565b5093505050614c3290614c21816138cd565b614c2b8154613d6b565b90556138b6565b614c3c8154613d6b565b9055565b80518051906001600160401b0382116105ce57614c6182611a0788546138fa565b602090601f8311600114614ca65792614c97836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b01940191019092614ad4565b90601f19831691875f52815f20925f5b818110614cf75750936020936001969387969383889510614cdf575b505050811b018755614c9a565b01515f1960f88460031b161c191690555f8080614cd2565b92936020600181928786015181550195019301614cb6565b835f528260205f2091820191015b818110614d2a5750614ac5565b80614d366001926148db565b01614d1d565b90601f19831691845f52815f20925f5b818110614d875750908460019594939210614d6f575b505050811b019055614aa5565b01515f1960f88460031b161c191690555f8080614d62565b92936020600181928786015181550195019301614d4c565b6001811015611b6057614e0a5780602080614dbf9351830101910161449f565b80515115613154576101008151511161311857602081018051156130c557604082015190511161306f5760c0810151156130185760e00180515115612fd357608090515111612f9a57565b60405162461bcd60e51b815260206004820152601860248201527f556e737570706f727465642070726f64756374207479706500000000000000006044820152606490fd5b8051825103614fbc57600a815111614f7f575f5b8151811015614f7a57614e768183613ea9565b515115614f35576020614e898284613ea9565b515111614ef0576080614e9c8285613ea9565b515111614eab57600101614e63565b60405162461bcd60e51b815260206004820152601960248201527f4361706162696c6974792076616c756520746f6f206c6f6e67000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f4361706162696c697479206b657920746f6f206c6f6e670000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f4361706162696c697479206b65792063616e6e6f7420626520656d70747900006044820152606490fd5b505050565b60405162461bcd60e51b8152602060048201526015602482015274546f6f206d616e79206361706162696c697469657360581b6044820152606490fd5b60405162461bcd60e51b815260206004820152602c60248201527f4b65797320616e642076616c75657320617272617973206d757374206861766560448201526b040e6c2daca40d8cadccee8d60a31b6064820152608490fd5b60ff5f5160206151205f395f51905f525460401c161561503257565b631afcd79f60e31b5f5260045ffd5b90615065575080511561505657602081519101fd5b63d6bda27560e01b5f5260045ffd5b81511580615096575b615076575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561506e56fea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a264697066735822122071a54ea79f0e6c1c8b857225dc7d3b55847595ea2f126934b557dbf2437ea48064736f6c634300081e0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00","sourceMap":"714:32647:85:-:0;;;;;;;1171:4:25;1163:13;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;;7894:76:24;;-1:-1:-1;;;;;;;;;;;714:32647:85;;7983:34:24;7979:146;;-1:-1:-1;714:32647:85;;;;;;;;1163:13:25;714:32647:85;;;;;;;;;;;7979:146:24;-1:-1:-1;;;;;;714:32647:85;-1:-1:-1;;;;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;8085:29:24;;714:32647:85;;8085:29:24;7979:146;;;;7894:76;7936:23;;;-1:-1:-1;7936:23:24;;-1:-1:-1;7936:23:24;714:32647:85;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806302ff8437146131c65780630a6a63f1146131a45780630b5c012514612a485780631e35bdde14612983578063213c63b1146129695780632335bde01461291d5780632f67c065146128db5780634368bafb1461285857806346ce41751461283c5780634f1ef286146126c357806350f3fc811461261357806351ca236f146125b557806352d1902d1461254f5780635c42d079146124c957806364b4f751146124a75780636bf6d74f146124385780636e36e9741461241d578063715018a6146123b65780637f6575671461239c5780638129fc1c14611eff57806382ee4b3414611eb057806383df54a514611e3f57806384b0196e14611b9c5780638bdc774714611b745780638c9a7b561461165f5780638da5cb5b1461162b57806393ecb91e146102d0578063a643324014611430578063a9d239b6146112a1578063aca0988f14611201578063ad3cb1cc146111ba578063b47be8ab14610b85578063b6363b9914610992578063c439fd57146108ac578063c9c5b5b41461070a578063cde24beb14610698578063d1329d4e1461065c578063d1c21b5b146103a3578063dcea1c6f14610388578063deb0e46214610339578063e459382f14610308578063e835440e146102d0578063f08bbda0146102b3578063f2fde38b14610288578063fc260f7b146102625763ffa1ad7414610213575f80fd5b3461025e575f36600319011261025e5761025a604051610234604082613491565b6005815264302e302e3160d81b6020820152604051918291602083526020830190613690565b0390f35b5f80fd5b3461025e5761025a61027c610276366136b4565b9161460b565b60405191829182613749565b3461025e57602036600319011261025e576102b16102a461386d565b6102ac61499f565b61459a565b005b3461025e575f36600319011261025e576020600754604051908152f35b3461025e57602036600319011261025e576001600160a01b036102f161386d565b165f526003602052602060405f2054604051908152f35b3461025e57602036600319011261025e57600435600181101561025e576103306020916138cd565b54604051908152f35b3461025e57602036600319011261025e576004356001600160401b03811161025e5761037461036f61025a923690600401613503565b61457e565b604051918291602083526020830190613a2a565b3461025e575f36600319011261025e57602060405160808152f35b3461025e57604036600319011261025e576004356001600160401b03811161025e576103d3903690600401613347565b6024356001600160401b03811161025e576103f2903690600401613347565b9092335f52600360205260405f20549283151561040e81613b09565b80610651575b61041d90613b55565b5f8481526001602052604090205461043f906001600160a01b03161515613ba1565b835f52600160205261045a60ff600460405f20015416614407565b610467608082111561422d565b610475610100841115614269565b835f526001602052600260405f2001916001600160401b0382116105ce576104a7826104a185546138fa565b856142c2565b5f90601f83116001146105ed576104d592915f91836105e2575b50508160011b915f199060031b1c19161790565b90555b815f526001602052600360405f2001906001600160401b0381116105ce5761050a8161050484546138fa565b846142c2565b5f601f821160011461056c5781906105389394955f926105615750508160011b915f199060031b1c19161790565b90555b7fae10af73bdb200f240b1ea85ef806346fb24c82388af00414f4c5fcfeef68f765f80a2005b0135905085806104c1565b601f19821694835f5260205f20915f5b8781106105b657508360019596971061059d575b505050811b01905561053b565b01355f19600384901b60f8161c19169055848080610590565b9092602060018192868601358155019401910161057c565b634e487b7160e01b5f52604160045260245ffd5b0135905087806104c1565b601f19831691845f5260205f20925f5b8181106106395750908460019594939210610620575b505050811b0190556104d8565b01355f19600384901b60f8161c19169055868080610613565b919360206001819287870135815501950192016105fd565b505f54841115610414565b3461025e575f36600319011261025e575f546001810180911161068457602090604051908152f35b634e487b7160e01b5f52601160045260245ffd5b3461025e57602060ff60036106f26106af366139b3565b90801515806106ff575b6106c290613b55565b5f8181526001875260409020546106e3906001600160a01b03161515613ba1565b5f526002855260405f206138e4565b0154166040519015158152f35b505f548111156106b9565b3461025e57602036600319011261025e576004356001600160401b03811161025e5761073a903690600401613503565b610742614941565b5f5160206151205f395f51905f525460ff8160401c16908115610897575b506108885760026001600160401b03195f5160206151205f395f51905f525416175f5160206151205f395f51905f525560ff60401b195f5160206151205f395f51905f52541690303303610843576107fe7f2b51ff7c4cc8e6fe1c72e9d9685b7d2a88a5d82ad3a644afbdceb0272c89c1c39160018060a01b035f5160206151005f395f51905f525416604051928392604084526040840190613690565b9060208301520390a15f5160206151205f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160028152a1005b60405162461bcd60e51b815260206004820152601a60248201527f4f6e6c792073656c662063616e2063616c6c206d6967726174650000000000006044820152606490fd5b63f92ee8a960e01b5f5260045ffd5b600291506001600160401b0316101582610760565b3461025e57602036600319011261025e576109476004356108cb6143c2565b81151580610987575b6108dd90613b55565b5f828152600160205260409020546108ff906001600160a01b03161515613ba1565b9060605f915f52600260205260405f205f805260205261092160405f20613dfe565b60208101518051610961575b505061095590604051948594606086526060860190613a2a565b9084820360208601526139d2565b90151560408301520390f35b9150925061096f915061457e565b9061095560606040830151920151151591908561092d565b505f548211156108d4565b3461025e575f36600319011261025e57335f52600360205260405f20548015156109bb81613b09565b80610b7a575b6109ca90613b55565b5f818152600160205260409020546109ec906001600160a01b03161515613ba1565b805f526001602052610a0760ff600460405f20015416614407565b5f81815260016020526040902054610a29906001600160a01b0316331461473c565b805f526001602052600460405f200160ff198154169055610a4b6007546149d2565b600755805f52600260205260405f205f8052602052610a70600160405f2001546138fa565b610abd575b805f52600160205260018060a01b0360405f2054165f5260036020525f60408120557f452148878c72ebab44f2761cb8b0b79c50628a437350aee5f3aab66625addcc45f80a2005b805f52600260205260405f205f805260205260405f206003810160ff815416610b3f575b90825f52600460205260405f205f805260205260405f209260025f9201915b8254811015610b2e5780610b28610b2387610b1d60019588614841565b50614856565b6148db565b01610b00565b5092505060ff198154169055610a75565b5f805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f88054610b73906149d2565b9055610ae1565b505f548111156109c1565b60e036600319011261025e57610b9961386d565b6024356001600160401b03811161025e57610bb8903690600401613347565b6044929192356001600160401b03811161025e57610bda903690600401613347565b93909160643591600183101561025e576084356001600160401b03811161025e57610c09903690600401613347565b929060a4356001600160401b03811161025e57610c2a903690600401613374565b909760c4356001600160401b03811161025e57610c4b903690600401613374565b949095610c588915613aab565b6001600160a01b0383161561117557335f52600360205260405f205461113057674563918244f4000034036110f457610c94608083111561422d565b610ca26101008d1115614269565b5f54610cad90613d6b565b998a5f556040519c8d92610cc084613424565b3384526001600160a01b0386166020850190815294610ce1913691906134cd565b926040019283523690610cf3926134cd565b60608d01908152600160808e0181905260a08e018c90525f8c81526020829052604090208e5181546001600160a01b03199081166001600160a01b03928316178355955192820180549096169216919091179093559051805160028401916001600160401b0382116105ce57610d6d826104a185546138fa565b602090601f831160011461109157610d9b92915f918361100d5750508160011b915f199060031b1c19161790565b90555b519a8b519b6001600160401b038d116105ce578c90610dcd82610dc460038701546138fa565b600387016142c2565b601f602092116001146110185791610e058e8d9e9f60a0949d9e9d6005965f9261100d5750508160011b915f199060031b1c19161790565b60038501555b610e2a60808201511515600486019060ff801983541691151516179055565b0151910155335f5260036020528660405f2055610e48600754613d6b565b6007556001600160a01b031633877faff7a33d237d3d600a92c556cda34cb73cf7cccc667e163c90b1d2d392b031a55f80a4610ea6610e883687856134cd565b610e9336848d61360a565b610e9e36878961360a565b918a8a6149de565b6020988992604051610eb88582613491565b5f8152968915610f9f575b505092610f2e610f3c93610f1d96937f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af71798968a5f526001835260018060a01b0360405f205416604051998a9960808b5260808b0190613690565b9389015287830360408901526142fc565b9184830360608601526142fc565b0390a35f808080674563918244f40000606360ff60981b015af1610f5e614393565b5015610f6c57604051908152f35b60405162461bcd60e51b815260048101839052600b60248201526a109d5c9b8819985a5b195960aa1b6044820152606490fd5b929597509250929450810194888287031261025e578135946001600160401b03861161025e57610f2e8a610f1d96610ffe8c9a7f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af7179a610f3c980161352e565b51985093965093949194610ec3565b015190505f806104c1565b908d91600385015f52815f20925f905b601f1916811061107857508e8d9e9f93600595939d9e9d60019360a096601f19811610611060575b505050811b016003850155610e0b565b01515f1960f88460031b161c191690555f8080611050565b818301518455600190930192602092830192018f611028565b90601f19831691845f52815f20925f5b8181106110dc57509084600195949392106110c4575b505050811b019055610d9e565b01515f1960f88460031b161c191690558f80806110b7565b929360206001819287860151815501950193016110a1565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0819995948185b5bdd5b9d60621b6044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920726567697374657265640000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f50617965652063616e6e6f74206265207a65726f2061646472657373000000006044820152606490fd5b3461025e575f36600319011261025e5761025a6040516111db604082613491565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613690565b3461025e5761094761126261125d611218366139b3565b9080151580611296575b61122b90613b55565b5f8181526001602052604090205461124d906001600160a01b03161515613ba1565b5f52600260205260405f206138e4565b613dfe565b60208101519061128c60606040830151920151151591604051948594606086526060860190613690565b9060408301520390f35b505f54811115611222565b3461025e57602036600319011261025e57600435600181101561025e576112c88115613aab565b335f52600360205260405f20548015156112e181613b09565b80611425575b6112f090613b55565b5f81815260016020526040902054611312906001600160a01b03161515613ba1565b805f52600160205261132d60ff600460405f20015416614407565b5f8181526001602052604090205461134f906001600160a01b0316331461473c565b805f52600260205261137360ff600361136b8560405f206138e4565b0154166147e4565b805f5260026020526113888260405f206138e4565b815f52600460205261139d8360405f206138e4565b9260025f9201915b82548110156113c857806113c2610b2387610b1d60019588614841565b016113a5565b5082805f52600260205260036113e18360405f206138e4565b01805460ff191690556113f3826138b6565b6113fd81546149d2565b90557f4c363c6cd3d80189ef501b26de41894b3ed5e7b4a85b096be6cbcaa8a13e5e4d5f80a3005b505f548111156112e7565b3461025e57606036600319011261025e57600435602435600181101561025e576044356001600160401b03811161025e5761146f903690600401613374565b9083151580611620575b61148590939293613b55565b5f848152600160205260409020546114a7906001600160a01b03161515613ba1565b6114b0836135f3565b916114be6040519384613491565b8383526114ca846135f3565b602084019190601f19013683376114e0856135f3565b956114ee6040519788613491565b858752601f196114fd876135f3565b015f5b81811061160d5750509061151e915f52600460205260405f206138e4565b9136819003601e1901915f5b868110156115be578060051b8301358481121561025e578301908135916001600160401b03831161025e5760200191803603831361025e576115886115758861158193600196613be2565b60405192838092613932565b0382613491565b8051611596575b500161152a565b826115a1838a613ea9565b526115ac828b613ea9565b526115b7818a613ea9565b508961158f565b50848760405191604083019060408452518091526060830193905f5b8181106115f557848061025a888783820360208501526139d2565b825115158652602095860195909201916001016115da565b60606020828b0181019190915201611500565b505f54841115611479565b3461025e575f36600319011261025e575f5160206150c05f395f51905f52546040516001600160a01b039091168152602090f35b3461025e5761166d366133a4565b9293906001871015611b60576116c1906116b988159661168c88613aab565b335f5260036020526116b160405f2054998a1515966116aa88613b09565b36916134cd565b95369161360a565b94369161360a565b9080611b55575b6116d490969596613b55565b5f868152600160205260409020546116f6906001600160a01b03161515613ba1565b855f52600160205261171160ff600460405f20015416614407565b5f86815260016020526040902054611733906001600160a01b0316331461473c565b855f5260026020526117488560405f206138e4565b94600386019661175b60ff8954166147e4565b6117658483614d9f565b61176f8386614e4f565b805f5260046020526117848260405f206138e4565b955f9860028901995b8a548110156117b157806117ab610b238b610b1d8f95600196614841565b0161178d565b508960018a999798996117c48782614929565b0188516001600160401b0381116105ce576117e38161050484546138fa565b6020601f8211600114611af3579080611810925f91611ae8575b508160011b915f199060031b1c19161790565b90555b8851600160401b81116105ce578154818355808210611abb575b5060208a01915f5260205f20915f905b8282106119e65750505050600160ff198254161790555f5b875181101561195c576118688186613ea9565b51602080611876848c613ea9565b51604051928184925191829101835e81018a815203019020908051906001600160401b0382116105ce576118ae826104a185546138fa565b602090601f83116001146118f55791806118e19260019695945f926118ea5750508160011b915f199060031b1c19161790565b90555b01611855565b015190508d806104c1565b90601f19831691845f52815f20925f5b81811061194457509160019695949291838895931061192c575b505050811b0190556118e4565b01515f1960f88460031b161c191690558c808061191f565b92936020600181928786015181550195019301611905565b50867fc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed6918588604051611990602082613491565b5f8152926119c5575b506119c090855f52600160205260018060a01b0360405f205416936040519485948561479d565b0390a3005b6119c0919250806020806119de9351830101910161449f565b519190611999565b80518051906001600160401b0382116105ce57611a0d82611a0788546138fa565b886142c2565b602090601f8311600114611a525792611a43836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b0194019101909261183d565b90601f19831691875f52815f20925f5b818110611aa35750936020936001969387969383889510611a8b575b505050811b018755611a46565b01515f1960f88460031b161c191690555f8080611a7e565b92936020600181928786015181550195019301611a62565b825f528160205f2091820191015b818110611ad6575061182d565b80611ae26001926148db565b01611ac9565b90508b01518d6117fd565b601f19821690835f52805f20915f5b8d828210611b3d5750509083600194939210611b25575b5050811b019055611813565b8c01515f1960f88460031b161c191690558c80611b19565b60018495602093958493015181550194019201611b02565b505f548511156116c8565b634e487b7160e01b5f52602160045260245ffd5b3461025e57602036600319011261025e57600435600181101561025e576103306020916138b6565b3461025e575f36600319011261025e577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580611e16575b15611dd9576040515f5160206150a05f395f51905f5254815f611bf7836138fa565b8083529260018116908115611dba5750600114611d4f575b611c1b92500382613491565b604051905f5f5160206150e05f395f51905f5254611c38816138fa565b8085529060018116908115611d2d5750600114611cc9575b5082611c64611c9b9461025a930382613491565b611ca960405191611c76602084613491565b5f83525f368137604051958695600f60f81b875260e0602088015260e0870190613690565b908582036040870152613690565b904660608501523060808501525f60a085015283820360c0850152613883565b5f5160206150e05f395f51905f525f90815291507f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b818310611d13575050820160200182611c50565b600181602092949394548385890101520191019190611cff565b60ff191660208087019190915291151560051b85019091019150839050611c50565b505f5160206150a05f395f51905f525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b818310611d9e575050906020611c1b92820101611c0f565b6020919350806001915483858801015201910190918392611d86565b60209250611c1b94915060ff191682840152151560051b820101611c0f565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415611bd5565b3461025e57602036600319011261025e5760043580151580611ea5575b611e6590613b55565b5f81815260016020526040902054611e87906001600160a01b03161515613ba1565b5f526001602052602060ff600460405f200154166040519015158152f35b505f54811115611e5c565b3461025e57602036600319011261025e576004356001600160401b03811161025e57611eeb611ee661025a92369060040161352e565b614202565b604051918291602083526020830190613690565b3461025e575f36600319011261025e575f5160206151205f395f51905f52546001600160401b0360ff8260401c1615911680159081612394575b600114908161238a575b159081612381575b50610888578060016001600160401b03195f5160206151205f395f51905f525416175f5160206151205f395f51905f5255612351575b611f89615016565b611f91615016565b611f9a3361459a565b611fa2615016565b604090815191611fb28184613491565b601783527f5365727669636550726f766964657252656769737472790000000000000000006020840152805191611fe98284613491565b60018352603160f81b6020840152611fff615016565b612007615016565b83516001600160401b0381116105ce5761202e5f5160206150a05f395f51905f52546138fa565b601f81116122f7575b50602094601f821160011461227c576120699293949582915f926122715750508160011b915f199060031b1c19161790565b5f5160206150a05f395f51905f52555b82516001600160401b0381116105ce576120a05f5160206150e05f395f51905f52546138fa565b601f811161220c575b506020601f82116001146121915781906120d99394955f926121865750508160011b915f199060031b1c19161790565b5f5160206150e05f395f51905f52555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015561213557005b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29160ff60401b195f5160206151205f395f51905f5254165f5160206151205f395f51905f52555160018152a1005b0151905085806104c1565b601f198216905f5160206150e05f395f51905f525f52805f20915f5b8181106121f4575095836001959697106121dc575b505050811b015f5160206150e05f395f51905f52556120e9565b01515f1960f88460031b161c191690558480806121c2565b9192602060018192868b0151815501940192016121ad565b5f5160206150e05f395f51905f525f52612261907f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510612267575b601f0160051c01906142ac565b846120a9565b9091508190612254565b0151905086806104c1565b601f198216955f5160206150a05f395f51905f525f52805f20915f5b8881106122df575083600195969798106122c7575b505050811b015f5160206150a05f395f51905f5255612079565b01515f1960f88460031b161c191690558580806122ad565b91926020600181928685015181550194019201612298565b5f5160206150a05f395f51905f525f5261234b907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c8101916020851061226757601f0160051c01906142ac565b85612037565b600160401b60ff60401b195f5160206151205f395f51905f525416175f5160206151205f395f51905f5255611f81565b90501582611f4b565b303b159150611f43565b829150611f39565b3461025e575f36600319011261025e576020604051818152f35b3461025e575f36600319011261025e576123ce61499f565b5f5160206150c05f395f51905f5280546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461025e575f36600319011261025e576020604051600a8152f35b3461025e5761249661245d61244c366139b3565b905f52600260205260405f206138e4565b60ff8154169061095560ff6003604051936124868561247f8160018501613932565b0386613491565b015416916040519485809561373c565b606060208501526060840190613690565b3461025e575f36600319011261025e576020604051674563918244f400008152f35b3461025e57602036600319011261025e576004356124e5613c24565b5080151580612544575b6124f890613b55565b5f8181526001602052604090205461251a906001600160a01b03161515613ba1565b5f52600160205261025a61253060405f20613d79565b6040519182916020835260208301906136d7565b505f548111156124ef565b3461025e575f36600319011261025e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036125a65760206040515f5160206151005f395f51905f528152f35b63703e46dd60e11b5f5260045ffd5b3461025e57602036600319011261025e576001600160a01b036125d661386d565b165f52600360205260405f2054801515806125f9575b6020906040519015158152f35b505f526001602052602060ff600460405f200154166125ec565b3461025e57602036600319011261025e576004355f52600160205260405f2060018060a01b0381541660018060a01b036001830154169160405161265e816115818160028601613932565b6126b2604051612675816115818160038801613932565b6126a4600560ff600487015416950154936040519788978852602088015260c0604088015260c0870190613690565b908582036060870152613690565b911515608084015260a08301520390f35b604036600319011261025e576126d761386d565b6024356001600160401b03811161025e576126f6903690600401613503565b6126fe614941565b61270661499f565b6040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f9181612808575b506127485783634c9c8ce360e01b5f5260045260245ffd5b805f5160206151005f395f51905f528592036127f65750813b156127e4575f5160206151005f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156127cc575f808360206102b195519101845af46127c6614393565b91615041565b5050346127d557005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011612834575b8161282460209383613491565b8101031261025e57519085612730565b3d9150612817565b3461025e575f36600319011261025e5760205f54604051908152f35b3461025e57606036600319011261025e57602435600181101561025e57604435906001600160401b03821161025e57611eeb602080611581936128b86128a561025a973690600401613503565b916004355f526004845260405f206138e4565b604051938285935191829101845e82019081520301902060405192838092613932565b3461025e57604036600319011261025e576129116128fd6024356004356140b3565b604051928392604084526040840190613883565b90151560208301520390f35b3461025e57602036600319011261025e5761293661386d565b61293e613c24565b5060018060a01b03165f52600360205260405f20545f52600160205261025a61253060405f20613d79565b3461025e5761025a61027c61297d366136b4565b91613ed1565b3461025e57606036600319011261025e57600435602435600181101561025e576044356001600160401b03811161025e5761158192612a1d92612a176129d0611575943690600401613347565b92909380151580612a3d575b6129e590613b55565b5f81815260016020526040902054612a07906001600160a01b03161515613ba1565b5f52600460205260405f206138e4565b91613be2565b8051151561025a6040519283928352604060208401526040830190613690565b505f548111156129dc565b3461025e57606036600319011261025e576004356001600160401b03811161025e57612a7890369060040161352e565b6024356001600160401b03811161025e57612a97903690600401613675565b6044356001600160401b03811161025e57612ab6903690600401613675565b90335f52600360205260405f205490612ad582151594611ee686613b09565b9380613199575b612ae590613b55565b5f82815260016020526040902054612b07906001600160a01b03161515613ba1565b815f526001602052612b2260ff600460405f20015416614407565b5f82815260016020526040902054612b44906001600160a01b0316331461473c565b815f52600260205260405f205f805260205260405f20936003850193612b6d60ff8654166147e4565b815193612b826020808501968501018661449f565b80515115613154576101008151511161311857602081018051156130c557604082015190511161306f5760c0810151156130185760e00180515115612fd357608090515111612f9a57612bd88285989798614e4f565b805f52600460205260405f205f805260205260405f20945f9760028801985b8954811015612c1a5780612c14610b238a610b1d6001958f614841565b01612bf7565b50886001899896979860ff1981541681550187516001600160401b0381116105ce57612c4a8161050484546138fa565b6020601f8211600114612f38579080612c76925f91612f2d57508160011b915f199060031b1c19161790565b90555b8751600160401b81116105ce578154818355808210612f00575b5060208901915f5260205f20915f905b828210612e315750505050600160ff198254161790555f5b8651811015612dc257612cce8185613ea9565b51602080612cdc848b613ea9565b51604051928184925191829101835e810189815203019020908051906001600160401b0382116105ce57612d14826104a185546138fa565b602090601f8311600114612d5b579180612d479260019695945f92612d505750508160011b915f199060031b1c19161790565b90555b01612cbb565b015190508c806104c1565b90601f19831691845f52815f20925f5b818110612daa575091600196959492918388959310612d92575b505050811b019055612d4a565b01515f1960f88460031b161c191690558b8080612d85565b92936020600181928786015181550195019301612d6b565b50855f936119c0612e0a7fc340a6dcdd0e7d3f96b6b2d3729fe5f0a6114e5847ba52b9e0071bf156dbaed69460208a89604051612dff8482613491565b52805101019061449f565b51858752600160205260408088205490519485949290916001600160a01b0316908561479d565b80518051906001600160401b0382116105ce57612e5282611a0788546138fa565b602090601f8311600114612e975792612e88836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b01940191019092612ca3565b90601f19831691875f52815f20925f5b818110612ee85750936020936001969387969383889510612ed0575b505050811b018755612e8b565b01515f1960f88460031b161c191690555f8080612ec3565b92936020600181928786015181550195019301612ea7565b825f528160205f2091820191015b818110612f1b5750612c93565b80612f276001926148db565b01612f0e565b90508a01518c6117fd565b601f19821690835f52805f20915f5b8c828210612f825750509083600194939210612f6a575b5050811b019055612c79565b8b01515f1960f88460031b161c191690558b80612f5e565b60018495602093958493015181550194019201612f47565b60405162461bcd60e51b81526020600482015260116024820152704c6f636174696f6e20746f6f206c6f6e6760781b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f4c6f636174696f6e2063616e6e6f7420626520656d70747900000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152602960248201527f4d696e2070726f76696e6720706572696f64206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602860248201527f4d61782070696563652073697a65206d757374206265203e3d206d696e2070696044820152676563652073697a6560c01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f4d696e2070696563652073697a65206d75737420626520677265617465722074604482015264068616e20360dc1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526014602482015273536572766963652055524c20746f6f206c6f6e6760601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601b60248201527f536572766963652055524c2063616e6e6f7420626520656d70747900000000006044820152606490fd5b505f54821115612adc565b3461025e575f36600319011261025e57604051606360ff60981b018152602090f35b3461025e576131d4366133a4565b929193906001871015611b605761321a906116b98815946131f486613aab565b335f52600360205261321260405f2054998a1515966116aa88613b09565b97369161360a565b908061333c575b61322a90613b55565b5f8581526001602052604090205461324c906001600160a01b03161515613ba1565b845f52600160205261326760ff600460405f20015416614407565b5f85815260016020526040902054613289906001600160a01b0316331461473c565b845f52600260205260ff60036132a28860405f206138e4565b0154166132e657836132d882857f93c484964e7897bebc18f4392da3a48d42bf4356601904bf354a6537376af717978a8a6149de565b604051611990602082613491565b60405162461bcd60e51b815260206004820152602860248201527f50726f6475637420616c72656164792065786973747320666f72207468697320604482015267383937bb34b232b960c11b6064820152608490fd5b505f54851115613221565b9181601f8401121561025e578235916001600160401b03831161025e576020838186019501011161025e57565b9181601f8401121561025e578235916001600160401b03831161025e576020808501948460051b01011161025e57565b90608060031983011261025e57600435600181101561025e57916024356001600160401b03811161025e57816133dc91600401613347565b929092916044356001600160401b03811161025e57816133fe91600401613374565b92909291606435906001600160401b03821161025e5761342091600401613374565b9091565b60c081019081106001600160401b038211176105ce57604052565b61012081019081106001600160401b038211176105ce57604052565b606081019081106001600160401b038211176105ce57604052565b608081019081106001600160401b038211176105ce57604052565b90601f801991011681019081106001600160401b038211176105ce57604052565b6001600160401b0381116105ce57601f01601f191660200190565b9291926134d9826134b2565b916134e76040519384613491565b82948184528183011161025e578281602093845f960137010152565b9080601f8301121561025e5781602061351e933591016134cd565b90565b3590811515820361025e57565b91906101208382031261025e57604051906135488261343f565b819380356001600160401b03811161025e5782613566918301613503565b8352602081013560208401526040810135604084015261358860608201613521565b606084015261359960808201613521565b608084015260a081013560a084015260c081013560c084015260e08101356001600160401b03811161025e57610100926135d4918301613503565b60e08401520135906001600160a01b038216820361025e576101000152565b6001600160401b0381116105ce5760051b60200190565b929190613616816135f3565b936136246040519586613491565b602085838152019160051b81019183831161025e5781905b83821061364a575050505050565b81356001600160401b03811161025e5760209161366a8784938701613503565b81520191019061363c565b9080601f8301121561025e5781602061351e9335910161360a565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b606090600319011261025e57600435600181101561025e57906024359060443590565b9060018060a01b03825116815260018060a01b03602083015116602082015260a080613727613715604086015160c0604087015260c0860190613690565b60608601518582036060870152613690565b93608081015115156080850152015191015290565b906001821015611b605752565b6020815260608101918051926040602084015283518091526080830190602060808260051b8601019501915f905b828210613791575050505060206040910151151591015290565b90919295607f1986820301825286518051825260406137bf60208301516060602086015260608501906136d7565b9101519160408183039101526137d681835161373c565b6137ef6020830151608060208401526080830190613690565b916040810151928281036040840152835180825260208201906020808260051b8501019601925f5b8281106138425750505050606091820151151591909201525095602090810193926001019101613777565b9091929396602080613860600193601f198782030189528b51613690565b9901950193929101613817565b600435906001600160a01b038216820361025e57565b90602080835192838152019201905f5b8181106138a05750505090565b8251845260209384019390920191600101613893565b6001811015611b60575f52600660205260405f2090565b6001811015611b60575f52600560205260405f2090565b906001811015611b60575f5260205260405f2090565b90600182811c92168015613928575b602083101461391457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613909565b5f9291815491613941836138fa565b8083529260018116908115613996575060011461395d57505050565b5f9081526020812093945091925b83831061397c575060209250010190565b60018160209294939454838587010152019101919061396b565b915050602093945060ff929192191683830152151560051b010190565b604090600319011261025e5760043590602435600181101561025e5790565b9080602083519182815201916020808360051b8301019401925f915b8383106139fd57505050505090565b9091929394602080613a1b600193601f198682030187528951613690565b970193019301919392906139ee565b90610100613a98613a4684516101208552610120850190613690565b602085015160208501526040850151604085015260608501511515606085015260808501511515608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152613690565b928101516001600160a01b031691015290565b15613ab257565b60405162461bcd60e51b815260206004820152602960248201527f4f6e6c79205044502070726f6475637420747970652063757272656e746c79206044820152681cdd5c1c1bdc9d195960ba1b6064820152608490fd5b15613b1057565b60405162461bcd60e51b815260206004820152601760248201527f50726f7669646572206e6f7420726567697374657265640000000000000000006044820152606490fd5b15613b5c57565b60405162461bcd60e51b815260206004820152601760248201527f50726f766964657220646f6573206e6f742065786973740000000000000000006044820152606490fd5b15613ba857565b60405162461bcd60e51b8152602060048201526012602482015271141c9bdd9a59195c881b9bdd08199bdd5b9960721b6044820152606490fd5b6020919283604051948593843782019081520301902090565b60405190604082018281106001600160401b038211176105ce576040525f602083606081520152565b60405190613c3182613424565b5f60a083828152826020820152606060408201526060808201528260808201520152565b60405190613c64602083613491565b5f80835282815b828110613c7757505050565b602090604051613c868161345b565b5f8152613c91613c24565b83820152604051613ca181613476565b5f8152606084820152606060408201525f6060820152604082015282828501015201613c6b565b90613cd2826135f3565b613cdf6040519182613491565b8281528092613cf0601f19916135f3565b01905f5b828110613d0057505050565b602090604051613d0f8161345b565b5f8152613d1a613c24565b83820152604051613d2a81613476565b5f8152606084820152606060408201525f6060820152604082015282828501015201613cf4565b9190820180921161068457565b9190820391821161068457565b5f1981146106845760010190565b90604051613d8681613424565b82546001600160a01b03908116825260018401541660208201526040519092839160a091600591613dbe816115818160028601613932565b6040850152604051613dd7816115818160038601613932565b606085015260ff600482015416151560808501520154910152565b6001821015611b605752565b90604051613e0b81613476565b8092613e1b60ff82541683613df2565b604051613e2f816115818160018601613932565b6020830152600281018054613e43816135f3565b91613e516040519384613491565b81835260208301905f5260205f205f915b838310613e845750505050600360609260ff9260408601520154161515910152565b600160208192604051613e9b816115818189613932565b815201920192019190613e62565b8051821015613ebd5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b92919092613edd613bfb565b613ee6826138b6565b548086108015906140ab575b6140925780613f018588613d51565b11614080575b613f1084613cc8565b8252613f1c8487613d51565b1060208201525f915f906001955f54965b8781111580614077575b1561406c57805f52600160205260ff600460405f200154168061404a575b80614021575b613f6e575b613f6990613d6b565b613f2d565b94888110158061400f575b613f92575b613f8a613f6991613d6b565b959050613f60565b92613f8a614006613f6992885f526001602052614000818a613fe860405f20825f526002602052613fde613fc98c60405f206138e4565b9160405194613fd78661345b565b8552613d79565b6020840152613dfe565b60408201528a5190613ffa8383613ea9565b52613ea9565b50613d6b565b94915050613f7e565b5061401a878a613d51565b8110613f79565b50805f526002602052614043600161403c8560405f206138e4565b01546138fa565b1515613f5b565b50805f52600260205260ff60036140648560405f206138e4565b015416613f55565b509550505093505050565b50868410613f37565b925061408c8584613d5e565b92613f07565b5092935050506140a0613c55565b81525f602082015290565b508315613ef2565b91906007548084108015906141fa575b6141dc57806140d28386613d51565b116141ca575b6140e1826135f3565b936140ef6040519586613491565b828552601f196140fe846135f3565b0136602087013784916141118483613d51565b10905f925f926001965f54975b88811115806141c1575b156141b557805f52600160205260ff600460405f20015416614153575b61414e90613d6b565b61411e565b95898786831015806141a3575b61417b575b505061417361414e91613d6b565b969050614145565b9161414e9261419889614192614173959b91613d6b565b9a613ea9565b529150508987614165565b506141ae8a88613d51565b8310614160565b50955095509550505050565b50878610614128565b90506141d68382613d5e565b906140d8565b505090506040516141ee602082613491565b5f81525f368137905f90565b5081156140c3565b61351e61421f916040519283916020808401526040830190613a2a565b03601f198101835282613491565b1561423457565b60405162461bcd60e51b815260206004820152600d60248201526c4e616d6520746f6f206c6f6e6760981b6044820152606490fd5b1561427057565b60405162461bcd60e51b81526020600482015260146024820152734465736372697074696f6e20746f6f206c6f6e6760601b6044820152606490fd5b8181106142b7575050565b5f81556001016142ac565b9190601f81116142d157505050565b6142fa925f5260205f20906020601f840160051c8301931061226757601f0160051c01906142ac565b565b90602083828152019060208160051b85010193835f915b8383106143235750505050505090565b909192939495601f198282030186528635601e198436030181121561025e57830190602082359201916001600160401b03811161025e57803603831361025e576020828280600196849695859652848401375f828201840152601f01601f19160101980196019493019190614313565b3d156143bd573d906143a4826134b2565b916143b26040519384613491565b82523d5f602084013e565b606090565b604051906143cf8261343f565b5f61010083606081528260208201528260408201528260608201528260808201528260a08201528260c0820152606060e08201520152565b1561440e57565b60405162461bcd60e51b815260206004820152601660248201527550726f7669646572206973206e6f742061637469766560501b6044820152606490fd5b81601f8201121561025e57805190614463826134b2565b926144716040519485613491565b8284526020838301011161025e57815f9260208093018386015e8301015290565b5190811515820361025e57565b60208183031261025e578051906001600160401b03821161025e5701906101208282031261025e57604051916144d48361343f565b80516001600160401b03811161025e57826144f091830161444c565b8352602081015160208401526040810151604084015261451260608201614492565b606084015261452360808201614492565b608084015260a081015160a084015260c081015160c084015260e08101516001600160401b03811161025e576101009261455e91830161444c565b60e084015201516001600160a01b038116810361025e5761010082015290565b61351e9061458a6143c2565b506020808251830101910161449f565b6001600160a01b031680156145f8575f5160206150c05f395f51905f5280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b631e4fbdf760e01b5f525f60045260245ffd5b92919092614617613bfb565b614620826138cd565b54808610801590614734575b614092578061463b8588613d51565b11614722575b61464a84613cc8565b82526146568487613d51565b1060208201525f915f906001955f54965b8781111580614719575b1561406c57805f526002602052614690600161403c8560405f206138e4565b6146a3575b61469e90613d6b565b614667565b948881101580614707575b6146c7575b6146bf61469e91613d6b565b959050614695565b926146bf6146fe61469e92885f526001602052614000818a613fe860405f20825f526002602052613fde613fc98c60405f206138e4565b949150506146b3565b50614712878a613d51565b81106146ae565b50868410614671565b925061472e8584613d5e565b92614641565b50831561462c565b1561474357565b60405162461bcd60e51b815260206004820152602c60248201527f4f6e6c7920736572766963652070726f76696465722063616e2063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608490fd5b929161351e94926147b96147d693608087526080870190613690565b6001600160a01b03909216602086015284820360408601526139d2565b9160608184039101526139d2565b156147eb57565b60405162461bcd60e51b815260206004820152602860248201527f50726f6475637420646f6573206e6f7420657869737420666f72207468697320604482015267383937bb34b232b960c11b6064820152608490fd5b8054821015613ebd575f5260205f2001905f90565b9060405180925f9080549061486a826138fa565b91600181169081156148c3575060011461488d575b505060209281520301902090565b9091505f5260205f205f905b8282106148ac575050810160205f61487f565b805482870152859350602090910190600101614899565b60ff191685525050801515028201905060205f61487f565b6148e581546138fa565b90816148ef575050565b81601f5f9311600114614900575055565b8183526020832061491c91601f0160051c8101906001016142ac565b8082528160208120915555565b906001811015611b605760ff80198354169116179055565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630811490811561497d575b506125a657565b5f5160206151005f395f51905f52546001600160a01b0316141590505f614976565b5f5160206150c05f395f51905f52546001600160a01b031633036149bf57565b63118cdaa760e01b5f523360045260245ffd5b8015610684575f190190565b9093919492946149ee8186614d9f565b6149f88387614e4f565b60405190614a0582613476565b614a0f8683613df2565b6020820190815260408201878152606083019160018352845f526002602052614a3b8860405f206138e4565b93516001811015611b6057614a509085614929565b51805160018501916001600160401b0382116105ce57614a74826104a185546138fa565b602090601f8311600114614d3c57614aa292915f918361100d5750508160011b915f199060031b1c19161790565b90555b5180516002840191600160401b82116105ce578254828455808310614d0f575b50602001915f5260205f20915f905b828210614c405750505050906003614afc9251151591019060ff801983541691151516179055565b5f526004602052614b108360405f206138e4565b915f5b8551811015614c0f57614b268184613ea9565b51602080614b34848a613ea9565b51604051928184925191829101835e810188815203019020908051906001600160401b0382116105ce57614b6c826104a185546138fa565b602090601f8311600114614ba8579180614b9f9260019695945f9261100d5750508160011b915f199060031b1c19161790565b90555b01614b13565b90601f19831691845f52815f20925f5b818110614bf7575091600196959492918388959310614bdf575b505050811b019055614ba2565b01515f1960f88460031b161c191690555f8080614bd2565b92936020600181928786015181550195019301614bb8565b5093505050614c3290614c21816138cd565b614c2b8154613d6b565b90556138b6565b614c3c8154613d6b565b9055565b80518051906001600160401b0382116105ce57614c6182611a0788546138fa565b602090601f8311600114614ca65792614c97836001959460209487965f9261100d5750508160011b915f199060031b1c19161790565b87555b01940191019092614ad4565b90601f19831691875f52815f20925f5b818110614cf75750936020936001969387969383889510614cdf575b505050811b018755614c9a565b01515f1960f88460031b161c191690555f8080614cd2565b92936020600181928786015181550195019301614cb6565b835f528260205f2091820191015b818110614d2a5750614ac5565b80614d366001926148db565b01614d1d565b90601f19831691845f52815f20925f5b818110614d875750908460019594939210614d6f575b505050811b019055614aa5565b01515f1960f88460031b161c191690555f8080614d62565b92936020600181928786015181550195019301614d4c565b6001811015611b6057614e0a5780602080614dbf9351830101910161449f565b80515115613154576101008151511161311857602081018051156130c557604082015190511161306f5760c0810151156130185760e00180515115612fd357608090515111612f9a57565b60405162461bcd60e51b815260206004820152601860248201527f556e737570706f727465642070726f64756374207479706500000000000000006044820152606490fd5b8051825103614fbc57600a815111614f7f575f5b8151811015614f7a57614e768183613ea9565b515115614f35576020614e898284613ea9565b515111614ef0576080614e9c8285613ea9565b515111614eab57600101614e63565b60405162461bcd60e51b815260206004820152601960248201527f4361706162696c6974792076616c756520746f6f206c6f6e67000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f4361706162696c697479206b657920746f6f206c6f6e670000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f4361706162696c697479206b65792063616e6e6f7420626520656d70747900006044820152606490fd5b505050565b60405162461bcd60e51b8152602060048201526015602482015274546f6f206d616e79206361706162696c697469657360581b6044820152606490fd5b60405162461bcd60e51b815260206004820152602c60248201527f4b65797320616e642076616c75657320617272617973206d757374206861766560448201526b040e6c2daca40d8cadccee8d60a31b6064820152608490fd5b60ff5f5160206151205f395f51905f525460401c161561503257565b631afcd79f60e31b5f5260045ffd5b90615065575080511561505657602081519101fd5b63d6bda27560e01b5f5260045ffd5b81511580615096575b615076575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561506e56fea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a264697066735822122071a54ea79f0e6c1c8b857225dc7d3b55847595ea2f126934b557dbf2437ea48064736f6c634300081e0033","sourceMap":"714:32647:85:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1408:2;714:32647;1408:2;;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;2357:1:23;714:32647:85;;:::i;:::-;2303:62:23;;:::i;:::-;2357:1;:::i;:::-;714:32647:85;;;;;;;-1:-1:-1;;714:32647:85;;;;;3722:34:86;714:32647:85;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;-1:-1:-1;;;;;714:32647:85;;:::i;:::-;;;;3050:81:86;714:32647:85;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;3429:81:86;714:32647:85;3429:81:86;;:::i;:::-;714:32647:85;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;1524:3;714:32647;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;16454:10;;;714:32647;;16434:19;714:32647;;;;;;16483:15;;;;16475:51;;;:::i;:::-;16544:44;;;714:32647;16536:80;;;:::i;:::-;714:32647;;;;16634:9;714:32647;;;;;;16626:82;;-1:-1:-1;;;;;714:32647:85;16634:51;;16626:82;:::i;:::-;714:32647;;;16634:9;714:32647;;16718:65;714:32647;;;;;16726:30;714:32647;;16718:65;:::i;:::-;16851:63;1524:3;16859:37;;;16851:63;:::i;:::-;16957:84;1193:3;16965:51;;;16957:84;:::i;:::-;714:32647;;;16634:9;714:32647;;17091:26;714:32647;;;17091:26;714:32647;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;;;;16634:9;714:32647;;16434:19;714:32647;;;17134:33;714:32647;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;17219:31;714:32647;17219:31;;714:32647;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;16634:9;714:32647;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16434:19:85;1193:3;;;;;714:32647;1193:3;;714:32647;;;;;;;;;;;16634:9;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:9;714:32647;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16434:19:85;1193:3;;;;;714:32647;1193:3;;714:32647;;;;;;;;;;;16634:9;714:32647;;;;;;;;;;;;;;;16544:44;-1:-1:-1;714:32647:85;;16562:26;;;16544:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;28124:1;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24910:50;:41;714:32647;;;:::i;:::-;3657:14;;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;24910:16;714:32647;;;;;24910:41;:::i;:::-;:50;714:32647;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;2624:62:25;;:::i;:::-;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;;6429:44:24;;;;;714:32647:85;6425:105:24;;;33196:1:85;-1:-1:-1;;;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;-1:-1:-1;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;33239:4;;33217:10;:27;714:32647;;;33290:62;714:32647;;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;;;;;;;;;;;:::i;:::-;;;;;;33290:62;;;-1:-1:-1;;;;;;;;;;;714:32647:85;6654:20:24;714:32647:85;;;33196:1;714:32647;;6654:20:24;714:32647:85;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;6425:105:24;4906:23;;;714:32647:85;6496:23:24;714:32647:85;;6496:23:24;6429:44;33196:1:85;714:32647;;-1:-1:-1;;;;;714:32647:85;6448:25:24;;6429:44;;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;:::i;:::-;3657:14;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;20292:519;714:32647;;;;;20542:16;714:32647;;;;;;;;;;;;;;;:::i;:::-;;20602:19;;;714:32647;;20598:207;;714:32647;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;20598:207;20662:38;;;;;;;;:::i;:::-;20731:22;714:32647;;;20731:22;;;20778:16;;714:32647;;;20598:207;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;17408:10;714:32647;;17388:19;714:32647;;;;;;17437:15;;;17429:51;;;:::i;:::-;3657:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;3747:9;714:32647;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;17408:10;3427:51;3419:108;:::i;:::-;714:32647;;;3747:9;714:32647;;;;;;17811:30;1854:42;1193:3;;;;;;17860:21;;714:32647;17860:21;:::i;:::-;;1193:3;714:32647;;;18012:16;714:32647;;;;;-1:-1:-1;714:32647:85;;;;;3747:9;714:32647;-1:-1:-1;714:32647:85;18012:57;714:32647;;:::i;:::-;18008:704;;714:32647;;;;3747:9;714:32647;;;;;;;;;;;;;;17388:19;714:32647;;;;;;1193:3;18858:27;714:32647;18858:27;;714:32647;18008:704;714:32647;;;18012:16;714:32647;;;;;-1:-1:-1;714:32647:85;;;;;-1:-1:-1;714:32647:85;17388:19;18253:16;;714:32647;;;;18249:104;;18008:704;714:32647;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;-1:-1:-1;714:32647:85;18530:13;18012:16;714:32647;18549:22;;18525:139;18580:3;714:32647;;18545:33;;;;;18623:25;18603:46;714:32647;18623:25;;3747:9;18623:25;;;:::i;:::-;714:32647;;:::i;:::-;18603:46;:::i;:::-;714:32647;18530:13;;18545:33;;;;;1854:42;1193:3;;;;;;18008:704;;18249:104;714:32647;;;18289:30;714:32647;;;;;18289:49;;;:::i;:::-;1193:3;;18249:104;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;-1:-1:-1;;714:32647:85;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;5582:84;5590:30;;5582:84;:::i;:::-;-1:-1:-1;;;;;714:32647:85;;5719:19;714:32647;;5860:10;714:32647;;5840:19;714:32647;;;;;;;;2018:4;5990:9;:29;714:32647;;6112:63;714:32647;6120:37;;;6112:63;:::i;:::-;6218:84;1193:3;6226:51;;;6218:84;:::i;:::-;714:32647;;6356:14;;;:::i;:::-;1193:3;;714:32647;1193:3;714:32647;;;;;;;;:::i;:::-;5860:10;714:32647;;-1:-1:-1;;;;;714:32647:85;;;6436:224;;714:32647;;;6436:224;1193:3;;714:32647;;;1193:3;:::i;:::-;6436:224;714:32647;6436:224;714:32647;;;;1193:3;;;;:::i;:::-;714:32647;6436:224;;714:32647;;;;;6436:224;;714:32647;;;;6436:224;;714:32647;;;-1:-1:-1;714:32647:85;;;;;;;;;;1193:3;;;;-1:-1:-1;;;;;;1193:3:85;;;-1:-1:-1;;;;;714:32647:85;;;1193:3;;;;;;;;;;;;;714:32647;;1193:3;;;;;;;714:32647;;;;1193:3;;;;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;714:32647;1193:3;;;;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;5840:19;1193:3;;;;:::i;:::-;5840:19;1193:3;;;:::i;:::-;;714:32647;1193:3;;;;;;;;;;;;714:32647;1193:3;;;;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;5840:19;1193:3;;;;;714:32647;6436:224;;714:32647;;;;1193:3;;;;;;;;;714:32647;;;1193:3;;;;;;6436:224;1193:3;;;;5860:10;714:32647;;5840:19;714:32647;;;;;;1193:3;6760:21;;714:32647;6760:21;:::i;:::-;;1193:3;-1:-1:-1;;;;;714:32647:85;5860:10;6841:49;;714:32647;;6841:49;6955:96;714:32647;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;6955:96;;;;:::i;:::-;714:32647;;;;;;;;;;:::i;:::-;;;;;5590:30;;7141:181;;1193:3;714:32647;;;1193:3;;714:32647;1193:3;714:32647;;7337:144;714:32647;;;;;;;;;;;;;;;;;;;;1193:3;;;714:32647;1193:3;;714:32647;1193:3;;;;:::i;:::-;;;;714:32647;1193:3;;;714:32647;1193:3;;;;:::i;:::-;;;;;714:32647;1193:3;;;;:::i;:::-;7337:144;;;714:32647;;;;2018:4;-1:-1:-1;;;;;7551:44:85;;;;:::i;:::-;;1193:3;;;714:32647;;;;;;1193:3;714:32647;;-1:-1:-1;;;1193:3:85;;714:32647;1193:3;;;;;;714:32647;1193:3;;714:32647;-1:-1:-1;;;714:32647:85;;;1193:3;714:32647;;1193:3;7141:181;7224:38;;;;;;;;;;;;714:32647;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;1193:3;714:32647;1193:3;714:32647;;;;7337:144;714:32647;1193:3;714:32647;;;:::i;:::-;7289:22;7141:181;;;;;;;;;;;1193:3;;;;-1:-1:-1;1193:3:85;;;;;;;;5840:19;1193:3;;714:32647;;;;;1193:3;714:32647;1193:3;;-1:-1:-1;;1193:3:85;;;;;714:32647;;;;;;1193:3;714:32647;;;;;;;;;;;1193:3;;;;;;;;;;;;5840:19;1193:3;;;;;;;;;;;;5840:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;;;;;714:32647;1193:3;;;;714:32647;1193:3;;;;;;;;;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;;714:32647;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;5840:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;;;;714:32647;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;19853:41;714:32647;;;:::i;:::-;3657:14;;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;19853:16;714:32647;;;;;19853:41;:::i;:::-;714:32647;:::i;:::-;;19912:19;;;19933:22;714:32647;;;19933:22;;;19957:16;;714:32647;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;13998:84;14006:30;;13998:84;:::i;:::-;14134:10;714:32647;;14114:19;714:32647;;;;;;14163:15;;;14155:51;;;:::i;:::-;3657:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;;;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;14134:10;3427:51;3419:108;:::i;:::-;714:32647;;;14572:16;714:32647;;14564:103;714:32647;14114:19;14572:41;714:32647;;;;14572:41;:::i;:::-;:50;714:32647;;14564:103;:::i;:::-;714:32647;;;14572:16;714:32647;;14754:41;714:32647;;;;14754:41;:::i;:::-;714:32647;;;;;;14854:44;714:32647;;;;14854:44;:::i;:::-;14913:13;14572:16;714:32647;14932:22;;14908:131;14963:3;714:32647;;14928:33;;;;;15002:25;14982:46;714:32647;15002:25;;714:32647;15002:25;;;:::i;14982:46::-;714:32647;14913:13;;14928:33;;;714:32647;;;14572:16;714:32647;;14114:19;15085:41;714:32647;;;;15085:41;:::i;:::-;:50;1193:3;;-1:-1:-1;;1193:3:85;;;15210:43;;;:::i;:::-;:45;714:32647;;15210:45;:::i;:::-;1193:3;;15293:39;714:32647;15293:39;;714:32647;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;3657:14;;;;:44;;;714:32647;3649:80;;;;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;714:32647:85;;;:::i;:::-;;;;;;;;;;;;28956:44;714:32647;;;;;;;;;28956:44;:::i;:::-;29016:13;714:32647;;;;-1:-1:-1;;714:32647:85;;;29048:3;29031:15;;;;;;714:32647;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;29124:113;;29048:3;;714:32647;29016:13;;29124:113;29171:16;;;;;:::i;:::-;714:32647;29205:17;;;;:::i;:::-;;;;;;:::i;:::-;;29124:113;;;29031:15;;;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;11545:30;714:32647;11545:30;;11537:84;;;;:::i;:::-;11673:10;714:32647;;11653:19;714:32647;;;;;;;11702:15;;;;11694:51;;;;:::i;:::-;714:32647;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;3657:44;;;;714:32647;3649:80;;;;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;;;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;11673:10;3427:51;3419:108;:::i;:::-;714:32647;;;12296:16;714:32647;;12296:41;714:32647;;;;12296:41;:::i;:::-;12388:16;11653:19;12388:16;;714:32647;12380:69;714:32647;;;;12380:69;:::i;:::-;12527:11;;;;:::i;:::-;12629:16;;;;:::i;:::-;714:32647;;;;;;12753:44;714:32647;;;;12753:44;:::i;:::-;12812:13;714:32647;12831:22;12296:16;12831:22;;12807:131;12862:3;714:32647;;12827:33;;;;;12901:25;12881:46;714:32647;12901:25;;;;714:32647;12901:25;;:::i;12881:46::-;714:32647;12812:13;;12827:33;;;714:32647;12827:33;;;;;12974;;;;:::i;:::-;13017:19;714:32647;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;;;;714:32647;1854:42;1193:3;;;;;;;714:32647;13240:3;714:32647;;13213:25;;;;;13293:19;;;;:::i;:::-;;714:32647;13272:17;;;;;:::i;:::-;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;;714:32647;1193:3;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;13198:13;;1193:3;;;;-1:-1:-1;1193:3:85;;;;;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;714:32647;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11653:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;;;;13213:25;;;13630:146;13213:25;;;714:32647;;;;;;:::i;:::-;;;;;13412:181;;13193:130;714:32647;13630:146;714:32647;;;;;;;;;;;;;;;;;;;;13630:146;;;;;:::i;:::-;;;;714:32647;13412:181;13630:146;714:32647;;;;;;13495:38;714:32647;;13495:38;;;;;;:::i;:::-;13560:22;13412:181;;;;714:32647;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;;;:::i;:::-;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;714:32647;1193:3;;714:32647;1193:3;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;;;;;;;;;1193:3;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;714:32647;1193:3;714:32647;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11653:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;;;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;;;;11653:19;1193:3;;714:32647;1193:3;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;3586:87:86;714:32647:85;3586:87:86;;:::i;714:32647:85:-;;;;;;-1:-1:-1;;714:32647:85;;;;2692:64:27;714:32647:85;5647:18:27;:43;;;714:32647:85;;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;5835:13:27;;714:32647:85;;;;5870:4:27;714:32647:85;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;-1:-1:-1;714:32647:85;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1193:3:85;;-1:-1:-1;714:32647:85;;;-1:-1:-1;;;;;;;;;;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;;714:32647;1193:3;;;1854:42;1193:3;714:32647;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;5647:43:27;714:32647:85;5669:16:27;714:32647:85;5669:21:27;5647:43;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;;;3657:14;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;;;;;;25984:30;714:32647;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;-1:-1:-1;;;;;714:32647:85;;;;;4301:16:24;714:32647:85;;4724:16:24;;:34;;;;714:32647:85;4803:1:24;4788:16;:50;;;;714:32647:85;4853:13:24;:30;;;;714:32647:85;4849:91:24;;;714:32647:85;4803:1:24;-1:-1:-1;;;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;4977:67:24;;714:32647:85;6891:76:24;;:::i;:::-;;;:::i;:::-;6959:1;4496:10:85;6959:1:24;:::i;:::-;6891:76;;:::i;:::-;714:32647:85;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;4803:1:24;714:32647:85;;-1:-1:-1;;;714:32647:85;;;;6891:76:24;;:::i;:::-;;;:::i;:::-;714:32647:85;;-1:-1:-1;;;;;1193:3:85;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;:::i;:::-;714:32647;1193:3;;;;714:32647;1193:3;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;;;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;714:32647;;-1:-1:-1;;;;;1193:3:85;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;:::i;:::-;714:32647;1193:3;;;;;;714:32647;;1193:3;;;714:32647;;;1193:3;;;;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;714:32647;2692:64:27;1193:3:85;714:32647;3788:16:27;1193:3:85;5064:101:24;;714:32647:85;5064:101:24;714:32647:85;5140:14:24;714:32647:85;-1:-1:-1;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;-1:-1:-1;;;;;;;;;;;714:32647:85;;4803:1:24;714:32647:85;;5140:14:24;714:32647:85;1193:3;;;;-1:-1:-1;1193:3:85;;;;;714:32647;;1193:3;;714:32647;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;1193:3;714:32647;1193:3;;;;;;;;;4803:1:24;1193:3:85;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;;;;;;;;;3676:10:27;1193:3:85;;714:32647;1193:3;;;;;;;;;;;;714:32647;4803:1:24;1193:3:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;1193:3;;714:32647;;1193:3;;;;;;;714:32647;1193:3;;;;;714:32647;1193:3;;;;;;:::i;:::-;;;;;;;-1:-1:-1;1193:3:85;;;;;;;;-1:-1:-1;1193:3:85;;;;;714:32647;;1193:3;;714:32647;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;;1193:3;714:32647;1193:3;;;;;;;;4803:1:24;1193:3:85;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1193:3:85;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;;;;714:32647;4803:1:24;1193:3:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;1193:3;;714:32647;;1193:3;;;;;;;714:32647;1193:3;;;;714:32647;1193:3;;;;;;:::i;:::-;;;;4977:67:24;-1:-1:-1;;;;;;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;4977:67:24;;4853:30;4870:13;;;4853:30;;;4788:50;4816:4;4808:25;:30;;-1:-1:-1;4788:50:24;;4724:34;;;-1:-1:-1;4724:34:24;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;1408:2;714:32647;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;2303:62:23;;:::i;:::-;-1:-1:-1;;;;;;;;;;;714:32647:85;;-1:-1:-1;;;;;;1193:3:85;;;;;714:32647;;-1:-1:-1;;;;;714:32647:85;3975:40:23;714:32647:85;;3975:40:23;714:32647:85;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;1650:2;714:32647;;;;;;;;2892:105:86;714:32647:85;;;:::i;:::-;;;;2892:105:86;714:32647:85;;;;;2892:105:86;:::i;:::-;714:32647:85;;;;;;;2892:105:86;714:32647:85;;2892:105:86;714:32647:85;2892:105:86;714:32647:85;2892:105:86;;;;714:32647:85;:::i;:::-;;;;:::i;:::-;2892:105:86;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;2018:4;714:32647;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;:::i;:::-;;3657:14;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;3657:44::-;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;5090:6:25;-1:-1:-1;;;;;714:32647:85;5081:4:25;5073:23;5069:145;;714:32647:85;;;-1:-1:-1;;;;;;;;;;;714:32647:85;;;5069:145:25;5174:29;;;714:32647:85;5174:29:25;714:32647:85;;5174:29:25;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;-1:-1:-1;;;;;714:32647:85;;:::i;:::-;;;;27809:19;714:32647;;;;;;27855:15;;;:49;;;714:32647;;;;;;;;;;;27855:49;714:32647;;;27874:9;714:32647;;;;;;;;27874:30;714:32647;;27855:49;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;2736:67:86;;714:32647:85;;;;;;2736:67:86;714:32647:85;2736:67:86;;;;714:32647:85;:::i;:::-;;;;;2736:67:86;714:32647:85;2736:67:86;;;;714:32647:85;:::i;:::-;;2736:67:86;714:32647:85;;2736:67:86;;714:32647:85;;2736:67:86;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;2624:62:25;;:::i;:::-;2303::23;;:::i;:::-;714:32647:85;;-1:-1:-1;;;6131:52:25;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;6131:52:25;;714:32647:85;;6131:52:25;;;714:32647:85;-1:-1:-1;6127:437:25;;1805:47:35;;;;714:32647:85;6493:60:25;714:32647:85;;;;6493:60:25;6127:437;6225:40;-1:-1:-1;;;;;;;;;;;6225:40:25;;;6221:120;;1748:29:35;;;:34;1744:119;;-1:-1:-1;;;;;;;;;;;1193:3:85;;-1:-1:-1;;;;;;1193:3:85;;;;;2407:36:35;-1:-1:-1;;2407:36:35;714:32647:85;;2458:15:35;:11;;714:32647:85;4065:25:42;;714:32647:85;4107:55:42;4065:25;;;;;;;;;:::i;:::-;4107:55;;:::i;2454:148:35:-;6163:9;;;6159:70;;714:32647:85;6159:70:35;6199:19;;;714:32647:85;6199:19:35;714:32647:85;;6199:19:35;1744:119;1805:47;;;714:32647:85;1805:47:35;714:32647:85;;;;1805:47:35;6221:120:25;6292:34;;;714:32647:85;6292:34:25;714:32647:85;;;;6292:34:25;6131:52;;;;714:32647:85;6131:52:25;;714:32647:85;6131:52:25;;;;;;714:32647:85;6131:52:25;;;:::i;:::-;;;714:32647:85;;;;;6131:52:25;;;;;;;-1:-1:-1;6131:52:25;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;3202:137:86;714:32647:85;;;;;;;;:::i;:::-;;;;;;;;;;;;3202:137:86;:::i;:::-;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;25306:19;714:32647;;;;;;;;25359:9;714:32647;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;29870:44;714:32647;;;;;;;;:::i;:::-;3657:14;;;;;;:44;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;;;29870:44;:::i;:::-;714:32647;;:::i;:::-;;;29938:23;;714:32647;;;;;;;;;;;;;;;;;;:::i;3657:44::-;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;15886:10;;714:32647;;15866:19;714:32647;;;;;;15915:15;15996:30;15915:15;;;15907:51;;;;:::i;15996:30::-;3657:44;;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;3747:9;714:32647;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;3747:9;714:32647;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;15886:10;3427:51;3419:108;:::i;:::-;714:32647;;;12296:16;714:32647;;;;;-1:-1:-1;714:32647:85;;;;;-1:-1:-1;714:32647:85;12388:16;15866:19;12388:16;;714:32647;12380:69;714:32647;;;;12380:69;:::i;:::-;714:32647;;30320:38;;714:32647;30320:38;;;;;;;;;:::i;:::-;30630:22;;714:32647;30624:40;714:32647;;1193:3;30720:22;;714:32647;30714:62;1077:3;;714:32647;30819:31;;1193:3;;30819:35;1077:3;;714:32647;30927:31;;1193:3;;;-1:-1:-1;1077:3:85;;31108:36;;;1193:3;31108:40;1077:3;;714:32647;31218:20;;;714:32647;31212:38;1077:3;;1524;31303:20;;714:32647;31297:57;1756:3;;12629:16;;;;;;;:::i;:::-;714:32647;;;;;;;;;-1:-1:-1;714:32647:85;;;;;-1:-1:-1;714:32647:85;12812:13;714:32647;12831:22;12296:16;12831:22;;12807:131;12862:3;714:32647;;12827:33;;;;;12901:25;12881:46;714:32647;12901:25;;3747:9;12901:25;;;:::i;12881:46::-;714:32647;12812:13;;12827:33;;;3747:9;12827:33;;;;;1854:42;1193:3;714:32647;;1193:3;714:32647;;13017:19;714:32647;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;;;;3747:9;1854:42;1193:3;;;;;;;714:32647;13240:3;714:32647;;13213:25;;;;;13293:19;;;;:::i;:::-;;714:32647;13272:17;;;;;:::i;:::-;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;;3747:9;1193:3;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;13198:13;;1193:3;;;;-1:-1:-1;1193:3:85;;;;;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;3747:9;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15866:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;3747:9;1193:3;;;;;;;;;;;;;;;13213:25;;;714:32647;13213:25;13630:146;13495:38;13630:146;13213:25;714:32647;13213:25;714:32647;;;;;;;:::i;:::-;;;;13495:38;;;;:::i;:::-;13560:22;714:32647;;;3747:9;714:32647;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;13630:146;:::i;714:32647::-;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;714:32647;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;3747:9;1193:3;;714:32647;1193:3;;;714:32647;1193:3;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;;;;;;;;;1193:3;714:32647;;;1193:3;;714:32647;;;;;;;1193:3;714:32647;1193:3;;;;;;;;714:32647;1193:3;3747:9;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15866:19;1193:3;;714:32647;1193:3;;;;;;;;;;;;714:32647;3747:9;1193:3;;;;;;;;;;;;;;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;3747:9;714:32647;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3747:9;714:32647;;;;;;;;;;;;;;;;;;;;1193:3;;;;15866:19;1193:3;;714:32647;1193:3;;714:32647;;;;;;;3747:9;714:32647;;;;;;;;;;;;;;;;;;1756:3;714:32647;;-1:-1:-1;;;1756:3:85;;714:32647;;1756:3;;;;714:32647;1756:3;;714:32647;-1:-1:-1;;;714:32647:85;;;1756:3;;;;1077;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;1077:3;714:32647;;;1077:3;;;;;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;1077:3;714:32647;;;1077:3;-1:-1:-1;;;1077:3:85;;;;;;;;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;1077:3;714:32647;;;1077:3;-1:-1:-1;;;1077:3:85;;;;;;;;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;1077:3;714:32647;;;1077:3;-1:-1:-1;;;1077:3:85;;;;;;;;714:32647;;-1:-1:-1;;;1077:3:85;;714:32647;;1077:3;;;;714:32647;1077:3;;714:32647;-1:-1:-1;;;714:32647:85;;;1077:3;;;;714:32647;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;-1:-1:-1;;714:32647:85;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;8258:30;714:32647;8258:30;;8250:84;;;;:::i;:::-;8386:10;714:32647;;8366:19;714:32647;;;;;;;8415:15;;;;8407:51;;;;:::i;714:32647::-;;;;;:::i;:::-;3657:44;;;;714:32647;3649:80;;;:::i;:::-;714:32647;;;;;;;;;;;3739:82;;-1:-1:-1;;;;;714:32647:85;3747:51;;3739:82;:::i;:::-;714:32647;;;;;;3946:65;714:32647;;;;;3954:30;714:32647;;3946:65;:::i;:::-;714:32647;;;;;;;;;;;3419:108;;-1:-1:-1;;;;;714:32647:85;8386:10;3427:51;3419:108;:::i;:::-;714:32647;;;8996:16;714:32647;;;8366:19;8996:41;714:32647;;;;8996:41;:::i;:::-;:50;714:32647;;;;9219:16;;;;9544:144;9219:16;;;;:::i;:::-;714:32647;;;;;;:::i;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;3657:44;-1:-1:-1;714:32647:85;;3675:26;;;3657:44;;714:32647;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;:::o;:::-;-1:-1:-1;;;;;714:32647:85;;;;;;-1:-1:-1;;714:32647:85;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;714:32647:85;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;-1:-1:-1;;714:32647:85;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;3586:87:86;714:32647:85;;;-1:-1:-1;714:32647:85;;:::o;:::-;;;;;;;-1:-1:-1;714:32647:85;3429:81:86;714:32647:85;;;-1:-1:-1;714:32647:85;;:::o;:::-;;;;;;;;-1:-1:-1;714:32647:85;;;;-1:-1:-1;714:32647:85;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;714:32647:85;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;1193:3;;;714:32647;1193:3;;;1854:42;1193:3;;;;714:32647;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;714:32647:85;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;-1:-1:-1;714:32647:85;;;;;;;:::o;:::-;;;;;;;:::i;:::-;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;23332:1;714:32647;;;;23332:1;714:32647;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;23332:1;714:32647;;;;:::i;:::-;;;;;;;;;;:::i;:::-;23332:1;714:32647;;;;;;;;;;;;23332:1;714:32647;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;714:32647:85;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;-1:-1:-1;714:32647:85;;;;:::i;:::-;;;;;;;;;;:::i;:::-;-1:-1:-1;714:32647:85;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;-1:-1:-1;;714:32647:85;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;22937:1554;;;;;714:32647;;:::i;:::-;23150:43;;;:::i;:::-;714:32647;23237:20;;;;;:34;;;22937:1554;23233:175;;23466:14;;;;;:::i;:::-;:27;23462:85;;22937:1554;23576:32;;;:::i;:::-;23557:51;;23636:14;;;;:::i;:::-;23635:29;23618:14;;;714:32647;-1:-1:-1;23745:23:85;-1:-1:-1;23784:13:85;23796:1;714:32647;-1:-1:-1;714:32647:85;23779:706;23841:3;23799:17;;;;:40;;;23841:3;23799:40;;;714:32647;-1:-1:-1;714:32647:85;23796:1;23618:14;714:32647;;23881:21;714:32647;-1:-1:-1;714:32647:85;23881:21;714:32647;;23881:66;;;23841:3;23881:145;;;23841:3;23860:615;;23841:3;;;;:::i;:::-;23784:13;;23860:615;24063:22;;;;;:55;;;23860:615;24059:370;;23860:615;24446:14;23841:3;24446:14;;:::i;:::-;23860:615;;;;;24059:370;714:32647;24446:14;24397:13;23841:3;714:32647;;-1:-1:-1;714:32647:85;23796:1;23618:14;714:32647;24142:233;714:32647;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;24320:16;23618:14;714:32647;;24320:32;714:32647;;-1:-1:-1;714:32647:85;24320:32;:::i;:::-;714:32647;;;;;;;:::i;:::-;;;;:::i;:::-;23618:14;24174:201;;714:32647;;:::i;:::-;;24174:201;;714:32647;24142:16;;:233;;;;;:::i;:::-;;;:::i;:::-;;24397:13;:::i;:::-;24059:370;;;;;;24063:55;24104:14;;;;;:::i;:::-;24089:29;;24063:55;;23881:145;714:32647;;-1:-1:-1;714:32647:85;23971:16;23618:14;714:32647;;23796:1;23971:32;714:32647;;-1:-1:-1;714:32647:85;23971:32;:::i;:::-;:44;714:32647;;:::i;:::-;23971:55;;23881:145;;:66;714:32647;;-1:-1:-1;714:32647:85;23906:16;23618:14;714:32647;;23906:41;:32;714:32647;;-1:-1:-1;714:32647:85;23906:32;:::i;:::-;:41;714:32647;;23881:66;;23799:40;;;;;;;;;;22937:1554::o;23799:40::-;23820:19;;;;23799:40;;23462:85;23517:19;;;;;;:::i;:::-;23462:85;;;23233:175;23306:28;;;;;;;;:::i;:::-;23287:47;;-1:-1:-1;23348:14:85;;;714:32647;23384:13;:::o;23237:34::-;23261:10;;;23237:34;;26331:972;;;26519:19;714:32647;26553:20;;;;;:34;;;26331:972;26549:167;;26730:14;;;;;:::i;:::-;:27;26726:85;;26331:972;714:32647;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;714:32647:85;;;:::i;:::-;;;;;;;26821:34;26876:14;;;;;:::i;:::-;26875:29;26915:24;714:32647;26949:23;714:32647;26988:13;27000:1;714:32647;;;26983:314;27045:3;27003:17;;;;:40;;;27045:3;27003:40;;;714:32647;;;27000:1;714:32647;;;27068:21;714:32647;;;27068:21;714:32647;;27064:223;;27045:3;;;;:::i;:::-;26988:13;;27064:223;27113:22;;;;;;;:55;;;27064:223;27109:132;;27064:223;27258:14;;;27045:3;27258:14;;:::i;:::-;27064:223;;;;;27109:132;27204:13;27045:3;27204:13;27192:30;27204:13;;27258:14;27204:13;;;;:::i;:::-;27192:30;;:::i;:::-;714:32647;27109:132;;;;;;;27113:55;27154:14;;;;;:::i;:::-;27139:29;;27113:55;;27003:40;;;;;;;;;;;26331:972::o;27003:40::-;27024:19;;;;27003:40;;26726:85;26781:19;;;;;;:::i;:::-;26726:85;;;26549:167;714:32647;;;;;;;;;;:::i;:::-;;;;;;;;26676:29;714:32647;26676:29;:::o;26553:34::-;26577:10;;;26553:34;;32204:141;32315:23;714:32647;32204:141;714:32647;;32315:23;;;;;;;714:32647;;;;;;:::i;:::-;32315:23;714:32647;;32315:23;;;;;;:::i;1295:3::-;;;;:::o;:::-;714:32647;;-1:-1:-1;;;1295:3:85;;;;;;;;;;;714:32647;-1:-1:-1;;;714:32647:85;;;1295:3;;;;1193;;;;:::o;:::-;714:32647;;-1:-1:-1;;;1193:3:85;;;;;;;;;;;714:32647;-1:-1:-1;;;714:32647:85;;;1193:3;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;714:32647;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;1193:3;714:32647;1193:3;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;714:32647;1193:3;714:32647;;;;1193:3;714:32647;1193:3;;;;;;;;-1:-1:-1;1193:3:85;;;;;;;;;;;;;;:::o;:::-;714:32647;;;;;;;;1193:3;;;;;;;;714:32647;;1193:3;;;;;;;;;;;;714:32647;1193:3;;;;;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;;714:32647;;;;1193:3;714:32647;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;-1:-1:-1;;714:32647:85;1193:3;;;714:32647;;1193:3;;;;;;;;;;;;;;714:32647;;;;:::i;:::-;;;;;;;;:::i;:::-;;;1193:3;-1:-1:-1;1193:3:85;;;;:::o;:::-;714:32647;1193:3;:::o;714:32647::-;;;;;;;:::i;:::-;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;:::o;32398:142::-;32502:31;32398:142;714:32647;;:::i;:::-;;32502:31;714:32647;;;32502:31;;;;;;:::i;3405:215:23:-;-1:-1:-1;;;;;714:32647:85;3489:22:23;;3485:91;;-1:-1:-1;;;;;;;;;;;714:32647:85;;-1:-1:-1;;;;;;1193:3:85;;;;;;;-1:-1:-1;;;;;714:32647:85;3975:40:23;-1:-1:-1;;3975:40:23;3405:215::o;3485:91::-;3534:31;;;3509:1;3534:31;3509:1;3534:31;714:32647:85;;3509:1:23;3534:31;21163:1415:85;;;;;714:32647;;:::i;:::-;21370:37;;;:::i;:::-;714:32647;21451:20;;;;;:34;;;21163:1415;21447:175;;21680:14;;;;;:::i;:::-;:27;21676:85;;21163:1415;21790:32;;;:::i;:::-;21771:51;;21850:14;;;;:::i;:::-;21849:29;21832:14;;;714:32647;-1:-1:-1;21952:23:85;-1:-1:-1;21991:13:85;22003:1;714:32647;-1:-1:-1;714:32647:85;21986:586;22048:3;22006:17;;;;:40;;;22048:3;22006:40;;;714:32647;-1:-1:-1;714:32647:85;22071:16;21832:14;714:32647;;22003:1;22071:32;714:32647;;-1:-1:-1;714:32647:85;22071:32;:::i;714:32647::-;22067:495;;22048:3;;;;:::i;:::-;21991:13;;22067:495;22150:22;;;;;:55;;;22067:495;22146:370;;22067:495;22533:14;22048:3;22533:14;;:::i;:::-;22067:495;;;;;22146:370;714:32647;22533:14;22484:13;22048:3;714:32647;;-1:-1:-1;714:32647:85;22003:1;21832:14;714:32647;22229:233;714:32647;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;22071:16;21832:14;714:32647;;22407:32;714:32647;;-1:-1:-1;714:32647:85;22407:32;:::i;22484:13::-;22146:370;;;;;;22150:55;22191:14;;;;;:::i;:::-;22176:29;;22150:55;;22006:40;22027:19;;;;22006:40;;21676:85;21731:19;;;;;;:::i;:::-;21676:85;;;21451:34;21475:10;;;21451:34;;714:32647;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;;;-1:-1:-1;714:32647:85;:::o;:::-;;;;;;-1:-1:-1;714:32647:85;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;-1:-1:-1;714:32647:85;;;;;;;-1:-1:-1;;714:32647:85;;;;;;;;;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;;-1:-1:-1;;714:32647:85;;;-1:-1:-1;;714:32647:85;;;;;;;-1:-1:-1;714:32647:85;;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;;-1:-1:-1;714:32647:85;;;;;;;;:::o;:::-;;;;;;;;;;1193:3;;;714:32647;;;;;;:::i;:::-;;;;;;;;;;;1193:3::o;714:32647::-;;;;;;;;1193:3;;;714:32647;;1193:3;;;;714:32647;;:::o;4578:312:25:-;-1:-1:-1;;;;;4667:6:25;714:32647:85;4658:4:25;4650:23;;;:120;;;;4578:312;4633:251;;;4578:312::o;4650:120::-;-1:-1:-1;;;;;;;;;;;714:32647:85;-1:-1:-1;;;;;714:32647:85;4728:42:25;;;-1:-1:-1;4650:120:25;;;2658:162:23;-1:-1:-1;;;;;;;;;;;714:32647:85;-1:-1:-1;;;;;714:32647:85;966:10:26;2717:23:23;2713:101;;2658:162::o;2713:101::-;2763:40;;;-1:-1:-1;2763:40:23;966:10:26;2763:40:23;714:32647:85;;-1:-1:-1;2763:40:23;714:32647:85;;;;;-1:-1:-1;;714:32647:85;;:::o;9799:1126::-;;;;;;;10101:11;;;;:::i;:::-;10203:16;;;;:::i;:::-;714:32647;;;;;;:::i;:::-;10300:174;;;;:::i;:::-;;;;714:32647;;;;10300:174;;714:32647;;;10300:174;;;714:32647;10459:4;714:32647;;;-1:-1:-1;714:32647:85;10256:16;10300:174;714:32647;10256:41;714:32647;;-1:-1:-1;714:32647:85;10256:41;:::i;:::-;714:32647;;10459:4;714:32647;;;;;;;;;:::i;:::-;;;;10459:4;714:32647;;;-1:-1:-1;;;;;714:32647:85;;;;;;;;;;:::i;:::-;10300:174;714:32647;;;;;;;;;;;-1:-1:-1;;714:32647:85;;;;;1193:3;;;;;;;;;714:32647;1193:3;;;;;714:32647;;;;;;;10256:16;714:32647;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;10300:174;714:32647;;-1:-1:-1;714:32647:85;10300:174;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;714:32647;;;1193:3;;;;;714:32647;-1:-1:-1;714:32647:85;10580:19;10300:174;714:32647;10580:44;714:32647;;-1:-1:-1;714:32647:85;10580:44;:::i;:::-;10639:13;-1:-1:-1;10681:3:85;714:32647;;10654:25;;;;;10734:19;;;;:::i;:::-;;10300:174;10713:17;;;;;:::i;:::-;;714:32647;;;;;;;;;;;;;;;;;;;;;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;10300:174;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;;10459:4;1193:3;;;-1:-1:-1;1193:3:85;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;10639:13;;1193:3;714:32647;;;1193:3;;714:32647;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;1193:3;-1:-1:-1;1193:3:85;;;;;;;;10459:4;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;714:32647;1193:3;;714:32647;1193:3;;;;;;;;;;;;10300:174;10459:4;1193:3;;;;;;;;;;;;;;;10654:25;;;;;;10873:43;10654:25;10824:37;;;:::i;:::-;:39;714:32647;;10824:39;:::i;:::-;1193:3;;10873:43;:::i;:::-;:45;714:32647;;10873:45;:::i;:::-;1193:3;;9799:1126::o;714:32647::-;;;;;1193:3;-1:-1:-1;;;;;1193:3:85;;;;;;;;;;:::i;:::-;10300:174;1193:3;714:32647;1193:3;;;714:32647;;;1193:3;;;10459:4;1193:3;;10300:174;1193:3;;;-1:-1:-1;1193:3:85;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;714:32647;;;;;;;;;1193:3;714:32647;;;1193:3;;714:32647;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;1193:3;-1:-1:-1;1193:3:85;;;;;;;;10300:174;1193:3;10459:4;1193:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;714:32647;1193:3;;;;;;;;;;;;10300:174;10459:4;1193:3;;;;;;;;;;;;;;;714:32647;;-1:-1:-1;714:32647:85;;10300:174;-1:-1:-1;714:32647:85;;;;;;;;;;;;;;;;;;10459:4;714:32647;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;;-1:-1:-1;714:32647:85;;;;;;;;;10459:4;714:32647;;;;;;;;;;;;;;;;;;;;;1193:3;;;;;;;714:32647;1193:3;;714:32647;;;;;;;;;;10300:174;10459:4;714:32647;;;;;;;;;;;;;;;30133:354;714:32647;;;;;;30241:30;;714:32647;30320:38;714:32647;30320:38;714:32647;;30320:38;;;;;;:::i;:::-;30630:22;;714:32647;30624:40;714:32647;;1193:3;30720:22;;714:32647;30714:62;1077:3;;30320:38;30819:31;;1193:3;;30819:35;1077:3;;30927:31;;;1193:3;;;-1:-1:-1;1077:3:85;;31108:36;;;1193:3;31108:40;1077:3;;31218:20;;;;714:32647;31212:38;1077:3;;1524;31303:20;;714:32647;31297:57;1756:3;;30133:354::o;30237:244::-;714:32647;;-1:-1:-1;;;30436:34:85;;714:32647;30436:34;;;714:32647;;;;;;;;;;;30436:34;;;31535:618;714:32647;;;;31643:28;714:32647;;1650:2;714:32647;;31738:31;714:32647;;-1:-1:-1;31843:3:85;714:32647;;31826:15;;;;;31876:7;;;;:::i;:::-;;714:32647;31870:25;714:32647;;1408:2;31958:7;;;;:::i;:::-;;714:32647;31952:50;714:32647;;1524:3;32058:9;;;;:::i;:::-;;714:32647;32052:54;714:32647;;;;31811:13;;714:32647;;;-1:-1:-1;;;714:32647:85;;1408:2;714:32647;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;1408:2;714:32647;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;1408:2;714:32647;;;;;;;;;;;;;;;;;31826:15;;;;31535:618::o;714:32647::-;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:32647:85;;;;;;;7082:141:24;714:32647:85;-1:-1:-1;;;;;;;;;;;714:32647:85;;;;7148:18:24;7144:73;;7082:141::o;7144:73::-;7189:17;;;-1:-1:-1;7189:17:24;;-1:-1:-1;7189:17:24;4437:582:42;;4609:8;;-1:-1:-1;714:32647:85;;5690:21:42;:17;;5815:105;;;;;;5686:301;5957:19;;;5710:1;5957:19;;5710:1;5957:19;4605:408;714:32647:85;;4857:22:42;:49;;;4605:408;4853:119;;4985:17;;:::o;4853:119::-;-1:-1:-1;;;4878:1:42;4933:24;;;-1:-1:-1;;;;;714:32647:85;;;;4933:24:42;714:32647:85;;;4933:24:42;4857:49;4883:18;;;:23;4857:49;","linkReferences":{},"immutableReferences":{"45353":[{"start":9569,"length":32},{"start":18763,"length":32}]}},"methodIdentifiers":{"BURN_ACTOR()":"0a6a63f1","MAX_CAPABILITIES()":"6e36e974","MAX_CAPABILITY_KEY_LENGTH()":"7f657567","MAX_CAPABILITY_VALUE_LENGTH()":"dcea1c6f","REGISTRATION_FEE()":"64b4f751","UPGRADE_INTERFACE_VERSION()":"ad3cb1cc","VERSION()":"ffa1ad74","activeProductTypeProviderCount(uint8)":"8bdc7747","activeProviderCount()":"f08bbda0","addProduct(uint8,bytes,string[],string[])":"02ff8437","addressToProviderId(address)":"e835440e","decodePDPOffering(bytes)":"deb0e462","eip712Domain()":"84b0196e","encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address))":"82ee4b34","getActiveProvidersByProductType(uint8,uint256,uint256)":"213c63b1","getAllActiveProviders(uint256,uint256)":"2f67c065","getNextProviderId()":"d1329d4e","getPDPService(uint256)":"c439fd57","getProduct(uint256,uint8)":"aca0988f","getProductCapabilities(uint256,uint8,string[])":"a6433240","getProductCapability(uint256,uint8,string)":"1e35bdde","getProvider(uint256)":"5c42d079","getProviderByAddress(address)":"2335bde0","getProviderCount()":"46ce4175","getProviderIdByAddress(address)":"93ecb91e","getProvidersByProductType(uint8,uint256,uint256)":"fc260f7b","initialize()":"8129fc1c","isProviderActive(uint256)":"83df54a5","isRegisteredProvider(address)":"51ca236f","migrate(string)":"c9c5b5b4","owner()":"8da5cb5b","productCapabilities(uint256,uint8,string)":"4368bafb","productTypeProviderCount(uint8)":"e459382f","providerHasProduct(uint256,uint8)":"cde24beb","providerProducts(uint256,uint8)":"6bf6d74f","providers(uint256)":"50f3fc81","proxiableUUID()":"52d1902d","registerProvider(address,string,string,uint8,bytes,string[],string[])":"b47be8ab","removeProduct(uint8)":"a9d239b6","removeProvider()":"b6363b99","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])":"0b5c0125","updateProduct(uint8,bytes,string[],string[])":"8c9a7b56","updateProviderInfo(string,string)":"d1c21b5b","upgradeToAndCall(address,bytes)":"4f1ef286"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ContractUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"serviceUrl\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"ProductAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"ProductRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"serviceUrl\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"ProductUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"ProviderInfoUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"ProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"ProviderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BURN_ACTOR\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CAPABILITIES\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CAPABILITY_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CAPABILITY_VALUE_LENGTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTRATION_FEE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"activeProductTypeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"addProduct\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"}],\"name\":\"addressToProviderId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"decodePDPOffering\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"serviceURL\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ipniPiece\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"ipniIpfs\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"paymentTokenAddress\",\"type\":\"address\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PDPOffering\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"serviceURL\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ipniPiece\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"ipniIpfs\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"paymentTokenAddress\",\"type\":\"address\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PDPOffering\",\"name\":\"pdpOffering\",\"type\":\"tuple\"}],\"name\":\"encodePDPOffering\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getActiveProvidersByProductType\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProviderInfo\",\"name\":\"providerInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProduct\",\"name\":\"product\",\"type\":\"tuple\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ProviderWithProduct[]\",\"name\":\"providers\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"hasMore\",\"type\":\"bool\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PaginatedProviders\",\"name\":\"result\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getAllActiveProviders\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"providerIds\",\"type\":\"uint256[]\"},{\"internalType\":\"bool\",\"name\":\"hasMore\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextProviderId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"getPDPService\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"serviceURL\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ipniPiece\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"ipniIpfs\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"paymentTokenAddress\",\"type\":\"address\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PDPOffering\",\"name\":\"pdpOffering\",\"type\":\"tuple\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"getProduct\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"string[]\",\"name\":\"keys\",\"type\":\"string[]\"}],\"name\":\"getProductCapabilities\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"exists\",\"type\":\"bool[]\"},{\"internalType\":\"string[]\",\"name\":\"values\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"getProductCapability\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"getProvider\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProviderInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"}],\"name\":\"getProviderByAddress\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProviderInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"}],\"name\":\"getProviderIdByAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getProvidersByProductType\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProviderInfo\",\"name\":\"providerInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ServiceProduct\",\"name\":\"product\",\"type\":\"tuple\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.ProviderWithProduct[]\",\"name\":\"providers\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"hasMore\",\"type\":\"bool\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PaginatedProviders\",\"name\":\"result\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"isProviderActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"isRegisteredProvider\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newVersion\",\"type\":\"string\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"productCapabilities\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"productTypeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"providerHasProduct\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"providerProducts\",\"outputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"providers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"registerProvider\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"removeProduct\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"removeProvider\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"serviceURL\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"minPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPieceSizeInBytes\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ipniPiece\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"ipniIpfs\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"storagePricePerTibPerMonth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minProvingPeriodInEpochs\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"paymentTokenAddress\",\"type\":\"address\"}],\"internalType\":\"struct ServiceProviderRegistryStorage.PDPOffering\",\"name\":\"pdpOffering\",\"type\":\"tuple\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"updatePDPServiceWithCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"capabilityKeys\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"capabilityValues\",\"type\":\"string[]\"}],\"name\":\"updateProduct\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"updateProviderInfo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"addProduct(uint8,bytes,string[],string[])\":{\"params\":{\"capabilityKeys\":\"Array of capability keys (max 32 chars each, max 10 keys)\",\"capabilityValues\":\"Array of capability values (max 128 chars each, max 10 values)\",\"productData\":\"The encoded product configuration data\",\"productType\":\"The type of product to add\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"This ensures the implementation contract cannot be initialized directly\"},\"eip712Domain()\":{\"details\":\"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature.\"},\"getActiveProvidersByProductType(uint8,uint256,uint256)\":{\"params\":{\"limit\":\"Maximum number of results to return\",\"offset\":\"Starting index for pagination (0-based)\",\"productType\":\"The product type to filter by\"},\"returns\":{\"result\":\"Paginated result containing provider details and hasMore flag\"}},\"getAllActiveProviders(uint256,uint256)\":{\"params\":{\"limit\":\"Maximum number of results to return\",\"offset\":\"Starting index for pagination (0-based)\"},\"returns\":{\"hasMore\":\"Whether there are more results after this page\",\"providerIds\":\"Array of active provider IDs\"}},\"getNextProviderId()\":{\"returns\":{\"_0\":\"The next provider ID that will be assigned\"}},\"getPDPService(uint256)\":{\"params\":{\"providerId\":\"The ID of the provider\"},\"returns\":{\"capabilityKeys\":\"Array of capability keys\",\"isActive\":\"Whether the PDP service is active\",\"pdpOffering\":\"The decoded PDP service data\"}},\"getProduct(uint256,uint8)\":{\"params\":{\"productType\":\"The type of product to retrieve\",\"providerId\":\"The ID of the provider\"},\"returns\":{\"capabilityKeys\":\"Array of capability keys\",\"isActive\":\"Whether the product is active\",\"productData\":\"The encoded product data\"}},\"getProductCapabilities(uint256,uint8,string[])\":{\"params\":{\"keys\":\"Array of capability keys to query\",\"productType\":\"The type of product\",\"providerId\":\"The ID of the provider\"},\"returns\":{\"exists\":\"Array of booleans indicating whether each key exists\",\"values\":\"Array of capability values corresponding to the keys (empty string for non-existent keys)\"}},\"getProductCapability(uint256,uint8,string)\":{\"params\":{\"key\":\"The capability key to query\",\"productType\":\"The type of product\",\"providerId\":\"The ID of the provider\"},\"returns\":{\"exists\":\"Whether the capability key exists\",\"value\":\"The capability value (empty string if key doesn't exist)\"}},\"getProvider(uint256)\":{\"params\":{\"providerId\":\"The ID of the provider\"},\"returns\":{\"info\":\"The provider information\"}},\"getProviderByAddress(address)\":{\"params\":{\"providerAddress\":\"The address of the service provider\"},\"returns\":{\"info\":\"The provider information (empty struct if not registered)\"}},\"getProviderCount()\":{\"returns\":{\"_0\":\"The total count of providers\"}},\"getProviderIdByAddress(address)\":{\"params\":{\"providerAddress\":\"The address of the service provider\"},\"returns\":{\"_0\":\"providerId The provider ID (0 if not registered)\"}},\"getProvidersByProductType(uint8,uint256,uint256)\":{\"params\":{\"limit\":\"Maximum number of results to return\",\"offset\":\"Starting index for pagination (0-based)\",\"productType\":\"The product type to filter by\"},\"returns\":{\"result\":\"Paginated result containing provider details and hasMore flag\"}},\"initialize()\":{\"details\":\"Can only be called once during proxy deployment\"},\"isProviderActive(uint256)\":{\"params\":{\"providerId\":\"The ID of the provider\"},\"returns\":{\"_0\":\"Whether the provider is active\"}},\"isRegisteredProvider(address)\":{\"params\":{\"provider\":\"The address to check\"},\"returns\":{\"_0\":\"Whether the address is a registered provider\"}},\"migrate(string)\":{\"details\":\"This function should be called during upgrades to emit version tracking events\",\"params\":{\"newVersion\":\"The version string for the new implementation\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"providerHasProduct(uint256,uint8)\":{\"params\":{\"productType\":\"The product type to check\",\"providerId\":\"The ID of the provider\"},\"returns\":{\"_0\":\"Whether the provider offers this product type\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"registerProvider(address,string,string,uint8,bytes,string[],string[])\":{\"params\":{\"capabilityKeys\":\"Array of capability keys\",\"capabilityValues\":\"Array of capability values\",\"description\":\"Provider description (max 256 chars)\",\"name\":\"Provider name (optional, max 128 chars)\",\"payee\":\"Address that will receive payments (cannot be changed after registration)\",\"productData\":\"The encoded product configuration data\",\"productType\":\"The type of product to register\"},\"returns\":{\"providerId\":\"The unique ID assigned to the provider\"}},\"removeProduct(uint8)\":{\"params\":{\"productType\":\"The type of product to remove\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])\":{\"params\":{\"capabilityKeys\":\"Array of capability keys (max 32 chars each, max 10 keys)\",\"capabilityValues\":\"Array of capability values (max 128 chars each, max 10 values)\",\"pdpOffering\":\"The new PDP service configuration\"}},\"updateProduct(uint8,bytes,string[],string[])\":{\"params\":{\"capabilityKeys\":\"Array of capability keys (max 32 chars each, max 10 keys)\",\"capabilityValues\":\"Array of capability values (max 128 chars each, max 10 values)\",\"productData\":\"The new encoded product configuration data\",\"productType\":\"The type of product to update\"}},\"updateProviderInfo(string,string)\":{\"params\":{\"description\":\"New provider description (max 256 chars)\",\"name\":\"New provider name (optional, max 128 chars)\"}},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"ServiceProviderRegistry\",\"version\":1},\"userdoc\":{\"events\":{\"ContractUpgraded(string,address)\":{\"notice\":\"Emitted when the contract is upgraded\"},\"ProductAdded(uint256,uint8,string,address,string[],string[])\":{\"notice\":\"Emitted when a product is added to an existing provider\"},\"ProductRemoved(uint256,uint8)\":{\"notice\":\"Emitted when a product is removed from a provider\"},\"ProductUpdated(uint256,uint8,string,address,string[],string[])\":{\"notice\":\"Emitted when a product is updated or added\"},\"ProviderInfoUpdated(uint256)\":{\"notice\":\"Emitted when provider info is updated\"},\"ProviderRegistered(uint256,address,address)\":{\"notice\":\"Emitted when a new provider registers\"},\"ProviderRemoved(uint256)\":{\"notice\":\"Emitted when a provider is removed\"}},\"kind\":\"user\",\"methods\":{\"BURN_ACTOR()\":{\"notice\":\"Burn actor address for burning FIL\"},\"MAX_CAPABILITIES()\":{\"notice\":\"Maximum number of capability key-value pairs per product\"},\"MAX_CAPABILITY_KEY_LENGTH()\":{\"notice\":\"Maximum length for capability keys\"},\"MAX_CAPABILITY_VALUE_LENGTH()\":{\"notice\":\"Maximum length for capability values\"},\"REGISTRATION_FEE()\":{\"notice\":\"Registration fee in attoFIL (5 FIL = 5 * 10^18 attoFIL)\"},\"VERSION()\":{\"notice\":\"Version of the contract implementation\"},\"activeProductTypeProviderCount(uint8)\":{\"notice\":\"Count of active providers offering each product type\"},\"activeProviderCount()\":{\"notice\":\"Count of active providers\"},\"addProduct(uint8,bytes,string[],string[])\":{\"notice\":\"Add a new product to an existing provider\"},\"addressToProviderId(address)\":{\"notice\":\"Address to provider ID lookup\"},\"constructor\":{\"notice\":\"Constructor that disables initializers for the implementation contract\"},\"decodePDPOffering(bytes)\":{\"notice\":\"Decode PDP offering from bytes\"},\"encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address))\":{\"notice\":\"Encode PDP offering to bytes\"},\"getActiveProvidersByProductType(uint8,uint256,uint256)\":{\"notice\":\"Get all active providers that offer a specific product type with pagination\"},\"getAllActiveProviders(uint256,uint256)\":{\"notice\":\"Get all active providers with pagination\"},\"getNextProviderId()\":{\"notice\":\"Returns the next available provider ID\"},\"getPDPService(uint256)\":{\"notice\":\"Get PDP service configuration for a provider (convenience function)\"},\"getProduct(uint256,uint8)\":{\"notice\":\"Get product data for a specific product type\"},\"getProductCapabilities(uint256,uint8,string[])\":{\"notice\":\"Get multiple capability values for a product\"},\"getProductCapability(uint256,uint8,string)\":{\"notice\":\"Get a single capability value for a product\"},\"getProvider(uint256)\":{\"notice\":\"Get complete provider information\"},\"getProviderByAddress(address)\":{\"notice\":\"Get provider info by address\"},\"getProviderCount()\":{\"notice\":\"Get total number of registered providers (including inactive)\"},\"getProviderIdByAddress(address)\":{\"notice\":\"Get provider ID by address\"},\"getProvidersByProductType(uint8,uint256,uint256)\":{\"notice\":\"Get all providers that offer a specific product type with pagination\"},\"initialize()\":{\"notice\":\"Initializes the registry contract\"},\"isProviderActive(uint256)\":{\"notice\":\"Check if a provider is active\"},\"isRegisteredProvider(address)\":{\"notice\":\"Check if an address is a registered provider\"},\"migrate(string)\":{\"notice\":\"Migration function for contract upgrades\"},\"productCapabilities(uint256,uint8,string)\":{\"notice\":\"Capability values mapping for efficient lookups\"},\"productTypeProviderCount(uint8)\":{\"notice\":\"Count of providers (including inactive) offering each product type\"},\"providerHasProduct(uint256,uint8)\":{\"notice\":\"Check if a provider offers a specific product type\"},\"providerProducts(uint256,uint8)\":{\"notice\":\"Provider products mapping (extensible for multiple product types)\"},\"providers(uint256)\":{\"notice\":\"Main registry of providers\"},\"registerProvider(address,string,string,uint8,bytes,string[],string[])\":{\"notice\":\"Register as a new service provider with a specific product type\"},\"removeProduct(uint8)\":{\"notice\":\"Remove a product from a provider\"},\"removeProvider()\":{\"notice\":\"Remove provider registration (soft delete)\"},\"updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])\":{\"notice\":\"Update PDP service configuration with capabilities\"},\"updateProduct(uint8,bytes,string[],string[])\":{\"notice\":\"Update an existing product configuration\"},\"updateProviderInfo(string,string)\":{\"notice\":\"Update provider information\"}},\"notice\":\"A registry contract for managing service providers across the Filecoin Services ecosystem\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ServiceProviderRegistry.sol\":\"ServiceProviderRegistry\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@fws-payments/=lib/fws-payments/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@pdp/=lib/pdp/src/\",\":@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/\",\":@session-key-registry/=lib/session-key-registry/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":fws-payments/=lib/fws-payments/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":pdp/=lib/pdp/src/\",\":pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/\",\":session-key-registry/=lib/session-key-registry/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x574a7451e42724f7de29e2855c392a8a5020acd695169466a18459467d719d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5bc189f63b639ee173dd7b6fecc39baf7113bf161776aea22b34c57fdd1872ec\",\"dweb:/ipfs/QmZAf2VtjDLRULqjJkde6LNsxAg12tUqpPqgUQQZbAjgtZ\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/EIP712Upgradeable.sol\":{\"keccak256\":\"0xd5d8ca01aef5be860ca223ddea39bf3c7467ba1a244fe8dcf26bc435e5ca43d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://48ff830d6a98a7e108a2309aff6dac9666b91e4003c2c1857957d7d79c6ac513\",\"dweb:/ipfs/QmNc3u2K11tshKxAmLEqjoxJ6eAFEiPAccwkr1RsWvsF3H\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"keccak256\":\"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d\",\"dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a\",\"dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP\"]},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196\",\"dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA\"]},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x8decfa54cec979c824b044b8128cd91d713f72c71fd7dfa54974624d8c949898\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://271f914261a19d87117a777e0924ada545c16191ef9b00cc40b0134fc14ebc70\",\"dweb:/ipfs/QmdvVNWHGHQrGGPonZJs5NuzTevTjZRM2zayKrDJf7WBA2\"]},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0x06871a0948d0fed9316ae59ee4368527e144911f5e284755312b5bfcde8b27ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3c30e46d061d8a450c561935a1236b1885aa76ffab93a19b26dcb8868c839843\",\"dweb:/ipfs/QmZbWbeDyixTyYkVtJvuiQYfkQz12pS7zxWZF3Ju9PYwGH\"]},\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0x104c579d98591d36dfe190bdad391c79c358d399ee18d76e877c30b94d3c07a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://332ab9adbc9a985195d56832159d09417ed5674adbbd6189db74586110aabc59\",\"dweb:/ipfs/QmZNVeVa4b7iKyFbHjvKir45RGBM93T7Yjgg9ye6Hu2umd\"]},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59\",\"dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"src/Errors.sol\":{\"keccak256\":\"0x27464ca1552086c6a7a7b0b069a66dcb3cb3d1db945570fa1120699ee151104a\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://8b2968e69dbb37a9b63b62196b3a87997a1453a410a0769af77701543061a2ef\",\"dweb:/ipfs/QmVrRCRtZeynQ6wtM9KFRKVQXDSHWUEt8CBo99Hoz5WrGH\"]},\"src/ServiceProviderRegistry.sol\":{\"keccak256\":\"0xfbd35734ef7436df8c3407c4fd64d74bf28a35ddcb427bc300282327034c03b7\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://c843026d23f17f082224ab2d0bd25168c41b1fa74675359f43fb0ac0d2e2152f\",\"dweb:/ipfs/QmNdVVEbhvgYaABPAwMAUtcYRw9zi49bukN2HPuwH7rhRv\"]},\"src/ServiceProviderRegistryStorage.sol\":{\"keccak256\":\"0x8b24b4146fc5220b5f5beb603df1397feb6f54cc7a44c15031ae97b914debe2d\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://453b1930c213530204b8f56ad298610748b2dd81fcf053e672f588722dfea4d9\",\"dweb:/ipfs/QmTGWoNgMYLYLtTv5p9LQMcYWGpdEH2eB7KdpQsm6srM53\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ERC1967InvalidImplementation"},{"inputs":[],"type":"error","name":"ERC1967NonPayable"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"InvalidInitialization"},{"inputs":[],"type":"error","name":"NotInitializing"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"UUPSUnauthorizedCallContext"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"type":"error","name":"UUPSUnsupportedProxiableUUID"},{"inputs":[{"internalType":"string","name":"version","type":"string","indexed":false},{"internalType":"address","name":"implementation","type":"address","indexed":false}],"type":"event","name":"ContractUpgraded","anonymous":false},{"inputs":[],"type":"event","name":"EIP712DomainChanged","anonymous":false},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8","indexed":true},{"internalType":"string","name":"serviceUrl","type":"string","indexed":false},{"internalType":"address","name":"serviceProvider","type":"address","indexed":false},{"internalType":"string[]","name":"capabilityKeys","type":"string[]","indexed":false},{"internalType":"string[]","name":"capabilityValues","type":"string[]","indexed":false}],"type":"event","name":"ProductAdded","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8","indexed":true}],"type":"event","name":"ProductRemoved","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8","indexed":true},{"internalType":"string","name":"serviceUrl","type":"string","indexed":false},{"internalType":"address","name":"serviceProvider","type":"address","indexed":false},{"internalType":"string[]","name":"capabilityKeys","type":"string[]","indexed":false},{"internalType":"string[]","name":"capabilityValues","type":"string[]","indexed":false}],"type":"event","name":"ProductUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true}],"type":"event","name":"ProviderInfoUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true},{"internalType":"address","name":"serviceProvider","type":"address","indexed":true},{"internalType":"address","name":"payee","type":"address","indexed":true}],"type":"event","name":"ProviderRegistered","anonymous":false},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256","indexed":true}],"type":"event","name":"ProviderRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"BURN_ACTOR","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_CAPABILITIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_CAPABILITY_KEY_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_CAPABILITY_VALUE_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"REGISTRATION_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"activeProductTypeProviderCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"activeProviderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"string[]","name":"capabilityValues","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"addProduct"},{"inputs":[{"internalType":"address","name":"providerAddress","type":"address"}],"stateMutability":"view","type":"function","name":"addressToProviderId","outputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"pure","type":"function","name":"decodePDPOffering","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.PDPOffering","name":"","type":"tuple","components":[{"internalType":"string","name":"serviceURL","type":"string"},{"internalType":"uint256","name":"minPieceSizeInBytes","type":"uint256"},{"internalType":"uint256","name":"maxPieceSizeInBytes","type":"uint256"},{"internalType":"bool","name":"ipniPiece","type":"bool"},{"internalType":"bool","name":"ipniIpfs","type":"bool"},{"internalType":"uint256","name":"storagePricePerTibPerMonth","type":"uint256"},{"internalType":"uint256","name":"minProvingPeriodInEpochs","type":"uint256"},{"internalType":"string","name":"location","type":"string"},{"internalType":"contract IERC20","name":"paymentTokenAddress","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}]},{"inputs":[{"internalType":"struct ServiceProviderRegistryStorage.PDPOffering","name":"pdpOffering","type":"tuple","components":[{"internalType":"string","name":"serviceURL","type":"string"},{"internalType":"uint256","name":"minPieceSizeInBytes","type":"uint256"},{"internalType":"uint256","name":"maxPieceSizeInBytes","type":"uint256"},{"internalType":"bool","name":"ipniPiece","type":"bool"},{"internalType":"bool","name":"ipniIpfs","type":"bool"},{"internalType":"uint256","name":"storagePricePerTibPerMonth","type":"uint256"},{"internalType":"uint256","name":"minProvingPeriodInEpochs","type":"uint256"},{"internalType":"string","name":"location","type":"string"},{"internalType":"contract IERC20","name":"paymentTokenAddress","type":"address"}]}],"stateMutability":"pure","type":"function","name":"encodePDPOffering","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function","name":"getActiveProvidersByProductType","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.PaginatedProviders","name":"result","type":"tuple","components":[{"internalType":"struct ServiceProviderRegistryStorage.ProviderWithProduct[]","name":"providers","type":"tuple[]","components":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","name":"providerInfo","type":"tuple","components":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"internalType":"struct ServiceProviderRegistryStorage.ServiceProduct","name":"product","type":"tuple","components":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"bool","name":"isActive","type":"bool"}]}]},{"internalType":"bool","name":"hasMore","type":"bool"}]}]},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function","name":"getAllActiveProviders","outputs":[{"internalType":"uint256[]","name":"providerIds","type":"uint256[]"},{"internalType":"bool","name":"hasMore","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getNextProviderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPDPService","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.PDPOffering","name":"pdpOffering","type":"tuple","components":[{"internalType":"string","name":"serviceURL","type":"string"},{"internalType":"uint256","name":"minPieceSizeInBytes","type":"uint256"},{"internalType":"uint256","name":"maxPieceSizeInBytes","type":"uint256"},{"internalType":"bool","name":"ipniPiece","type":"bool"},{"internalType":"bool","name":"ipniIpfs","type":"bool"},{"internalType":"uint256","name":"storagePricePerTibPerMonth","type":"uint256"},{"internalType":"uint256","name":"minProvingPeriodInEpochs","type":"uint256"},{"internalType":"string","name":"location","type":"string"},{"internalType":"contract IERC20","name":"paymentTokenAddress","type":"address"}]},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"bool","name":"isActive","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"getProduct","outputs":[{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"bool","name":"isActive","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"string[]","name":"keys","type":"string[]"}],"stateMutability":"view","type":"function","name":"getProductCapabilities","outputs":[{"internalType":"bool[]","name":"exists","type":"bool[]"},{"internalType":"string[]","name":"values","type":"string[]"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"string","name":"key","type":"string"}],"stateMutability":"view","type":"function","name":"getProductCapability","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"string","name":"value","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getProvider","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","name":"info","type":"tuple","components":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]}]},{"inputs":[{"internalType":"address","name":"providerAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getProviderByAddress","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","name":"info","type":"tuple","components":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getProviderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"providerAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getProviderIdByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function","name":"getProvidersByProductType","outputs":[{"internalType":"struct ServiceProviderRegistryStorage.PaginatedProviders","name":"result","type":"tuple","components":[{"internalType":"struct ServiceProviderRegistryStorage.ProviderWithProduct[]","name":"providers","type":"tuple[]","components":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"struct ServiceProviderRegistryStorage.ServiceProviderInfo","name":"providerInfo","type":"tuple","components":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"internalType":"struct ServiceProviderRegistryStorage.ServiceProduct","name":"product","type":"tuple","components":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"bool","name":"isActive","type":"bool"}]}]},{"internalType":"bool","name":"hasMore","type":"bool"}]}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"isProviderActive","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"provider","type":"address"}],"stateMutability":"view","type":"function","name":"isRegisteredProvider","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"string","name":"newVersion","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"migrate"},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"string","name":"key","type":"string"}],"stateMutability":"view","type":"function","name":"productCapabilities","outputs":[{"internalType":"string","name":"value","type":"string"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"productTypeProviderCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"providerHasProduct","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"providerProducts","outputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"bool","name":"isActive","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"providers","outputs":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"string[]","name":"capabilityValues","type":"string[]"}],"stateMutability":"payable","type":"function","name":"registerProvider","outputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"removeProduct"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"removeProvider"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"struct ServiceProviderRegistryStorage.PDPOffering","name":"pdpOffering","type":"tuple","components":[{"internalType":"string","name":"serviceURL","type":"string"},{"internalType":"uint256","name":"minPieceSizeInBytes","type":"uint256"},{"internalType":"uint256","name":"maxPieceSizeInBytes","type":"uint256"},{"internalType":"bool","name":"ipniPiece","type":"bool"},{"internalType":"bool","name":"ipniIpfs","type":"bool"},{"internalType":"uint256","name":"storagePricePerTibPerMonth","type":"uint256"},{"internalType":"uint256","name":"minProvingPeriodInEpochs","type":"uint256"},{"internalType":"string","name":"location","type":"string"},{"internalType":"contract IERC20","name":"paymentTokenAddress","type":"address"}]},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"string[]","name":"capabilityValues","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"updatePDPServiceWithCapabilities"},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"string[]","name":"capabilityKeys","type":"string[]"},{"internalType":"string[]","name":"capabilityValues","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"updateProduct"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateProviderInfo"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"}],"devdoc":{"kind":"dev","methods":{"addProduct(uint8,bytes,string[],string[])":{"params":{"capabilityKeys":"Array of capability keys (max 32 chars each, max 10 keys)","capabilityValues":"Array of capability values (max 128 chars each, max 10 values)","productData":"The encoded product configuration data","productType":"The type of product to add"}},"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor","details":"This ensures the implementation contract cannot be initialized directly"},"eip712Domain()":{"details":"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature."},"getActiveProvidersByProductType(uint8,uint256,uint256)":{"params":{"limit":"Maximum number of results to return","offset":"Starting index for pagination (0-based)","productType":"The product type to filter by"},"returns":{"result":"Paginated result containing provider details and hasMore flag"}},"getAllActiveProviders(uint256,uint256)":{"params":{"limit":"Maximum number of results to return","offset":"Starting index for pagination (0-based)"},"returns":{"hasMore":"Whether there are more results after this page","providerIds":"Array of active provider IDs"}},"getNextProviderId()":{"returns":{"_0":"The next provider ID that will be assigned"}},"getPDPService(uint256)":{"params":{"providerId":"The ID of the provider"},"returns":{"capabilityKeys":"Array of capability keys","isActive":"Whether the PDP service is active","pdpOffering":"The decoded PDP service data"}},"getProduct(uint256,uint8)":{"params":{"productType":"The type of product to retrieve","providerId":"The ID of the provider"},"returns":{"capabilityKeys":"Array of capability keys","isActive":"Whether the product is active","productData":"The encoded product data"}},"getProductCapabilities(uint256,uint8,string[])":{"params":{"keys":"Array of capability keys to query","productType":"The type of product","providerId":"The ID of the provider"},"returns":{"exists":"Array of booleans indicating whether each key exists","values":"Array of capability values corresponding to the keys (empty string for non-existent keys)"}},"getProductCapability(uint256,uint8,string)":{"params":{"key":"The capability key to query","productType":"The type of product","providerId":"The ID of the provider"},"returns":{"exists":"Whether the capability key exists","value":"The capability value (empty string if key doesn't exist)"}},"getProvider(uint256)":{"params":{"providerId":"The ID of the provider"},"returns":{"info":"The provider information"}},"getProviderByAddress(address)":{"params":{"providerAddress":"The address of the service provider"},"returns":{"info":"The provider information (empty struct if not registered)"}},"getProviderCount()":{"returns":{"_0":"The total count of providers"}},"getProviderIdByAddress(address)":{"params":{"providerAddress":"The address of the service provider"},"returns":{"_0":"providerId The provider ID (0 if not registered)"}},"getProvidersByProductType(uint8,uint256,uint256)":{"params":{"limit":"Maximum number of results to return","offset":"Starting index for pagination (0-based)","productType":"The product type to filter by"},"returns":{"result":"Paginated result containing provider details and hasMore flag"}},"initialize()":{"details":"Can only be called once during proxy deployment"},"isProviderActive(uint256)":{"params":{"providerId":"The ID of the provider"},"returns":{"_0":"Whether the provider is active"}},"isRegisteredProvider(address)":{"params":{"provider":"The address to check"},"returns":{"_0":"Whether the address is a registered provider"}},"migrate(string)":{"details":"This function should be called during upgrades to emit version tracking events","params":{"newVersion":"The version string for the new implementation"}},"owner()":{"details":"Returns the address of the current owner."},"providerHasProduct(uint256,uint8)":{"params":{"productType":"The product type to check","providerId":"The ID of the provider"},"returns":{"_0":"Whether the provider offers this product type"}},"proxiableUUID()":{"details":"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"registerProvider(address,string,string,uint8,bytes,string[],string[])":{"params":{"capabilityKeys":"Array of capability keys","capabilityValues":"Array of capability values","description":"Provider description (max 256 chars)","name":"Provider name (optional, max 128 chars)","payee":"Address that will receive payments (cannot be changed after registration)","productData":"The encoded product configuration data","productType":"The type of product to register"},"returns":{"providerId":"The unique ID assigned to the provider"}},"removeProduct(uint8)":{"params":{"productType":"The type of product to remove"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])":{"params":{"capabilityKeys":"Array of capability keys (max 32 chars each, max 10 keys)","capabilityValues":"Array of capability values (max 128 chars each, max 10 values)","pdpOffering":"The new PDP service configuration"}},"updateProduct(uint8,bytes,string[],string[])":{"params":{"capabilityKeys":"Array of capability keys (max 32 chars each, max 10 keys)","capabilityValues":"Array of capability values (max 128 chars each, max 10 values)","productData":"The new encoded product configuration data","productType":"The type of product to update"}},"updateProviderInfo(string,string)":{"params":{"description":"New provider description (max 256 chars)","name":"New provider name (optional, max 128 chars)"}},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{"BURN_ACTOR()":{"notice":"Burn actor address for burning FIL"},"MAX_CAPABILITIES()":{"notice":"Maximum number of capability key-value pairs per product"},"MAX_CAPABILITY_KEY_LENGTH()":{"notice":"Maximum length for capability keys"},"MAX_CAPABILITY_VALUE_LENGTH()":{"notice":"Maximum length for capability values"},"REGISTRATION_FEE()":{"notice":"Registration fee in attoFIL (5 FIL = 5 * 10^18 attoFIL)"},"VERSION()":{"notice":"Version of the contract implementation"},"activeProductTypeProviderCount(uint8)":{"notice":"Count of active providers offering each product type"},"activeProviderCount()":{"notice":"Count of active providers"},"addProduct(uint8,bytes,string[],string[])":{"notice":"Add a new product to an existing provider"},"addressToProviderId(address)":{"notice":"Address to provider ID lookup"},"constructor":{"notice":"Constructor that disables initializers for the implementation contract"},"decodePDPOffering(bytes)":{"notice":"Decode PDP offering from bytes"},"encodePDPOffering((string,uint256,uint256,bool,bool,uint256,uint256,string,address))":{"notice":"Encode PDP offering to bytes"},"getActiveProvidersByProductType(uint8,uint256,uint256)":{"notice":"Get all active providers that offer a specific product type with pagination"},"getAllActiveProviders(uint256,uint256)":{"notice":"Get all active providers with pagination"},"getNextProviderId()":{"notice":"Returns the next available provider ID"},"getPDPService(uint256)":{"notice":"Get PDP service configuration for a provider (convenience function)"},"getProduct(uint256,uint8)":{"notice":"Get product data for a specific product type"},"getProductCapabilities(uint256,uint8,string[])":{"notice":"Get multiple capability values for a product"},"getProductCapability(uint256,uint8,string)":{"notice":"Get a single capability value for a product"},"getProvider(uint256)":{"notice":"Get complete provider information"},"getProviderByAddress(address)":{"notice":"Get provider info by address"},"getProviderCount()":{"notice":"Get total number of registered providers (including inactive)"},"getProviderIdByAddress(address)":{"notice":"Get provider ID by address"},"getProvidersByProductType(uint8,uint256,uint256)":{"notice":"Get all providers that offer a specific product type with pagination"},"initialize()":{"notice":"Initializes the registry contract"},"isProviderActive(uint256)":{"notice":"Check if a provider is active"},"isRegisteredProvider(address)":{"notice":"Check if an address is a registered provider"},"migrate(string)":{"notice":"Migration function for contract upgrades"},"productCapabilities(uint256,uint8,string)":{"notice":"Capability values mapping for efficient lookups"},"productTypeProviderCount(uint8)":{"notice":"Count of providers (including inactive) offering each product type"},"providerHasProduct(uint256,uint8)":{"notice":"Check if a provider offers a specific product type"},"providerProducts(uint256,uint8)":{"notice":"Provider products mapping (extensible for multiple product types)"},"providers(uint256)":{"notice":"Main registry of providers"},"registerProvider(address,string,string,uint8,bytes,string[],string[])":{"notice":"Register as a new service provider with a specific product type"},"removeProduct(uint8)":{"notice":"Remove a product from a provider"},"removeProvider()":{"notice":"Remove provider registration (soft delete)"},"updatePDPServiceWithCapabilities((string,uint256,uint256,bool,bool,uint256,uint256,string,address),string[],string[])":{"notice":"Update PDP service configuration with capabilities"},"updateProduct(uint8,bytes,string[],string[])":{"notice":"Update an existing product configuration"},"updateProviderInfo(string,string)":{"notice":"Update provider information"}},"version":1}},"settings":{"remappings":["@fws-payments/=lib/fws-payments/src/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@pdp/=lib/pdp/src/","@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/","@session-key-registry/=lib/session-key-registry/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","fws-payments/=lib/fws-payments/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","pdp/=lib/pdp/src/","pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/","session-key-registry/=lib/session-key-registry/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/ServiceProviderRegistry.sol":"ServiceProviderRegistry"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a","urls":["bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6","dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05","urls":["bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08","dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x574a7451e42724f7de29e2855c392a8a5020acd695169466a18459467d719d63","urls":["bzz-raw://5bc189f63b639ee173dd7b6fecc39baf7113bf161776aea22b34c57fdd1872ec","dweb:/ipfs/QmZAf2VtjDLRULqjJkde6LNsxAg12tUqpPqgUQQZbAjgtZ"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/EIP712Upgradeable.sol":{"keccak256":"0xd5d8ca01aef5be860ca223ddea39bf3c7467ba1a244fe8dcf26bc435e5ca43d3","urls":["bzz-raw://48ff830d6a98a7e108a2309aff6dac9666b91e4003c2c1857957d7d79c6ac513","dweb:/ipfs/QmNc3u2K11tshKxAmLEqjoxJ6eAFEiPAccwkr1RsWvsF3H"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol":{"keccak256":"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486","urls":["bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d","dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d","urls":["bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196","dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x8decfa54cec979c824b044b8128cd91d713f72c71fd7dfa54974624d8c949898","urls":["bzz-raw://271f914261a19d87117a777e0924ada545c16191ef9b00cc40b0134fc14ebc70","dweb:/ipfs/QmdvVNWHGHQrGGPonZJs5NuzTevTjZRM2zayKrDJf7WBA2"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7","urls":["bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db","dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0x06871a0948d0fed9316ae59ee4368527e144911f5e284755312b5bfcde8b27ea","urls":["bzz-raw://3c30e46d061d8a450c561935a1236b1885aa76ffab93a19b26dcb8868c839843","dweb:/ipfs/QmZbWbeDyixTyYkVtJvuiQYfkQz12pS7zxWZF3Ju9PYwGH"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"keccak256":"0x104c579d98591d36dfe190bdad391c79c358d399ee18d76e877c30b94d3c07a0","urls":["bzz-raw://332ab9adbc9a985195d56832159d09417ed5674adbbd6189db74586110aabc59","dweb:/ipfs/QmZNVeVa4b7iKyFbHjvKir45RGBM93T7Yjgg9ye6Hu2umd"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631","urls":["bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59","dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6","urls":["bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3","dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"],"license":"MIT"},"src/Errors.sol":{"keccak256":"0x27464ca1552086c6a7a7b0b069a66dcb3cb3d1db945570fa1120699ee151104a","urls":["bzz-raw://8b2968e69dbb37a9b63b62196b3a87997a1453a410a0769af77701543061a2ef","dweb:/ipfs/QmVrRCRtZeynQ6wtM9KFRKVQXDSHWUEt8CBo99Hoz5WrGH"],"license":"Apache-2.0 OR MIT"},"src/ServiceProviderRegistry.sol":{"keccak256":"0xfbd35734ef7436df8c3407c4fd64d74bf28a35ddcb427bc300282327034c03b7","urls":["bzz-raw://c843026d23f17f082224ab2d0bd25168c41b1fa74675359f43fb0ac0d2e2152f","dweb:/ipfs/QmNdVVEbhvgYaABPAwMAUtcYRw9zi49bukN2HPuwH7rhRv"],"license":"Apache-2.0 OR MIT"},"src/ServiceProviderRegistryStorage.sol":{"keccak256":"0x8b24b4146fc5220b5f5beb603df1397feb6f54cc7a44c15031ae97b914debe2d","urls":["bzz-raw://453b1930c213530204b8f56ad298610748b2dd81fcf053e672f588722dfea4d9","dweb:/ipfs/QmTGWoNgMYLYLtTv5p9LQMcYWGpdEH2eB7KdpQsm6srM53"],"license":"Apache-2.0 OR MIT"}},"version":1},"id":85} \ No newline at end of file diff --git a/pdp/contract/ServiceProviderRegistryStorage.abi b/pdp/contract/ServiceProviderRegistryStorage.abi new file mode 100644 index 000000000..1df58f10b --- /dev/null +++ b/pdp/contract/ServiceProviderRegistryStorage.abi @@ -0,0 +1,179 @@ +[ + { + "type": "function", + "name": "activeProductTypeProviderCount", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "activeProviderCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addressToProviderId", + "inputs": [ + { + "name": "providerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "productCapabilities", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "key", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "value", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "productTypeProviderCount", + "inputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providerProducts", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + } + ], + "outputs": [ + { + "name": "productType", + "type": "uint8", + "internalType": "enum ServiceProviderRegistryStorage.ProductType" + }, + { + "name": "productData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "providers", + "inputs": [ + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "serviceProvider", + "type": "address", + "internalType": "address" + }, + { + "name": "payee", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "isActive", + "type": "bool", + "internalType": "bool" + }, + { + "name": "providerId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + } +] \ No newline at end of file diff --git a/pdp/contract/ServiceProviderRegistryStorage.go b/pdp/contract/ServiceProviderRegistryStorage.go new file mode 100644 index 000000000..4a79fb23b --- /dev/null +++ b/pdp/contract/ServiceProviderRegistryStorage.go @@ -0,0 +1,451 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ServiceProviderRegistryStorageMetaData contains all meta data concerning the ServiceProviderRegistryStorage contract. +var ServiceProviderRegistryStorageMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"activeProductTypeProviderCount\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeProviderCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressToProviderId\",\"inputs\":[{\"name\":\"providerAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"productCapabilities\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"key\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"value\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"productTypeProviderCount\",\"inputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerProducts\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"}],\"outputs\":[{\"name\":\"productType\",\"type\":\"uint8\",\"internalType\":\"enumServiceProviderRegistryStorage.ProductType\"},{\"name\":\"productData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providers\",\"inputs\":[{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"serviceProvider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isActive\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"providerId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", +} + +// ServiceProviderRegistryStorageABI is the input ABI used to generate the binding from. +// Deprecated: Use ServiceProviderRegistryStorageMetaData.ABI instead. +var ServiceProviderRegistryStorageABI = ServiceProviderRegistryStorageMetaData.ABI + +// ServiceProviderRegistryStorage is an auto generated Go binding around an Ethereum contract. +type ServiceProviderRegistryStorage struct { + ServiceProviderRegistryStorageCaller // Read-only binding to the contract + ServiceProviderRegistryStorageTransactor // Write-only binding to the contract + ServiceProviderRegistryStorageFilterer // Log filterer for contract events +} + +// ServiceProviderRegistryStorageCaller is an auto generated read-only Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryStorageTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ServiceProviderRegistryStorageFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ServiceProviderRegistryStorageSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ServiceProviderRegistryStorageSession struct { + Contract *ServiceProviderRegistryStorage // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ServiceProviderRegistryStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ServiceProviderRegistryStorageCallerSession struct { + Contract *ServiceProviderRegistryStorageCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ServiceProviderRegistryStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ServiceProviderRegistryStorageTransactorSession struct { + Contract *ServiceProviderRegistryStorageTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ServiceProviderRegistryStorageRaw is an auto generated low-level Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageRaw struct { + Contract *ServiceProviderRegistryStorage // Generic contract binding to access the raw methods on +} + +// ServiceProviderRegistryStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageCallerRaw struct { + Contract *ServiceProviderRegistryStorageCaller // Generic read-only contract binding to access the raw methods on +} + +// ServiceProviderRegistryStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ServiceProviderRegistryStorageTransactorRaw struct { + Contract *ServiceProviderRegistryStorageTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewServiceProviderRegistryStorage creates a new instance of ServiceProviderRegistryStorage, bound to a specific deployed contract. +func NewServiceProviderRegistryStorage(address common.Address, backend bind.ContractBackend) (*ServiceProviderRegistryStorage, error) { + contract, err := bindServiceProviderRegistryStorage(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryStorage{ServiceProviderRegistryStorageCaller: ServiceProviderRegistryStorageCaller{contract: contract}, ServiceProviderRegistryStorageTransactor: ServiceProviderRegistryStorageTransactor{contract: contract}, ServiceProviderRegistryStorageFilterer: ServiceProviderRegistryStorageFilterer{contract: contract}}, nil +} + +// NewServiceProviderRegistryStorageCaller creates a new read-only instance of ServiceProviderRegistryStorage, bound to a specific deployed contract. +func NewServiceProviderRegistryStorageCaller(address common.Address, caller bind.ContractCaller) (*ServiceProviderRegistryStorageCaller, error) { + contract, err := bindServiceProviderRegistryStorage(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryStorageCaller{contract: contract}, nil +} + +// NewServiceProviderRegistryStorageTransactor creates a new write-only instance of ServiceProviderRegistryStorage, bound to a specific deployed contract. +func NewServiceProviderRegistryStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*ServiceProviderRegistryStorageTransactor, error) { + contract, err := bindServiceProviderRegistryStorage(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryStorageTransactor{contract: contract}, nil +} + +// NewServiceProviderRegistryStorageFilterer creates a new log filterer instance of ServiceProviderRegistryStorage, bound to a specific deployed contract. +func NewServiceProviderRegistryStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*ServiceProviderRegistryStorageFilterer, error) { + contract, err := bindServiceProviderRegistryStorage(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ServiceProviderRegistryStorageFilterer{contract: contract}, nil +} + +// bindServiceProviderRegistryStorage binds a generic wrapper to an already deployed contract. +func bindServiceProviderRegistryStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ServiceProviderRegistryStorageMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ServiceProviderRegistryStorage.Contract.ServiceProviderRegistryStorageCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistryStorage.Contract.ServiceProviderRegistryStorageTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ServiceProviderRegistryStorage.Contract.ServiceProviderRegistryStorageTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ServiceProviderRegistryStorage.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ServiceProviderRegistryStorage.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ServiceProviderRegistryStorage.Contract.contract.Transact(opts, method, params...) +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ActiveProductTypeProviderCount(opts *bind.CallOpts, productType uint8) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "activeProductTypeProviderCount", productType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ActiveProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ActiveProductTypeProviderCount(&_ServiceProviderRegistryStorage.CallOpts, productType) +} + +// ActiveProductTypeProviderCount is a free data retrieval call binding the contract method 0x8bdc7747. +// +// Solidity: function activeProductTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ActiveProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ActiveProductTypeProviderCount(&_ServiceProviderRegistryStorage.CallOpts, productType) +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ActiveProviderCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "activeProviderCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ActiveProviderCount() (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ActiveProviderCount(&_ServiceProviderRegistryStorage.CallOpts) +} + +// ActiveProviderCount is a free data retrieval call binding the contract method 0xf08bbda0. +// +// Solidity: function activeProviderCount() view returns(uint256) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ActiveProviderCount() (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ActiveProviderCount(&_ServiceProviderRegistryStorage.CallOpts) +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) AddressToProviderId(opts *bind.CallOpts, providerAddress common.Address) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "addressToProviderId", providerAddress) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) AddressToProviderId(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.AddressToProviderId(&_ServiceProviderRegistryStorage.CallOpts, providerAddress) +} + +// AddressToProviderId is a free data retrieval call binding the contract method 0xe835440e. +// +// Solidity: function addressToProviderId(address providerAddress) view returns(uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) AddressToProviderId(providerAddress common.Address) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.AddressToProviderId(&_ServiceProviderRegistryStorage.CallOpts, providerAddress) +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ProductCapabilities(opts *bind.CallOpts, providerId *big.Int, productType uint8, key string) (string, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "productCapabilities", providerId, productType, key) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ProductCapabilities(providerId *big.Int, productType uint8, key string) (string, error) { + return _ServiceProviderRegistryStorage.Contract.ProductCapabilities(&_ServiceProviderRegistryStorage.CallOpts, providerId, productType, key) +} + +// ProductCapabilities is a free data retrieval call binding the contract method 0x4368bafb. +// +// Solidity: function productCapabilities(uint256 providerId, uint8 productType, string key) view returns(string value) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ProductCapabilities(providerId *big.Int, productType uint8, key string) (string, error) { + return _ServiceProviderRegistryStorage.Contract.ProductCapabilities(&_ServiceProviderRegistryStorage.CallOpts, providerId, productType, key) +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ProductTypeProviderCount(opts *bind.CallOpts, productType uint8) (*big.Int, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "productTypeProviderCount", productType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ProductTypeProviderCount(&_ServiceProviderRegistryStorage.CallOpts, productType) +} + +// ProductTypeProviderCount is a free data retrieval call binding the contract method 0xe459382f. +// +// Solidity: function productTypeProviderCount(uint8 productType) view returns(uint256 count) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ProductTypeProviderCount(productType uint8) (*big.Int, error) { + return _ServiceProviderRegistryStorage.Contract.ProductTypeProviderCount(&_ServiceProviderRegistryStorage.CallOpts, productType) +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) ProviderProducts(opts *bind.CallOpts, providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "providerProducts", providerId, productType) + + outstruct := new(struct { + ProductType uint8 + ProductData []byte + IsActive bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProductType = *abi.ConvertType(out[0], new(uint8)).(*uint8) + outstruct.ProductData = *abi.ConvertType(out[1], new([]byte)).(*[]byte) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + + return *outstruct, err + +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) ProviderProducts(providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + return _ServiceProviderRegistryStorage.Contract.ProviderProducts(&_ServiceProviderRegistryStorage.CallOpts, providerId, productType) +} + +// ProviderProducts is a free data retrieval call binding the contract method 0x6bf6d74f. +// +// Solidity: function providerProducts(uint256 providerId, uint8 productType) view returns(uint8 productType, bytes productData, bool isActive) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) ProviderProducts(providerId *big.Int, productType uint8) (struct { + ProductType uint8 + ProductData []byte + IsActive bool +}, error) { + return _ServiceProviderRegistryStorage.Contract.ProviderProducts(&_ServiceProviderRegistryStorage.CallOpts, providerId, productType) +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCaller) Providers(opts *bind.CallOpts, providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + var out []interface{} + err := _ServiceProviderRegistryStorage.contract.Call(opts, &out, "providers", providerId) + + outstruct := new(struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.ServiceProvider = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.Payee = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.Name = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.Description = *abi.ConvertType(out[3], new(string)).(*string) + outstruct.IsActive = *abi.ConvertType(out[4], new(bool)).(*bool) + outstruct.ProviderId = *abi.ConvertType(out[5], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageSession) Providers(providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + return _ServiceProviderRegistryStorage.Contract.Providers(&_ServiceProviderRegistryStorage.CallOpts, providerId) +} + +// Providers is a free data retrieval call binding the contract method 0x50f3fc81. +// +// Solidity: function providers(uint256 providerId) view returns(address serviceProvider, address payee, string name, string description, bool isActive, uint256 providerId) +func (_ServiceProviderRegistryStorage *ServiceProviderRegistryStorageCallerSession) Providers(providerId *big.Int) (struct { + ServiceProvider common.Address + Payee common.Address + Name string + Description string + IsActive bool + ProviderId *big.Int +}, error) { + return _ServiceProviderRegistryStorage.Contract.Providers(&_ServiceProviderRegistryStorage.CallOpts, providerId) +} diff --git a/pdp/contract/ServiceProviderRegistryStorage.json b/pdp/contract/ServiceProviderRegistryStorage.json new file mode 100644 index 000000000..f2a82a96f --- /dev/null +++ b/pdp/contract/ServiceProviderRegistryStorage.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"activeProductTypeProviderCount","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"activeProviderCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addressToProviderId","inputs":[{"name":"providerAddress","type":"address","internalType":"address"}],"outputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"productCapabilities","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"value","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"productTypeProviderCount","inputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"providerProducts","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"},{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"}],"outputs":[{"name":"productType","type":"uint8","internalType":"enum ServiceProviderRegistryStorage.ProductType"},{"name":"productData","type":"bytes","internalType":"bytes"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"providers","inputs":[{"name":"providerId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"serviceProvider","type":"address","internalType":"address"},{"name":"payee","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"isActive","type":"bool","internalType":"bool"},{"name":"providerId","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"bytecode":{"object":"0x6080806040523460155761054d908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081634368bafb146102fb5750806350f3fc811461025a5780636bf6d74f1461012c5780638bdc7747146100f9578063e459382f146100c6578063e835440e1461008a5763f08bbda014610069575f80fd5b34610086575f366003190112610086576020600754604051908152f35b5f80fd5b34610086576020366003190112610086576004356001600160a01b03811690819003610086575f526003602052602060405f2054604051908152f35b34610086576020366003190112610086576004356001811015610086575f526005602052602060405f2054604051908152f35b34610086576020366003190112610086576004356001811015610086575f526006602052602060405f2054604051908152f35b3461008657604036600319011261008657602435600181101561008657610160906004355f52600260205260405f20610405565b60ff81541690600181019060405180925f9080549061017e8261041b565b808552916001811690811561023257506001146101f2575b5050916101a960039260ff9403856103e3565b0154166040519260018110156101de5783926101d29184526060602085015260608401906104f3565b90151560408301520390f35b634e487b7160e01b5f52602160045260245ffd5b5f908152602081209092505b81831061021657505081016020016101a96003610196565b60209193508060019154838589010152019101909184926101fe565b60ff191660208087019190915292151560051b850190920192506101a9915060039050610196565b34610086576020366003190112610086576004355f9081526001602081905260409091208054918101546001600160a01b0390811692169061029e60028201610453565b6102ea6102ad60038401610453565b6102dc600560ff600487015416950154936040519788978852602088015260c0604088015260c08701906104f3565b9085820360608701526104f3565b911515608084015260a08301520390f35b34610086576060366003190112610086576024356001811015610086576044359167ffffffffffffffff8311610086573660238401121561008657826004013567ffffffffffffffff81116103cf5761035e601f8201601f1916602001836103e3565b808252602082019136602483870101116100865761039e6103b7945f602085819660246103cb9b018937850101526004355f526004845260405f20610405565b604051938492518091845e820190815203019020610453565b6040519182916020835260208301906104f3565b0390f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176103cf57604052565b9060018110156101de575f5260205260405f2090565b90600182811c92168015610449575b602083101461043557565b634e487b7160e01b5f52602260045260245ffd5b91607f169161042a565b9060405191825f8254926104668461041b565b80845293600181169081156104d1575060011461048d575b5061048b925003836103e3565b565b90505f9291925260205f20905f915b8183106104b557505090602061048b928201015f61047e565b602091935080600191548385890101520191019091849261049c565b90506020925061048b94915060ff191682840152151560051b8201015f61047e565b805180835260209291819084018484015e5f828201840152601f01601f191601019056fea2646970667358221220a0b030b08ca12d83e08e41a5e2c63a011a5c15653efecaea3c75f6fb3b55ec4764736f6c634300081e0033","sourceMap":"341:3418:86:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081634368bafb146102fb5750806350f3fc811461025a5780636bf6d74f1461012c5780638bdc7747146100f9578063e459382f146100c6578063e835440e1461008a5763f08bbda014610069575f80fd5b34610086575f366003190112610086576020600754604051908152f35b5f80fd5b34610086576020366003190112610086576004356001600160a01b03811690819003610086575f526003602052602060405f2054604051908152f35b34610086576020366003190112610086576004356001811015610086575f526005602052602060405f2054604051908152f35b34610086576020366003190112610086576004356001811015610086575f526006602052602060405f2054604051908152f35b3461008657604036600319011261008657602435600181101561008657610160906004355f52600260205260405f20610405565b60ff81541690600181019060405180925f9080549061017e8261041b565b808552916001811690811561023257506001146101f2575b5050916101a960039260ff9403856103e3565b0154166040519260018110156101de5783926101d29184526060602085015260608401906104f3565b90151560408301520390f35b634e487b7160e01b5f52602160045260245ffd5b5f908152602081209092505b81831061021657505081016020016101a96003610196565b60209193508060019154838589010152019101909184926101fe565b60ff191660208087019190915292151560051b850190920192506101a9915060039050610196565b34610086576020366003190112610086576004355f9081526001602081905260409091208054918101546001600160a01b0390811692169061029e60028201610453565b6102ea6102ad60038401610453565b6102dc600560ff600487015416950154936040519788978852602088015260c0604088015260c08701906104f3565b9085820360608701526104f3565b911515608084015260a08301520390f35b34610086576060366003190112610086576024356001811015610086576044359167ffffffffffffffff8311610086573660238401121561008657826004013567ffffffffffffffff81116103cf5761035e601f8201601f1916602001836103e3565b808252602082019136602483870101116100865761039e6103b7945f602085819660246103cb9b018937850101526004355f526004845260405f20610405565b604051938492518091845e820190815203019020610453565b6040519182916020835260208301906104f3565b0390f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176103cf57604052565b9060018110156101de575f5260205260405f2090565b90600182811c92168015610449575b602083101461043557565b634e487b7160e01b5f52602260045260245ffd5b91607f169161042a565b9060405191825f8254926104668461041b565b80845293600181169081156104d1575060011461048d575b5061048b925003836103e3565b565b90505f9291925260205f20905f915b8183106104b557505090602061048b928201015f61047e565b602091935080600191548385890101520191019091849261049c565b90506020925061048b94915060ff191682840152151560051b8201015f61047e565b805180835260209291819084018484015e5f828201840152601f01601f191601019056fea2646970667358221220a0b030b08ca12d83e08e41a5e2c63a011a5c15653efecaea3c75f6fb3b55ec4764736f6c634300081e0033","sourceMap":"341:3418:86:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;3722:34;341:3418;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;-1:-1:-1;;;;;341:3418:86;;;;;;;;;;3050:81;341:3418;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;3429:81;341:3418;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;3586:87;341:3418;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;2892:105;341:3418;;;;;2892:105;341:3418;;;;;2892:105;:::i;:::-;341:3418;;;;2892:105;341:3418;2892:105;;341:3418;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2892:105;341:3418;;;;;;:::i;:::-;2892:105;341:3418;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;341:3418:86;;;;;;-1:-1:-1;;341:3418:86;;;;;2892:105;341:3418;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;;;;;;;-1:-1:-1;341:3418:86;;-1:-1:-1;2892:105:86;;-1:-1:-1;341:3418:86;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;;;;;;;;2736:67;;;341:3418;-1:-1:-1;;;;;341:3418:86;;;;;;2736:67;;;;;:::i;:::-;341:3418;2736:67;;;;;:::i;:::-;341:3418;2736:67;341:3418;;2736:67;;341:3418;;2736:67;;341:3418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;341:3418:86;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3202:137;341:3418;;;;;;;;;;;;;;;;;;;;;;;;;;;3202:137;:::i;:::-;341:3418;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;341:3418:86;;;;-1:-1:-1;341:3418:86;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;341:3418:86;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;341:3418:86;;;;;-1:-1:-1;341:3418:86;;-1:-1:-1;341:3418:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;341:3418:86;;;;;;;;-1:-1:-1;;341:3418:86;;;;:::o","linkReferences":{}},"methodIdentifiers":{"activeProductTypeProviderCount(uint8)":"8bdc7747","activeProviderCount()":"f08bbda0","addressToProviderId(address)":"e835440e","productCapabilities(uint256,uint8,string)":"4368bafb","productTypeProviderCount(uint8)":"e459382f","providerProducts(uint256,uint8)":"6bf6d74f","providers(uint256)":"50f3fc81"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"activeProductTypeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"}],\"name\":\"addressToProviderId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"productCapabilities\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"productTypeProviderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"},{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"}],\"name\":\"providerProducts\",\"outputs\":[{\"internalType\":\"enum ServiceProviderRegistryStorage.ProductType\",\"name\":\"productType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"productData\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"name\":\"providers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"providerId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"All storage variables are declared here to prevent storage slot collisions during upgrades\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"numProviders\":{\"details\":\"Also used for generating unique provider IDs, where ID 0 is reserved\"}},\"title\":\"ServiceProviderRegistryStorage\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"activeProductTypeProviderCount(uint8)\":{\"notice\":\"Count of active providers offering each product type\"},\"activeProviderCount()\":{\"notice\":\"Count of active providers\"},\"addressToProviderId(address)\":{\"notice\":\"Address to provider ID lookup\"},\"productCapabilities(uint256,uint8,string)\":{\"notice\":\"Capability values mapping for efficient lookups\"},\"productTypeProviderCount(uint8)\":{\"notice\":\"Count of providers (including inactive) offering each product type\"},\"providerProducts(uint256,uint8)\":{\"notice\":\"Provider products mapping (extensible for multiple product types)\"},\"providers(uint256)\":{\"notice\":\"Main registry of providers\"}},\"notice\":\"Centralized storage contract for ServiceProviderRegistry\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ServiceProviderRegistryStorage.sol\":\"ServiceProviderRegistryStorage\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@fws-payments/=lib/fws-payments/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@pdp/=lib/pdp/src/\",\":@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/\",\":@session-key-registry/=lib/session-key-registry/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":fws-payments/=lib/fws-payments/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":pdp/=lib/pdp/src/\",\":pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/\",\":session-key-registry/=lib/session-key-registry/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"src/ServiceProviderRegistryStorage.sol\":{\"keccak256\":\"0x8b24b4146fc5220b5f5beb603df1397feb6f54cc7a44c15031ae97b914debe2d\",\"license\":\"Apache-2.0 OR MIT\",\"urls\":[\"bzz-raw://453b1930c213530204b8f56ad298610748b2dd81fcf053e672f588722dfea4d9\",\"dweb:/ipfs/QmTGWoNgMYLYLtTv5p9LQMcYWGpdEH2eB7KdpQsm6srM53\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"activeProductTypeProviderCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"activeProviderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"providerAddress","type":"address"}],"stateMutability":"view","type":"function","name":"addressToProviderId","outputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"string","name":"key","type":"string"}],"stateMutability":"view","type":"function","name":"productCapabilities","outputs":[{"internalType":"string","name":"value","type":"string"}]},{"inputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"productTypeProviderCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"}],"stateMutability":"view","type":"function","name":"providerProducts","outputs":[{"internalType":"enum ServiceProviderRegistryStorage.ProductType","name":"productType","type":"uint8"},{"internalType":"bytes","name":"productData","type":"bytes"},{"internalType":"bool","name":"isActive","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"}],"stateMutability":"view","type":"function","name":"providers","outputs":[{"internalType":"address","name":"serviceProvider","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"providerId","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"activeProductTypeProviderCount(uint8)":{"notice":"Count of active providers offering each product type"},"activeProviderCount()":{"notice":"Count of active providers"},"addressToProviderId(address)":{"notice":"Address to provider ID lookup"},"productCapabilities(uint256,uint8,string)":{"notice":"Capability values mapping for efficient lookups"},"productTypeProviderCount(uint8)":{"notice":"Count of providers (including inactive) offering each product type"},"providerProducts(uint256,uint8)":{"notice":"Provider products mapping (extensible for multiple product types)"},"providers(uint256)":{"notice":"Main registry of providers"}},"version":1}},"settings":{"remappings":["@fws-payments/=lib/fws-payments/src/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@pdp/=lib/pdp/src/","@pythnetwork/pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/","@session-key-registry/=lib/session-key-registry/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","fws-payments/=lib/fws-payments/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","pdp/=lib/pdp/src/","pyth-sdk-solidity/=lib/pdp/lib/pyth-sdk-solidity/","session-key-registry/=lib/session-key-registry/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/ServiceProviderRegistryStorage.sol":"ServiceProviderRegistryStorage"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7","urls":["bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db","dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"],"license":"MIT"},"src/ServiceProviderRegistryStorage.sol":{"keccak256":"0x8b24b4146fc5220b5f5beb603df1397feb6f54cc7a44c15031ae97b914debe2d","urls":["bzz-raw://453b1930c213530204b8f56ad298610748b2dd81fcf053e672f588722dfea4d9","dweb:/ipfs/QmTGWoNgMYLYLtTv5p9LQMcYWGpdEH2eB7KdpQsm6srM53"],"license":"Apache-2.0 OR MIT"}},"version":1},"id":86} \ No newline at end of file diff --git a/pdp/contract/utils.go b/pdp/contract/utils.go index b623360ea..7147e9a47 100644 --- a/pdp/contract/utils.go +++ b/pdp/contract/utils.go @@ -1,15 +1,35 @@ package contract import ( - "math/big" + "context" + "crypto/ecdsa" + "fmt" + mbig "math/big" + "time" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + etypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" - logger "github.com/ipfs/go-log/v2" + logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/builtin" + + "github.com/filecoin-project/curio/build" + "github.com/filecoin-project/curio/harmony/harmonydb" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/types/ethtypes" ) -var log = logger.Logger("pdp-contract") +var log = logging.Logger("pdp-contract") // GetProvingScheduleFromListener checks if a listener has a view contract and returns // an IPDPProvingSchedule instance bound to the appropriate address. @@ -41,7 +61,7 @@ func GetProvingScheduleFromListener(listenerAddr common.Address, ethClient *ethc return provingSchedule, nil } -func GetDataSetMetadataAtKey(listenerAddr common.Address, ethClient *ethclient.Client, dataSetId *big.Int, key string) (bool, string, error) { +func GetDataSetMetadataAtKey(listenerAddr common.Address, ethClient *ethclient.Client, dataSetId *mbig.Int, key string) (bool, string, error) { metadataAddr := listenerAddr // Check if the listener supports the viewContractAddress method @@ -60,5 +80,329 @@ func GetDataSetMetadataAtKey(listenerAddr common.Address, ethClient *ethclient.C return false, "", nil } out, err := mDataService.GetDataSetMetadata(nil, dataSetId, key) - return out.Exists, out.Value, err + if err != nil { + return false, "", err + } + return out.Exists, out.Value, nil +} + +const ServiceRegistryMainnet = "0x9C65E8E57C98cCc040A3d825556832EA1e9f4Df6" +const ServiceRegistryCalibnet = "0xA8a7e2130C27e4f39D1aEBb3D538D5937bCf8ddb" + +func ServiceRegistryAddress() (common.Address, error) { + switch build.BuildType { + case build.BuildCalibnet: + return common.HexToAddress(ServiceRegistryCalibnet), nil + case build.BuildMainnet: + return common.HexToAddress(ServiceRegistryMainnet), nil + default: + return common.Address{}, xerrors.Errorf("service registry address not set for this network %s", build.BuildTypeString()[1:]) + } +} + +func FSRegister(ctx context.Context, db *harmonydb.DB, full api.FullNode, ethClient *ethclient.Client, name, description string, pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilities map[string]string) error { + if len(name) > 128 { + return xerrors.Errorf("name is too long, max 128 characters allowed") + } + + if name == "" { + return xerrors.Errorf("name is required") + } + + if len(description) > 128 { + return xerrors.Errorf("description is too long, max 128 characters allowed") + } + + var keys, values []string + for k, v := range capabilities { + if len(k) > 32 { + return xerrors.Errorf("capabilities key %s is too long, max 32 characters allowed", k) + } + if len(v) > 128 { + return xerrors.Errorf("capabilities value %s is too long, max 128 characters allowed", v) + } + keys = append(keys, k) + values = append(values, v) + } + + sender, fSender, privateKey, err := getSender(ctx, db) + if err != nil { + return xerrors.Errorf("failed to get sender: %w", err) + } + + ac, err := full.StateGetActor(ctx, fSender, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get actor: %w", err) + } + + amount, err := types.ParseFIL("5 FIL") + if err != nil { + return fmt.Errorf("failed to parse 5 FIL: %w", err) + } + + token := abi.NewTokenAmount(amount.Int64()) + + if ac.Balance.LessThan(big.NewInt(token.Int64())) { + return xerrors.Errorf("wallet balance is too low") + } + + walletEvm, err := ethtypes.EthAddressFromFilecoinAddress(fSender) + if err != nil { + return xerrors.Errorf("failed to convert wallet address to Eth address: %w", err) + } + + contractAddr, err := ServiceRegistryAddress() + if err != nil { + return xerrors.Errorf("failed to get service registry address: %w", err) + } + + srAbi, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return xerrors.Errorf("failed to get service registry ABI: %w", err) + } + + registry, err := NewServiceProviderRegistry(contractAddr, ethClient) + if err != nil { + return xerrors.Errorf("failed to create service registry: %w", err) + } + + encodedPDP, err := registry.EncodePDPOffering(&bind.CallOpts{Context: ctx}, pdpOffering) + if err != nil { + return xerrors.Errorf("failed to encode PDP offering: %w", err) + } + + if len(keys) > 10 { + return xerrors.Errorf("too many capabilities, max 10 allowed") + } + + // Prepare EVM calldata + calldata, err := srAbi.Pack("registerProvider", common.Address(walletEvm), name, description, uint8(0), encodedPDP, keys, values) + if err != nil { + return fmt.Errorf("failed to serialize parameters for registerProvider: %w", err) + } + + signedTx, err := createSignedTransaction(ctx, ethClient, privateKey, sender, contractAddr, amount.Int, calldata) + if err != nil { + return xerrors.Errorf("creating signed transaction: %w", err) + } + + err = ethClient.SendTransaction(ctx, signedTx) + if err != nil { + return xerrors.Errorf("sending transaction: %w", err) + } + + log.Infof("Sent Register Service Provider transaction %s at %s", signedTx.Hash().String(), time.Now().Format(time.RFC3339Nano)) + return nil +} + +func getSender(ctx context.Context, db *harmonydb.DB) (common.Address, address.Address, *ecdsa.PrivateKey, error) { + // Fetch the private key from the database + var privateKeyData []byte + err := db.QueryRow(ctx, + `SELECT private_key FROM eth_keys WHERE role = 'pdp'`).Scan(&privateKeyData) + if err != nil { + return common.Address{}, address.Address{}, nil, xerrors.Errorf("fetching pdp private key from db: %w", err) + } + + privateKey, err := crypto.ToECDSA(privateKeyData) + if err != nil { + return common.Address{}, address.Address{}, nil, xerrors.Errorf("converting private key: %w", err) + } + + sender := crypto.PubkeyToAddress(privateKey.PublicKey) + + fSender, err := address.NewDelegatedAddress(builtin.EthereumAddressManagerActorID, sender.Bytes()) + if err != nil { + return common.Address{}, address.Address{}, nil, xerrors.Errorf("failed to create delegated address: %w", err) + } + + return sender, fSender, privateKey, nil +} + +func createSignedTransaction(ctx context.Context, ethClient *ethclient.Client, privateKey *ecdsa.PrivateKey, from, to common.Address, amount *mbig.Int, data []byte) (*etypes.Transaction, error) { + msg := ethereum.CallMsg{ + From: from, + To: &to, + Value: amount, + Data: data, + } + + gasLimit, err := ethClient.EstimateGas(ctx, msg) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + if gasLimit == 0 { + return nil, fmt.Errorf("estimated gas limit is zero") + } + + // Fetch current base fee + header, err := ethClient.HeaderByNumber(ctx, nil) + if err != nil { + return nil, fmt.Errorf("failed to get latest block header: %w", err) + } + + baseFee := header.BaseFee + if baseFee == nil { + return nil, fmt.Errorf("base fee not available; network might not support EIP-1559") + } + + // Set GasTipCap (maxPriorityFeePerGas) + gasTipCap, err := ethClient.SuggestGasTipCap(ctx) + if err != nil { + return nil, xerrors.Errorf("estimating gas premium: %w", err) + } + + // Calculate GasFeeCap (maxFeePerGas) + gasFeeCap := big.NewInt(0).Add(baseFee, gasTipCap) + + chainID, err := ethClient.NetworkID(ctx) + if err != nil { + return nil, xerrors.Errorf("getting network ID: %w", err) + } + + pendingNonce, err := ethClient.PendingNonceAt(ctx, from) + if err != nil { + return nil, xerrors.Errorf("getting pending nonce: %w", err) + } + + // Create a new transaction with estimated gas limit and fee caps + tx := etypes.NewTx(&etypes.DynamicFeeTx{ + ChainID: chainID, + Nonce: pendingNonce, + GasFeeCap: gasFeeCap, + GasTipCap: gasTipCap, + Gas: gasLimit, + To: &to, + Value: amount, + Data: data, + }) + + // Sign the transaction + signer := etypes.LatestSignerForChainID(chainID) + signedTx, err := etypes.SignTx(tx, signer, privateKey) + if err != nil { + return nil, xerrors.Errorf("signing transaction: %w", err) + } + + return signedTx, nil +} + +func FSUpdateProvider(ctx context.Context, name, description string, db *harmonydb.DB, ethClient *ethclient.Client) (string, error) { + if len(name) > 128 { + return "", xerrors.Errorf("name is too long, max 128 characters allowed") + } + + if name == "" { + return "", xerrors.Errorf("name is required") + } + + if len(description) > 128 { + return "", xerrors.Errorf("description is too long, max 128 characters allowed") + } + + sender, _, privateKey, err := getSender(ctx, db) + if err != nil { + return "", xerrors.Errorf("failed to get sender: %w", err) + } + + contractAddr, err := ServiceRegistryAddress() + if err != nil { + return "", xerrors.Errorf("failed to get service registry address: %w", err) + } + + srAbi, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return "", xerrors.Errorf("failed to get service registry ABI: %w", err) + } + + calldata, err := srAbi.Pack("updateProviderInfo", name, description) + if err != nil { + return "", xerrors.Errorf("failed to serialize parameters for updateProviderInfo: %w", err) + } + + signedTx, err := createSignedTransaction(ctx, ethClient, privateKey, sender, contractAddr, mbig.NewInt(0), calldata) + if err != nil { + return "", xerrors.Errorf("creating signed transaction: %w", err) + } + + err = ethClient.SendTransaction(ctx, signedTx) + if err != nil { + return "", xerrors.Errorf("sending transaction: %w", err) + } + + return signedTx.Hash().String(), nil +} + +func FSUpdatePDPService(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client, pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilities map[string]string) (string, error) { + var keys, values []string + for k, v := range capabilities { + keys = append(keys, k) + values = append(values, v) + } + + sender, _, privateKey, err := getSender(ctx, db) + if err != nil { + return "", xerrors.Errorf("failed to get sender: %w", err) + } + + contractAddr, err := ServiceRegistryAddress() + if err != nil { + return "", xerrors.Errorf("failed to get service registry address: %w", err) + } + + srAbi, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return "", xerrors.Errorf("failed to get service registry ABI: %w", err) + } + + calldata, err := srAbi.Pack("updatePDPServiceWithCapabilities", pdpOffering, keys, values) + if err != nil { + return "", xerrors.Errorf("failed to serialize parameters for updatePDPServiceWithCapabilities: %w", err) + } + + signedTx, err := createSignedTransaction(ctx, ethClient, privateKey, sender, contractAddr, mbig.NewInt(0), calldata) + if err != nil { + return "", xerrors.Errorf("creating signed transaction: %w", err) + } + + err = ethClient.SendTransaction(ctx, signedTx) + if err != nil { + return "", xerrors.Errorf("sending transaction: %w", err) + } + + return signedTx.Hash().String(), nil +} + +func FSDeregisterProvider(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client) (string, error) { + sender, _, privateKey, err := getSender(ctx, db) + if err != nil { + return "", xerrors.Errorf("failed to get sender: %w", err) + } + + contractAddr, err := ServiceRegistryAddress() + if err != nil { + return "", xerrors.Errorf("failed to get service registry address: %w", err) + } + + srAbi, err := ServiceProviderRegistryMetaData.GetAbi() + if err != nil { + return "", xerrors.Errorf("failed to get service registry ABI: %w", err) + } + + calldata, err := srAbi.Pack("removeProvider") + if err != nil { + return "", xerrors.Errorf("failed to serialize parameters for removeProvider: %w", err) + } + + signedTx, err := createSignedTransaction(ctx, ethClient, privateKey, sender, contractAddr, mbig.NewInt(0), calldata) + if err != nil { + return "", xerrors.Errorf("creating signed transaction: %w", err) + } + + err = ethClient.SendTransaction(ctx, signedTx) + if err != nil { + return "", xerrors.Errorf("sending transaction: %w", err) + } + + return signedTx.Hash().String(), nil } diff --git a/web/api/webrpc/pdp.go b/web/api/webrpc/pdp.go index c6c2f99a1..00a64732b 100644 --- a/web/api/webrpc/pdp.go +++ b/web/api/webrpc/pdp.go @@ -6,14 +6,20 @@ import ( "crypto/x509" "encoding/hex" "encoding/pem" + "errors" "fmt" + "math/big" + "net/url" "strings" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/yugabyte/pgx/v5" - xerrors "golang.org/x/xerrors" + "golang.org/x/xerrors" "github.com/filecoin-project/curio/harmony/harmonydb" + "github.com/filecoin-project/curio/pdp/contract" ) // PDPService represents a PDP service @@ -226,3 +232,369 @@ func (a *WebRPC) RemovePDPKey(ctx context.Context, ownerAddress string) error { return nil } + +type FSRegistryStatus struct { + Address string `json:"address"` + ID int64 `json:"id"` + Active bool `json:"status"` + Name string `json:"name"` + Description string `json:"description"` + Payee string `json:"payee"` + PDPService *FSPDPOffering `json:"pdp_service"` + Capabilities map[string]string `json:"capabilities"` +} + +type FSPDPOffering struct { + ServiceURL string `json:"service_url"` + MinPieceSizeInBytes int64 `json:"min_size"` + MaxPieceSizeInBytes int64 `json:"max_size"` + IpniPiece bool `json:"ipni_piece"` + IpniIpfs bool `json:"ipni_ipfs"` + StoragePricePerTibPerMonth int64 `json:"price"` + MinProvingPeriodInEpochs int64 `json:"min_proving_period"` + Location string `json:"location"` +} + +func (a *WebRPC) FSRegistryStatus(ctx context.Context) (*FSRegistryStatus, error) { + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return nil, fmt.Errorf("no PDP key found") + } + return nil, fmt.Errorf("failed to retrieve PDP key") + } + + eclient, err := a.deps.EthClient.Val() + if err != nil { + return nil, fmt.Errorf("failed to get eth client: %w", err) + } + + registryAddr, err := contract.ServiceRegistryAddress() + if err != nil { + return nil, fmt.Errorf("failed to get service registry address: %w", err) + } + + registry, err := contract.NewServiceProviderRegistry(registryAddr, eclient) + if err != nil { + return nil, fmt.Errorf("failed to create service registry: %w", err) + } + + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return nil, fmt.Errorf("failed to check if provider is registered: %w", err) + } + + if !registered { + return nil, nil + } + + pid, err := registry.GetProviderIdByAddress(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return nil, fmt.Errorf("failed to get provider id: %w", err) + } + + provider, err := registry.GetProviderByAddress(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return nil, fmt.Errorf("failed to get provider: %w", err) + } + + pdpOffering, err := registry.GetPDPService(&bind.CallOpts{Context: ctx}, pid) + if err != nil { + return nil, fmt.Errorf("failed to get PDP offering: %w", err) + } + + capabilityValues, err := registry.GetProductCapabilities(&bind.CallOpts{Context: ctx}, pid, uint8(0), pdpOffering.CapabilityKeys) + if err != nil { + return nil, fmt.Errorf("failed to get capability values: %w", err) + } + + capabilities := make(map[string]string) + for i := range pdpOffering.CapabilityKeys { + if capabilityValues.Exists[i] { + capabilities[pdpOffering.CapabilityKeys[i]] = capabilityValues.Values[i] + } else { + capabilities[pdpOffering.CapabilityKeys[i]] = "" + } + } + + return &FSRegistryStatus{ + Address: existingAddress, + ID: provider.ProviderId.Int64(), + Active: provider.IsActive, + Payee: provider.Payee.String(), + Name: provider.Name, + Description: provider.Description, + Capabilities: capabilities, + PDPService: &FSPDPOffering{ + ServiceURL: pdpOffering.PdpOffering.ServiceURL, + MinPieceSizeInBytes: pdpOffering.PdpOffering.MinPieceSizeInBytes.Int64(), + MaxPieceSizeInBytes: pdpOffering.PdpOffering.MaxPieceSizeInBytes.Int64(), + IpniPiece: pdpOffering.PdpOffering.IpniPiece, + IpniIpfs: pdpOffering.PdpOffering.IpniIpfs, + StoragePricePerTibPerMonth: pdpOffering.PdpOffering.StoragePricePerTibPerMonth.Int64(), + MinProvingPeriodInEpochs: pdpOffering.PdpOffering.MinProvingPeriodInEpochs.Int64(), + Location: pdpOffering.PdpOffering.Location, + }, + }, nil +} + +func (a *WebRPC) FSRegister(ctx context.Context, name, description, location string) error { + if name == "" { + return fmt.Errorf("name cannot be empty") + } + if description == "" { + return fmt.Errorf("description cannot be empty") + } + + if len(name) > 128 { + return fmt.Errorf("name cannot be longer than 128 characters") + } + + if len(description) > 256 { + return fmt.Errorf("description cannot be longer than 256 characters") + } + + if location == "" { + location = "Unknown" + } + + if len(location) > 128 { + return xerrors.Errorf("location must be less than 128 characters") + } + + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return fmt.Errorf("no PDP key found") + } + return fmt.Errorf("failed to retrieve PDP key") + } + + eclient, err := a.deps.EthClient.Val() + if err != nil { + return fmt.Errorf("failed to get eth client: %w", err) + } + + registryAddr, err := contract.ServiceRegistryAddress() + if err != nil { + return fmt.Errorf("failed to get service registry address: %w", err) + } + + registry, err := contract.NewServiceProviderRegistry(registryAddr, eclient) + if err != nil { + return fmt.Errorf("failed to create service registry: %w", err) + } + + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return fmt.Errorf("failed to check if provider is registered: %w", err) + } + + if registered { + return xerrors.Errorf("provider is already registered") + } + + serviceURL := url.URL{ + Scheme: "https", + Host: a.deps.Cfg.HTTP.DomainName, + } + + offering := contract.ServiceProviderRegistryStoragePDPOffering{ + ServiceURL: serviceURL.String(), + MinPieceSizeInBytes: big.NewInt(1024 * 1024), // 1 MiB + MaxPieceSizeInBytes: big.NewInt(64 * 1024 * 1024 * 1024), // 64 GiB + IpniPiece: true, + IpniIpfs: true, + StoragePricePerTibPerMonth: big.NewInt(5000000000000000000), // 5 USDFC per TiB per month + MinProvingPeriodInEpochs: big.NewInt(1440), // 12 hours + Location: location, + PaymentTokenAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + } + + err = contract.FSRegister(ctx, a.deps.DB, a.deps.Chain, eclient, name, description, offering, nil) + if err != nil { + return xerrors.Errorf("failed to register storage provider with service contract: %w", err) + } + + return nil +} + +func (a *WebRPC) FSUpdateProvider(ctx context.Context, name, description string) error { + if name == "" { + return fmt.Errorf("name cannot be empty") + } + if description == "" { + return fmt.Errorf("description cannot be empty") + } + + if len(name) > 128 { + return fmt.Errorf("name cannot be longer than 128 characters") + } + + if len(description) > 256 { + return fmt.Errorf("description cannot be longer than 256 characters") + } + + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return fmt.Errorf("no PDP key found") + } + return fmt.Errorf("failed to retrieve PDP key") + } + + eclient, err := a.deps.EthClient.Val() + if err != nil { + return fmt.Errorf("failed to get eth client: %w", err) + } + + registryAddr, err := contract.ServiceRegistryAddress() + if err != nil { + return fmt.Errorf("failed to get service registry address: %w", err) + } + + registry, err := contract.NewServiceProviderRegistry(registryAddr, eclient) + if err != nil { + return fmt.Errorf("failed to create service registry: %w", err) + } + + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return fmt.Errorf("failed to check if provider is registered: %w", err) + } + + if !registered { + return xerrors.Errorf("provider is not registered") + } + + hash, err := contract.FSUpdateProvider(ctx, name, description, a.deps.DB, eclient) + if err != nil { + return xerrors.Errorf("failed to update service provider info: %w", err) + } + + log.Infof("FSRegister: registered PDP provider details updated with transaction %s", hash) + + return nil +} + +func (a *WebRPC) FSUpdatePDP(ctx context.Context, pdpOffering *FSPDPOffering, capabilities map[string]string) error { + if pdpOffering == nil { + return fmt.Errorf("pdp offering cannot be empty") + } + + if pdpOffering.ServiceURL == "" { + return fmt.Errorf("service URL cannot be empty") + } else { + _, err := url.Parse(pdpOffering.ServiceURL) + if err != nil { + return fmt.Errorf("invalid service URL") + } + } + + if pdpOffering.MinPieceSizeInBytes < 1024*1024 { + return fmt.Errorf("minimum piece size must be at least 1 MiB") + } else if pdpOffering.MaxPieceSizeInBytes < 1024*1024 { + return fmt.Errorf("maximum piece size must be at least 1 MiB") + } else if pdpOffering.MaxPieceSizeInBytes < pdpOffering.MinPieceSizeInBytes { + return fmt.Errorf("maximum piece size must be greater than minimum piece size") + } else if pdpOffering.MaxPieceSizeInBytes > 64*1024*1024*1024 { + return fmt.Errorf("maximum piece size must be less than 64 GiB") + } + + if pdpOffering.StoragePricePerTibPerMonth < 0 { + return fmt.Errorf("storage price per TiB per month must be greater than or equal to 0") + } + + if pdpOffering.MinProvingPeriodInEpochs < 0 { + return fmt.Errorf("minimum proving period in epochs must be greater than or equal to 0") + } + + if pdpOffering.Location == "" { + pdpOffering.Location = "Unknown" + } + + if len(pdpOffering.Location) > 128 { + return fmt.Errorf("location cannot be longer than 128 characters") + } + + for k, v := range capabilities { + if len(k) > 32 { + return xerrors.Errorf("capabilities key %s is too long, max 32 characters allowed", k) + } + if len(v) > 128 { + return xerrors.Errorf("capabilities value %s is too long, max 128 characters allowed", v) + } + } + + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return fmt.Errorf("no PDP key found") + } + return fmt.Errorf("failed to retrieve PDP key") + } + + eclient, err := a.deps.EthClient.Val() + if err != nil { + return fmt.Errorf("failed to get eth client: %w", err) + } + + registryAddr, err := contract.ServiceRegistryAddress() + if err != nil { + return fmt.Errorf("failed to get service registry address: %w", err) + } + + registry, err := contract.NewServiceProviderRegistry(registryAddr, eclient) + if err != nil { + return fmt.Errorf("failed to create service registry: %w", err) + } + + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + if err != nil { + return fmt.Errorf("failed to check if provider is registered: %w", err) + } + + if !registered { + return xerrors.Errorf("provider is not registered") + } + + offering := contract.ServiceProviderRegistryStoragePDPOffering{ + ServiceURL: pdpOffering.ServiceURL, + MinPieceSizeInBytes: big.NewInt(pdpOffering.MinPieceSizeInBytes), + MaxPieceSizeInBytes: big.NewInt(pdpOffering.MaxPieceSizeInBytes), + IpniPiece: pdpOffering.IpniPiece, + IpniIpfs: pdpOffering.IpniIpfs, + StoragePricePerTibPerMonth: big.NewInt(pdpOffering.StoragePricePerTibPerMonth), + MinProvingPeriodInEpochs: big.NewInt(pdpOffering.MinProvingPeriodInEpochs), + Location: pdpOffering.Location, + PaymentTokenAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + } + + hash, err := contract.FSUpdatePDPService(ctx, a.deps.DB, eclient, offering, capabilities) + if err != nil { + return xerrors.Errorf("failed to update PDP offering: %w", err) + } + + log.Infof("FSRegister: updated PDP provider product details with transaction %s", hash) + + return nil +} + +func (a *WebRPC) FSDeregister(ctx context.Context) error { + eclient, err := a.deps.EthClient.Val() + if err != nil { + return fmt.Errorf("failed to get eth client: %w", err) + } + + hash, err := contract.FSDeregisterProvider(ctx, a.deps.DB, eclient) + if err != nil { + return xerrors.Errorf("failed to deregister storage provider: %w", err) + } + + log.Infof("FSDeregister: deregistered PDP provider with transaction %s", hash) + return nil +} diff --git a/web/static/pages/market-settings/index.html b/web/static/pages/market-settings/index.html index b267cc7e2..70c24158a 100644 --- a/web/static/pages/market-settings/index.html +++ b/web/static/pages/market-settings/index.html @@ -17,7 +17,7 @@
-

Market Setting

+

Market Setting

diff --git a/web/static/pages/pdp/index.html b/web/static/pages/pdp/index.html index 049237a94..b497537b7 100644 --- a/web/static/pages/pdp/index.html +++ b/web/static/pages/pdp/index.html @@ -4,21 +4,33 @@ Node Info + -
-
-
-

Proof of Data Possession

+
+ +
+ +
+
+

Proof of Data Possession

+
+
+
+ +
+
+
+
+
+
+ +
+
+
-
-
-
- -
-
-
+
diff --git a/web/static/pages/pdp/register.js b/web/static/pages/pdp/register.js new file mode 100644 index 000000000..8aefeaceb --- /dev/null +++ b/web/static/pages/pdp/register.js @@ -0,0 +1,604 @@ +import {css, html, LitElement} from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'; +import RPCCall from '/lib/jsonrpc.mjs'; + +customElements.define('fs-registry-info', class FSRegistryInfo extends LitElement { + static properties = { + status: { type: Object }, + loading: { type: Boolean }, + error: { type: String }, + + // modal toggles + showRegisterModal: { type: Boolean }, + showUpdateModal: { type: Boolean }, + showUpdatePDPModal: { type: Boolean }, + showDeregisterModal: { type: Boolean }, + + // service form state + name: { type: String }, + description: { type: String }, + location: { type: String }, + + // PDP update state + pdpServiceURL: { type: String }, + pdpMinPieceSize: { type: Number }, + pdpMaxPieceSize: { type: Number }, + pdpIpniPiece: { type: Boolean }, + pdpIpniIpfs: { type: Boolean }, + pdpPrice: { type: Number }, + pdpMinProvingPeriod: { type: Number }, + pdpLocation: { type: String }, + + // deregister confirmation input + deregisterConfirmation: { type: String }, + + capabilities: { type: Object }, + + }; + + static styles = css` + .modal-backdrop { + position: fixed; inset: 0; background: rgba(0,0,0,0.6); + display: flex; align-items: center; justify-content: center; z-index: 1050; + } + .modal-card { + background: #1f1f1f; color: #fff; border-radius: .5rem; width: 40rem; max-width: 95vw; + box-shadow: 0 1rem 3rem rgba(0,0,0,.3); + } + .modal-header, .modal-footer { padding: 1rem 1.25rem; border-color: rgba(255,255,255,.1); } + .modal-header { border-bottom: 1px solid; } + .modal-footer { border-top: 1px solid; } + .modal-body { padding: 1rem 1.25rem; } + .close-btn { background: transparent; border: 0; color: #aaa; font-size: 1.5rem; line-height: 1; } + .kv-table th { width: 28%; } + .badge { font-size: .85rem; } + .muted { color: #9aa0a6; } + `; + + constructor() { + super(); + this.status = null; + this.loading = true; + this.error = ''; + + this.showRegisterModal = false; + this.showUpdateModal = false; + this.showUpdatePDPModal = false; + + this.name = ''; + this.description = ''; + this.location = ''; + + // PDP update state + this.pdpServiceURL = ''; + this.pdpMinPieceSize = 0; + this.pdpMaxPieceSize = 0; + this.pdpIpniPiece = true; + this.pdpIpniIpfs = true; + this.pdpPrice = 0; + this.pdpMinProvingPeriod = 0; + this.pdpLocation = ''; + + this.capabilities = {}; + + this.deregisterConfirmation = ''; + + this.loadStatus(); + } + + async loadStatus() { + this.loading = true; + this.error = ''; + try { + const s = await RPCCall('FSRegistryStatus', []); + this.status = s ?? null; + if (this.status && typeof this.status === 'object') { + this.status.capabilities = this.status.capabilities || {}; + } + } catch (e) { + console.error('FSRegistryStatus error:', e); + this.error = e?.message || String(e); + this.status = null; + } finally { + this.loading = false; + } + } + + openRegister() { + this.name = ''; + this.description = ''; + this.location = ''; + this.showRegisterModal = true; + } + closeRegister() { this.showRegisterModal = false; } + + async submitRegister(e) { + e.preventDefault(); + const name = this.name.trim(); + const description = this.description.trim(); + const location = this.location.trim(); + + if (!name || !description || !location) { + alert('Please fill all fields (name, description, location).'); + return; + } + + try { + await RPCCall('FSRegister', [name, description, location]); + this.showRegisterModal = false; + await this.loadStatus(); + alert('Provider registered successfully. Please wait for the 5 epochs to see the updated status.'); + } catch (err) { + console.error('FSRegister failed:', err); + alert('Register failed: ' + (err?.message || err)); + } + } + + openUpdate() { + // prefill from current status + this.name = this.status?.name || ''; + this.description = this.status?.description || ''; + this.showUpdateModal = true; + } + closeUpdate() { this.showUpdateModal = false; } + + async submitUpdate(e) { + e.preventDefault(); + const name = this.name.trim(); + const description = this.description.trim(); + // FSUpdateProvider signature: (name, description) + if (!name || !description) { + alert('Please fill name and description.'); + return; + } + try { + await RPCCall('FSUpdateProvider', [name, description]); + this.showUpdateModal = false; + await this.loadStatus(); + alert('Provider updated successfully. Please wait for the 5 epochs to see the updated status.'); + } catch (err) { + console.error('FSUpdateProvider failed:', err); + alert('Update failed: ' + (err?.message || err)); + } + } + + openDeregisterModal() { + this.deregisterConfirmation = ''; // Reset confirmation input + this.showDeregisterModal = true; + } + + closeDeregisterModal() { + this.showDeregisterModal = false; + } + + async submitDeregister(e) { + e.preventDefault(); + + if (this.deregisterConfirmation.trim().toLowerCase() !== 'deregister') { + alert('You must type "deregister" to confirm removal.'); + return; + } + + try { + await RPCCall('FSDeregister', []); // Call backend deregister method + this.showDeregisterModal = false; + await this.loadStatus(); // Reload status to reflect deregistration + alert('Provider deregistered successfully. Please wait for the 5 epochs to see the updated status.'); + } catch (err) { + console.error('FSDeregister failed:', err); + alert('Deregistration failed: ' + (err?.message || err)); + } + } + + addCapability() { + const key = prompt('Enter capability key:'); + if (key) { + if (this.capabilities[key]) { + alert('This key already exists.'); + return; + } + const value = prompt('Enter capability value:'); + if (value) { + this.capabilities = {...this.capabilities, [key]: value}; + } + } + } + + editCapability(key) { + const value = prompt(`Edit value for key "${key}":`, this.capabilities[key]); + if (value) { + this.capabilities = {...this.capabilities, [key]: value}; + } + } + + removeCapability(key) { + if (confirm(`Are you sure you want to remove the capability "${key}"?`)) { + const { [key]: _, ...updatedCapabilities } = this.capabilities; // Use destructuring to exclude the key + this.capabilities = updatedCapabilities; + } + } + + openUpdatePDP() { + const pdp = this.status?.pdp_service || {}; + this.pdpServiceURL = pdp.service_url || ''; + this.pdpMinPieceSize = pdp.min_size || 0; + this.pdpMaxPieceSize = pdp.max_size || 0; + this.pdpIpniPiece = pdp.ipni_piece || false; + this.pdpIpniIpfs = pdp.ipni_ipfs || false; + this.pdpPrice = pdp.price || 0; + this.pdpMinProvingPeriod = pdp.min_proving_period || 0; + this.pdpLocation = pdp.location || ''; + this.capabilities = this.status?.capabilities || {}; + this.showUpdatePDPModal = true; + } + + closeUpdatePDP() { + this.showUpdatePDPModal = false; + } + + isValidLocation(location) { + // Regular expression for the format "C=US;ST=California;L=San Francisco" + const regex = /^C=[A-Z]{2};ST=[\w\s]+;L=[\w\s]+$/; + return regex.test(location); + } + + async submitUpdatePDP(e) { + e.preventDefault(); + + const pdpOffering = { + service_url: this.pdpServiceURL.trim(), + min_size: parseInt(this.pdpMinPieceSize, 10), + max_size: parseInt(this.pdpMaxPieceSize, 10), + ipni_piece: this.pdpIpniPiece, + ipni_ipfs: this.pdpIpniIpfs, + price: parseInt(this.pdpPrice, 10), + min_proving_period: parseInt(this.pdpMinProvingPeriod, 10), + location: this.pdpLocation.trim(), + }; + + // Validate location format + if (!this.isValidLocation(pdpOffering.location)) { + alert('Location must be in the format: "C=US;ST=California;L=San Francisco".'); + return; + } + + // Validate fields + if (!pdpOffering.service_url || !pdpOffering.location || + pdpOffering.min_size <= 0 || pdpOffering.max_size <= 0 || pdpOffering.price < 0 || pdpOffering.min_proving_period <= 0) { + alert('Please provide all required fields with valid data.'); + return; + } + + try { + await RPCCall('FSUpdatePDP', [pdpOffering, this.capabilities]); + this.showUpdatePDPModal = false; + await this.loadStatus(); // Refresh status + alert('PDP Offering updated successfully. Please wait for the 5 epochs to see the updated status.'); + } catch (err) { + console.error('FSUpdatePDP failed:', err); + alert('Update failed: ' + (err?.message || err)); + } + } + + renderKV(label, value) { + return html` + + ${label} + ${value ?? html``} + + `; + } + + renderCapabilities(cap) { + const entries = Object.entries(cap || {}); + if (!entries.length) return html`None`; + return html`${entries.map(([k, v]) => html` + ${k}: ${v} + `)}`; + } + + renderPDP(pdp, capabilities) { + if (!pdp) return html`None`; + return html` + + + ${this.renderKV('Service URL', pdp.service_url)} + ${this.renderKV('Min Piece Size', this.formatBytes(pdp.min_size))} + ${this.renderKV('Max Piece Size', this.formatBytes(pdp.max_size))} + ${this.renderKV('IPNI Piece', String(!!pdp.ipni_piece))} + ${this.renderKV('IPNI IPFS', String(!!pdp.ipni_ipfs))} + ${this.renderKV('Price (per TiB per month)', this.unitsToUSDFCPerTiBPerMonth(pdp.price))} + ${this.renderKV('Min Proving Period (epochs)', pdp.min_proving_period)} + ${this.renderKV('Location', pdp.location)} + ${this.renderKV('Capabilities', this.renderCapabilities(capabilities))} + +
+ `; + } + + formatBytes(bytes) { + if (bytes === 0) return '0 Bytes'; + const k = 1024; + const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; + } + + get UNIT_PER_USDFC() { + return 1e18; + } + + unitsToUSDFCPerTiBPerMonth(value) { + const inUSDFC = + value / this.UNIT_PER_USDFC; + return inUSDFC.toFixed(4); // Limit to 4 decimal places + } + + USDFCToUnitsPerGiBPerEpoch(value) { + const inUnits = + (value * this.UNIT_PER_USDFC); + return Math.round(inUnits); // Round to the nearest integer + } + + render() { + return html` + + +

+ +
+

Filecoin Service Registry

+ + ${this.loading ? html` +
+ + Loading status… +
+ ` : this.error ? html` +
Failed to load status: ${this.error}
+ ` : html`${this.status === null ? html` +
This provider is not registered.
+ + ` : html` +
+
Current Status
+
+ + + ${this.renderKV('Address', this.status.address)} + ${this.renderKV('ID', this.status.id)} + ${this.renderKV('Active', String(!!this.status.status))} + ${this.renderKV('Name', this.status.name)} + ${this.renderKV('Description', this.status.description)} + ${this.renderKV('Payee', this.status.payee)} + + + + + +
PDP Service + ${this.renderPDP(this.status.pdp_service, this.status.capabilities)} +
+
+
+ + + + ${this.status !== null ? html`` : ''} +

+ `}`} + + ${this.showRegisterModal ? html` + + ` : ''} + + ${this.showUpdateModal ? html` + + ` : ''} + + ${this.showUpdatePDPModal ? html` + + ` : ''} + + ${this.showDeregisterModal ? html` + + ` : ''} +
+ `; + } +}); From 3c7d06e3d5642a9002a3efcb53ab3721dfde6e92 Mon Sep 17 00:00:00 2001 From: LexLuthr Date: Mon, 13 Oct 2025 16:39:13 +0400 Subject: [PATCH 2/2] apply review suggestions --- pdp/contract/addresses.go | 29 ++++++++++++ pdp/contract/utils.go | 31 +++++-------- web/api/webrpc/pdp.go | 76 +++++++++++++------------------- web/static/pages/pdp/register.js | 14 ++---- 4 files changed, 76 insertions(+), 74 deletions(-) diff --git a/pdp/contract/addresses.go b/pdp/contract/addresses.go index c76820174..d5c1dcbfd 100644 --- a/pdp/contract/addresses.go +++ b/pdp/contract/addresses.go @@ -5,6 +5,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/snadrus/must" + "golang.org/x/xerrors" "github.com/filecoin-project/curio/build" @@ -60,3 +61,31 @@ func IsRecordKeeperAllowed(recordKeeper common.Address) bool { } return false } + +const ServiceRegistryMainnet = "0x9C65E8E57C98cCc040A3d825556832EA1e9f4Df6" +const ServiceRegistryCalibnet = "0xA8a7e2130C27e4f39D1aEBb3D538D5937bCf8ddb" + +func ServiceRegistryAddress() (common.Address, error) { + switch build.BuildType { + case build.BuildCalibnet: + return common.HexToAddress(ServiceRegistryCalibnet), nil + case build.BuildMainnet: + return common.HexToAddress(ServiceRegistryMainnet), nil + default: + return common.Address{}, xerrors.Errorf("service registry address not set for this network %s", build.BuildTypeString()[1:]) + } +} + +const USDFCAddressMainnet = "0x80B98d3aa09ffff255c3ba4A241111Ff1262F045" +const USDFCAddressCalibnet = "0xb3042734b608a1B16e9e86B374A3f3e389B4cDf0" + +func USDFCAddress() (common.Address, error) { + switch build.BuildType { + case build.BuildCalibnet: + return common.HexToAddress(USDFCAddressCalibnet), nil + case build.BuildMainnet: + return common.HexToAddress(USDFCAddressMainnet), nil + default: + return common.Address{}, xerrors.Errorf("USDFC address not set for this network %s", build.BuildTypeString()[1:]) + } +} diff --git a/pdp/contract/utils.go b/pdp/contract/utils.go index 7147e9a47..95718ada8 100644 --- a/pdp/contract/utils.go +++ b/pdp/contract/utils.go @@ -21,7 +21,6 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/curio/build" "github.com/filecoin-project/curio/harmony/harmonydb" "github.com/filecoin-project/lotus/api" @@ -86,20 +85,6 @@ func GetDataSetMetadataAtKey(listenerAddr common.Address, ethClient *ethclient.C return out.Exists, out.Value, nil } -const ServiceRegistryMainnet = "0x9C65E8E57C98cCc040A3d825556832EA1e9f4Df6" -const ServiceRegistryCalibnet = "0xA8a7e2130C27e4f39D1aEBb3D538D5937bCf8ddb" - -func ServiceRegistryAddress() (common.Address, error) { - switch build.BuildType { - case build.BuildCalibnet: - return common.HexToAddress(ServiceRegistryCalibnet), nil - case build.BuildMainnet: - return common.HexToAddress(ServiceRegistryMainnet), nil - default: - return common.Address{}, xerrors.Errorf("service registry address not set for this network %s", build.BuildTypeString()[1:]) - } -} - func FSRegister(ctx context.Context, db *harmonydb.DB, full api.FullNode, ethClient *ethclient.Client, name, description string, pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilities map[string]string) error { if len(name) > 128 { return xerrors.Errorf("name is too long, max 128 characters allowed") @@ -122,6 +107,9 @@ func FSRegister(ctx context.Context, db *harmonydb.DB, full api.FullNode, ethCli return xerrors.Errorf("capabilities value %s is too long, max 128 characters allowed", v) } keys = append(keys, k) + if len(keys) > 10 { + return xerrors.Errorf("too many capabilities, max 10 allowed") + } values = append(values, v) } @@ -171,10 +159,6 @@ func FSRegister(ctx context.Context, db *harmonydb.DB, full api.FullNode, ethCli return xerrors.Errorf("failed to encode PDP offering: %w", err) } - if len(keys) > 10 { - return xerrors.Errorf("too many capabilities, max 10 allowed") - } - // Prepare EVM calldata calldata, err := srAbi.Pack("registerProvider", common.Address(walletEvm), name, description, uint8(0), encodedPDP, keys, values) if err != nil { @@ -336,7 +320,16 @@ func FSUpdateProvider(ctx context.Context, name, description string, db *harmony func FSUpdatePDPService(ctx context.Context, db *harmonydb.DB, ethClient *ethclient.Client, pdpOffering ServiceProviderRegistryStoragePDPOffering, capabilities map[string]string) (string, error) { var keys, values []string for k, v := range capabilities { + if len(k) > 32 { + return "", xerrors.Errorf("capabilities key %s is too long, max 32 characters allowed", k) + } + if len(v) > 128 { + return "", xerrors.Errorf("capabilities value %s is too long, max 128 characters allowed", v) + } keys = append(keys, k) + if len(keys) > 10 { + return "", xerrors.Errorf("too many capabilities, max 10 allowed") + } values = append(values, v) } diff --git a/web/api/webrpc/pdp.go b/web/api/webrpc/pdp.go index 00a64732b..dfde6222e 100644 --- a/web/api/webrpc/pdp.go +++ b/web/api/webrpc/pdp.go @@ -313,8 +313,6 @@ func (a *WebRPC) FSRegistryStatus(ctx context.Context) (*FSRegistryStatus, error for i := range pdpOffering.CapabilityKeys { if capabilityValues.Exists[i] { capabilities[pdpOffering.CapabilityKeys[i]] = capabilityValues.Values[i] - } else { - capabilities[pdpOffering.CapabilityKeys[i]] = "" } } @@ -355,21 +353,13 @@ func (a *WebRPC) FSRegister(ctx context.Context, name, description, location str return fmt.Errorf("description cannot be longer than 256 characters") } - if location == "" { - location = "Unknown" - } - if len(location) > 128 { return xerrors.Errorf("location must be less than 128 characters") } - var existingAddress string - err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + pdpAddress, err := a.getPDPAddress(ctx) if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - return fmt.Errorf("no PDP key found") - } - return fmt.Errorf("failed to retrieve PDP key") + return fmt.Errorf("failed to get PDP address: %w", err) } eclient, err := a.deps.EthClient.Val() @@ -387,7 +377,7 @@ func (a *WebRPC) FSRegister(ctx context.Context, name, description, location str return fmt.Errorf("failed to create service registry: %w", err) } - registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, pdpAddress) if err != nil { return fmt.Errorf("failed to check if provider is registered: %w", err) } @@ -401,6 +391,11 @@ func (a *WebRPC) FSRegister(ctx context.Context, name, description, location str Host: a.deps.Cfg.HTTP.DomainName, } + tokenAddress, err := contract.USDFCAddress() + if err != nil { + return xerrors.Errorf("failed to get USDFC address: %w", err) + } + offering := contract.ServiceProviderRegistryStoragePDPOffering{ ServiceURL: serviceURL.String(), MinPieceSizeInBytes: big.NewInt(1024 * 1024), // 1 MiB @@ -410,7 +405,7 @@ func (a *WebRPC) FSRegister(ctx context.Context, name, description, location str StoragePricePerTibPerMonth: big.NewInt(5000000000000000000), // 5 USDFC per TiB per month MinProvingPeriodInEpochs: big.NewInt(1440), // 12 hours Location: location, - PaymentTokenAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + PaymentTokenAddress: tokenAddress, } err = contract.FSRegister(ctx, a.deps.DB, a.deps.Chain, eclient, name, description, offering, nil) @@ -437,13 +432,9 @@ func (a *WebRPC) FSUpdateProvider(ctx context.Context, name, description string) return fmt.Errorf("description cannot be longer than 256 characters") } - var existingAddress string - err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + pdpAddress, err := a.getPDPAddress(ctx) if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - return fmt.Errorf("no PDP key found") - } - return fmt.Errorf("failed to retrieve PDP key") + return fmt.Errorf("failed to get PDP address: %w", err) } eclient, err := a.deps.EthClient.Val() @@ -461,7 +452,7 @@ func (a *WebRPC) FSUpdateProvider(ctx context.Context, name, description string) return fmt.Errorf("failed to create service registry: %w", err) } - registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, pdpAddress) if err != nil { return fmt.Errorf("failed to check if provider is registered: %w", err) } @@ -494,10 +485,10 @@ func (a *WebRPC) FSUpdatePDP(ctx context.Context, pdpOffering *FSPDPOffering, ca } } - if pdpOffering.MinPieceSizeInBytes < 1024*1024 { - return fmt.Errorf("minimum piece size must be at least 1 MiB") - } else if pdpOffering.MaxPieceSizeInBytes < 1024*1024 { - return fmt.Errorf("maximum piece size must be at least 1 MiB") + if pdpOffering.MinPieceSizeInBytes < 127 { + return fmt.Errorf("minimum piece size must be at least 127 bytes") + } else if pdpOffering.MaxPieceSizeInBytes < 127 { + return fmt.Errorf("maximum piece size must be at least 127 bytes") } else if pdpOffering.MaxPieceSizeInBytes < pdpOffering.MinPieceSizeInBytes { return fmt.Errorf("maximum piece size must be greater than minimum piece size") } else if pdpOffering.MaxPieceSizeInBytes > 64*1024*1024*1024 { @@ -512,30 +503,13 @@ func (a *WebRPC) FSUpdatePDP(ctx context.Context, pdpOffering *FSPDPOffering, ca return fmt.Errorf("minimum proving period in epochs must be greater than or equal to 0") } - if pdpOffering.Location == "" { - pdpOffering.Location = "Unknown" - } - if len(pdpOffering.Location) > 128 { return fmt.Errorf("location cannot be longer than 128 characters") } - for k, v := range capabilities { - if len(k) > 32 { - return xerrors.Errorf("capabilities key %s is too long, max 32 characters allowed", k) - } - if len(v) > 128 { - return xerrors.Errorf("capabilities value %s is too long, max 128 characters allowed", v) - } - } - - var existingAddress string - err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + pdpAddress, err := a.getPDPAddress(ctx) if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - return fmt.Errorf("no PDP key found") - } - return fmt.Errorf("failed to retrieve PDP key") + return fmt.Errorf("failed to get PDP address: %w", err) } eclient, err := a.deps.EthClient.Val() @@ -553,7 +527,7 @@ func (a *WebRPC) FSUpdatePDP(ctx context.Context, pdpOffering *FSPDPOffering, ca return fmt.Errorf("failed to create service registry: %w", err) } - registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, common.HexToAddress(existingAddress)) + registered, err := registry.IsRegisteredProvider(&bind.CallOpts{Context: ctx}, pdpAddress) if err != nil { return fmt.Errorf("failed to check if provider is registered: %w", err) } @@ -598,3 +572,15 @@ func (a *WebRPC) FSDeregister(ctx context.Context) error { log.Infof("FSDeregister: deregistered PDP provider with transaction %s", hash) return nil } + +func (a *WebRPC) getPDPAddress(ctx context.Context) (common.Address, error) { + var existingAddress string + err := a.deps.DB.QueryRow(ctx, `SELECT address FROM eth_keys WHERE role = 'pdp'`).Scan(&existingAddress) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return common.Address{}, fmt.Errorf("no PDP key found") + } + return common.Address{}, fmt.Errorf("failed to retrieve PDP key") + } + return common.HexToAddress(existingAddress), nil +} diff --git a/web/static/pages/pdp/register.js b/web/static/pages/pdp/register.js index 8aefeaceb..33a333fe9 100644 --- a/web/static/pages/pdp/register.js +++ b/web/static/pages/pdp/register.js @@ -134,7 +134,6 @@ customElements.define('fs-registry-info', class FSRegistryInfo extends LitElemen } openUpdate() { - // prefill from current status this.name = this.status?.name || ''; this.description = this.status?.description || ''; this.showUpdateModal = true; @@ -145,7 +144,6 @@ customElements.define('fs-registry-info', class FSRegistryInfo extends LitElemen e.preventDefault(); const name = this.name.trim(); const description = this.description.trim(); - // FSUpdateProvider signature: (name, description) if (!name || !description) { alert('Please fill name and description.'); return; @@ -197,22 +195,18 @@ customElements.define('fs-registry-info', class FSRegistryInfo extends LitElemen return; } const value = prompt('Enter capability value:'); - if (value) { - this.capabilities = {...this.capabilities, [key]: value}; - } + this.capabilities = {...this.capabilities, [key]: value}; } } editCapability(key) { const value = prompt(`Edit value for key "${key}":`, this.capabilities[key]); - if (value) { - this.capabilities = {...this.capabilities, [key]: value}; - } + this.capabilities = {...this.capabilities, [key]: value}; } removeCapability(key) { if (confirm(`Are you sure you want to remove the capability "${key}"?`)) { - const { [key]: _, ...updatedCapabilities } = this.capabilities; // Use destructuring to exclude the key + const { [key]: _, ...updatedCapabilities } = this.capabilities; this.capabilities = updatedCapabilities; } } @@ -237,7 +231,7 @@ customElements.define('fs-registry-info', class FSRegistryInfo extends LitElemen isValidLocation(location) { // Regular expression for the format "C=US;ST=California;L=San Francisco" - const regex = /^C=[A-Z]{2};ST=[\w\s]+;L=[\w\s]+$/; + const regex = /^C=[A-Z]{2}(;ST=[\w\s]+)?(;L=[\w\s]+)?$/; return regex.test(location); }