@soma-finance/core-contracts
Version:
SOMA Finance core contracts
1,473 lines • 126 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "SomaStaking",
"sourceName": "contracts/soma/SomaStaking/SomaStaking.sol",
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "AdminClaimed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "Claimed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ClaimedImmediate",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "id",
"type": "uint256"
}
],
"name": "RequestCancelled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"indexed": false,
"internalType": "enum ISomaStaking.RequestType",
"name": "requestType",
"type": "uint8"
}
],
"name": "RequestCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "id",
"type": "uint256"
}
],
"name": "RequestFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes32",
"name": "prevPrivileges",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "newPrivileges",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RequiredPrivilegesUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "token",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RewardTokenAdded",
"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": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "seizedRewards",
"type": "uint256[]"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "Seized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "Staked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"components": [
{
"internalType": "uint64",
"name": "unstakeDuration",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "claimDuration",
"type": "uint64"
},
{
"internalType": "uint16",
"name": "earlyUnstakeFee",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "earlyClaimFee",
"type": "uint16"
}
],
"indexed": false,
"internalType": "struct ISomaStaking.StakingConfig",
"name": "prevConfig",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint64",
"name": "unstakeDuration",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "claimDuration",
"type": "uint64"
},
{
"internalType": "uint16",
"name": "earlyUnstakeFee",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "earlyClaimFee",
"type": "uint16"
}
],
"indexed": false,
"internalType": "struct ISomaStaking.StakingConfig",
"name": "newConfig",
"type": "tuple"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "StakingConfigUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "rewardToken",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "startDate",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "endDate",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "StrategyCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "token",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "TokensRecovered",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "Unstaked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "UnstakedImmediate",
"type": "event"
},
{
"inputs": [],
"name": "DEFAULT_PRIVILEGES",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "GLOBAL_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "GLOBAL_SEIZE_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "GLOBAL_UPDATE_PRIVILEGES_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "LOCAL_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "LOCAL_SEIZE_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "LOCAL_UPDATE_PRIVILEGES_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "SOMA",
"outputs": [
{
"internalType": "contract ISOMA",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "TOKEN_RECOVERY_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_asset",
"type": "address"
}
],
"name": "addRewardToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_asset",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
}
],
"name": "adminClaim",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_asset",
"type": "address"
}
],
"name": "adminClaimable",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_assets",
"type": "address[]"
},
{
"internalType": "uint256[][]",
"name": "_ids",
"type": "uint256[][]"
}
],
"name": "cancelClaimRequests",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "_ids",
"type": "uint256[]"
}
],
"name": "cancelUnstakeRequests",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_assets",
"type": "address[]"
},
{
"internalType": "uint256[][]",
"name": "_ids",
"type": "uint256[][]"
}
],
"name": "claim",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_assets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "_amounts",
"type": "uint256[]"
}
],
"name": "claimImmediate",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
},
{
"internalType": "address",
"name": "_asset",
"type": "address"
},
{
"internalType": "uint256",
"name": "_id",
"type": "uint256"
}
],
"name": "claimRequest",
"outputs": [
{
"components": [
{
"internalType": "bytes8",
"name": "hash",
"type": "bytes8"
},
{
"internalType": "uint64",
"name": "timestamp",
"type": "uint64"
},
{
"internalType": "uint128",
"name": "amount",
"type": "uint128"
}
],
"internalType": "struct ISomaStaking.Request",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
},
{
"internalType": "address",
"name": "_asset",
"type": "address"
}
],
"name": "claimable",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "config",
"outputs": [
{
"components": [
{
"internalType": "uint64",
"name": "unstakeDuration",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "claimDuration",
"type": "uint64"
},
{
"internalType": "uint16",
"name": "earlyUnstakeFee",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "earlyClaimFee",
"type": "uint16"
}
],
"internalType": "struct ISomaStaking.StakingConfig",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_assets",
"type": "address[]"
}
],
"name": "createClaimRequests",
"outputs": [
{
"internalType": "uint256[]",
"name": "_ids",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_startDate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_endDate",
"type": "uint256"
},
{
"internalType": "address",
"name": "_rewardToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_rewardAmount",
"type": "uint256"
}
],
"name": "createStrategy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "createUnstakeRequest",
"outputs": [
{
"internalType": "uint256",
"name": "_id",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "currentTPS",
"outputs": [
{
"internalType": "uint256",
"name": "tps_",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
},
{
"internalType": "address",
"name": "_asset",
"type": "address"
}
],
"name": "debt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasPrivileges",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "stakingToken_",
"type": "address"
},
{
"internalType": "address[]",
"name": "rewardTokens_",
"type": "address[]"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "results",
"type": "bytes[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "pendingStrategy",
"outputs": [
{
"components": [
{
"internalType": "uint48",
"name": "startDate",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "endDate",
"type": "uint48"
},
{
"internalType": "address",
"name": "rewardToken",
"type": "address"
},
{
"internalType": "uint128",
"name": "rewardsLocked",
"type": "uint128"
},
{
"internalType": "uint128",
"name": "rewardsUnlocked",
"type": "uint128"
}
],
"internalType": "struct ISomaStaking.Strategy",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "recoverTokens",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "requiredPrivileges",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "rewardToken",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
}
],
"name": "seize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "stake",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
}
],
"name": "stakeOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "stakingToken",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
}
],
"name": "strategy",
"outputs": [
{
"components": [
{
"internalType": "uint48",
"name": "startDate",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "endDate",
"type": "uint48"
},
{
"internalType": "address",
"name": "rewardToken",
"type": "address"
},
{
"internalType": "uint128",
"name": "rewardsLocked",
"type": "uint128"
},
{
"internalType": "uint128",
"name": "rewardsUnlocked",
"type": "uint128"
}
],
"internalType": "struct ISomaStaking.Strategy",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalPendingStrategies",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalPendingUnstake",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalRewardTokens",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalStaked",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalStrategies",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_asset",
"type": "address"
}
],
"name": "tps",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "unpause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "_ids",
"type": "uint256[]"
}
],
"name": "unstake",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "unstakeImmediate",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
},
{
"internalType": "uint256",
"name": "_id",
"type": "uint256"
}
],
"name": "unstakeRequest",
"outputs": [
{
"components": [
{
"internalType": "bytes8",
"name": "hash",
"type": "bytes8"
},
{
"internalType": "uint64",
"name": "timestamp",
"type": "uint64"
},
{
"internalType": "uint128",
"name": "amount",
"type": "uint128"
}
],
"internalType": "struct ISomaStaking.Request",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "_unstakeDuration",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "_claimDuration",
"type": "uint64"
},
{
"internalType": "uint16",
"name": "_earlyUnstakeFee",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "_earlyClaimFee",
"type": "uint16"
}
],
"name": "updateConfig",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "newRequiredPrivileges",
"type": "bytes32"
}
],
"name": "updateRequiredPrivileges",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60c0604052730f3dc00189dbcd1d0c574e48031270cae04c4adf6080526001600160401b0360a05234801561003357600080fd5b5060805160a051615bcf6200009960003960006103ed0152600081816105ab01528181610c980152818161122b015281816112c7015281816114da01528181611a5601528181611dfb01528181611e97015281816122900152612f2d0152615bcf6000f3fe608060405234801561001057600080fd5b50600436106103275760003560e01c806366258068116101b8578063a7c5b41311610104578063d8697598116100a2578063e5261b1d1161007c578063e5261b1d14610872578063eec47d6014610885578063f96d7b801461088f578063fb3ee5711461089857600080fd5b8063d86975981461082e578063e2481dbd14610855578063e449f3411461085f57600080fd5b8063be864d68116100de578063be864d68146107eb578063c72460ee146107fe578063d449300d14610808578063d4570c1c1461081b57600080fd5b8063a7c5b41314610743578063ac9650d8146107b8578063bc88d7e4146107d857600080fd5b80638456cb591161017157806391d148541161014b57806391d14854146106ea578063946d9204146106fd578063a488b71e14610710578063a694fc3a1461073057600080fd5b80638456cb59146106bc5780638b0bd55b146106c457806390672ad8146106d757600080fd5b806366258068146105cd57806367b4cdb8146105e25780636fa3fbda1461060c57806372f702f31461061f57806379502c5514610631578063817b1cd2146106b357600080fd5b80633d173136116102775780634b63885a11610230578063509b6c3f1161020a578063509b6c3f146105605780635c975abb1461058b5780635f3e849f1461059357806363727fc2146105a657600080fd5b80634b63885a146105275780634e6e056f1461053a5780634f814cc51461054d57600080fd5b80633d173136146104b35780633e677297146104bc5780633ee16bf7146104cf5780633f4ba83a146104e257806342623360146104ea57806349aeb46f1461051457600080fd5b8063248a9ca3116102e457806330139280116102be578063301392801461040f578063350b5af0146104365780633a22502c146104495780633cfe9fd11461049a57600080fd5b8063248a9ca3146103c25780632772ce9d146103d55780632a7a0c68146103e857600080fd5b806301ffc9a71461032c5780631b0875a6146103545780631c03e6cc1461036a5780631d8b4c491461037f5780631e26571f14610392578063227102a61461039b575b600080fd5b61033f61033a3660046150f2565b6108ab565b60405190151581526020015b60405180910390f35b61035c6108d6565b60405190815260200161034b565b61037d610378366004615141565b6108e8565b005b61037d61038d3660046151a9565b610a72565b6101945461035c565b61035c7ff28c151dcc22c5bfb460fbc387993d6c0d1c1245ca20aca5f3cbd33f33041eb181565b61035c6103d0366004615214565b610c94565b61033f6103e3366004615214565b610d86565b61035c7f000000000000000000000000000000000000000000000000000000000000000081565b61035c7f520767f2ee41b25d23e3166443601203d348640efb766878c95999973ecd38e181565b61037d61044436600461522d565b610e49565b61045c610457366004615266565b610fb2565b6040805182516001600160c01b03191681526020808401516001600160401b031690820152918101516001600160801b03169082015260600161034b565b6101d254600160c01b90046001600160401b031661035c565b6101ca5461035c565b61035c6104ca366004615141565b610fef565b61037d6104dd366004615214565b611048565b61037d61121a565b61035c6104f8366004615141565b6001600160a01b031660009081526101cf602052604090205490565b61037d6105223660046152d0565b6113a9565b61033f610535366004615141565b6114d6565b61035c610548366004615141565b6115e0565b61037d61055b366004615324565b61166d565b61057361056e366004615214565b611a44565b6040516001600160a01b03909116815260200161034b565b61033f611a52565b61037d6105a1366004615266565b611ae6565b6105737f000000000000000000000000000000000000000000000000000000000000000081565b61035c600080516020615ba383398151915281565b61035c6105f0366004615141565b6001600160a01b031660009081526101ce602052604090205490565b61037d61061a3660046151a9565b611c57565b6101cb546001600160a01b0316610573565b6106a660408051608081018252600080825260208201819052918101829052606081019190915250604080516080810182526101cd546001600160401b038082168352600160401b820416602083015261ffff600160801b8204811693830193909352600160901b9004909116606082015290565b60405161034b9190615363565b6101c95461035c565b61037d611dea565b61037d6106d23660046153a9565b611f76565b61037d6106e53660046151a9565b61207c565b61033f6106f83660046153ea565b61228c565b61037d61070b366004615425565b612383565b61072361071e3660046153a9565b61263e565b60405161034b9190615539565b61037d61073e366004615214565b612814565b610756610751366004615214565b612922565b60405161034b9190815165ffffffffffff9081168252602080840151909116908201526040808301516001600160a01b0316908201526060808301516001600160801b0390811691830191909152608092830151169181019190915260a00190565b6107cb6107c63660046153a9565b6129ee565b60405161034b919061559c565b6107566107e6366004615214565b612ae2565b61035c6107f9366004615214565b612b9b565b61035c6101c85481565b61035c61081636600461522d565b612c92565b61035c61082936600461522d565b612cc9565b61035c7f0b8459b722d944f0580da74c767d2dcae280ce16527c19c825b302a24e208dfd81565b61035c6101c75481565b61037d61086d3660046153a9565b612d44565b61045c6108803660046155fe565b612e67565b61035c6101935481565b6101d75461035c565b61037d6108a6366004615141565b612e9f565b60006001600160e01b0319821663941be9cf60e01b14806108d057506108d082613184565b92915050565b60006108e36101d56131a9565b905090565b33610901600080516020615ba38339815191528261228c565b8061091457506109146101c7548261228c565b6109395760405162461bcd60e51b81526004016109309061562a565b60405180910390fd5b60026001540361095b5760405162461bcd60e51b815260040161093090615657565b600260015561096c6101d5836131b3565b6109b85760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e673a205245574152445f544f4b454e5f455849535453000000006044820152606401610930565b60406109c56101d56131a9565b1115610a045760405162461bcd60e51b815260206004820152600e60248201526d14dd185ada5b99ce88131253525560921b6044820152606401610930565b6001600160a01b0382163b610a2b5760405162461bcd60e51b81526004016109309061568e565b610a34826131c8565b60405133906001600160a01b038416907f3344e0a0f48738979c56a1b9f2cd3425597f76766d53e83439cab3fc30b067c790600090a3505060018055565b600260015403610a945760405162461bcd60e51b815260040161093090615657565b600260015533610aa3816114d6565b610abf5760405162461bcd60e51b8152600401610930906156be565b3360008181526101cf6020526040902085610b1c5760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20494e56414c49445f4153534554535f4c454e47544800006044820152606401610930565b838614610b6b5760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20494e56414c49445f494e5055545f4c454e4754485300006044820152606401610930565b60005b86811015610c86576000868683818110610b8a57610b8a6156f5565b9050602002810190610b9c919061570b565b905090506000898984818110610bb457610bb46156f5565b9050602002016020810190610bc99190615141565b90506000808311610bec5760405162461bcd60e51b815260040161093090615754565b60005b83811015610c5257610c3e8a8a87818110610c0c57610c0c6156f5565b9050602002810190610c1e919061570b565b83818110610c2e57610c2e6156f5565b90506020020135848960016131d8565b90910190610c4b816157a1565b9050610bef565b506001600160a01b03909116600090815260018501602052604090208054909101905550610c7f816157a1565b9050610b6e565b505060018055505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1891906157ba565b6001600160a01b031663248a9ca3836040518263ffffffff1660e01b8152600401610d4591815260200190565b602060405180830381865afa158015610d62573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d091906157d7565b6000610d96610193546106f83390565b80610dc65750610dc67ff28c151dcc22c5bfb460fbc387993d6c0d1c1245ca20aca5f3cbd33f33041eb13361228c565b610e385760405162461bcd60e51b815260206004820152603860248201527f477561726461626c653a20796f7520646f206e6f74206861766520746865207260448201527f6571756972656420726f6c657320746f20646f207468697300000000000000006064820152608401610930565b610e4182613239565b506001919050565b33610e62600080516020615ba38339815191528261228c565b80610e755750610e756101c7548261228c565b610e915760405162461bcd60e51b81526004016109309061562a565b600260015403610eb35760405162461bcd60e51b815260040161093090615657565b60026001556101c954610ec59061327e565b6001600160a01b03831660009081526101d0602052604090205480610f2c5760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e673a20494e53554646494349454e545f434c41494d41424c45006044820152606401610930565b6001600160a01b03841660008181526101d06020526040812055610f519084836134c8565b336001600160a01b0316836001600160a01b0316856001600160a01b03167feb4184e6deaf4d9d0984cd22dcacac383ed3c67600403e9d48a877f32843260084604051610fa091815260200190565b60405180910390a45050600180555050565b6040805160608101825260008082526020820181905291810191909152610fd88361352b565b610fe58284866001613553565b90505b9392505050565b6101c9546000908181611003576000611018565b6110186101c95461101386613656565b613768565b6001600160a01b03851660009081526101ce60205260409020549091506110409082906157f0565b949350505050565b60026001540361106a5760405162461bcd60e51b815260040161093090615657565b600260015533611079816114d6565b6110955760405162461bcd60e51b8152600401610930906156be565b3360008181526101cf602090815260409182902080546101c95484516080810186526101cd546001600160401b038082168352600160401b8204169582019590955261ffff600160801b8604811696820196909652600160901b9094049094166060840152909290918683101561111e5760405162461bcd60e51b815260040161093090615803565b6000871161113e5760405162461bcd60e51b81526004016109309061583a565b6111478261327e565b61115b84846111568a82615871565b61378a565b8682036101c955604081015160009061117990899061ffff16613867565b6101cb546001600160a01b031660008181526101d06020526040812080549394509192849291906111ab9084906157f0565b909155506111d09050876111bf848c615871565b6001600160a01b03841691906134c8565b604080518a81526020810184905233917f0caa32aefed7436cb5c128d4c61517c3b4fd8ca09590ecadc0545441a7954864910160405180910390a250506001805550505050505050565b6000339050806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee97f7f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ab91906157ba565b6001600160a01b031614806113525750806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632d37ead56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611323573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134791906157ba565b6001600160a01b0316145b61139e5760405162461bcd60e51b815260206004820152601f60248201527f534f4d413a204d4153544552206f7220535542204d4153544552206f6e6c79006044820152606401610930565b6113a6613876565b50565b336113c2600080516020615ba38339815191528261228c565b806113d557506113d56101c7548261228c565b6113f15760405162461bcd60e51b81526004016109309061562a565b604080516080810182526001600160401b0387811682528616602082015261ffff8581168284015284166060820152905133907f9462329a02c37f74ff4c4fcc54801197381851fde6531472fd444620fbf0fd9d90611455906101cd908590615884565b60405180910390a280516101cd8054602084015160408501516060909501516001600160401b039485166001600160801b031990931692909217600160401b94909116939093029290921763ffffffff60801b1916600160801b61ffff9485160261ffff60901b191617600160901b93909216929092021790555050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637ceab3b16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a91906157ba565b6001600160a01b031663253bd7b7836115736101945490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156115bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d091906158f7565b6000806115ef6101d5846138c8565b9050808061160b57506101cb546001600160a01b038481169116145b6116275760405162461bcd60e51b81526004016109309061568e565b6101c9541580156116355750805b611640576000611649565b61164983613656565b6001600160a01b03841660009081526101d06020526040902054610fe891906157f0565b33611686600080516020615ba38339815191528261228c565b8061169957506116996101c7548261228c565b6116b55760405162461bcd60e51b81526004016109309061562a565b6002600154036116d75760405162461bcd60e51b815260040161093090615657565b60026001556001600160801b038211156117335760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e673a204d41585f5245574152445f414d4f554e540000000000006044820152606401610930565b4285116117825760405162461bcd60e51b815260206004820152601b60248201527f5374616b696e673a20494e56414c49445f53544152545f4441544500000000006044820152606401610930565b8385106117d15760405162461bcd60e51b815260206004820152601b60248201527f5374616b696e673a20494e56414c49445f444154455f4f5244455200000000006044820152606401610930565b65ffffffffffff8411156118275760405162461bcd60e51b815260206004820152601960248201527f5374616b696e673a20494e56414c49445f454e445f44415445000000000000006044820152606401610930565b6118308361352b565b61183c833330856138ea565b91506000821161185e5760405162461bcd60e51b81526004016109309061583a565b6101d754604081106118a35760405162461bcd60e51b815260206004820152600e60248201526d14dd185ada5b99ce88131253525560921b6044820152606401610930565b60006040518060a001604052808865ffffffffffff1681526020018765ffffffffffff168152602001866001600160a01b031681526020016118e4866139f1565b6001600160801b039081168252600060209283018190526101d780546001810182559152835160029091027f069f7b5e1776a2d4bf57d8efb3ff6de682dcba14407464b37d674a8bd8984923810180549486015160408701516001600160a01b0316600160601b026bffffffffffffffffffffffff65ffffffffffff928316600160301b026bffffffffffffffffffffffff1990981692909516919091179590951792909216939093179055606083015160808401518216600160801b029116177f069f7b5e1776a2d4bf57d8efb3ff6de682dcba14407464b37d674a8bd89849249091015590506119d96101d28389613a5e565b33606080830151604080516001600160801b039092168252602082018b905281018990526001600160a01b03928316928816917f4b43c543dc2da7e74df4d701157b31ed22b9fb6a39f9c5329fff7f250b65a872910160405180910390a35050600180555050505050565b60006108d06101d583614055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad691906158f7565b806108e357505060655460ff1690565b7f0b8459b722d944f0580da74c767d2dcae280ce16527c19c825b302a24e208dfd611b11813361228c565b611b8d5760405162461bcd60e51b815260206004820152604160248201527f536f6d61416363657373436f6e74726f6c3a2063616c6c657220646f6573206e60448201527f6f7420686176652074686520617070726f70726961746520617574686f7269746064820152607960f81b608482015260a401610930565b611b9961015f856138c8565b15611be65760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e5265636f766572793a20494e56414c49445f544f4b454e000000006044820152606401610930565b611bfa6001600160a01b03851684846134c8565b336001600160a01b0316836001600160a01b0316856001600160a01b03167fca574176b1d34032f40f7fb0c519eae468b4535ebf7b27f986a7b6e2fa53d53885604051611c4991815260200190565b60405180910390a450505050565b600260015403611c795760405162461bcd60e51b815260040161093090615657565b600260015533611c88816114d6565b611ca45760405162461bcd60e51b8152600401610930906156be565b838214611cf35760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20494e434f4e53495354454e545f4c454e475448530000006044820152606401610930565b3360008181526101cf602090815260409182902082516080810184526101cd546001600160401b038082168352600160401b8204169382019390935261ffff600160801b8404811694820194909452600160901b909204909216606082015281546101c954611d619061327e565b611d6c83828361378a565b60005b88811015611dda57611dca84846060015161ffff16878d8d86818110611d9757611d976156f5565b9050602002016020810190611dac9190615141565b8c8c87818110611dbe57611dbe6156f5565b90506020020135614061565b611dd3816157a1565b9050611d6f565b5050600180555050505050505050565b6000339050806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee97f7f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b91906157ba565b6001600160a01b03161480611f225750806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632d37ead56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1791906157ba565b6001600160a01b0316145b611f6e5760405162461bcd60e51b815260206004820152601f60248201527f534f4d413a204d4153544552206f7220535542204d4153544552206f6e6c79006044820152606401610930565b6113a66141fe565b600260015403611f985760405162461bcd60e51b815260040161093090615657565b600260015533611fa7816114d6565b611fc35760405162461bcd60e51b8152600401610930906156be565b3360008181526101cf6020526040902080546101c95485611ff65760405162461bcd60e51b815260040161093090615754565b6101cb546001600160a01b03168260005b88811015612048576120348a8a83818110612024576120246156f5565b90506020020135848960006131d8565b90910190612041816157a1565b9050612007565b506120528361327e565b61205d85858361378a565b9182016101c955506101ca805491909103905550506001805550505050565b60026001540361209e5760405162461bcd60e51b815260040161093090615657565b6002600155336120ad816114d6565b6120c95760405162461bcd60e51b8152600401610930906156be565b6101cd543390600160401b90046001600160401b031683861461212e5760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20494e56414c49445f494e5055545f4c454e4754485300006044820152606401610930565b60005b86811015610c8657600086868381811061214d5761214d6156f5565b905060200281019061215f919061570b565b905090506000898984818110612177576121776156f5565b905060200201602081019061218c9190615141565b905060008083116121af5760405162461bcd60e51b815260040161093090615754565b60005b83811015612216576122028a8a878181106121cf576121cf6156f5565b90506020028101906121e1919061570b565b838181106121f1576121f16156f5565b90506020020135848989600161423b565b9091019061220f816157a1565b90506121b2565b5061222b6001600160a01b03831687836134c8565b856001600160a01b0316826001600160a01b03167f7e6632ca16a0ac6cf28448500b1a17d96c8b8163ad4c4a9b44ef5386cc02779e8360405161227091815260200190565b60405180910390a350505080612285906157a1565b9050612131565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122ec573d6000803e3d6