Overview ERC20
PRICE
n/a

ON-CHAIN MARKET CAP n/a

Total Supply:
0.01 ssPrt

Profile Summary
Blockchain:
Ethereum (1)


Decimals:
18
Contract Source Code Verified (Partial Match)
Contract Name:
SignedSnapshotStakingPool

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Created At:
Fri, 12 Jul 2024 17:37:23 GMT
SignedSnapshotStakingPool.sol
src
staking
SignedSnapshotStakingPool.sol


Contract ABI
[
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "eip712Name",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "eip712Version",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "stakeMessage",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "name",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "symbol",
        "type": "string"
      },
      {
        "internalType": "contract IERC20",
        "name": "rewardToken",
        "type": "address"
      },
      {
        "internalType": "contract IERC20",
        "name": "stakeToken",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "distributor",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "snapshotBuffer",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "snapshotDelay",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "inputs": [],
    "name": "CannotAccrueWithZeroStakedSupply",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "CannotAccrueZero",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "CannotClaimFromPastSnapshots",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "CannotStakeDuringBuffer",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidShortString",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidSignature",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidSnapshotBuffer",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidSnapshotDelay",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidSnapshotId",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MustBeDistributor",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NonExistentSnapshotId",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NotApprovedStaker",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "SnapshotDelayNotPassed",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "str",
        "type": "string"
      }
    ],
    "name": "StringTooLong",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransfersNotAllowed",
    "type": "error"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Approval",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "newDistributor",
        "type": "address"
      }
    ],
    "name": "DistributorChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [],
    "name": "EIP712DomainChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "string",
        "name": "newMessage",
        "type": "string"
      }
    ],
    "name": "MessageChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "previousOwner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipTransferred",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "id",
        "type": "uint256"
      }
    ],
    "name": "Snapshot",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "newSnapshotBuffer",
        "type": "uint256"
      }
    ],
    "name": "SnapshotBufferChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "newSnapshotDelay",
        "type": "uint256"
      }
    ],
    "name": "SnapshotDelayChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "staker",
        "type": "address"
      }
    ],
    "name": "StakerApproved",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Transfer",
    "type": "event"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "accrue",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "allowance",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "approve",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes",
        "name": "signature",
        "type": "bytes"
      }
    ],
    "name": "approveStaker",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "snapshotId",
        "type": "uint256"
      }
    ],
    "name": "balanceOfAt",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "canAccrue",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "canStake",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "claim",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "startSnapshotId",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "endSnapshotId",
        "type": "uint256"
      }
    ],
    "name": "claimPartial",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "subtractedValue",
        "type": "uint256"
      }
    ],
    "name": "decreaseAllowance",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "distributor",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "eip712Domain",
    "outputs": [
      {
        "internalType": "bytes1",
        "name": "fields",
        "type": "bytes1"
      },
      {
        "internalType": "string",
        "name": "name",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "version",
        "type": "string"
      },
      {
        "internalType": "uint256",
        "name": "chainId",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "verifyingContract",
        "type": "address"
      },
      {
        "internalType": "bytes32",
        "name": "salt",
        "type": "bytes32"
      },
      {
        "internalType": "uint256[]",
        "name": "extensions",
        "type": "uint256[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getCurrentSnapshotId",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "getLifetimeRewards",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getNextSnapshotBufferTime",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getNextSnapshotTime",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "getPendingRewards",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getRewardSnapshots",
    "outputs": [
      {
        "internalType": "uint256[]",
        "name": "",
        "type": "uint256[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getStakeSignatureDigest",
    "outputs": [
      {
        "internalType": "bytes32",
        "name": "",
        "type": "bytes32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getTimeUntilNextSnapshot",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getTimeUntilNextSnapshotBuffer",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "addedValue",
        "type": "uint256"
      }
    ],
    "name": "increaseAllowance",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "isApprovedStaker",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "lastSnapshotTime",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "message",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "nextClaimId",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "owner",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "snapshotId",
        "type": "uint256"
      }
    ],
    "name": "rewardAt",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "snapshotId",
        "type": "uint256"
      }
    ],
    "name": "rewardOfAt",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "startSnapshotId",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "endSnapshotId",
        "type": "uint256"
      }
    ],
    "name": "rewardOfInRange",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "name": "rewardSnapshots",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "rewardToken",
    "outputs": [
      {
        "internalType": "contract IERC20",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newDistributor",
        "type": "address"
      }
    ],
    "name": "setDistributor",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "newMessage",
        "type": "string"
      }
    ],
    "name": "setMessage",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "newSnapshotBuffer",
        "type": "uint256"
      }
    ],
    "name": "setSnapshotBuffer",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "newSnapshotDelay",
        "type": "uint256"
      }
    ],
    "name": "setSnapshotDelay",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "snapshotBuffer",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "snapshotDelay",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      },
      {
        "internalType": "bytes",
        "name": "signature",
        "type": "bytes"
      }
    ],
    "name": "stake",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "stake",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "stakeToken",
    "outputs": [
      {
        "internalType": "contract IERC20",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "snapshotId",
        "type": "uint256"
      }
    ],
    "name": "totalSupplyAt",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "pure",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "pure",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "transferOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "unstake",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  }
]


Contract Creation Code
6101a06040523480156200001257600080fd5b506040516200302e3803806200302e8339810160408190526200003591620003ab565b89898888888888888886866200004b33620001a1565b60046200005983826200056a565b5060056200006882826200056a565b50506001600a5550808211156200009257604051631962358f60e31b815260040160405180910390fd5b6001600160a01b0394851660805292841660a052600b80546001600160a01b0319169290941691909117909255600e91909155600f55505042601055620000db826011620001f1565b61016052620000ec816012620001f1565b61018052815160208084019190912061012052815190820120610140524660e0526200017c6101205161014051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60c0525050306101005262000191886200022a565b5050505050505050505062000690565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020835110156200021157620002098362000275565b905062000224565b816200021e84826200056a565b5060ff90505b92915050565b60136200023882826200056a565b507fbb4847942d98bb5bb249692c72ce235605e41502e705831e609875320ef2cac7816040516200026a919062000636565b60405180910390a150565b600080829050601f81511115620002ac578260405163305a27a960e01b8152600401620002a3919062000636565b60405180910390fd5b8051620002b9826200066b565b179392505050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620002f4578181015183820152602001620002da565b50506000910152565b600082601f8301126200030f57600080fd5b81516001600160401b03808211156200032c576200032c620002c1565b604051601f8301601f19908116603f01168101908282118183101715620003575762000357620002c1565b816040528381528660208588010111156200037157600080fd5b62000384846020830160208901620002d7565b9695505050505050565b80516001600160a01b0381168114620003a657600080fd5b919050565b6000806000806000806000806000806101408b8d031215620003cc57600080fd5b8a516001600160401b0380821115620003e457600080fd5b620003f28e838f01620002fd565b9b5060208d01519150808211156200040957600080fd5b620004178e838f01620002fd565b9a5060408d01519150808211156200042e57600080fd5b6200043c8e838f01620002fd565b995060608d01519150808211156200045357600080fd5b620004618e838f01620002fd565b985060808d01519150808211156200047857600080fd5b50620004878d828e01620002fd565b9650506200049860a08c016200038e565b9450620004a860c08c016200038e565b9350620004b860e08c016200038e565b92506101008b015191506101208b015190509295989b9194979a5092959850565b600181811c90821680620004ee57607f821691505b6020821081036200050f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000565576000816000526020600020601f850160051c81016020861015620005405750805b601f850160051c820191505b8181101562000561578281556001016200054c565b5050505b505050565b81516001600160401b03811115620005865762000586620002c1565b6200059e81620005978454620004d9565b8462000515565b602080601f831160018114620005d65760008415620005bd5750858301515b600019600386901b1c1916600185901b17855562000561565b600085815260208120601f198616915b828110156200060757888601518255948401946001909101908401620005e6565b5085821015620006265787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000825180602084015262000657816040850160208701620002d7565b601f01601f19169190910160400192915050565b805160208083015191908110156200050f5760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516129116200071d6000396000610e9c01526000610e7101526000611e8701526000611e5f01526000611dba01526000611de401526000611e0e0152600081816104800152818161087d015261154f0152600081816106b701528181610c4801526117f301526129116000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c8063744f4cf61161019d578063a457c2d7116100e9578063c7029999116100a2578063ed56e4301161007c578063ed56e43014610684578063f2fde38b1461068c578063f6ed20171461069f578063f7c618c1146106b257600080fd5b8063c702999914610661578063dd62ed3e14610669578063e21f37ce1461067c57600080fd5b8063a457c2d7146105fe578063a694fc3a14610611578063a9059cbb14610624578063be74baf214610632578063bfe109281461063b578063c2d4413c1461064e57600080fd5b8063857f4864116101565780639320e605116101305780639320e605146105c657806395d89b41146105db578063981b24d0146105e35780639ed27809146105f657600080fd5b8063857f4864146105a45780638da5cb5b146105ac578063913db157146105bd57600080fd5b8063744f4cf61461052a57806375619ab51461053d5780637c4e4ab3146105505780637d3f0e7d146105635780637e9d05f71461057657806384b0196e1461058957600080fd5b806342f667ec1161025c5780635439ad86116102155780635e94d4e8116101ef5780635e94d4e8146104e85780636afc62e4146104f157806370a08231146104f9578063715018a61461052257600080fd5b80635439ad86146104ba5780635c1b6119146104c25780635d648588146104d557600080fd5b806342f667ec146104225780634854424e146104455780634ca4b539146104585780634e71d92d146104605780634ee2cd7e1461046857806351ed6a301461047b57600080fd5b80632ad2b7e1116102c9578063357f5d7a116102a3578063357f5d7a146103c9578063368b8772146103e9578063373f6d9d146103fc578063395093511461040f57600080fd5b80632ad2b7e1146103945780632e17de78146103a7578063313ce567146103ba57600080fd5b806306863e261461031157806306fdde031461032c578063095ea7b3146103415780630e89439b1461036457806318160ddd1461037957806323b872dd14610381575b600080fd5b6103196106d9565b6040519081526020015b60405180910390f35b6103346106f5565b604051610323919061224f565b61035461034f366004612279565b610787565b6040519015158152602001610323565b6103776103723660046122e5565b6107a1565b005b600354610319565b61035461038f366004612331565b6107cd565b6103776103a236600461236d565b6107e8565b6103776103b536600461236d565b61084f565b60405160128152602001610323565b6103196103d7366004612386565b600c6020526000908152604090205481565b6103776103f73660046123b7565b610900565b61037761040a36600461236d565b610911565b61035461041d366004612279565b610971565b610354610430366004612386565b60146020526000908152604090205460ff1681565b610377610453366004612468565b610993565b6103196109e4565b610377610a01565b610319610476366004612279565b610a3f565b6104a27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610323565b610319610a98565b6103776104d036600461248a565b610aa2565b6103196104e336600461236d565b610aad565b610319600f5481565b610319610ace565b610319610507366004612386565b6001600160a01b031660009081526001602052604090205490565b610377610b78565b61037761053836600461236d565b610b8a565b61037761054b366004612386565b610cff565b61031961055e3660046124cc565b610d55565b610319610571366004612386565b610dbd565b61031961058436600461236d565b610e0f565b610591610e63565b604051610323979695949392919061253b565b610319610eec565b6000546001600160a01b03166104a2565b610319600e5481565b6105ce610efe565b60405161032391906125ab565b610334610f55565b6103196105f136600461236d565b610f64565b610354610f85565b61035461060c366004612279565b610f96565b61037761061f36600461236d565b611021565b61035461038f366004612279565b61031960105481565b600b546104a2906001600160a01b031681565b61031961065c366004612279565b61106d565b6103546110c2565b6103196106773660046125be565b6110d4565b6103346110ff565b61031961118d565b61037761069a366004612386565b6111ab565b6103196106ad366004612386565b611221565b6104a27f000000000000000000000000000000000000000000000000000000000000000081565b6000600e546106e6610eec565b6106f09190612607565b905090565b6060600480546107049061261a565b80601f01602080910402602001604051908101604052809291908181526020018280546107309061261a565b801561077d5780601f106107525761010080835404028352916020019161077d565b820191906000526020600020905b81548152906001019060200180831161076057829003601f168201915b5050505050905090565b600033610795818585611277565b60019150505b92915050565b6107a961139b565b6107b43383836113f4565b6107be33846114a7565b6107c86001600a55565b505050565b600060405163ab064ad360e01b815260040160405180910390fd5b6107f06115c7565b80600e541115610813576040516318d7cfc960e11b815260040160405180910390fd5b600f8190556040518181527fac73a90e92241d825f00fe635380c3a52d9764a66fe05df6ba465ca269cdcf8e906020015b60405180910390a150565b61085761139b565b6108613382611621565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156108ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190612654565b506108fd6001600a55565b50565b6109086115c7565b6108fd81611761565b6109196115c7565b600f5481111561093c57604051631962358f60e31b815260040160405180910390fd5b600e8190556040518181527fe7ada3f086eaa57ed8ea5f0ee543b7e9e80ffe73cdc79b63c51eeade5fe7228690602001610844565b60003361079581858561098483836110d4565b61098e9190612676565b611277565b61099b61139b565b336000908152600c60205260409020548210156109cb5760405163045587fd60e31b815260040160405180910390fd5b6109d633838361179d565b6109e06001600a55565b5050565b60006109ee610f85565b6109f85750600090565b426106e66106d9565b610a0961139b565b6000610a13611867565b336000818152600c6020526040902054919250610a3190828461179d565b5050610a3d6001600a55565b565b6001600160a01b038216600090815260066020526040812081908190610a66908590611872565b9150915081610a8d576001600160a01b038516600090815260016020526040902054610a8f565b805b95945050505050565b60006106f0611867565b6109e03383836113f4565b600d8181548110610abd57600080fd5b600091825260209091200154905081565b60006106f06040518060400160405280601c81526020017f5374616b654d65737361676528737472696e67206d6573736167652900000000815250604051602001610b199190612689565b604051602081830303815290604052805190602001206013604051610b3e91906126a5565b604051908190038120610b5d9291602001918252602082015260400190565b60405160208183030381529060405280519060200120611968565b610b806115c7565b610a3d6000611995565b610b9261139b565b600b546001600160a01b03163314610bbd5760405163086bf14760e21b815260040160405180910390fd5b80600003610bde5760405163010cb85960e41b815260040160405180910390fd5b600354600003610c0157604051630355041f60e11b815260040160405180910390fd5b610c096110c2565b610c2657604051636f407c6b60e11b815260040160405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190612654565b5042601055600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5018190556108f26119e5565b610d076115c7565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527fe37acc13f5ed9d0cc83c2842e093fe5a494d5b8fb5b1db06356b327081832f5290602001610844565b600082600003610d78576040516342f66ec960e01b815260040160405180910390fd5b81831180610d8c5750610d89611867565b82115b15610daa57604051630ea8635b60e41b815260040160405180910390fd5b610db5848484611a3f565b949350505050565b600080610dc8611867565b6001600160a01b0384166000908152600c60205260409020549091501580610dee575080155b15610dfc5750600092915050565b610e0883600183611a3f565b9392505050565b600081600003610e32576040516342f66ec960e01b815260040160405180910390fd5b610e3a611867565b821115610e5a57604051630ea8635b60e41b815260040160405180910390fd5b61079b82611a7c565b600060608082808083610e977f00000000000000000000000000000000000000000000000000000000000000006011611aad565b610ec27f00000000000000000000000000000000000000000000000000000000000000006012611aad565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000600f546010546106f09190612676565b6060600d80548060200260200160405190810160405280929190818152602001828054801561077d57602002820191906000526020600020905b815481526020019060010190808311610f38575050505050905090565b6060600580546107049061261a565b6000806000610f74846007611872565b9150915081610e0857600354610db5565b6000610f8f6106d9565b4210905090565b60003381610fa482866110d4565b9050838110156110095760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6110168286868403611277565b506001949350505050565b61102961139b565b3360009081526014602052604090205460ff1661105957604051630e56a41760e31b815260040160405180910390fd5b61106333826114a7565b6108fd6001600a55565b600081600003611090576040516342f66ec960e01b815260040160405180910390fd5b611098611867565b8211156110b857604051630ea8635b60e41b815260040160405180910390fd5b610e088383611b58565b60006110cc610eec565b421015905090565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6013805461110c9061261a565b80601f01602080910402602001604051908101604052809291908181526020018280546111389061261a565b80156111855780601f1061115a57610100808354040283529160200191611185565b820191906000526020600020905b81548152906001019060200180831161116857829003601f168201915b505050505081565b60006111976110c2565b156111a25750600090565b426106e6610eec565b6111b36115c7565b6001600160a01b0381166112185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611000565b6108fd81611995565b60008061122c611867565b6001600160a01b0384166000908152600c6020526040902054909150801580611253575081155b8061125d57508181115b1561126c575060009392505050565b610db5848284611a3f565b6001600160a01b0383166112d95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611000565b6001600160a01b03821661133a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611000565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6002600a54036113ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611000565b6002600a55565b61143c83611400610ace565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8a92505050565b61145957604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b038316600081815260146020526040808220805460ff19166001179055517fdad95f091b1c8a016983f3274e809d4365bf521cfb310b8fbdac95814601c6d89190a2505050565b6114af610f85565b6114cc57604051630123178760e31b815260040160405180910390fd5b6001600160a01b0382166000908152600c602052604081205490036115235760006114f5611867565b905060008111611506576001611508565b805b6001600160a01b0384166000908152600c6020526040902055505b6040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303816000875af1158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190612654565b506109e03382611beb565b6000546001600160a01b03163314610a3d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611000565b6001600160a01b0382166116815760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401611000565b61168d82600083611cb8565b6001600160a01b038216600090815260016020526040902054818110156117015760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401611000565b6001600160a01b03831660008181526001602090815260408083208686039055600380548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b601361176d828261276b565b507fbb4847942d98bb5bb249692c72ce235605e41502e705831e609875320ef2cac781604051610844919061224f565b60006117aa848484610d55565b90506117b7826001612676565b6001600160a01b038581166000818152600c60205260409081902093909355915163a9059cbb60e01b81526004810192909252602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561183c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118609190612654565b5050505050565b60006106f060095490565b600080600084116118be5760405162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b6044820152606401611000565b6118c6611867565b8411156119155760405162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006044820152606401611000565b60006119218486611d00565b84549091508103611939576000809250925050611961565b60018460010182815481106119505761195061282b565b906000526020600020015492509250505b9250929050565b600061079b611975611dad565b8360405161190160f01b8152600281019290925260228201526042902090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006119f5600980546001019055565b60006119ff611867565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051611a3291815260200190565b60405180910390a1919050565b600080835b838111611a7357611a558682611b58565b611a5f9083612676565b915080611a6b81612841565b915050611a44565b50949350505050565b6000600d611a8b600184612607565b81548110611a9b57611a9b61282b565b90600052602060002001549050919050565b606060ff8314611ac757611ac083611ed8565b905061079b565b818054611ad39061261a565b80601f0160208091040260200160405190810160405280929190818152602001828054611aff9061261a565b8015611b4c5780601f10611b2157610100808354040283529160200191611b4c565b820191906000526020600020905b815481529060010190602001808311611b2f57829003601f168201915b5050505050905061079b565b6000611b6382610f64565b611b6d8484610a3f565b611b7684611a7c565b611b80919061285a565b610e089190612871565b6000806000611b998585611f17565b90925090506000816004811115611bb257611bb2612893565b148015611bd05750856001600160a01b0316826001600160a01b0316145b80611be15750611be1868686611f59565b9695505050505050565b6001600160a01b038216611c415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611000565b611c4d60008383611cb8565b8060036000828254611c5f9190612676565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038316611cd757611ccf82612045565b6107c8612078565b6001600160a01b038216611cee57611ccf83612045565b611cf783612045565b6107c882612045565b81546000908103611d135750600061079b565b82546000905b80821015611d60576000611d2d8383612086565b60008781526020902090915085908201541115611d4c57809150611d5a565b611d57816001612676565b92505b50611d19565b600082118015611d8c575083611d8986611d7b600186612607565b600091825260209091200190565b54145b15611da557611d9c600183612607565b9250505061079b565b50905061079b565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611e0657507f000000000000000000000000000000000000000000000000000000000000000046145b15611e3057507f000000000000000000000000000000000000000000000000000000000000000090565b6106f0604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60606000611ee5836120a1565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6000808251604103611f4d5760208301516040840151606085015160001a611f41878285856120c9565b94509450505050611961565b50600090506002611961565b6000806000856001600160a01b0316631626ba7e60e01b8686604051602401611f839291906128a9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611fc19190612689565b600060405180830381855afa9150503d8060008114611ffc576040519150601f19603f3d011682016040523d82523d6000602084013e612001565b606091505b509150915081801561201557506020815110155b8015611be157508051630b135d3f60e11b9061203a90830160209081019084016128c2565b149695505050505050565b6001600160a01b03811660009081526006602090815260408083206001909252909120546108fd919061218d565b61218d565b610a3d600761207360035490565b60006120956002848418612871565b610e0890848416612676565b600060ff8216601f81111561079b57604051632cd44ac360e21b815260040160405180910390fd5b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156121005750600090506003612184565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612154573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661217d57600060019250925050612184565b9150600090505b94509492505050565b6000612197611867565b9050806121a3846121d7565b10156107c8578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b805460009081036121ea57506000919050565b81548290611a8b90600190612607565b919050565b60005b8381101561221a578181015183820152602001612202565b50506000910152565b6000815180845261223b8160208601602086016121ff565b601f01601f19169290920160200192915050565b602081526000610e086020830184612223565b80356001600160a01b03811681146121fa57600080fd5b6000806040838503121561228c57600080fd5b61229583612262565b946020939093013593505050565b60008083601f8401126122b557600080fd5b50813567ffffffffffffffff8111156122cd57600080fd5b60208301915083602082850101111561196157600080fd5b6000806000604084860312156122fa57600080fd5b83359250602084013567ffffffffffffffff81111561231857600080fd5b612324868287016122a3565b9497909650939450505050565b60008060006060848603121561234657600080fd5b61234f84612262565b925061235d60208501612262565b9150604084013590509250925092565b60006020828403121561237f57600080fd5b5035919050565b60006020828403121561239857600080fd5b610e0882612262565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156123c957600080fd5b813567ffffffffffffffff808211156123e157600080fd5b818401915084601f8301126123f557600080fd5b813581811115612407576124076123a1565b604051601f8201601f19908116603f0116810190838211818310171561242f5761242f6123a1565b8160405282815287602084870101111561244857600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000806040838503121561247b57600080fd5b50508035926020909101359150565b6000806020838503121561249d57600080fd5b823567ffffffffffffffff8111156124b457600080fd5b6124c0858286016122a3565b90969095509350505050565b6000806000606084860312156124e157600080fd5b6124ea84612262565b95602085013595506040909401359392505050565b60008151808452602080850194506020840160005b8381101561253057815187529582019590820190600101612514565b509495945050505050565b60ff60f81b8816815260e06020820152600061255a60e0830189612223565b828103604084015261256c8189612223565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152905061259d81856124ff565b9a9950505050505050505050565b602081526000610e0860208301846124ff565b600080604083850312156125d157600080fd5b6125da83612262565b91506125e860208401612262565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561079b5761079b6125f1565b600181811c9082168061262e57607f821691505b60208210810361264e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561266657600080fd5b81518015158114610e0857600080fd5b8082018082111561079b5761079b6125f1565b6000825161269b8184602087016121ff565b9190910192915050565b60008083546126b38161261a565b600182811680156126cb57600181146126e05761270f565b60ff198416875282151583028701945061270f565b8760005260208060002060005b858110156127065781548a8201529084019082016126ed565b50505082870194505b50929695505050505050565b601f8211156107c8576000816000526020600020601f850160051c810160208610156127445750805b601f850160051c820191505b8181101561276357828155600101612750565b505050505050565b815167ffffffffffffffff811115612785576127856123a1565b61279981612793845461261a565b8461271b565b602080601f8311600181146127ce57600084156127b65750858301515b600019600386901b1c1916600185901b178555612763565b600085815260208120601f198616915b828110156127fd578886015182559484019460019091019084016127de565b508582101561281b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060018201612853576128536125f1565b5060010190565b808202811582820484141761079b5761079b6125f1565b60008261288e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fd5b828152604060208201526000610db56040830184612223565b6000602082840312156128d457600080fd5b505191905056fea264697066735822122081c95cd074e3aadaafab5c1e78d6cd3d2b155186c7369efa588814651c2e3c6c64736f6c634300081700330000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000043c3ef32e52f17777789c71002ef4a887df90613000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000a496e64657820436f6f700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c492068617665207265616420616e642061636365707420746865205465726d73206f6620536572766963652e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001253746167696e67205374616b656420505254000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057373507274000000000000000000000000000000000000000000000000000000