diff --git a/contracts/MechAgentFactory.json b/contracts/MechAgentFactory.json deleted file mode 100644 index bfbc437..0000000 --- a/contracts/MechAgentFactory.json +++ /dev/null @@ -1,539 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "MechMarketplace", - "sourceName": "contracts/MechMarketplace.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_agentRegistry", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "AgentInstanceRegistered", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "AgentInstancesSlotsFilled", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - } - ], - "name": "AgentNotFound", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "AgentNotInService", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "componentId", - "type": "uint256" - } - ], - "name": "ComponentNotFound", - "type": "error" - }, - { - "inputs": [], - "name": "HashExists", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "sent", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "IncorrectAgentBondingValue", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "sent", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "IncorrectRegistrationDepositValue", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "manager", - "type": "address" - } - ], - "name": "ManagerOnly", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "provided", - "type": "address" - }, - { - "internalType": "address", - "name": "expected", - "type": "address" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "OnlyOwnServiceMultisig", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "OperatorHasNoInstances", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "provided", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "max", - "type": "uint256" - } - ], - "name": "Overflow", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "OwnerOnly", - "type": "error" - }, - { - "inputs": [], - "name": "Paused", - "type": "error" - }, - { - "inputs": [], - "name": "ReentrancyGuard", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "ServiceMustBeInactive", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "TransferFailed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "multisig", - "type": "address" - } - ], - "name": "UnauthorizedMultisig", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - } - ], - "name": "WrongAgentId", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "numValues1", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "numValues2", - "type": "uint256" - } - ], - "name": "WrongArrayLength", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "WrongOperator", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "state", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" - } - ], - "name": "WrongServiceState", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "currentThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxThreshold", - "type": "uint256" - } - ], - "name": "WrongThreshold", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroValue", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "mech", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "name": "CreateMech", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "OwnerUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "Pause", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "Unpause", - "type": "event" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "agentRegistry", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "changeOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "agentOwner", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "agentHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - }, - { - "internalType": "address", - "name": "mechMarketplace", - "type": "address" - } - ], - "name": "create", - "outputs": [ - { - "internalType": "uint256", - "name": "agentId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "mech", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/contracts/MechMarketplace.json b/contracts/MechMarketplace.json index 63cc2ef..1149d65 100644 --- a/contracts/MechMarketplace.json +++ b/contracts/MechMarketplace.json @@ -7,37 +7,91 @@ "inputs": [ { "internalType": "address", - "name": "_stakingFactory", + "name": "_serviceRegistry", "type": "address" }, { "internalType": "address", - "name": "_karmaProxy", + "name": "_karma", "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + } + ], + "name": "AlreadyDelivered", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + } + ], + "name": "AlreadyRequested", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" }, { "internalType": "uint256", - "name": "_minResponseTimeout", + "name": "provided", "type": "uint256" }, { "internalType": "uint256", - "name": "_maxResponseTimeout", + "name": "expected", "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "IncorrectSignatureLength", + "type": "error" }, { "inputs": [ { "internalType": "uint256", - "name": "requestId", + "name": "current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "required", "type": "uint256" } ], - "name": "AlreadyDelivered", + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "NoDepositAllowed", "type": "error" }, { @@ -114,6 +168,17 @@ "name": "ReentrancyGuard", "type": "error" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + } + ], + "name": "RequestIdNotFound", + "type": "error" + }, { "inputs": [ { @@ -130,6 +195,53 @@ "name": "ServiceNotStaked", "type": "error" }, + { + "inputs": [ + { + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "SignatureNotValidated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferFailed", + "type": "error" + }, { "inputs": [ { @@ -141,6 +253,96 @@ "name": "UnauthorizedAccount", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numValues1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues2", + "type": "uint256" + } + ], + "name": "WrongArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numValues1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues3", + "type": "uint256" + } + ], + "name": "WrongArrayLength3", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numValues1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues4", + "type": "uint256" + } + ], + "name": "WrongArrayLength4", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "paymentType", + "type": "bytes32" + } + ], + "name": "WrongPaymentType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "state", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + } + ], + "name": "WrongServiceState", + "type": "error" + }, { "inputs": [], "name": "ZeroAddress", @@ -157,11 +359,17 @@ { "indexed": true, "internalType": "address", - "name": "factory", + "name": "mech", "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" } ], - "name": "FactoryUpdated", + "name": "CreateMech", "type": "event" }, { @@ -170,26 +378,20 @@ { "indexed": true, "internalType": "address", - "name": "priorityMech", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "actualMech", + "name": "mech", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "requester", + "name": "mechServiceMultisig", "type": "address" }, { "indexed": false, - "internalType": "uint256", + "internalType": "bytes32", "name": "requestId", - "type": "uint256" + "type": "bytes32" }, { "indexed": false, @@ -198,7 +400,7 @@ "type": "bytes" } ], - "name": "MarketplaceDeliver", + "name": "Deliver", "type": "event" }, { @@ -207,29 +409,48 @@ { "indexed": true, "internalType": "address", - "name": "requester", + "name": "implementation", "type": "address" - }, + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { "indexed": true, "internalType": "address", - "name": "requestedMech", + "name": "deliveryMech", "type": "address" }, + { + "indexed": true, + "internalType": "address[]", + "name": "requesters", + "type": "address[]" + }, { "indexed": false, "internalType": "uint256", - "name": "requestId", + "name": "numDeliveries", "type": "uint256" }, { "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" + }, + { + "indexed": false, + "internalType": "bool[]", + "name": "deliveredRequests", + "type": "bool[]" } ], - "name": "MarketplaceRequest", + "name": "MarketplaceDelivery", "type": "event" }, { @@ -238,22 +459,40 @@ { "indexed": true, "internalType": "address", - "name": "mech", + "name": "deliveryMech", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "requester", "type": "address" }, { "indexed": false, - "internalType": "bool", - "name": "status", - "type": "bool" + "internalType": "uint256", + "name": "numRequests", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" } ], - "name": "MechRegistrationStatusChanged", + "name": "MarketplaceDeliveryWithSignatures", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -267,7 +506,38 @@ "type": "uint256" } ], - "name": "MinMaxResponseTimeoutUpdated", + "name": "MarketplaceParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "priorityMech", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "numRequests", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" + } + ], + "name": "MarketplaceRequest", "type": "event" }, { @@ -283,6 +553,63 @@ "name": "OwnerUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "RequesterHashApproved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address[]", + "name": "mechFactories", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "bool[]", + "name": "statuses", + "type": "bool[]" + } + ], + "name": "SetMechFactoryStatuses", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32[]", + "name": "paymentTypes", + "type": "bytes32[]" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "balanceTrackers", + "type": "address[]" + } + ], + "name": "SetPaymentTypeBalanceTrackers", + "type": "event" + }, { "inputs": [], "name": "DOMAIN_SEPARATOR_TYPE_HASH", @@ -296,6 +623,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "MAX_FEE_FACTOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MECH_MARKETPLACE_PROXY", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "VERSION", @@ -326,25 +679,64 @@ "inputs": [ { "internalType": "address", - "name": "mech", + "name": "newImplementation", "type": "address" + } + ], + "name": "changeImplementation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newFee", + "type": "uint256" }, { - "internalType": "address", - "name": "mechStakingInstance", - "type": "address" + "internalType": "uint256", + "name": "newMinResponseTimeout", + "type": "uint256" }, { "internalType": "uint256", - "name": "mechServiceId", + "name": "newMaxResponseTimeout", "type": "uint256" } ], + "name": "changeMarketplaceParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "changeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + } + ], "name": "checkMech", "outputs": [ { "internalType": "address", - "name": "", + "name": "multisig", "type": "address" } ], @@ -354,68 +746,95 @@ { "inputs": [ { - "internalType": "address", - "name": "requester", - "type": "address" + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" }, { "internalType": "address", - "name": "requesterStakingInstance", + "name": "mechFactory", "type": "address" }, { - "internalType": "uint256", - "name": "requesterServiceId", - "type": "uint256" + "internalType": "bytes", + "name": "payload", + "type": "bytes" } ], - "name": "checkRequester", - "outputs": [], - "stateMutability": "view", + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "mech", + "type": "address" + } + ], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "stakingInstance", - "type": "address" + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" }, { - "internalType": "uint256", - "name": "serviceId", - "type": "uint256" + "internalType": "uint256[]", + "name": "deliveryRates", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "deliveryDatas", + "type": "bytes[]" } ], - "name": "checkStakingInstance", - "outputs": [], - "stateMutability": "view", + "name": "deliverMarketplace", + "outputs": [ + { + "internalType": "bool[]", + "name": "deliveredRequests", + "type": "bool[]" + } + ], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" + "internalType": "address", + "name": "requester", + "type": "address" + }, + { + "internalType": "bytes[]", + "name": "requestDatas", + "type": "bytes[]" }, { - "internalType": "bytes", - "name": "requestData", - "type": "bytes" + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" }, { - "internalType": "address", - "name": "deliveryMechStakingInstance", - "type": "address" + "internalType": "bytes[]", + "name": "deliveryDatas", + "type": "bytes[]" }, { - "internalType": "uint256", - "name": "deliveryMechServiceId", - "type": "uint256" + "internalType": "uint256[]", + "name": "deliveryRates", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" } ], - "name": "deliverMarketplace", + "name": "deliverMarketplaceWithSignatures", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -434,14 +853,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "getDeliveriesCount", + "inputs": [], + "name": "fee", "outputs": [ { "internalType": "uint256", @@ -467,40 +880,33 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, { "internalType": "uint256", - "name": "requestId", + "name": "deliveryRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", "type": "uint256" } ], - "name": "getMechDeliveryInfo", + "name": "getRequestId", "outputs": [ { - "components": [ - { - "internalType": "address", - "name": "priorityMech", - "type": "address" - }, - { - "internalType": "address", - "name": "deliveryMech", - "type": "address" - }, - { - "internalType": "address", - "name": "requester", - "type": "address" - }, - { - "internalType": "uint32", - "name": "responseTimeout", - "type": "uint32" - } - ], - "internalType": "struct MechDelivery", - "name": "", - "type": "tuple" + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" } ], "stateMutability": "view", @@ -509,17 +915,17 @@ { "inputs": [ { - "internalType": "address", - "name": "mechService", - "type": "address" + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" } ], - "name": "getMechServiceDeliveriesCount", + "name": "getRequestStatus", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "enum MechMarketplace.RequestStatus", + "name": "status", + "type": "uint8" } ], "stateMutability": "view", @@ -528,27 +934,34 @@ { "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_fee", + "type": "uint256" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "uint256", + "name": "_minResponseTimeout", + "type": "uint256" }, { "internalType": "uint256", - "name": "nonce", + "name": "_maxResponseTimeout", "type": "uint256" } ], - "name": "getRequestId", + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "karma", "outputs": [ { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], "stateMutability": "view", @@ -557,17 +970,17 @@ { "inputs": [ { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "getRequestStatus", + "name": "mapAgentMechFactories", "outputs": [ { - "internalType": "enum MechMarketplace.RequestStatus", - "name": "status", - "type": "uint8" + "internalType": "address", + "name": "", + "type": "address" } ], "stateMutability": "view", @@ -577,11 +990,11 @@ "inputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "getRequestsCount", + "name": "mapDeliveryCounts", "outputs": [ { "internalType": "uint256", @@ -593,15 +1006,21 @@ "type": "function" }, { - "inputs": [], - "name": "karmaProxy", - "outputs": [ + "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], + "name": "mapMechDeliveryCounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, @@ -613,12 +1032,12 @@ "type": "address" } ], - "name": "mapDeliveryCounts", + "name": "mapMechFactories", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -662,6 +1081,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "mapPaymentTypeBalanceTrackers", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -684,12 +1122,12 @@ { "inputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], - "name": "mapRequestIdDeliveries", + "name": "mapRequestIdInfos", "outputs": [ { "internalType": "address", @@ -707,9 +1145,38 @@ "type": "address" }, { - "internalType": "uint32", + "internalType": "uint256", "name": "responseTimeout", - "type": "uint32" + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deliveryRate", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "paymentType", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "mapServiceIdMech", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" } ], "stateMutability": "view", @@ -741,6 +1208,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "numMechs", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "numTotalRequests", @@ -767,50 +1247,82 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { "internalType": "bytes", - "name": "data", + "name": "requestData", "type": "bytes" }, { - "internalType": "address", - "name": "priorityMech", - "type": "address" - }, - { - "internalType": "address", - "name": "priorityMechStakingInstance", - "type": "address" + "internalType": "uint256", + "name": "priorityMechServiceId", + "type": "uint256" }, { "internalType": "uint256", - "name": "priorityMechServiceId", + "name": "responseTimeout", "type": "uint256" }, { - "internalType": "address", - "name": "requesterStakingInstance", - "type": "address" + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" + } + ], + "name": "request", + "outputs": [ + { + "internalType": "bytes32", + "name": "requestId", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "requestDatas", + "type": "bytes[]" }, { "internalType": "uint256", - "name": "requesterServiceId", + "name": "priorityMechServiceId", "type": "uint256" }, { "internalType": "uint256", "name": "responseTimeout", "type": "uint256" + }, + { + "internalType": "bytes", + "name": "paymentData", + "type": "bytes" } ], - "name": "request", + "name": "requestBatch", "outputs": [ { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" + "internalType": "bytes32[]", + "name": "requestIds", + "type": "bytes32[]" } ], "stateMutability": "payable", @@ -818,7 +1330,7 @@ }, { "inputs": [], - "name": "stakingFactory", + "name": "serviceRegistry", "outputs": [ { "internalType": "address", @@ -828,10 +1340,46 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "mechFactories", + "type": "address[]" + }, + { + "internalType": "bool[]", + "name": "statuses", + "type": "bool[]" + } + ], + "name": "setMechFactoryStatuses", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "paymentTypes", + "type": "bytes32[]" + }, + { + "internalType": "address[]", + "name": "balanceTrackers", + "type": "address[]" + } + ], + "name": "setPaymentTypeBalanceTrackers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], - "bytecode": "0x", - "deployedBytecode": "0x", + "bytecode": "0x610100604052348015610010575f5ffd5b5060405161434a38038061434a83398101604081905261002f91610177565b6001600160a01b038216158061004c57506001600160a01b038116155b1561006a5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0380831660e052811660c0524660a052610089610094565b608052506101dd9050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff376b6313a0837eb351511248cfe7dcc1cd26c49b8e0a47e1eb369dd62c425db604051806040016040528060058152602001640312e312e360dc1b81525060405160200161010591906101a8565b60408051601f1981840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b80516001600160a01b0381168114610172575f5ffd5b919050565b5f5f60408385031215610188575f5ffd5b6101918361015c565b915061019f6020840161015c565b90509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e0516141026102485f395f81816107c30152611f6a01525f81816105c101528181610f930152818161121e01528181611b0d01528181611b970152612fdc01525f81816106f3015261270c01525f81816108f8015261274101526141025ff3fe6080604052600436106102aa575f3560e01c80638342d20e11610165578063d64bf8b0116100c6578063ed24911d1161007c578063f698da2511610062578063f698da25146108e7578063f9bddb901461091a578063ffa1ad7414610939575f5ffd5b8063ed24911d146108a0578063f5dcb7bb146108b4575f5ffd5b8063ded81286116100ac578063ded8128614610843578063e0cb19e814610858578063e8eca22d1461086d575f5ffd5b8063d64bf8b014610810578063ddca3f431461082f575f5ffd5b8063af4937fc1161011b578063c69f6f9f11610101578063c69f6f9f14610771578063cbcf252a146107b2578063cbd6407a146107e5575f5ffd5b8063af4937fc14610747578063bdf863171461075c575f5ffd5b80639a8a05921161014b5780639a8a0592146106e2578063a1b4169314610715578063a6f9dae114610728575f5ffd5b80638342d20e146106025780638da5cb5b146106b6575f5ffd5b806328c320411161020f5780634ada3e61116101c557806357c0762d116101ab57806357c0762d1461059157806374a8569b146105b057806380d85911146105e3575f5ffd5b80634ada3e611461053b5780634eb07dd314610550575f5ffd5b806345d07664116101f557806345d07664146104d057806346fbcbb2146104fc578063480f17031461051b575f5ffd5b806328c320411461048657806343be9643146104a5575f5ffd5b8063176b8b01116102645780631bbbeeb81161024a5780631bbbeeb8146103d65780632394290e146104015780632685937b14610467575f5ffd5b8063176b8b011461038c57806317a68dd8146103b7575f5ffd5b806308c38b0c1161029457806308c38b0c1461030d5780630f41196a14610339578063139999141461034e575f5ffd5b8062427c54146102ae578063087f08d4146102ec575b5f5ffd5b3480156102b9575f5ffd5b506102d96102c83660046133d8565b60096020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156102f7575f5ffd5b5061030b610306366004613505565b61098e565b005b348015610318575f5ffd5b5061032c610327366004613734565b610ba8565b6040516102e391906137fe565b348015610344575f5ffd5b506102d960015481565b348015610359575f5ffd5b5061037c6103683660046133d8565b600d6020525f908152604090205460ff1681565b60405190151581526020016102e3565b348015610397575f5ffd5b506102d96103a63660046133d8565b600a6020525f908152604090205481565b3480156103c2575f5ffd5b5061030b6103d13660046133d8565b6113a9565b3480156103e1575f5ffd5b506102d96103f03660046133d8565b60086020525f908152604090205481565b34801561040c575f5ffd5b5061044261041b366004613810565b60116020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e3565b348015610472575f5ffd5b506104426104813660046133d8565b6114d0565b348015610491575f5ffd5b5061030b6104a0366004613827565b61167a565b3480156104b0575f5ffd5b506102d96104bf3660046133d8565b600b6020525f908152604090205481565b3480156104db575f5ffd5b506104ef6104ea366004613810565b611def565b6040516102e39190613919565b348015610507575f5ffd5b50610442610516366004613958565b611eaa565b61052e6105293660046139a3565b6120ea565b6040516102e39190613a4a565b348015610546575f5ffd5b506102d960045481565b34801561055b575f5ffd5b5061044261056a366004613810565b600f6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561059c575f5ffd5b5061030b6105ab366004613a5c565b612147565b3480156105bb575f5ffd5b506104427f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ee575f5ffd5b5061030b6105fd366004613a5c565b61220b565b34801561060d575f5ffd5b5061066b61061c366004613810565b600c6020525f908152604090208054600182015460028301546003840154600485015460059095015473ffffffffffffffffffffffffffffffffffffffff948516959385169490921692909186565b6040805173ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015293909516928401929092526060830152608082015260a081019190915260c0016102e3565b3480156106c1575f5ffd5b506007546104429073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106ed575f5ffd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b6102d9610723366004613a85565b61229a565b348015610733575f5ffd5b5061030b6107423660046133d8565b612385565b348015610752575f5ffd5b506102d961271081565b348015610767575f5ffd5b506102d960035481565b34801561077c575f5ffd5b5061044261078b3660046133d8565b600e6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156107bd575f5ffd5b506104427f000000000000000000000000000000000000000000000000000000000000000081565b3480156107f0575f5ffd5b506102d96107ff3660046133d8565b60106020525f908152604090205481565b34801561081b575f5ffd5b5061030b61082a366004613aba565b6124b3565b34801561083a575f5ffd5b506102d95f5481565b34801561084e575f5ffd5b506102d960025481565b348015610863575f5ffd5b506102d960055481565b348015610878575f5ffd5b506102d97fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81565b3480156108ab575f5ffd5b506102d9612709565b3480156108bf575f5ffd5b506102d97f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b3480156108f2575f5ffd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b348015610925575f5ffd5b506102d9610934366004613b1f565b612763565b348015610944575f5ffd5b506109816040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e39190613bc7565b60075473ffffffffffffffffffffffffffffffffffffffff163314610a06576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b8051825114610a4e57815181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109fd565b5f5b8251811015610b6a575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610a8257610a82613bd9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610ad7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818181518110610ae957610ae9613bd9565b6020026020010151600d5f858481518110610b0657610b06613bd9565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610a50565b507f8cc6be981009d13170c616af494b7d671ed2d84b7e6891e4c8f21fe065c00dfc8282604051610b9c929190613c4c565b60405180910390a15050565b6060600654600203610be6576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065583511580610bfb57508251845114155b80610c0857508151845114155b15610c56578351835183516040517fd097c4da0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016109fd565b5f610c60336114d0565b85519091505f908067ffffffffffffffff811115610c8057610c806133f3565b604051908082528060200260200182016040528015610ca9578160200160208202803683370190505b5093505f8167ffffffffffffffff811115610cc657610cc66133f3565b604051908082528060200260200182016040528015610cef578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610d0c57610d0c6133f3565b604051908082528060200260200182016040528015610d35578160200160208202803683370190505b5090505f3373ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610d83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da79190613c79565b90505f5b84811015611170575f600c5f8d8481518110610dc957610dc9613bd9565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff1680610e34576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83826005015414610e74576040517f7fec71d7000000000000000000000000000000000000000000000000000000008152600481018590526024016109fd565b600182015473ffffffffffffffffffffffffffffffffffffffff1615610e9b575050611168565b8160040154858481518110610eb257610eb2613bd9565b602002602001018181525050848381518110610ed057610ed0613bd9565b60200260200101518c8481518110610eea57610eea613bd9565b60200260200101511115610eff575050611168565b73ffffffffffffffffffffffffffffffffffffffff81163314611030578160030154421115610fef576040517f4225d37a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301527f00000000000000000000000000000000000000000000000000000000000000001690634225d37a906044015f604051808303815f87803b158015610fd4575f5ffd5b505af1158015610fe6573d5f5f3e3d5ffd5b50505050611030565b60038201546040517f177d0c7900000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016109fd565b6001820180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556002820154865173ffffffffffffffffffffffffffffffffffffffff919091169087908590811061108f5761108f613bd9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060095f8785815181106110de576110de613bd9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061112f90613cbd565b919050555060018a848151811061114857611148613bd9565b911515602092830291909101909101528761116281613cbd565b98505050505b600101610dab565b50841561132e578460035f8282546111889190613cf4565b9091555050335f908152600a6020526040812080548792906111ab908490613d0d565b909155505073ffffffffffffffffffffffffffffffffffffffff86165f908152600b6020526040812080548792906111e4908490613d0d565b90915550506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634225d37a906044015f604051808303815f87803b158015611274575f5ffd5b505af1158015611286573d5f5f3e3d5ffd5b505050505f600f5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166379e4afe833868b8e886040518663ffffffff1660e01b81526004016112ff959493929190613d20565b5f604051808303815f87803b158015611316575f5ffd5b505af1158015611328573d5f5f3e3d5ffd5b50505050505b8260405161133c9190613d94565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f894bb814a80f77e14febccf552394d95b38cc21a6dda1b0cf26434433fdf3e4c878d8b60405161138e93929190613ddf565b60405180910390a35050600160065550929695505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff16331461141c576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044016109fd565b73ffffffffffffffffffffffffffffffffffffffff8116611469576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81905560405173ffffffffffffffffffffffffffffffffffffffff8216907f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03905f90a250565b5f73ffffffffffffffffffffffffffffffffffffffff821661151e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff166317d70f7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611568573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061158c9190613c79565b5f8181526011602052604090205490915073ffffffffffffffffffffffffffffffffffffffff848116911614611606576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016109fd565b8273ffffffffffffffffffffffffffffffffffffffff1663e7f43c686040518163ffffffff1660e01b8152600401602060405180830381865afa15801561164f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116739190613e13565b9392505050565b6006546002036116b6576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600655845115806116cb57508351855114155b806116d857508251855114155b806116e557508151855114155b1561173a5784518451845184516040517f884b5d0600000000000000000000000000000000000000000000000000000000815260048101949094526024840192909252604483015260648201526084016109fd565b5f611744336114d0565b86519091505f8167ffffffffffffffff811115611763576117636133f3565b60405190808252806020026020018201604052801561178c578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff8a165f908152601060205260408120549192505b83811015611a24576117fc8b8b83815181106117d4576117d4613bd9565b60200260200101518984815181106117ee576117ee613bd9565b602002602001015185612763565b83828151811061180e5761180e613bd9565b6020026020010181815250506118578b84838151811061183057611830613bd9565b60200260200101518b848151811061184a5761184a613bd9565b60200260200101516127fd565b5f600c5f85848151811061186d5761186d613bd9565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff16156118f5578382815181106118b8576118b8613bd9565b60200260200101516040517fec0db6980000000000000000000000000000000000000000000000000000000081526004016109fd91815260200190565b8054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216811783556001830180548316909117905560028201805490911673ffffffffffffffffffffffffffffffffffffffff8e16179055875188908390811061196457611964613bd9565b60200260200101518160040181905550828061197f90613cbd565b9350508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb26bbe1b5d72196ae18b7198ae5effbeafd5c75782ac31c6b8445c71f385f49b8685815181106119e3576119e3613bd9565b60200260200101518c86815181106119fd576119fd613bd9565b6020026020010151604051611a13929190613e2e565b60405180910390a3506001016117b6565b5073ffffffffffffffffffffffffffffffffffffffff8a165f90815260106020908152604080832084905560099091528120805491611a6283613cbd565b9091555050335f908152600a60205260408120805491611a8183613cbd565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f908152600b60205260408120805491611ab683613cbd565b90915550506040517f55e7d04400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152336024830152604482018590527f000000000000000000000000000000000000000000000000000000000000000016906355e7d044906064015f604051808303815f87803b158015611b4e575f5ffd5b505af1158015611b60573d5f5f3e3d5ffd5b50506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169250634225d37a91506044015f604051808303815f87803b158015611bef575f5ffd5b505af1158015611c01573d5f5f3e3d5ffd5b505050505f600f5f3373ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611c53573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c779190613c79565b8152602081019190915260409081015f205490517f6072dd2c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911691508190636072dd2c90611ce49033908f908c908c90600401613e4e565b5f604051808303815f87803b158015611cfb575f5ffd5b505af1158015611d0d573d5f5f3e3d5ffd5b50506040517f9680b60300000000000000000000000000000000000000000000000000000000815260048101879052339250639680b60391506024015f604051808303815f87803b158015611d60575f5ffd5b505af1158015611d72573d5f5f3e3d5ffd5b505050508a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff980d83e9456535b0f9f3634d171df2a5f052f5d5e706b75d30c4e0433da927d8686604051611dd5929190613eb5565b60405180910390a350506001600655505050505050505050565b5f818152600c60209081526040808320815160c081018352815473ffffffffffffffffffffffffffffffffffffffff90811680835260018401548216958301959095526002830154169281019290925260038101546060830152600481015460808301526005015460a08201529015611ea457602081015173ffffffffffffffffffffffffffffffffffffffff16611e9f578060600151421115611e965760029150611ea4565b60019150611ea4565b600391505b50919050565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600d602052604081205460ff16611f20576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016109fd565b6040517f0f7fb56d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690630f7fb56d90611f96907f00000000000000000000000000000000000000000000000000000000000000009088908790600401613ecd565b6020604051808303815f875af1158015611fb2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd69190613e13565b905073ffffffffffffffffffffffffffffffffffffffff8116612025576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8082165f818152600e6020908152604080832080549589167fffffffffffffffffffffffff0000000000000000000000000000000000000000968716179055888352601190915281208054909316909117909155600580549161209c83613cbd565b9091555050604051849073ffffffffffffffffffffffffffffffffffffffff8316907f0dab9459b2f129b692750bed5cc716b07a2fb19ba9fe0a0dc378428a62040367905f90a39392505050565b6060600654600203612128576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065561213985858585612ab4565b600160065595945050505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146121ba576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044016109fd565b6121c5838383613181565b60408051848152602081018490529081018290527f64d0972bd5d0c2828d80911b61084d86d61214c3081656ca3a720047a88320359060600160405180910390a1505050565b60075473ffffffffffffffffffffffffffffffffffffffff161561225b576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612266838383613181565b5050600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055506001600655565b5f6006546002036122d7576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026006556040805160018082528183019092525f91816020015b60608152602001906001900390816122f25750506040805160018082528183019092529192505f91906020808301908036833701905050905086825f8151811061233e5761233e613bd9565b602002602001018190525061235582878787612ab4565b9050805f8151811061236957612369613bd9565b6020026020010151925060016006819055505050949350505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146123f8576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044016109fd565b73ffffffffffffffffffffffffffffffffffffffff8116612445576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b905f90a250565b60075473ffffffffffffffffffffffffffffffffffffffff163314612526576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044016109fd565b805182511461256e57815181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109fd565b5f5b82518110156126d75782818151811061258b5761258b613bd9565b60200260200101515f5f1b036125cd576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168282815181106125f6576125f6613bd9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361264b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81818151811061265d5761265d613bd9565b6020026020010151600f5f85848151811061267a5761267a613bd9565b602002602001015181526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001019050612570565b507fa9759667b17e564f26a0d91ce1c5e4a1dc3910aee992dc3f5f4da0a59d48f3cb8282604051610b9c929190613f01565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461273e576127396132a6565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f61276c612709565b3086868686604051602001612785959493929190613f25565b604051602081830303815290604052805190602001206040516020016127dd9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050949350505050565b73ffffffffffffffffffffffffffffffffffffffff831661284a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83163b15612960576040517f1626ba7e000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff851690631626ba7e906128bd9086908690600401613e2e565b602060405180830381865afa1580156128d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128fc9190613f83565b7fffffffff00000000000000000000000000000000000000000000000000000000160361292857505050565b8282826040517f02d51bb20000000000000000000000000000000000000000000000000000000081526004016109fd93929190613ecd565b80516041146129a25780516040517f1d9f5a5f0000000000000000000000000000000000000000000000000000000081526109fd918391604190600401613fc2565b5f816040815181106129b6576129b6613bd9565b016020015160f81c905060048110156129d7576129d4601b82613fe6565b90505b60208281015160408085015181515f80825294810180845288905260ff861692810192909252606082018390526080820181905291929060019060a0016020604051602081039080840390855afa158015612a34573d5f5f3e3d5ffd5b5050506020604051035190508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612aab578686866040517f02d51bb20000000000000000000000000000000000000000000000000000000081526004016109fd93929190613ecd565b50505050505050565b606063ffffffff612ac54285613d0d565b1115612b1557612ad54284613d0d565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915263ffffffff60248201526044016109fd565b600154831080612b26575060025483115b15612b73576001546002546040517feb373cfe00000000000000000000000000000000000000000000000000000000815260048101869052602481019290925260448201526064016109fd565b84515f819003612baf576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8581526011602052604090205473ffffffffffffffffffffffffffffffffffffffff1680612c0a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8167ffffffffffffffff811115612c2357612c236133f3565b604051908082528060200260200182016040528015612c4c578160200160208202803683370190505b5092505f8173ffffffffffffffffffffffffffffffffffffffff16632cc0fcb26040518163ffffffff1660e01b81526004016020604051808303815f875af1158015612c9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cbe9190613c79565b90505f8273ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015612d0b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2f9190613c79565b335f908152601060205260408120549192505b8a51811015612ee2578a8181518110612d5d57612d5d613bd9565b6020026020010151515f03612d9e576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dc3338c8381518110612db457612db4613bd9565b60200260200101518685612763565b878281518110612dd557612dd5613bd9565b6020026020010181815250505f600c5f898481518110612df757612df7613bd9565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff1615612e42578782815181106118b8576118b8613bd9565b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716178155612e8a428b613d0d565b60038201556002810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055600481018590556005810184905582612ed381613cbd565b93505050806001019050612d42565b50335f818152601060209081526040808320859055858352600f909152908190205490517f38603a3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169182916338603a39913491612f5f91908b908a908f90600401613fff565b5f604051808303818588803b158015612f76575f5ffd5b505af1158015612f88573d5f5f3e3d5ffd5b50506040517f55e7d04400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8981166024830152604482018b90527f00000000000000000000000000000000000000000000000000000000000000001693506355e7d044925060640190505f604051808303815f87803b158015613021575f5ffd5b505af1158015613033573d5f5f3e3d5ffd5b5050335f90815260086020526040812080548a9450909250613056908490613d0d565b925050819055508560035f82825461306e9190613d0d565b925050819055508560045f8282546130869190613d0d565b90915550506040517fbe2641de00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063be2641de906130df908a908f90600401614039565b5f604051808303815f87803b1580156130f6575f5ffd5b505af1158015613108573d5f5f3e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f5d60556939d4ab71b3129033c865bf7e828306916fd94fd35019d3d530eb36b3888a60405161316b929190613eb5565b60405180910390a3505050505050949350505050565b81158061318c575080155b156131c3576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271083111561320a576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810184905261271060248201526044016109fd565b8082111561324e576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016109fd565b63ffffffff811115613299576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff60248201526044016109fd565b5f92909255600155600255565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff376b6313a0837eb351511248cfe7dcc1cd26c49b8e0a47e1eb369dd62c425db6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525060405160200161332f9190613bc7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff811681146133c5575f5ffd5b50565b80356133d3816133a4565b919050565b5f602082840312156133e8575f5ffd5b8135611673816133a4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613467576134676133f3565b604052919050565b5f67ffffffffffffffff821115613488576134886133f3565b5060051b60200190565b5f82601f8301126134a1575f5ffd5b81356134b46134af8261346f565b613420565b8082825260208201915060208360051b8601019250858311156134d5575f5ffd5b602085015b838110156134fb5780356134ed816133a4565b8352602092830192016134da565b5095945050505050565b5f5f60408385031215613516575f5ffd5b823567ffffffffffffffff81111561352c575f5ffd5b61353885828601613492565b925050602083013567ffffffffffffffff811115613554575f5ffd5b8301601f81018513613564575f5ffd5b80356135726134af8261346f565b8082825260208201915060208360051b850101925087831115613593575f5ffd5b6020840193505b828410156135c257833580151581146135b1575f5ffd5b82526020938401939091019061359a565b809450505050509250929050565b5f82601f8301126135df575f5ffd5b81356135ed6134af8261346f565b8082825260208201915060208360051b86010192508583111561360e575f5ffd5b602085015b838110156134fb578035835260209283019201613613565b5f82601f83011261363a575f5ffd5b813567ffffffffffffffff811115613654576136546133f3565b61368560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613420565b818152846020838601011115613699575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126136c4575f5ffd5b81356136d26134af8261346f565b8082825260208201915060208360051b8601019250858311156136f3575f5ffd5b602085015b838110156134fb57803567ffffffffffffffff811115613716575f5ffd5b613725886020838a010161362b565b845250602092830192016136f8565b5f5f5f60608486031215613746575f5ffd5b833567ffffffffffffffff81111561375c575f5ffd5b613768868287016135d0565b935050602084013567ffffffffffffffff811115613784575f5ffd5b613790868287016135d0565b925050604084013567ffffffffffffffff8111156137ac575f5ffd5b6137b8868287016136b5565b9150509250925092565b5f8151808452602084019350602083015f5b828110156137f457815115158652602095860195909101906001016137d4565b5093949350505050565b602081525f61167360208301846137c2565b5f60208284031215613820575f5ffd5b5035919050565b5f5f5f5f5f5f60c0878903121561383c575f5ffd5b613845876133c8565b9550602087013567ffffffffffffffff811115613860575f5ffd5b61386c89828a016136b5565b955050604087013567ffffffffffffffff811115613888575f5ffd5b61389489828a016136b5565b945050606087013567ffffffffffffffff8111156138b0575f5ffd5b6138bc89828a016136b5565b935050608087013567ffffffffffffffff8111156138d8575f5ffd5b6138e489828a016135d0565b92505060a087013567ffffffffffffffff811115613900575f5ffd5b61390c89828a0161362b565b9150509295509295509295565b6020810160048310613952577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f5f5f6060848603121561396a575f5ffd5b83359250602084013561397c816133a4565b9150604084013567ffffffffffffffff811115613997575f5ffd5b6137b88682870161362b565b5f5f5f5f608085870312156139b6575f5ffd5b843567ffffffffffffffff8111156139cc575f5ffd5b6139d8878288016136b5565b9450506020850135925060408501359150606085013567ffffffffffffffff811115613a02575f5ffd5b613a0e8782880161362b565b91505092959194509250565b5f8151808452602084019350602083015f5b828110156137f4578151865260209586019590910190600101613a2c565b602081525f6116736020830184613a1a565b5f5f5f60608486031215613a6e575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f60808587031215613a98575f5ffd5b843567ffffffffffffffff811115613aae575f5ffd5b6139d88782880161362b565b5f5f60408385031215613acb575f5ffd5b823567ffffffffffffffff811115613ae1575f5ffd5b613aed858286016135d0565b925050602083013567ffffffffffffffff811115613b09575f5ffd5b613b1585828601613492565b9150509250929050565b5f5f5f5f60808587031215613b32575f5ffd5b8435613b3d816133a4565b9350602085013567ffffffffffffffff811115613b58575f5ffd5b613b648782880161362b565b949794965050505060408301359260600135919050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6116736020830184613b7b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151808452602084019350602083015f5b828110156137f457815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101613c18565b604081525f613c5e6040830185613c06565b8281036020840152613c7081856137c2565b95945050505050565b5f60208284031215613c89575f5ffd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ced57613ced613c90565b5060010190565b81810381811115613d0757613d07613c90565b92915050565b80820180821115613d0757613d07613c90565b73ffffffffffffffffffffffffffffffffffffffff8616815260a060208201525f613d4e60a0830187613c06565b8281036040840152613d6081876137c2565b90508281036060840152613d748186613a1a565b90508281036080840152613d888185613a1a565b98975050505050505050565b81515f90829060208501835b82811015613dd457815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101613da0565b509195945050505050565b838152606060208201525f613df76060830185613a1a565b8281036040840152613e0981856137c2565b9695505050505050565b5f60208284031215613e23575f5ffd5b8151611673816133a4565b828152604060208201525f613e466040830184613b7b565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152608060408201525f613e986080830185613a1a565b8281036060840152613eaa8185613b7b565b979650505050505050565b828152604060208201525f613e466040830184613a1a565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f613c706060830184613b7b565b604081525f613f136040830185613a1a565b8281036020840152613c708185613c06565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015260a060408201525f613f6f60a0830186613b7b565b606083019490945250608001529392505050565b5f60208284031215613f93575f5ffd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114611673575f5ffd5b606081525f613fd46060830186613b7b565b60208301949094525060400152919050565b60ff8181168382160190811115613d0757613d07613c90565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152826040820152608060608201525f613e096080830184613b7b565b604081525f61404b6040830185613a1a565b828103602084015280845180835260208301915060208160051b840101602087015f5b838110156140be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526140a8838351613b7b565b602095860195909350919091019060010161406e565b50909897505050505050505056fea2646970667358221220cb873648a5a9404d58b97b6839202c8425eb3389d2d261b5a6d804c00317f49e64736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106102aa575f3560e01c80638342d20e11610165578063d64bf8b0116100c6578063ed24911d1161007c578063f698da2511610062578063f698da25146108e7578063f9bddb901461091a578063ffa1ad7414610939575f5ffd5b8063ed24911d146108a0578063f5dcb7bb146108b4575f5ffd5b8063ded81286116100ac578063ded8128614610843578063e0cb19e814610858578063e8eca22d1461086d575f5ffd5b8063d64bf8b014610810578063ddca3f431461082f575f5ffd5b8063af4937fc1161011b578063c69f6f9f11610101578063c69f6f9f14610771578063cbcf252a146107b2578063cbd6407a146107e5575f5ffd5b8063af4937fc14610747578063bdf863171461075c575f5ffd5b80639a8a05921161014b5780639a8a0592146106e2578063a1b4169314610715578063a6f9dae114610728575f5ffd5b80638342d20e146106025780638da5cb5b146106b6575f5ffd5b806328c320411161020f5780634ada3e61116101c557806357c0762d116101ab57806357c0762d1461059157806374a8569b146105b057806380d85911146105e3575f5ffd5b80634ada3e611461053b5780634eb07dd314610550575f5ffd5b806345d07664116101f557806345d07664146104d057806346fbcbb2146104fc578063480f17031461051b575f5ffd5b806328c320411461048657806343be9643146104a5575f5ffd5b8063176b8b01116102645780631bbbeeb81161024a5780631bbbeeb8146103d65780632394290e146104015780632685937b14610467575f5ffd5b8063176b8b011461038c57806317a68dd8146103b7575f5ffd5b806308c38b0c1161029457806308c38b0c1461030d5780630f41196a14610339578063139999141461034e575f5ffd5b8062427c54146102ae578063087f08d4146102ec575b5f5ffd5b3480156102b9575f5ffd5b506102d96102c83660046133d8565b60096020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156102f7575f5ffd5b5061030b610306366004613505565b61098e565b005b348015610318575f5ffd5b5061032c610327366004613734565b610ba8565b6040516102e391906137fe565b348015610344575f5ffd5b506102d960015481565b348015610359575f5ffd5b5061037c6103683660046133d8565b600d6020525f908152604090205460ff1681565b60405190151581526020016102e3565b348015610397575f5ffd5b506102d96103a63660046133d8565b600a6020525f908152604090205481565b3480156103c2575f5ffd5b5061030b6103d13660046133d8565b6113a9565b3480156103e1575f5ffd5b506102d96103f03660046133d8565b60086020525f908152604090205481565b34801561040c575f5ffd5b5061044261041b366004613810565b60116020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e3565b348015610472575f5ffd5b506104426104813660046133d8565b6114d0565b348015610491575f5ffd5b5061030b6104a0366004613827565b61167a565b3480156104b0575f5ffd5b506102d96104bf3660046133d8565b600b6020525f908152604090205481565b3480156104db575f5ffd5b506104ef6104ea366004613810565b611def565b6040516102e39190613919565b348015610507575f5ffd5b50610442610516366004613958565b611eaa565b61052e6105293660046139a3565b6120ea565b6040516102e39190613a4a565b348015610546575f5ffd5b506102d960045481565b34801561055b575f5ffd5b5061044261056a366004613810565b600f6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561059c575f5ffd5b5061030b6105ab366004613a5c565b612147565b3480156105bb575f5ffd5b506104427f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ee575f5ffd5b5061030b6105fd366004613a5c565b61220b565b34801561060d575f5ffd5b5061066b61061c366004613810565b600c6020525f908152604090208054600182015460028301546003840154600485015460059095015473ffffffffffffffffffffffffffffffffffffffff948516959385169490921692909186565b6040805173ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015293909516928401929092526060830152608082015260a081019190915260c0016102e3565b3480156106c1575f5ffd5b506007546104429073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106ed575f5ffd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b6102d9610723366004613a85565b61229a565b348015610733575f5ffd5b5061030b6107423660046133d8565b612385565b348015610752575f5ffd5b506102d961271081565b348015610767575f5ffd5b506102d960035481565b34801561077c575f5ffd5b5061044261078b3660046133d8565b600e6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156107bd575f5ffd5b506104427f000000000000000000000000000000000000000000000000000000000000000081565b3480156107f0575f5ffd5b506102d96107ff3660046133d8565b60106020525f908152604090205481565b34801561081b575f5ffd5b5061030b61082a366004613aba565b6124b3565b34801561083a575f5ffd5b506102d95f5481565b34801561084e575f5ffd5b506102d960025481565b348015610863575f5ffd5b506102d960055481565b348015610878575f5ffd5b506102d97fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81565b3480156108ab575f5ffd5b506102d9612709565b3480156108bf575f5ffd5b506102d97f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b3480156108f2575f5ffd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b348015610925575f5ffd5b506102d9610934366004613b1f565b612763565b348015610944575f5ffd5b506109816040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e39190613bc7565b60075473ffffffffffffffffffffffffffffffffffffffff163314610a06576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b8051825114610a4e57815181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109fd565b5f5b8251811015610b6a575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610a8257610a82613bd9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610ad7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818181518110610ae957610ae9613bd9565b6020026020010151600d5f858481518110610b0657610b06613bd9565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610a50565b507f8cc6be981009d13170c616af494b7d671ed2d84b7e6891e4c8f21fe065c00dfc8282604051610b9c929190613c4c565b60405180910390a15050565b6060600654600203610be6576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065583511580610bfb57508251845114155b80610c0857508151845114155b15610c56578351835183516040517fd097c4da0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016109fd565b5f610c60336114d0565b85519091505f908067ffffffffffffffff811115610c8057610c806133f3565b604051908082528060200260200182016040528015610ca9578160200160208202803683370190505b5093505f8167ffffffffffffffff811115610cc657610cc66133f3565b604051908082528060200260200182016040528015610cef578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610d0c57610d0c6133f3565b604051908082528060200260200182016040528015610d35578160200160208202803683370190505b5090505f3373ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610d83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da79190613c79565b90505f5b84811015611170575f600c5f8d8481518110610dc957610dc9613bd9565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff1680610e34576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83826005015414610e74576040517f7fec71d7000000000000000000000000000000000000000000000000000000008152600481018590526024016109fd565b600182015473ffffffffffffffffffffffffffffffffffffffff1615610e9b575050611168565b8160040154858481518110610eb257610eb2613bd9565b602002602001018181525050848381518110610ed057610ed0613bd9565b60200260200101518c8481518110610eea57610eea613bd9565b60200260200101511115610eff575050611168565b73ffffffffffffffffffffffffffffffffffffffff81163314611030578160030154421115610fef576040517f4225d37a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301527f00000000000000000000000000000000000000000000000000000000000000001690634225d37a906044015f604051808303815f87803b158015610fd4575f5ffd5b505af1158015610fe6573d5f5f3e3d5ffd5b50505050611030565b60038201546040517f177d0c7900000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016109fd565b6001820180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556002820154865173ffffffffffffffffffffffffffffffffffffffff919091169087908590811061108f5761108f613bd9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060095f8785815181106110de576110de613bd9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061112f90613cbd565b919050555060018a848151811061114857611148613bd9565b911515602092830291909101909101528761116281613cbd565b98505050505b600101610dab565b50841561132e578460035f8282546111889190613cf4565b9091555050335f908152600a6020526040812080548792906111ab908490613d0d565b909155505073ffffffffffffffffffffffffffffffffffffffff86165f908152600b6020526040812080548792906111e4908490613d0d565b90915550506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634225d37a906044015f604051808303815f87803b158015611274575f5ffd5b505af1158015611286573d5f5f3e3d5ffd5b505050505f600f5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166379e4afe833868b8e886040518663ffffffff1660e01b81526004016112ff959493929190613d20565b5f604051808303815f87803b158015611316575f5ffd5b505af1158015611328573d5f5f3e3d5ffd5b50505050505b8260405161133c9190613d94565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f894bb814a80f77e14febccf552394d95b38cc21a6dda1b0cf26434433fdf3e4c878d8b60405161138e93929190613ddf565b60405180910390a35050600160065550929695505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff16331461141c576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044016109fd565b73ffffffffffffffffffffffffffffffffffffffff8116611469576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe6194b93a7bff0a54130ed8cd277223408a77f3e48bb5104a9db96d334f962ca81905560405173ffffffffffffffffffffffffffffffffffffffff8216907f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03905f90a250565b5f73ffffffffffffffffffffffffffffffffffffffff821661151e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff166317d70f7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611568573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061158c9190613c79565b5f8181526011602052604090205490915073ffffffffffffffffffffffffffffffffffffffff848116911614611606576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016109fd565b8273ffffffffffffffffffffffffffffffffffffffff1663e7f43c686040518163ffffffff1660e01b8152600401602060405180830381865afa15801561164f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116739190613e13565b9392505050565b6006546002036116b6576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600655845115806116cb57508351855114155b806116d857508251855114155b806116e557508151855114155b1561173a5784518451845184516040517f884b5d0600000000000000000000000000000000000000000000000000000000815260048101949094526024840192909252604483015260648201526084016109fd565b5f611744336114d0565b86519091505f8167ffffffffffffffff811115611763576117636133f3565b60405190808252806020026020018201604052801561178c578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff8a165f908152601060205260408120549192505b83811015611a24576117fc8b8b83815181106117d4576117d4613bd9565b60200260200101518984815181106117ee576117ee613bd9565b602002602001015185612763565b83828151811061180e5761180e613bd9565b6020026020010181815250506118578b84838151811061183057611830613bd9565b60200260200101518b848151811061184a5761184a613bd9565b60200260200101516127fd565b5f600c5f85848151811061186d5761186d613bd9565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff16156118f5578382815181106118b8576118b8613bd9565b60200260200101516040517fec0db6980000000000000000000000000000000000000000000000000000000081526004016109fd91815260200190565b8054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216811783556001830180548316909117905560028201805490911673ffffffffffffffffffffffffffffffffffffffff8e16179055875188908390811061196457611964613bd9565b60200260200101518160040181905550828061197f90613cbd565b9350508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb26bbe1b5d72196ae18b7198ae5effbeafd5c75782ac31c6b8445c71f385f49b8685815181106119e3576119e3613bd9565b60200260200101518c86815181106119fd576119fd613bd9565b6020026020010151604051611a13929190613e2e565b60405180910390a3506001016117b6565b5073ffffffffffffffffffffffffffffffffffffffff8a165f90815260106020908152604080832084905560099091528120805491611a6283613cbd565b9091555050335f908152600a60205260408120805491611a8183613cbd565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f908152600b60205260408120805491611ab683613cbd565b90915550506040517f55e7d04400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152336024830152604482018590527f000000000000000000000000000000000000000000000000000000000000000016906355e7d044906064015f604051808303815f87803b158015611b4e575f5ffd5b505af1158015611b60573d5f5f3e3d5ffd5b50506040517f4225d37a000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169250634225d37a91506044015f604051808303815f87803b158015611bef575f5ffd5b505af1158015611c01573d5f5f3e3d5ffd5b505050505f600f5f3373ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611c53573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c779190613c79565b8152602081019190915260409081015f205490517f6072dd2c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911691508190636072dd2c90611ce49033908f908c908c90600401613e4e565b5f604051808303815f87803b158015611cfb575f5ffd5b505af1158015611d0d573d5f5f3e3d5ffd5b50506040517f9680b60300000000000000000000000000000000000000000000000000000000815260048101879052339250639680b60391506024015f604051808303815f87803b158015611d60575f5ffd5b505af1158015611d72573d5f5f3e3d5ffd5b505050508a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff980d83e9456535b0f9f3634d171df2a5f052f5d5e706b75d30c4e0433da927d8686604051611dd5929190613eb5565b60405180910390a350506001600655505050505050505050565b5f818152600c60209081526040808320815160c081018352815473ffffffffffffffffffffffffffffffffffffffff90811680835260018401548216958301959095526002830154169281019290925260038101546060830152600481015460808301526005015460a08201529015611ea457602081015173ffffffffffffffffffffffffffffffffffffffff16611e9f578060600151421115611e965760029150611ea4565b60019150611ea4565b600391505b50919050565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600d602052604081205460ff16611f20576040517f32b2baa300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016109fd565b6040517f0f7fb56d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690630f7fb56d90611f96907f00000000000000000000000000000000000000000000000000000000000000009088908790600401613ecd565b6020604051808303815f875af1158015611fb2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd69190613e13565b905073ffffffffffffffffffffffffffffffffffffffff8116612025576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8082165f818152600e6020908152604080832080549589167fffffffffffffffffffffffff0000000000000000000000000000000000000000968716179055888352601190915281208054909316909117909155600580549161209c83613cbd565b9091555050604051849073ffffffffffffffffffffffffffffffffffffffff8316907f0dab9459b2f129b692750bed5cc716b07a2fb19ba9fe0a0dc378428a62040367905f90a39392505050565b6060600654600203612128576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065561213985858585612ab4565b600160065595945050505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146121ba576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044016109fd565b6121c5838383613181565b60408051848152602081018490529081018290527f64d0972bd5d0c2828d80911b61084d86d61214c3081656ca3a720047a88320359060600160405180910390a1505050565b60075473ffffffffffffffffffffffffffffffffffffffff161561225b576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612266838383613181565b5050600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055506001600655565b5f6006546002036122d7576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026006556040805160018082528183019092525f91816020015b60608152602001906001900390816122f25750506040805160018082528183019092529192505f91906020808301908036833701905050905086825f8151811061233e5761233e613bd9565b602002602001018190525061235582878787612ab4565b9050805f8151811061236957612369613bd9565b6020026020010151925060016006819055505050949350505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146123f8576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044016109fd565b73ffffffffffffffffffffffffffffffffffffffff8116612445576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b905f90a250565b60075473ffffffffffffffffffffffffffffffffffffffff163314612526576007546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044016109fd565b805182511461256e57815181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109fd565b5f5b82518110156126d75782818151811061258b5761258b613bd9565b60200260200101515f5f1b036125cd576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168282815181106125f6576125f6613bd9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361264b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81818151811061265d5761265d613bd9565b6020026020010151600f5f85848151811061267a5761267a613bd9565b602002602001015181526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001019050612570565b507fa9759667b17e564f26a0d91ce1c5e4a1dc3910aee992dc3f5f4da0a59d48f3cb8282604051610b9c929190613f01565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461273e576127396132a6565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f61276c612709565b3086868686604051602001612785959493929190613f25565b604051602081830303815290604052805190602001206040516020016127dd9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050949350505050565b73ffffffffffffffffffffffffffffffffffffffff831661284a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83163b15612960576040517f1626ba7e000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff851690631626ba7e906128bd9086908690600401613e2e565b602060405180830381865afa1580156128d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128fc9190613f83565b7fffffffff00000000000000000000000000000000000000000000000000000000160361292857505050565b8282826040517f02d51bb20000000000000000000000000000000000000000000000000000000081526004016109fd93929190613ecd565b80516041146129a25780516040517f1d9f5a5f0000000000000000000000000000000000000000000000000000000081526109fd918391604190600401613fc2565b5f816040815181106129b6576129b6613bd9565b016020015160f81c905060048110156129d7576129d4601b82613fe6565b90505b60208281015160408085015181515f80825294810180845288905260ff861692810192909252606082018390526080820181905291929060019060a0016020604051602081039080840390855afa158015612a34573d5f5f3e3d5ffd5b5050506020604051035190508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612aab578686866040517f02d51bb20000000000000000000000000000000000000000000000000000000081526004016109fd93929190613ecd565b50505050505050565b606063ffffffff612ac54285613d0d565b1115612b1557612ad54284613d0d565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019190915263ffffffff60248201526044016109fd565b600154831080612b26575060025483115b15612b73576001546002546040517feb373cfe00000000000000000000000000000000000000000000000000000000815260048101869052602481019290925260448201526064016109fd565b84515f819003612baf576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8581526011602052604090205473ffffffffffffffffffffffffffffffffffffffff1680612c0a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8167ffffffffffffffff811115612c2357612c236133f3565b604051908082528060200260200182016040528015612c4c578160200160208202803683370190505b5092505f8173ffffffffffffffffffffffffffffffffffffffff16632cc0fcb26040518163ffffffff1660e01b81526004016020604051808303815f875af1158015612c9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cbe9190613c79565b90505f8273ffffffffffffffffffffffffffffffffffffffff16632763b8da6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015612d0b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2f9190613c79565b335f908152601060205260408120549192505b8a51811015612ee2578a8181518110612d5d57612d5d613bd9565b6020026020010151515f03612d9e576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dc3338c8381518110612db457612db4613bd9565b60200260200101518685612763565b878281518110612dd557612dd5613bd9565b6020026020010181815250505f600c5f898481518110612df757612df7613bd9565b60209081029190910181015182528101919091526040015f20805490915073ffffffffffffffffffffffffffffffffffffffff1615612e42578782815181106118b8576118b8613bd9565b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716178155612e8a428b613d0d565b60038201556002810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055600481018590556005810184905582612ed381613cbd565b93505050806001019050612d42565b50335f818152601060209081526040808320859055858352600f909152908190205490517f38603a3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169182916338603a39913491612f5f91908b908a908f90600401613fff565b5f604051808303818588803b158015612f76575f5ffd5b505af1158015612f88573d5f5f3e3d5ffd5b50506040517f55e7d04400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8981166024830152604482018b90527f00000000000000000000000000000000000000000000000000000000000000001693506355e7d044925060640190505f604051808303815f87803b158015613021575f5ffd5b505af1158015613033573d5f5f3e3d5ffd5b5050335f90815260086020526040812080548a9450909250613056908490613d0d565b925050819055508560035f82825461306e9190613d0d565b925050819055508560045f8282546130869190613d0d565b90915550506040517fbe2641de00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063be2641de906130df908a908f90600401614039565b5f604051808303815f87803b1580156130f6575f5ffd5b505af1158015613108573d5f5f3e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f5d60556939d4ab71b3129033c865bf7e828306916fd94fd35019d3d530eb36b3888a60405161316b929190613eb5565b60405180910390a3505050505050949350505050565b81158061318c575080155b156131c3576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271083111561320a576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810184905261271060248201526044016109fd565b8082111561324e576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016109fd565b63ffffffff811115613299576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff60248201526044016109fd565b5f92909255600155600255565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff376b6313a0837eb351511248cfe7dcc1cd26c49b8e0a47e1eb369dd62c425db6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525060405160200161332f9190613bc7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff811681146133c5575f5ffd5b50565b80356133d3816133a4565b919050565b5f602082840312156133e8575f5ffd5b8135611673816133a4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613467576134676133f3565b604052919050565b5f67ffffffffffffffff821115613488576134886133f3565b5060051b60200190565b5f82601f8301126134a1575f5ffd5b81356134b46134af8261346f565b613420565b8082825260208201915060208360051b8601019250858311156134d5575f5ffd5b602085015b838110156134fb5780356134ed816133a4565b8352602092830192016134da565b5095945050505050565b5f5f60408385031215613516575f5ffd5b823567ffffffffffffffff81111561352c575f5ffd5b61353885828601613492565b925050602083013567ffffffffffffffff811115613554575f5ffd5b8301601f81018513613564575f5ffd5b80356135726134af8261346f565b8082825260208201915060208360051b850101925087831115613593575f5ffd5b6020840193505b828410156135c257833580151581146135b1575f5ffd5b82526020938401939091019061359a565b809450505050509250929050565b5f82601f8301126135df575f5ffd5b81356135ed6134af8261346f565b8082825260208201915060208360051b86010192508583111561360e575f5ffd5b602085015b838110156134fb578035835260209283019201613613565b5f82601f83011261363a575f5ffd5b813567ffffffffffffffff811115613654576136546133f3565b61368560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613420565b818152846020838601011115613699575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126136c4575f5ffd5b81356136d26134af8261346f565b8082825260208201915060208360051b8601019250858311156136f3575f5ffd5b602085015b838110156134fb57803567ffffffffffffffff811115613716575f5ffd5b613725886020838a010161362b565b845250602092830192016136f8565b5f5f5f60608486031215613746575f5ffd5b833567ffffffffffffffff81111561375c575f5ffd5b613768868287016135d0565b935050602084013567ffffffffffffffff811115613784575f5ffd5b613790868287016135d0565b925050604084013567ffffffffffffffff8111156137ac575f5ffd5b6137b8868287016136b5565b9150509250925092565b5f8151808452602084019350602083015f5b828110156137f457815115158652602095860195909101906001016137d4565b5093949350505050565b602081525f61167360208301846137c2565b5f60208284031215613820575f5ffd5b5035919050565b5f5f5f5f5f5f60c0878903121561383c575f5ffd5b613845876133c8565b9550602087013567ffffffffffffffff811115613860575f5ffd5b61386c89828a016136b5565b955050604087013567ffffffffffffffff811115613888575f5ffd5b61389489828a016136b5565b945050606087013567ffffffffffffffff8111156138b0575f5ffd5b6138bc89828a016136b5565b935050608087013567ffffffffffffffff8111156138d8575f5ffd5b6138e489828a016135d0565b92505060a087013567ffffffffffffffff811115613900575f5ffd5b61390c89828a0161362b565b9150509295509295509295565b6020810160048310613952577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f5f5f6060848603121561396a575f5ffd5b83359250602084013561397c816133a4565b9150604084013567ffffffffffffffff811115613997575f5ffd5b6137b88682870161362b565b5f5f5f5f608085870312156139b6575f5ffd5b843567ffffffffffffffff8111156139cc575f5ffd5b6139d8878288016136b5565b9450506020850135925060408501359150606085013567ffffffffffffffff811115613a02575f5ffd5b613a0e8782880161362b565b91505092959194509250565b5f8151808452602084019350602083015f5b828110156137f4578151865260209586019590910190600101613a2c565b602081525f6116736020830184613a1a565b5f5f5f60608486031215613a6e575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f60808587031215613a98575f5ffd5b843567ffffffffffffffff811115613aae575f5ffd5b6139d88782880161362b565b5f5f60408385031215613acb575f5ffd5b823567ffffffffffffffff811115613ae1575f5ffd5b613aed858286016135d0565b925050602083013567ffffffffffffffff811115613b09575f5ffd5b613b1585828601613492565b9150509250929050565b5f5f5f5f60808587031215613b32575f5ffd5b8435613b3d816133a4565b9350602085013567ffffffffffffffff811115613b58575f5ffd5b613b648782880161362b565b949794965050505060408301359260600135919050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6116736020830184613b7b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151808452602084019350602083015f5b828110156137f457815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101613c18565b604081525f613c5e6040830185613c06565b8281036020840152613c7081856137c2565b95945050505050565b5f60208284031215613c89575f5ffd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ced57613ced613c90565b5060010190565b81810381811115613d0757613d07613c90565b92915050565b80820180821115613d0757613d07613c90565b73ffffffffffffffffffffffffffffffffffffffff8616815260a060208201525f613d4e60a0830187613c06565b8281036040840152613d6081876137c2565b90508281036060840152613d748186613a1a565b90508281036080840152613d888185613a1a565b98975050505050505050565b81515f90829060208501835b82811015613dd457815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101613da0565b509195945050505050565b838152606060208201525f613df76060830185613a1a565b8281036040840152613e0981856137c2565b9695505050505050565b5f60208284031215613e23575f5ffd5b8151611673816133a4565b828152604060208201525f613e466040830184613b7b565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152608060408201525f613e986080830185613a1a565b8281036060840152613eaa8185613b7b565b979650505050505050565b828152604060208201525f613e466040830184613a1a565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f613c706060830184613b7b565b604081525f613f136040830185613a1a565b8281036020840152613c708185613c06565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015260a060408201525f613f6f60a0830186613b7b565b606083019490945250608001529392505050565b5f60208284031215613f93575f5ffd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114611673575f5ffd5b606081525f613fd46060830186613b7b565b60208301949094525060400152919050565b60ff8181168382160190811115613d0757613d07613c90565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152826040820152608060608201525f613e096080830184613b7b565b604081525f61404b6040830185613a1a565b828103602084015280845180835260208301915060208160051b840101602087015f5b838110156140be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526140a8838351613b7b565b602095860195909350919091019060010161406e565b50909897505050505050505056fea2646970667358221220cb873648a5a9404d58b97b6839202c8425eb3389d2d261b5a6d804c00317f49e64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} -} +} \ No newline at end of file diff --git a/run_service.py b/run_service.py index 30b0a62..bf29b80 100644 --- a/run_service.py +++ b/run_service.py @@ -28,6 +28,7 @@ from dotenv import load_dotenv from halo import Halo +from web3.constants import ADDRESS_ZERO from operate.account.user import UserAccount from operate.cli import OperateApp from operate.ledger.profiles import CONTRACTS, STAKING, OLAS @@ -103,7 +104,7 @@ def get_service_template(config: MechQuickstartConfig) -> ServiceTemplate: "nft": "bafybeifgj3kackzfoq4fxjiuousm6epgwx7jbc3n2gjwzjgvtbbz7fc3su", "cost_of_bond": COST_OF_BOND, "threshold": 1, - "use_staking": True, + "use_staking": config.use_staking, "fund_requirements": FundRequirementsTemplate( { "agent": AGENT_TOPUP, @@ -309,6 +310,11 @@ def main() -> None: "SERVICE_REGISTRY_ADDRESS": CONTRACTS[home_chain_type]["service_registry"], "STAKING_TOKEN_CONTRACT_ADDRESS": STAKING[home_chain_type]["mech_marketplace"], "MECH_MARKETPLACE_ADDRESS": CHAIN_TO_MARKETPLACE[home_chain_type], + "MECH_STAKING_INSTANCE_ADDRESS": ( + STAKING[ChainType.GNOSIS]["mech_marketplace"] + if mech_quickstart_config.use_staking + else ADDRESS_ZERO + ), # TODO: no way to update this atm after its provided, user is expected to update the file itself. "API_KEYS": json.dumps(api_keys, separators=(',', ':')), "AGENT_ID": str(mech_quickstart_config.agent_id), diff --git a/utils.py b/utils.py index ed4d2ba..2cb5eeb 100644 --- a/utils.py +++ b/utils.py @@ -28,6 +28,7 @@ from operate.services.service import Service from operate.types import ChainType, ServiceTemplate, LedgerType, ConfigurationTemplate from operate.utils.gnosis import SafeOperation +from operate.ledger.profiles import CONTRACTS # Set decimal precision getcontext().prec = 18 @@ -47,6 +48,7 @@ class MechQuickstartConfig(LocalResource): path: Path gnosis_rpc: t.Optional[str] = None + mech_type: t.Optional[str] = None password_migrated: t.Optional[bool] = None use_staking: t.Optional[bool] = None api_keys_path: t.Optional[str] = None @@ -320,6 +322,16 @@ def get_local_config() -> MechQuickstartConfig: mech_quickstart_config.gnosis_rpc = input( f"Please enter a {ChainType.from_id(mech_quickstart_config.home_chain_id).name} RPC URL: " ) + + if mech_quickstart_config.mech_type is None: + mech_quickstart_config.mech_type = input_with_default_value( + "Which type of mech do you want to deploy? (Native/Token/Nevermine)" , "Native" + ) + + if mech_quickstart_config.use_staking is None: + mech_quickstart_config.use_staking = input_with_default_value( + "Do you wish to use staking for your service? (True/False)" , False + ) if mech_quickstart_config.mech_hash is None: mech_hash = ( @@ -473,13 +485,24 @@ def unit_to_wei(unit: float) -> int: """Convert unit to Wei.""" return int(unit * 1e18) - +# @todo update after mainnet deployment CHAIN_TO_MARKETPLACE = { - ChainType.GNOSIS: "0x4554fE75c1f5576c1d7F765B2A036c199Adae329", + ChainType.GNOSIS: "0x74867dc703cc99d0c537cd8385308b31d15d81f3", +} + +# @todo update after mainnet deployment +CHAIN_TO_NATIVE_MECH_FACTORY = { + ChainType.GNOSIS: "0x021c68454d901b89ab8bcdbad3265006ccd9599f", +} + +# @todo update after mainnet deployment +CHAIN_TO_TOKEN_MECH_FACTORY = { + ChainType.GNOSIS: "0x9ab943c841c6de524ea37a5ba6000bf318e924e6", } -CHAIN_TO_AGENT_FACTORY = { - ChainType.GNOSIS: "0x6D8CbEbCAD7397c63347D44448147Db05E7d17B0", +# @todo update after mainnet deployment +CHAIN_TO_NVM_MECH_FACTORY = { + ChainType.GNOSIS: "0xf2086d71ac953035968068646273e1ca0bd9c5da", } def fetch_token_price(url: str, headers: dict) -> t.Optional[float]: @@ -502,35 +525,42 @@ def deploy_mech(sftxb: EthSafeTxBuilder, local_config: MechQuickstartConfig, ser """Deploy the Mech service.""" print_section("Creating a new Mech On Chain") chain_type = ChainType.from_id(int(local_config.home_chain_id)) - path = OPERATE_HOME / Path("../contracts/MechAgentFactory.json") + mech_type = local_config.mech_type + path = OPERATE_HOME / Path("../contracts/MechMarketplace.json") abi = json.loads(path.read_text())["abi"] instance = web3.Web3() mech_marketplace_address = CHAIN_TO_MARKETPLACE[chain_type] + if mech_type == 'Native': + mech_factory_address = CHAIN_TO_NATIVE_MECH_FACTORY[chain_type] + + if mech_type == 'Token': + mech_factory_address = CHAIN_TO_TOKEN_MECH_FACTORY[chain_type] + + if mech_type == 'Nevermine': + mech_factory_address = CHAIN_TO_NVM_MECH_FACTORY[chain_type] + # 0.01xDAI hardcoded for price # better to be configurable and part of local config mech_request_price = unit_to_wei(0.01) contract = instance.eth.contract(address=Web3.to_checksum_address(mech_marketplace_address), abi=abi) data = contract.encodeABI("create", args=[ - service.chain_configs[service.home_chain_id].chain_data.multisig, - bytes.fromhex(local_config.metadata_hash.lstrip("f01701220")), - mech_request_price, - mech_marketplace_address + service.chain_configs[str(local_config.home_chain_id)].chain_data.token, + Web3.to_checksum_address(mech_factory_address), + mech_request_price.to_bytes(32, byteorder='big'), ]) tx_dict = { - "to": CHAIN_TO_AGENT_FACTORY[chain_type], + "to": mech_marketplace_address, "data": data, "value": 0, "operation": SafeOperation.CALL, } receipt = sftxb.new_tx().add(tx_dict).settle() event = contract.events.CreateMech().process_receipt(receipt)[0] - mech_address, agent_id = event["args"]["mech"], event["args"]["agentId"] + mech_address = event["args"]["mech"] print(f"Mech address: {mech_address}") - print(f"Agent ID: {agent_id}") local_config.mech_address = mech_address - local_config.agent_id = agent_id local_config.store() def generate_mech_config(local_config: MechQuickstartConfig) -> dict: