@dolomite-exchange/dolomite-margin
Version:
Ethereum Smart Contracts and TypeScript library used for the DolomiteMargin trading protocol
538 lines • 1.26 MB
JSON
{
"contractName": "SignedOperationProxy",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "dolomiteMargin",
"type": "address"
},
{
"internalType": "uint256",
"name": "chainId",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bool",
"name": "operational",
"type": "bool"
}
],
"name": "ContractStatusSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "operationHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "canceler",
"type": "address"
}
],
"name": "LogOperationCanceled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "operationHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "signer",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "LogOperationExecuted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"constant": true,
"inputs": [],
"name": "DOLOMITE_MARGIN",
"outputs": [
{
"internalType": "contract IDolomiteMargin",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "EIP712_DOMAIN_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "g_invalidated",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "g_isOperational",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isOwner",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "shutDown",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "startUp",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "number",
"type": "uint256"
}
],
"internalType": "struct Account.Info[]",
"name": "accounts",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "enum Actions.ActionType",
"name": "actionType",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "accountId",
"type": "uint256"
},
{
"components": [
{
"internalType": "bool",
"name": "sign",
"type": "bool"
},
{
"internalType": "enum Types.AssetDenomination",
"name": "denomination",
"type": "uint8"
},
{
"internalType": "enum Types.AssetReference",
"name": "ref",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"internalType": "struct Types.AssetAmount",
"name": "amount",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "primaryMarketId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "secondaryMarketId",
"type": "uint256"
},
{
"internalType": "address",
"name": "otherAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "otherAccountId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"internalType": "struct Actions.ActionArgs[]",
"name": "actions",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "uint256",
"name": "numActions",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "expiration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct SignedOperationProxy.OperationHeader",
"name": "header",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct SignedOperationProxy.Authorization",
"name": "auth",
"type": "tuple"
}
],
"name": "cancel",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "number",
"type": "uint256"
}
],
"internalType": "struct Account.Info[]",
"name": "accounts",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "enum Actions.ActionType",
"name": "actionType",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "accountId",
"type": "uint256"
},
{
"components": [
{
"internalType": "bool",
"name": "sign",
"type": "bool"
},
{
"internalType": "enum Types.AssetDenomination",
"name": "denomination",
"type": "uint8"
},
{
"internalType": "enum Types.AssetReference",
"name": "ref",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"internalType": "struct Types.AssetAmount",
"name": "amount",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "primaryMarketId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "secondaryMarketId",
"type": "uint256"
},
{
"internalType": "address",
"name": "otherAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "otherAccountId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"internalType": "struct Actions.ActionArgs[]",
"name": "actions",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "uint256",
"name": "numActions",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "expiration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct SignedOperationProxy.OperationHeader",
"name": "header",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct SignedOperationProxy.Authorization[]",
"name": "auths",
"type": "tuple[]"
}
],
"name": "operate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "bytes32[]",
"name": "operationHashes",
"type": "bytes32[]"
}
],
"name": "getOperationsAreInvalid",
"outputs": [
{
"internalType": "bool[]",
"name": "",
"type": "bool[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dolomiteMargin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"operational\",\"type\":\"bool\"}],\"name\":\"ContractStatusSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operationHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"canceler\",\"type\":\"address\"}],\"name\":\"LogOperationCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operationHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"LogOperationExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[],\"name\":\"DOLOMITE_MARGIN\",\"outputs\":[{\"internalType\":\"contract IDolomiteMargin\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"EIP712_DOMAIN_HASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"internalType\":\"struct Account.Info[]\",\"name\":\"accounts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum Actions.ActionType\",\"name\":\"actionType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"accountId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"sign\",\"type\":\"bool\"},{\"internalType\":\"enum Types.AssetDenomination\",\"name\":\"denomination\",\"type\":\"uint8\"},{\"internalType\":\"enum Types.AssetReference\",\"name\":\"ref\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct Types.AssetAmount\",\"name\":\"amount\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"primaryMarketId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryMarketId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"otherAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"otherAccountId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Actions.ActionArgs[]\",\"name\":\"actions\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"numActions\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"internalType\":\"struct SignedOperationProxy.OperationHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct SignedOperationProxy.Authorization\",\"name\":\"auth\",\"type\":\"tuple\"}],\"name\":\"cancel\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"g_invalidated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"g_isOperational\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"operationHashes\",\"type\":\"bytes32[]\"}],\"name\":\"getOperationsAreInvalid\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"\",\"type\":\"bool[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"internalType\":\"struct Account.Info[]\",\"name\":\"accounts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum Actions.ActionType\",\"name\":\"actionType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"accountId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"sign\",\"type\":\"bool\"},{\"internalType\":\"enum Types.AssetDenomination\",\"name\":\"denomination\",\"type\":\"uint8\"},{\"internalType\":\"enum Types.AssetReference\",\"name\":\"ref\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct Types.AssetAmount\",\"name\":\"amount\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"primaryMarketId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryMarketId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"otherAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"otherAccountId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Actions.ActionArgs[]\",\"name\":\"actions\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"numActions\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"internalType\":\"struct SignedOperationProxy.OperationHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct SignedOperationProxy.Authorization[]\",\"name\":\"auths\",\"type\":\"tuple[]\"}],\"name\":\"operate\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"shutDown\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"startUp\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"dYdX * Contract for sending operations on behalf of others\",\"methods\":{\"cancel((address,uint256)[],(uint8,uint256,(bool,uint8,uint8,uint256),uint256,uint256,address,uint256,bytes)[],(uint256,(uint256,uint256,address,address),bytes))\":{\"params\":{\"accounts\":\"The accounts involved in the operation\",\"actions\":\"The actions involved in the operation\",\"auth\":\"The unsigned authorization of the operation\"}},\"isOwner()\":{\"details\":\"Returns true if the caller is the current owner.\"},\"operate((address,uint256)[],(uint8,uint256,(bool,uint8,uint8,uint256),uint256,uint256,address,uint256,bytes)[],(uint256,(uint256,uint256,address,address),bytes)[])\":{\"params\":{\"accounts\":\"The accounts to forward to DolomiteMargin.operate()\",\"actions\":\"The actions to forward to DolomiteMargin.operate()\",\"auths\":\"The signed authorizations for each group of actions (or unsigned if msg.sender is already authorized)\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. * NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"SignedOperationProxy\"},\"userdoc\":{\"methods\":{\"cancel((address,uint256)[],(uint8,uint256,(bool,uint8,uint8,uint256),uint256,uint256,address,uint256,bytes)[],(uint256,(uint256,uint256,address,address),bytes))\":{\"notice\":\"Allows a signer to permanently cancel an operation on-chain.\"},\"getOperationsAreInvalid(bytes32[])\":{\"notice\":\"Returns a bool for each operation. True if the operation is invalid (from being canceled or previously executed).\"},\"operate((address,uint256)[],(uint8,uint256,(bool,uint8,uint8,uint256),uint256,uint256,address,uint256,bytes)[],(uint256,(uint256,uint256,address,address),bytes)[])\":{\"notice\":\"Submits an operation to DolomiteMargin. Actions for accounts that the msg.sender does not control must be authorized by a signed message. Each authorization can apply to multiple actions at once which must occur in-order next to each other. An empty authorization must be supplied explicitly for each group of actions that do not require a signed message.\"},\"shutDown()\":{\"notice\":\"The owner can shut down the exchange.\"},\"startUp()\":{\"notice\":\"The owner can start back up the exchange.\"}}}},\"settings\":{\"compilationTarget\":{\"/home/cdc218/projects/dolomite-protocol-v2/contracts/external/proxies/SignedOperationProxy.sol\":\"SignedOperationProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"/home/cdc218/projects/dolomite-protocol-v2/contracts/external/helpers/OnlyDolomiteMargin.sol\":{\"keccak256\":\"0xe40babc0a6dd2a767d76f3e0f0a22de124c4c480f2b2227a7b924b44e57526ea\",\"urls\":[\"bzz-raw://458f7f1f16eacd4faae597090503dc1e58446e9d371640c77b2e01e3e3113f17\",\"dweb:/ipfs/QmXqTG4sWJeDh5XA286KarbqHT4qJ7m3dphS16enpqtQiX\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/external/lib/TypedSignature.sol\":{\"keccak256\":\"0x4b4eb5fd2869d6c410948f78163773442c11bc82e393307e41359bbdb21577bf\",\"urls\":[\"bzz-raw://9c9c3abae44173086bc08f5479fbc67151d5905f60e1032ec6f9e40f841f3365\",\"dweb:/ipfs/QmbsQRX3gmcpimjFEW5ULJVavHQtViyg7NSQ2Q8Qcu6F6V\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/external/proxies/SignedOperationProxy.sol\":{\"keccak256\":\"0xacbde1a649f3ac64e228a085a3a41f655db51401456904affc054b4237fc5c9b\",\"urls\":[\"bzz-raw://f3ba662220aaf686acb8f5efc1a7e2041d805df48a732c667af31b740872917f\",\"dweb:/ipfs/QmZXUV1svWn8iBmE6Vp1WLJq8fDvoF9kMMRwJ8owKjYPok\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IAccountRiskOverrideSetter.sol\":{\"keccak256\":\"0x5b9fde139ddfdaae7b650b3c3f6699e0e44605f0d9d3daadc1622eb06ad4c3f8\",\"urls\":[\"bzz-raw://2dfd5af24b6de63f94519c99fd8777a264d7cd11266fa2d525c7d72d96a9c7cf\",\"dweb:/ipfs/QmPg9fjhbnmBayZMh6yTG79xsK1PWSoAHA5pfwSXfnKKjF\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IDolomiteMargin.sol\":{\"keccak256\":\"0x7e86ed1ed04dc205245db9f4e7cf7cca60c3bfc46c57ade8129a463780647967\",\"urls\":[\"bzz-raw://f8fbd85afd334c12bdccbb6523ebea9172b27b7b4b132c4a48b4b4dd03ceeb2b\",\"dweb:/ipfs/QmU1srfSqBTz3kw7oz1KEzfTUJvphZiE4K8MRZcy9uJjv1\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IERC20Detailed.sol\":{\"keccak256\":\"0x22a62e2a8155e70300773721902f4b9118e17aa0bb5d9d1b046050a014cfb223\",\"urls\":[\"bzz-raw://03af737a33c552fbe58f6f1fbd5496854fdc28dd57be4365d56663725c083a18\",\"dweb:/ipfs/QmbgLqGAQEd6tXsZB8QaPNCAMiU6nNzP75wNbKdS65BuUF\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IInterestSetter.sol\":{\"keccak256\":\"0x546825f65490a30e29d0f6446acec49c1e895ce6b33d48ca5c05092725a63a57\",\"urls\":[\"bzz-raw://6ad3013aed985bdf6e6234ae0f7f37e6bba76c3470c33bfa24678cf19b3b412c\",\"dweb:/ipfs/QmfYaSBzxGpgiHoR7ontMJY66S5L26XwkLYoEuzsEjpbQH\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IOracleSentinel.sol\":{\"keccak256\":\"0xa94499fda55ef112640daed2cb1d06062e72c51c7b925c323b4e0ffa9b456ce5\",\"urls\":[\"bzz-raw://18b4a16acac577590a57f34f7ec6583e3cb35f575c948abb928b308d29cac1ab\",\"dweb:/ipfs/QmR1jLkzj6w7SjrdZ7GVW4V2vofSdMJwzjTqKpeUKABvxu\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IPriceOracle.sol\":{\"keccak256\":\"0x3f7c3d1397390ea44c6d5e5730d49476431c3df3b28334fe38218de5edc31138\",\"urls\":[\"bzz-raw://63ebf926fca9ce33aaabaf93805686acc25daded1648d6dab59c8c4d05116918\",\"dweb:/ipfs/QmeGkDp7ycYstpfqCYBiqoCYwy876gabx8r42o5koj3H5A\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Account.sol\":{\"keccak256\":\"0x2059276ea5e478bd5ac7f2712e7b1b6c85d291c647a54b264909044844828e67\",\"urls\":[\"bzz-raw://f153777051d12131b13a57e5c3af10a2670927cfc7d22c9519ab20c9b4b9bc89\",\"dweb:/ipfs/QmQMP3qS5xDAVGYKDfNkbkSqBKozQGQsGqX4e8VyjRtxPS\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Actions.sol\":{\"keccak256\":\"0x7b2fcf441c034952dd042b6c8b20b148359db771e7c9ac07d06369560a9f0301\",\"urls\":[\"bzz-raw://84665ee4a780360fe6160d197ba98f0bf0ab0d7c6ad87bfed6226bf2f88d8d30\",\"dweb:/ipfs/QmRDfRdAd8hSXeu4SAeeYKkKoXBhStu7n4uReYBce2JD5Z\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Bits.sol\":{\"keccak256\":\"0x6d9a641163b2dd25e648c65f5d9e4949a57938e29ddc4c9dddefd74a9964aeef\",\"urls\":[\"bzz-raw://67e5a04ed4055faafbc100d6ccca9c54448ed378a1a8c71171562edda7bcbf7c\",\"dweb:/ipfs/QmYRikK3Xbgiq3UBJkgoo2zNUSSrShVabpRHmQj6iQHhrc\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Cache.sol\":{\"keccak256\":\"0xe57c80a7621a77fcb2acb9f883fb5248e71a6dce03bc2db56df0db3fee332950\",\"urls\":[\"bzz-raw://28e221c04629674490b9a0041d4f9a5f15e669dc0cc192a5df6e2c701c36369f\",\"dweb:/ipfs/QmaL3oh8c7v9cx91pB175pyCEuzxnhNTab4UxmBMsDYfUx\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Decimal.sol\":{\"keccak256\":\"0xd9a348c2b1eec076609ba12bbec6b9c2e4ea135790a7ef4f5411feb050af2144\",\"urls\":[\"bzz-raw://d5bcff29e47d5cd02d7a9966e9f44c46ccbb4f0e4adfc4b0b86646880677db39\",\"dweb:/ipfs/QmRKfJD4FFM1AvTynSFNx1NcDg94o9SAcjz7dvMaJCfecp\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/DolomiteMarginMath.sol\":{\"keccak256\":\"0x53f205f6a779d579be29faa9412c806a892b3e605fff092dfd9d14d936fa019f\",\"urls\":[\"bzz-raw://0ff936f89602a63b8e6a4eb4ce8f87673c0f45b7ce29694920905a3f0b5a6a69\",\"dweb:/ipfs/QmbYME9BeEvPC1ndV8EaUDX5fDMghLc3rocNUxFtgHmg8m\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/EnumerableSet.sol\":{\"keccak256\":\"0x41a3460e34b7b8635d936e35e6568ceb5354b638f53b884530e0d4875fa0f151\",\"urls\":[\"bzz-raw://d1a5ba866ee95d455afe5075dadd91fc71c2806371f2c1b358a1f67c632bb0df\",\"dweb:/ipfs/QmW4qCjmsG8J3UJv97GwDLDM7wt1K4yLDKAwzWMY7TFYi5\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Interest.sol\":{\"keccak256\":\"0x141a0ecb4a746f0e5767df4b99dbe33c6362df507ae9d5c02da1c1c17bc26df3\",\"urls\":[\"bzz-raw://9ff03e64a8ce5231acde07788624bf8c7a8ff55d90b157fa32f62fa887a0eff0\",\"dweb:/ipfs/QmUVxxWeE954RDXbmHJAYnHsXcit6rSXGqZUigu8t9oH2z\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Monetary.sol\":{\"keccak256\":\"0x5257274f2d4d3605f3e97ec45fb902111fe9a22506f0b4cf308ea933bc81bfe2\",\"urls\":[\"bzz-raw://85b8023b78805063a2ec8d376f1f5983994eabd96efd8ceadb0224dbb71c5678\",\"dweb:/ipfs/QmaDhzCzRqsuHuJfhToEC4pATQHwhh7yWWsjwfuRzFT1kG\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Require.sol\":{\"keccak256\":\"0x05a2a90b41b6a5f42f0a72da63d015fb0b406a9ba2172823352e522e8bf3a606\",\"urls\":[\"bzz-raw://19883f0c6d33266f756ec5c3d17539524aa24b993c46c33f8400801d09373a6c\",\"dweb:/ipfs/QmYX2fwK3vQQDSZLMrc5wMfeb8RWrcC9CGX8XECLty8QDk\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Storage.sol\":{\"keccak256\":\"0x9c27f3cd52af28c9b6bca18097b1793f114d08284d78417467d0d05f67e9e2a9\",\"urls\":[\"bzz-raw://d1ed0e7a7f76d59f30572996d4e164ab8fb5b2ec4bfca127983f9e936b904813\",\"dweb:/ipfs/QmePVYbgrY8Yw3Vf76pmEvE9pX916Jaa9we4kjM8tGM4J1\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Time.sol\":{\"keccak256\":\"0x87ee8d3c1d6e315a116426d8c8fc6f083e220fd14dda27fad4e8d7cab3dc7305\",\"urls\":[\"bzz-raw://7c20f2c52da682c3b5917fb6a19e81f43699b1d13c62b569ed723f34da72e766\",\"dweb:/ipfs/QmbXWYXi67nHBVNDKYUpo2E9ZaEVcHLvmXQkpYLMm1d5Vm\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Token.sol\":{\"keccak256\":\"0x095b5f8eb3665f6e246200311efc8a654fa3e90f9a1a522e27a4d089e8ab3917\",\"urls\":[\"bzz-raw://5db812b752a03d601d424e6e21be38153477082af0acf51b5c98eefa5553ed18\",\"dweb:/ipfs/QmbE549QUXYTurpx8hSMLBJvuBpfYqyNE6FBCgHJDY8PLf\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Types.sol\":{\"keccak256\":\"0xe1bab8c8799d83e86c7a49aaf815d8e3bc8d09562d46d44d921500db5e98de0e\",\"urls\":[\"bzz-raw://8ea3d0cc4fdab6dd9bba545a792170f939b342d8d1a7051c1c6365009af72658\",\"dweb:/ipfs/QmaLJgbavu88eEit6JPqfWnw6NmGBDZfveMXxumgWywBFG\"]},\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x90a3995645af7562d84b9d69363ffa5ae7217714ab61e951bf7bc450f40e4061\",\"urls\":[\"bzz-raw://216ef9d6b614db4eb46970b4e84903f2534a45572dd30a79f0041f1a5830f436\",\"dweb:/ipfs/QmNPrJ4MWKUAWzKXpUqeyKRUfosaoANZAqXgvepdrCwZAG\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzz-raw://31113152e1ddb78fe7a4197f247591ca894e93f916867beb708d8e747b6cc74f\",\"dweb:/ipfs/QmbZaJyXdpsYGykVhHH9qpVGQg9DGCxE2QufbCUy3daTgq\"]},\"@openzeppelin/contracts/ownership/Ownable.sol\":{\"keccak256\":\"0x6fb9d7889769d7cc161225f9ef7a90e468ba9788b253816f8d8b6894d3472c24\",\"urls\":[\"bzz-raw://cf4c00fc3c37cc5acf0c82ec6fd97bab67d72c2567fdc0ebf023d9c09b30a08e\",\"dweb:/ipfs/Qmb7TChG6DsEDX7LooJ4vmxot19f7VXX8S1zUGPeJTWbwZ\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzz-raw://59fd025151435da35faa8093a5c7a17de02de9d08ad27275c5cdf05050820d91\",\"dweb:/ipfs/QmQMvwEcPhoRXzbXyrdoeRtvLoifUW9Qh7Luho7bmUPRkc\"]}},\"version\":1}",
"bytecode": "0x60806040523480156200001157600080fd5b5060405162003ac738038062003ac7833981016040819052620000349162000262565b600080546001600160a01b0319166001600160a01b03841617815562000059620001c1565b600180546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062003aa7833981519152908290a350620000aa326001600160e01b03620001c516565b6003805460ff19166001179055604051620000c8906020016200045b565b60408051601f1981840301815290829052620000e79160200162000446565b60408051601f1981840301815282825280516020918201208383018352601484527f5369676e65644f7065726174696f6e50726f787900000000000000000000000093820193909352815180830183526003815262312e3160e81b9082015290516200019d92917fcefe97a0ba2f870a5405632ee9957acc8f7015bb8dbd346fb5ce3f06f3571dc3917f722c0e0c80487266e8c6a45e3a1a803aab23378a9c32e6ebe029d4fad7bfc965918691309101620004a9565b60405160208183030381529060405280519060200120600281905550505062000597565b3390565b6001600160a01b038116620001f75760405162461bcd60e51b8152600401620001ee90620004ff565b60405180910390fd5b6001546040516001600160a01b0380841692169060008051602062003aa783398151915290600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b80516200024f8162000572565b92915050565b80516200024f816200058c565b600080604083850312156200027657600080fd5b600062000284858562000242565b9250506020620002978582860162000255565b9150509250929050565b620002ac8162000523565b82525050565b620002ac8162000530565b6000620002ca8262000511565b620002d6818562000515565b9350620002e88185602086016200053f565b9290920192915050565b600062000301600c8362000515565b6b1cdd1c9a5b99c81b985b594b60a21b8152600c0192915050565b60006200032b6026836200051a565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b60006200037560198362000515565b7f6164647265737320766572696679696e67436f6e747261637400000000000000815260190192915050565b6000620003b060108362000515565b6f1d5a5b9d0c8d4d8818da185a5b92590b60821b815260100192915050565b6000620003de60018362000515565b602960f81b815260010192915050565b6000620003fd600f8362000515565b6e1cdd1c9a5b99c81d995c9cda5bdb8b608a1b8152600f0192915050565b60006200042a600d8362000515565b6c08a92a06e626488dedac2d2dc5609b1b8152600d0192915050565b6000620004548284620002bd565b9392505050565b600062000468826200041b565b91506200047582620002f2565b91506200048282620003ee565b91506200048f82620003a1565b91506200049c8262000366565b91506200024f82620003cf565b60a08101620004b98288620002b2565b620004c86020830187620002b2565b620004d76040830186620002b2565b620004e66060830185620002b2565b620004f56080830184620002a1565b9695505050505050565b602080825281016200024f816200031c565b5190565b919050565b90815260200190565b60006200024f8262000533565b90565b6001600160a01b031690565b60005b838110156200055c57818101518382015260200162000542565b838111156200056c576000848401525b50505050565b6200057d8162000523565b81146200058957600080fd5b50565b6200057d8162000530565b61350080620005a76000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80638da5cb5b1161008c578063baf7413f11610066578063baf7413f1461018c578063e306f7791461019f578063f2fde38b146101b4578063f72ac9cb146101c7576100df565b80638da5cb5b1461015c5780638f32d59b146101715780639ef90ea214610179576100df565b80633b84a304116100bd5780633b84a304146101145780635b9ddfdc14610134578063715018a614610154576100df565b806310b9e583146100e457806315c14a4a146100ee57806330e4a7841461010c575b600080fd5b6100ec6101cf565b005b6100f6610279565b604051610103919061329d565b60405180910390f35b6100ec610295565b610127610122366004612304565b61032f565b60405161010391906130fe565b610147610142366004612475565b6103d3565b6040516101039190613134565b6100ec6103e8565b610164610495565b60405161010391906130ac565b6101476104b1565b6100ec610187366004612339565b6104f1565b6100ec61019a3660046123cd565b610baa565b6101a7610ca3565b6040516101039190613142565b6100ec6101c23660046122e6565b610ca9565b610147610cf3565b6101d76104b1565b610216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020d906132dc565b60405180910390fd5b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f800e9acf7ef6d84d7bc26116f2ecb9d8fc6e4a2562cda6d1c411f66ea72054819061026f90600090613134565b60405180910390a1565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61029d6104b1565b6102d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020d906132dc565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556040517f800e9acf7ef6d84d7bc26116f2ecb9d8fc6e4a2562cda6d1c411f66ea72054819161026f91613134565b6060600082519050606081604051908082528060200260200182016040528015610363578160200160208202803883390190505b50905060005b828110156103c9576004600086838151811061038157fe5b6020026020010151815260200190815260200160002060009054906101000a900460ff168282815181106103b157fe5b91151560209283029190910190910152600101610369565b509150505b919050565b60046020526000908152604090205460ff1681565b6103f06104b1565b610426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020d906132dc565b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60015460009073ffffffffffffffffffffffffffffffffffffffff166104d5610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6003546105429060ff167f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f436f6e7472616374206973206e6f74206f7065726174696f6e616c0000000000610d00565b8051600090815b81811015610aca57610559611d28565b84828151811061056557fe5b602002602001015190506105d68160200151600001516000148061058e57506020820151514211155b7f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f5369676e6564206f7065726174696f6e2069732065787069726564000000000085610d8f565b60208101516040015161066a9073ffffffffffffffffffffffffffffffffffffffff161580610622575060208201516040015173ffffffffffffffffffffffffffffffffffffffff1633145b7f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f4f7065726174696f6e2073656e646572206d69736d617463680000000000000085610d8f565b60408101515133901561081357600061068589898589610e2d565b6000818152600460205260409020549091506106e79060ff16157f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f4861736820616c72656164792075736564206f722063616e63656c656400000084610f48565b6106f5818460400151610faa565b91506107998273ffffffffffffffffffffffffffffffffffffffff1684602001516060015173ffffffffffffffffffffffffffffffffffffffff16148015610752575073ffffffffffffffffffffffffffffffffffffffff831615155b7f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f496e76616c6964207369676e6174757265000000000000000000000000000000610d00565b60008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551339173ffffffffffffffffffffffffffffffffffffffff85169184917fc567efce0a7476d41074b5c204ed0e44fd548b306cf1dc0c27b8cfac27bc0c2d91a4505b815160009061082990879063ffffffff6111dd16565b9050855b81811015610abd5761083d611d4f565b89828151811061084957fe5b602002602001015190506108788b82602001518151811061086657fe5b60200260200101516000015185611223565b60028151600881111561088757fe5b14156108a5576108a08b8260c001518151811061086657fe5b610ab4565b6109006006825160088111156108b757fe5b14157f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f43616e6e6f7420706572666f726d206c69717569646174696f6e730000000000610d00565b60058151600881111561090f57fe5b1480156109c0575060005460a08201516040517ff1061ba800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163f1061ba891610970916004016130ac565b60206040518083038186803b15801561098857600080fd5b505afa15801561099c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109c09190810190612457565b15610ab4576000546040517f052f72d7000000000000000000000000000000000000000000000000000000008152610ab49173ffffffffffffffffffffffffffffffffffffffff169063052f72d790610a1d9033906004016130ba565b60206040518083038186803b158015610a3557600080fd5b505afa158015610a49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a6d9190810190612457565b7f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f556e7065726d697373696f6e6564207472616465206f70657261746f72000000610d00565b5060010161082d565b5094505050600101610549565b50610b19845183147f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f4e6f7420616c6c20616374696f6e7320617265207369676e6564000000000000610d00565b6000546040517fa67a6a4500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a67a6a4590610b71908890889060040161310f565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b505050505050505050565b6000610bb98484846000610e2d565b9050610c3c3373ffffffffffffffffffffffffffffffffffffffff1683602001516060015173ffffffffffffffffffffffffffffffffffffffff16147f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f43616e63656c6572206d757374206265207369676e6572000000000000000000610d00565b60008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551339183917feb98d4ec98d06fd7735ff893b47d492a6f12700b6093a6c5bd5a932608727afb9190a350505050565b60025481565b610cb16104b1565b610ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020d906132dc565b610cf08161141e565b50565b60035460ff1681565b3390565b82610d8a57610d0e826114f9565b7f3a20000000000000000000000000000000000000000000000000000000000000610d38836114f9565b604051602001610d4a93929190612ecb565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261020d916004016132ab565b505050565b83610e2757610d9d836114f9565b7f3a20000000000000000000000000000000000000000000000000000000000000610dc7846114f9565b7f203c000000000000000000000000000000000000000000000000000000000000610df1856115af565b604051610d4a9594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001612ef3565b50505050565b600080610e3c868686866116be565b90506000604051602001610e4f90612faf565b604051602081830303815290604052604051602001610e6d90612ffc565b604051602081830303815290604052604051602001610e8b90613075565b60408051601f1981840301815290829052610eaa939291602001612f8b565b60405160208183030381529060405280519060200120828660200151604051602001610ed89392919061319c565b60408051601f19818403018152908290528051602091820120600254909350610f25927f190100000000000000000000000000000000000000000000000000000000000092859101612e73565b60405160208183030381529060405280519060200120925050505b949350505050565b83610e2757610f56836114f9565b7f3a20000000000000000000000000000000000000000000000000000000000000610f80846114f9565b7f203c000000000000000000000000000000000000000000000000000000000000610df1856117ee565b6000610ffb60428351147f54797065645369676e61747572650000000000000000000000000000000000007f496e76616c6964207369676e6174757265206c656e6774680000000000000000610d00565b602082015160408301516060840151600081901a9060011a611061600382107f54797065645369676e61747572650000000000000000000000000000000000007f496e76616c6964207369676e6174757265207479706500000000000000000000610d00565b60008160ff16600381111561107257fe5b905060008082600381111561108357fe5b141561109057508761117f565b600182600381111561109e57fe5b1415611109576040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250896040516020016110ec929190612f51565b60405160208183030381529060405280519060200120905061117f565b600282600381111561111757fe5b1461111e57fe5b6040518060400160405280601b81526020017f19457468657265756d205369676e6564204d6573736167653a0a20000000000081525089604051602001611166929190612f51565b6040516020818303038152906040528051906020012090505b600181858888604051600081526020016040526040516111a29493929190613268565b6020604051602081039080840390855afa1580156111c4573d6000803e3d6000fd5b5050506020604051035196505050505050505b92915050565b60008282018381101561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020d906132cc565b9392505050565b60003373ffffffffffffffffffffffffffffffffffffffff8416148061127457508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061132257506000546040517f3a031bf000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633a031bf0906112d290869033906004016130e3565b60206040518083038186803b1580156112ea57600080fd5b505afa1580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113229190810190612457565b806113d057506000546040517f3a031bf000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633a031bf09061138090869086906004016130c8565b60206040518083038186803b15801561139857600080fd5b505afa1580156113ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113d09190810190612457565b9050610d8a817f5369676e65644f7065726174696f6e50726f78790000000000000000000000007f5369676e6572206e6f7420617574686f72697a6564000000000000000000000085611951565b73ffffffffffffffffffffffffffffffffffffffff811661146b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020d906132bc565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6060808260405160200161150d9190612eaa565b60408051601f19818403018152919052905060205b80156115985781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019082908290811061155b57fe5b01602001517fff00000000000000000000000000000000000000000000000000000000000000161561159357600101815290506103ce565b611522565b505060408051600081526020810190915292915050565b6060816115f0575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103ce565b8160005b811561160857600101600a820491506115f4565b6060816040519080825280601f01601f191660200182016040528015611635576020820181803883390190505b508593509050815b80156116b5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600a840660300160f81b82828151811061167b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8404935061163d565b50949350505050565b6000606083600001516040519080825280602002602001820160405280156116f0578160200160208202803883390190505b50905060005b84518110156117bb57611707611d4f565b868286018151811061171557fe5b60200260200101519050611727611dae565b60008251611734906119b3565b600281111561173f57fe5b1461176157888260c001518151811061175457fe5b6020026020010151611776565b60408051808201909152600080825260208201525b905061179a828a84602001518151811061178c57fe5b602002602001015183611a21565b8484815181106117a657fe5b602090810291909101015250506001016116f6565b50806040516020016117cd9190612e67565b60405160208183030381529060405280519060200120915050949350505050565b6040805160428082526080820190925260609183918391602082018180388339019050509050603060f81b8160008151811061182657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350607860f81b8160018151811061186757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b60208110156103c957600281026118b2600f8516611b06565b8382604103815181106118c157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600484901c9350611903600f8516611b06565b83826040038151811061191257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060049290921c91600101611899565b83610e275761195f836114f9565b7f3a20000000000000000000000000000000000000000000000000000000000000611989846114f9565b7f203c000000000000000000000000000000000000000000000000000000000000610df185611b28565b600060028260088111156119c357fe5b14806119da575060058260088111156119d857fe5b145b156119e7575060016103ce565b60068260088111156119f557fe5b1480611a0c57506007826008811115611a0a57fe5b145b15611a19575060026103ce565b506000919050565b6000604051602001611a3290612ffc565b604051602081830303815290604052604051602001611a5090613075565b60408051601f1981840301815290829052611a6e9291602001612f73565b60405160208183030381529060405280519060200120846000015184600001518560200151611aa08860400151611c9f565b606089015160808a015160a08b0151895160208b015160e08e0151604051611ac89190612ebf565b604051908190038120611ae79b9a9998979695949392916020016131c4565b6040516020818303038152906040528051906020012090509392505050565b6000600a821015611b1e57506030810160f81b6103ce565b5060570160f81b90565b60408051602a808252606082810190935273ffffffffffffffffffffffffffffffffffffffff8416918391602082018180388339019050509050603060f81b81600081518110611b7457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916