More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 203 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 17598107 | 634 days ago | IN | 0 ETH | 0.00101616 | ||||
Withdraw | 17598106 | 634 days ago | IN | 0 ETH | 0.00670007 | ||||
Withdraw | 15947870 | 865 days ago | IN | 0 ETH | 0.00222997 | ||||
Withdraw | 15927747 | 868 days ago | IN | 0 ETH | 0.05563597 | ||||
Withdraw | 15899407 | 872 days ago | IN | 0 ETH | 0.00610553 | ||||
Withdraw | 15832343 | 882 days ago | IN | 0 ETH | 0.00581878 | ||||
Withdraw | 15771154 | 890 days ago | IN | 0 ETH | 0.00590163 | ||||
Withdraw | 15771104 | 890 days ago | IN | 0 ETH | 0.00713917 | ||||
Deposit | 15641394 | 908 days ago | IN | 0 ETH | 0.00594283 | ||||
Deposit | 15573705 | 918 days ago | IN | 0 ETH | 0.00130456 | ||||
Withdraw | 15538320 | 923 days ago | IN | 0 ETH | 0.00208907 | ||||
Withdraw | 15527906 | 924 days ago | IN | 0 ETH | 0.00854829 | ||||
Withdraw | 15454456 | 936 days ago | IN | 0 ETH | 0.00640668 | ||||
Withdraw | 15437993 | 939 days ago | IN | 0 ETH | 0.00379876 | ||||
Withdraw | 15437359 | 939 days ago | IN | 0 ETH | 0.00467178 | ||||
Withdraw | 15420312 | 942 days ago | IN | 0 ETH | 0.0017062 | ||||
Withdraw | 15413307 | 943 days ago | IN | 0 ETH | 0.00209999 | ||||
Withdraw | 15407395 | 944 days ago | IN | 0 ETH | 0.00223769 | ||||
Withdraw | 15364906 | 951 days ago | IN | 0 ETH | 0.00060115 | ||||
Withdraw | 15364902 | 951 days ago | IN | 0 ETH | 0.00425593 | ||||
Withdraw | 15351556 | 953 days ago | IN | 0 ETH | 0.00425605 | ||||
Withdraw | 15350243 | 953 days ago | IN | 0 ETH | 0.00324386 | ||||
Withdraw | 15274597 | 965 days ago | IN | 0 ETH | 0.00682371 | ||||
Withdraw | 15265298 | 966 days ago | IN | 0 ETH | 0.00561226 | ||||
Withdraw | 15256166 | 968 days ago | IN | 0 ETH | 0.00455598 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AGFIStaking
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-01 */ // File: contracts/@openzeppelin/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/@openzeppelin/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: contracts/@openzeppelin/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev 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. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/@openzeppelin/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/@openzeppelin/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: contracts/@openzeppelin/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/@openzeppelin/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/Staking.sol pragma solidity ^0.8.14; /** * @title AGFI Staking * @author Aggregated Finance * @notice AGFIStaking is a contract that allows AGFI deposits and receives AGFI sent from the AGFI staking tax channel * harvests. Users deposit AGFI and receive a share of what has been sent from the AGFI contract based on their participation of * the total deposited AGFI. * This contract is a fork from sJOE, but just rewarding the same token that is staked * Every time `updateReward(token)` is called, We distribute the balance of that tokens as rewards to users that are * currently staking inside this contract, and they can claim it using `withdraw(0)` */ contract AGFIStaking is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; /// @notice Info of each user struct UserInfo { uint256 amount; mapping(IERC20 => uint256) rewardDebt; /** * @notice We do some fancy math here. Basically, any point in time, the amount of AGFI * entitled to a user but is pending to be distributed is: * * pending reward = (user.amount * accRewardPerShare) - user.rewardDebt[token] * * Whenever a user deposits or withdraws AGFI. Here's what happens: * 1. accRewardPerShare (and `lastRewardBalance`) gets updated * 2. User receives the pending reward sent to his/her address * 3. User's `amount` gets updated * 4. User's `rewardDebt[token]` gets updated */ } IERC20 public agfi; /// @dev Internal balance of AGFI, this gets updated on user deposits / withdrawals /// this allows to reward users with AGFI uint256 public internalAGFIBalance; /// @notice Array of tokens that users can claim IERC20[] public rewardTokens; mapping(IERC20 => bool) public isRewardToken; /// @notice Last reward balance of `token` mapping(IERC20 => uint256) public lastRewardBalance; address public feeCollector; /// @notice The deposit fee, scaled to `DEPOSIT_FEE_PERCENT_PRECISION` uint256 public depositFeePercent; /// @notice The precision of `depositFeePercent` uint256 public DEPOSIT_FEE_PERCENT_PRECISION; /// @notice Accumulated `token` rewards per share, scaled to `ACC_REWARD_PER_SHARE_PRECISION` mapping(IERC20 => uint256) public accRewardPerShare; /// @notice The precision of `accRewardPerShare` uint256 public ACC_REWARD_PER_SHARE_PRECISION; /// @dev Info of each user that stakes AGFI mapping(address => UserInfo) private userInfo; /// @notice Emitted when a user deposits AGFI event Deposit(address indexed user, uint256 amount, uint256 fee); /// @notice Emitted when owner changes the deposit fee percentage event DepositFeeChanged(uint256 newFee, uint256 oldFee); /// @notice Emitted when a user withdraws AGFI event Withdraw(address indexed user, uint256 amount); /// @notice Emitted when a user claims reward event ClaimReward(address indexed user, address indexed rewardToken, uint256 amount); /// @notice Emitted when a user emergency withdraws its AGFI event EmergencyWithdraw(address indexed user, uint256 amount); /// @notice Emitted when owner adds a token to the reward tokens list event RewardTokenAdded(address token); /// @notice Emitted when owner removes a token from the reward tokens list event RewardTokenRemoved(address token); /** * @notice Initialize a new AGFIStaking contract * @dev This contract needs to receive an ERC20 `_rewardToken` in order to distribute them * @param _rewardToken The address of the ERC20 reward token * @param _agfi The address of the AGFI token * @param _feeCollector The address where deposit fees will be sent * @param _depositFeePercent The deposit fee percent, scalled to 1e18, e.g. 3% is 3e16 */ constructor( IERC20 _rewardToken, IERC20 _agfi, address _feeCollector, uint256 _depositFeePercent ) { require(address(_rewardToken) != address(0), "AGFIStaking: reward token can't be address(0)"); require(address(_agfi) != address(0), "AGFIStaking: agfi can't be address(0)"); require(_feeCollector != address(0), "AGFIStaking: fee collector can't be address(0)"); require(_depositFeePercent <= 5e17, "AGFIStaking: max deposit fee can't be greater than 50%"); agfi = _agfi; depositFeePercent = _depositFeePercent; feeCollector = _feeCollector; isRewardToken[_rewardToken] = true; rewardTokens.push(_rewardToken); DEPOSIT_FEE_PERCENT_PRECISION = 1e18; ACC_REWARD_PER_SHARE_PRECISION = 1e24; } /** * @notice Deposit AGFI for reward token allocation * @param _amount The amount of AGFI to deposit */ function deposit(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[_msgSender()]; uint256 _fee = _amount.mul(depositFeePercent).div(DEPOSIT_FEE_PERCENT_PRECISION); uint256 _amountMinusFee = _amount.sub(_fee); uint256 _previousAmount = user.amount; uint256 _newAmount = user.amount.add(_amountMinusFee); user.amount = _newAmount; uint256 _len = rewardTokens.length; for (uint256 i; i < _len; i++) { IERC20 _token = rewardTokens[i]; updateReward(_token); uint256 _previousRewardDebt = user.rewardDebt[_token]; user.rewardDebt[_token] = _newAmount.mul(accRewardPerShare[_token]).div(ACC_REWARD_PER_SHARE_PRECISION); if (_previousAmount != 0) { uint256 _pending = _previousAmount .mul(accRewardPerShare[_token]) .div(ACC_REWARD_PER_SHARE_PRECISION) .sub(_previousRewardDebt); if (_pending != 0) { safeTokenTransfer(_token, _msgSender(), _pending); emit ClaimReward(_msgSender(), address(_token), _pending); } } } internalAGFIBalance = internalAGFIBalance.add(_amountMinusFee); agfi.safeTransferFrom(_msgSender(), feeCollector, _fee); agfi.safeTransferFrom(_msgSender(), address(this), _amountMinusFee); emit Deposit(_msgSender(), _amountMinusFee, _fee); } /** * @notice Get user info * @param _user The address of the user * @param _rewardToken The address of the reward token * @return The amount of AGFI user has deposited * @return The reward debt for the chosen token */ function getUserInfo(address _user, IERC20 _rewardToken) external view returns (uint256, uint256) { UserInfo storage user = userInfo[_user]; return (user.amount, user.rewardDebt[_rewardToken]); } /** * @notice Get the number of reward tokens * @return The length of the array */ function rewardTokensLength() external view returns (uint256) { return rewardTokens.length; } /** * @notice Add a reward token * @param _rewardToken The address of the reward token */ function addRewardToken(IERC20 _rewardToken) external onlyOwner { require( !isRewardToken[_rewardToken] && address(_rewardToken) != address(0), "AGFIStaking: token can't be added" ); require(rewardTokens.length < 25, "AGFIStaking: list of token too big"); rewardTokens.push(_rewardToken); isRewardToken[_rewardToken] = true; updateReward(_rewardToken); emit RewardTokenAdded(address(_rewardToken)); } /** * @notice Remove a reward token * @param _rewardToken The address of the reward token */ function removeRewardToken(IERC20 _rewardToken) external onlyOwner { require(isRewardToken[_rewardToken], "AGFIStaking: token can't be removed"); updateReward(_rewardToken); isRewardToken[_rewardToken] = false; uint256 _len = rewardTokens.length; for (uint256 i; i < _len; i++) { if (rewardTokens[i] == _rewardToken) { rewardTokens[i] = rewardTokens[_len - 1]; rewardTokens.pop(); break; } } emit RewardTokenRemoved(address(_rewardToken)); } /** * @notice Set the deposit fee percent * @param _depositFeePercent The new deposit fee percent */ function setDepositFeePercent(uint256 _depositFeePercent) external onlyOwner { require(_depositFeePercent <= 5e17, "AGFIStaking: deposit fee can't be greater than 50%"); uint256 oldFee = depositFeePercent; depositFeePercent = _depositFeePercent; emit DepositFeeChanged(_depositFeePercent, oldFee); } /** * @notice View function to see pending reward token on frontend * @param _user The address of the user * @param _token The address of the token * @return `_user`'s pending reward token */ function pendingReward(address _user, IERC20 _token) external view returns (uint256) { require(isRewardToken[_token], "AGFIStaking: wrong reward token"); UserInfo storage user = userInfo[_user]; uint256 _totalAGFI = internalAGFIBalance; uint256 _accRewardTokenPerShare = accRewardPerShare[_token]; uint256 _currRewardBalance = _token.balanceOf(address(this)); uint256 _rewardBalance = _token == agfi ? _currRewardBalance.sub(_totalAGFI) : _currRewardBalance; if (_rewardBalance != lastRewardBalance[_token] && _totalAGFI != 0) { uint256 _accruedReward = _rewardBalance.sub(lastRewardBalance[_token]); _accRewardTokenPerShare = _accRewardTokenPerShare.add( _accruedReward.mul(ACC_REWARD_PER_SHARE_PRECISION).div(_totalAGFI) ); } return user.amount.mul(_accRewardTokenPerShare).div(ACC_REWARD_PER_SHARE_PRECISION).sub(user.rewardDebt[_token]); } /** * @notice Withdraw AGFI and harvest the rewards * @param _amount The amount of AGFI to withdraw */ function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[_msgSender()]; uint256 _previousAmount = user.amount; require(_amount <= _previousAmount, "AGFIStaking: withdraw amount exceeds balance"); uint256 _newAmount = user.amount.sub(_amount); user.amount = _newAmount; uint256 _len = rewardTokens.length; if (_previousAmount != 0) { for (uint256 i; i < _len; i++) { IERC20 _token = rewardTokens[i]; updateReward(_token); uint256 _pending = _previousAmount .mul(accRewardPerShare[_token]) .div(ACC_REWARD_PER_SHARE_PRECISION) .sub(user.rewardDebt[_token]); user.rewardDebt[_token] = _newAmount.mul(accRewardPerShare[_token]).div(ACC_REWARD_PER_SHARE_PRECISION); if (_pending != 0) { safeTokenTransfer(_token, _msgSender(), _pending); emit ClaimReward(_msgSender(), address(_token), _pending); } } } internalAGFIBalance = internalAGFIBalance.sub(_amount); agfi.safeTransfer(_msgSender(), _amount); emit Withdraw(_msgSender(), _amount); } /** * @notice Withdraw without caring about rewards. EMERGENCY ONLY */ function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[_msgSender()]; uint256 _amount = user.amount; user.amount = 0; uint256 _len = rewardTokens.length; for (uint256 i; i < _len; i++) { IERC20 _token = rewardTokens[i]; user.rewardDebt[_token] = 0; } internalAGFIBalance = internalAGFIBalance.sub(_amount); agfi.safeTransfer(_msgSender(), _amount); emit EmergencyWithdraw(_msgSender(), _amount); } /** * @notice Update reward variables * @param _token The address of the reward token * @dev Needs to be called before any deposit or withdrawal */ function updateReward(IERC20 _token) public { require(isRewardToken[_token], "AGFIStaking: wrong reward token"); uint256 _totalAGFI = internalAGFIBalance; uint256 _currRewardBalance = _token.balanceOf(address(this)); uint256 _rewardBalance = _token == agfi ? _currRewardBalance.sub(_totalAGFI) : _currRewardBalance; // Did AGFIStaking receive any token if (_rewardBalance == lastRewardBalance[_token] || _totalAGFI == 0) { return; } uint256 _accruedReward = _rewardBalance.sub(lastRewardBalance[_token]); accRewardPerShare[_token] = accRewardPerShare[_token].add( _accruedReward.mul(ACC_REWARD_PER_SHARE_PRECISION).div(_totalAGFI) ); lastRewardBalance[_token] = _rewardBalance; } /** * @notice Safe token transfer function, just in case if rounding error * causes pool to not have enough reward tokens * @param _token The address of then token to transfer * @param _to The address that will receive `_amount` `rewardToken` * @param _amount The amount to send to `_to` */ function safeTokenTransfer( IERC20 _token, address _to, uint256 _amount ) internal { uint256 _currRewardBalance = _token.balanceOf(address(this)); uint256 _rewardBalance = _token == agfi ? _currRewardBalance.sub(internalAGFIBalance) : _currRewardBalance; if (_amount > _rewardBalance) { lastRewardBalance[_token] = lastRewardBalance[_token].sub(_rewardBalance); _token.safeTransfer(_to, _rewardBalance); } else { lastRewardBalance[_token] = lastRewardBalance[_token].sub(_amount); _token.safeTransfer(_to, _amount); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IERC20","name":"_agfi","type":"address"},{"internalType":"address","name":"_feeCollector","type":"address"},{"internalType":"uint256","name":"_depositFeePercent","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"}],"name":"DepositFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":"address","name":"token","type":"address"}],"name":"RewardTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"RewardTokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ACC_REWARD_PER_SHARE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_FEE_PERCENT_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"accRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"}],"name":"addRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"agfi","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"internalAGFIBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"isRewardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"lastRewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"}],"name":"removeRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositFeePercent","type":"uint256"}],"name":"setDepositFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001d3638038062001d3683398101604081905262000034916200031c565b6200003f33620002b3565b600180556001600160a01b038416620000b55760405162461bcd60e51b815260206004820152602d60248201527f414746495374616b696e673a2072657761726420746f6b656e2063616e27742060448201526c6265206164647265737328302960981b60648201526084015b60405180910390fd5b6001600160a01b0383166200011b5760405162461bcd60e51b815260206004820152602560248201527f414746495374616b696e673a20616766692063616e2774206265206164647265604482015264737328302960d81b6064820152608401620000ac565b6001600160a01b0382166200018a5760405162461bcd60e51b815260206004820152602e60248201527f414746495374616b696e673a2066656520636f6c6c6563746f722063616e277460448201526d206265206164647265737328302960901b6064820152608401620000ac565b6706f05b59d3b200008111156200020a5760405162461bcd60e51b815260206004820152603660248201527f414746495374616b696e673a206d6178206465706f736974206665652063616e60448201527f27742062652067726561746572207468616e20353025000000000000000000006064820152608401620000ac565b600280546001600160a01b03199081166001600160a01b03958616179091556008919091556007805482169284169290921790915591166000818152600560205260408120805460ff191660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018054909216179055670de0b6b3a764000060095569d3c21bcecceda1000000600b5562000376565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200031957600080fd5b50565b600080600080608085870312156200033357600080fd5b8451620003408162000303565b6020860151909450620003538162000303565b6040860151909350620003668162000303565b6060959095015193969295505050565b6119b080620003866000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80639ced7e76116100c3578063cc1252ae1161007c578063cc1252ae146102d0578063cd5dfd87146102d9578063db2e21bc146102ec578063eb553a5e146102f4578063f2801fe7146102fd578063f2fde38b1461035357600080fd5b80639ced7e7614610253578063a610708a14610266578063b5fd73f81461026f578063b6b55f25146102a2578063bf199e62146102b5578063c415b95c146102bd57600080fd5b80635dcea4d4116101155780635dcea4d4146101bc5780635fc0d9e0146101dc578063632447c9146101fc578063715018a61461020f5780637bb7bed1146102175780638da5cb5b1461024257600080fd5b80631c03e6cc146101525780632052eb77146101675780632e1a7d4d1461017a5780633c97d5ae1461018d5780633d509c97146101a9575b600080fd5b61016561016036600461171e565b610366565b005b61016561017536600461173b565b610528565b61016561018836600461173b565b61060b565b610196600b5481565b6040519081526020015b60405180910390f35b6101656101b736600461171e565b610869565b6101966101ca36600461171e565b600a6020526000908152604090205481565b6101966101ea36600461171e565b60066020526000908152604090205481565b61016561020a36600461171e565b610a6f565b610165610c31565b61022a61022536600461173b565b610c67565b6040516001600160a01b0390911681526020016101a0565b6000546001600160a01b031661022a565b610196610261366004611754565b610c91565b61019660095481565b61029261027d36600461171e565b60056020526000908152604090205460ff1681565b60405190151581526020016101a0565b6101656102b036600461173b565b610e6f565b600454610196565b60075461022a906001600160a01b031681565b61019660085481565b60025461022a906001600160a01b031681565b6101656110ac565b61019660035481565b61033e61030b366004611754565b6001600160a01b038083166000908152600c60209081526040808320805494861684526001019091529020549250929050565b604080519283526020830191909152016101a0565b61016561036136600461171e565b6111aa565b6000546001600160a01b031633146103995760405162461bcd60e51b81526004016103909061178d565b60405180910390fd5b6001600160a01b03811660009081526005602052604090205460ff161580156103ca57506001600160a01b03811615155b6104205760405162461bcd60e51b815260206004820152602160248201527f414746495374616b696e673a20746f6b656e2063616e277420626520616464656044820152601960fa1b6064820152608401610390565b60045460191161047d5760405162461bcd60e51b815260206004820152602260248201527f414746495374616b696e673a206c697374206f6620746f6b656e20746f6f2062604482015261696760f01b6064820152608401610390565b6004805460018082019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0384169081179091556000908152600560205260409020805460ff191690911790556104e981610a6f565b6040516001600160a01b03821681527ff3e4c2c64e71e6ba2eaab9a599bced62f9eb91d2cda610bf41aa8c80ff2cf8269060200160405180910390a150565b6000546001600160a01b031633146105525760405162461bcd60e51b81526004016103909061178d565b6706f05b59d3b200008111156105c55760405162461bcd60e51b815260206004820152603260248201527f414746495374616b696e673a206465706f736974206665652063616e27742062604482015271652067726561746572207468616e2035302560701b6064820152608401610390565b600880549082905560408051838152602081018390527f6be5411ea11f30380402ca68832d060d744cbc5f62d2344495c10256ba93904a91015b60405180910390a15050565b60026001540361062d5760405162461bcd60e51b8152600401610390906117c2565b6002600155336000908152600c602052604090208054808311156106a85760405162461bcd60e51b815260206004820152602c60248201527f414746495374616b696e673a20776974686472617720616d6f756e742065786360448201526b656564732062616c616e636560a01b6064820152608401610390565b81546000906106b79085611245565b80845560045490915082156108025760005b81811015610800576000600482815481106106e6576106e66117f9565b6000918252602090912001546001600160a01b0316905061070681610a6f565b6001600160a01b0381166000908152600187016020908152604080832054600b54600a9093529083205461074f9261074991610743908b90611258565b90611264565b90611245565b600b546001600160a01b0384166000908152600a602052604090205491925061077d91610743908890611258565b6001600160a01b038316600090815260018901602052604090205580156107eb576107aa82335b83611270565b6040518181526001600160a01b0383169033907f7e77f685b38c861064cb08f2776eb5dfd3c82f652ed9f21221b8c53b75628e519060200160405180910390a35b505080806107f890611825565b9150506106c9565b505b60035461080f9086611245565b600355610829336002546001600160a01b031690876113b4565b60405185815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2505060018055505050565b6000546001600160a01b031633146108935760405162461bcd60e51b81526004016103909061178d565b6001600160a01b03811660009081526005602052604090205460ff166109075760405162461bcd60e51b815260206004820152602360248201527f414746495374616b696e673a20746f6b656e2063616e27742062652072656d6f6044820152621d995960ea1b6064820152608401610390565b61091081610a6f565b6001600160a01b0381166000908152600560205260408120805460ff19169055600454905b81811015610a3557826001600160a01b03166004828154811061095a5761095a6117f9565b6000918252602090912001546001600160a01b031603610a2357600461098160018461183e565b81548110610991576109916117f9565b600091825260209091200154600480546001600160a01b0390921691839081106109bd576109bd6117f9565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060048054806109fc576109fc611855565b600082815260209020810160001990810180546001600160a01b0319169055019055610a35565b80610a2d81611825565b915050610935565b506040516001600160a01b03831681527f66257bcef574219c04f7c05f7a1c78d599da10491294c92a5805c48b4cdf5009906020016105ff565b6001600160a01b03811660009081526005602052604090205460ff16610ad75760405162461bcd60e51b815260206004820152601f60248201527f414746495374616b696e673a2077726f6e672072657761726420746f6b656e006044820152606401610390565b6003546040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b45919061186b565b6002549091506000906001600160a01b03858116911614610b665781610b70565b610b708284611245565b6001600160a01b038516600090815260066020526040902054909150811480610b97575082155b15610ba25750505050565b6001600160a01b038416600090815260066020526040812054610bc6908390611245565b9050610c03610be485610743600b548561125890919063ffffffff16565b6001600160a01b0387166000908152600a60205260409020549061141c565b6001600160a01b039095166000908152600a6020908152604080832097909755600690529490942055505050565b6000546001600160a01b03163314610c5b5760405162461bcd60e51b81526004016103909061178d565b610c656000611428565b565b60048181548110610c7757600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03811660009081526005602052604081205460ff16610cf95760405162461bcd60e51b815260206004820152601f60248201527f414746495374616b696e673a2077726f6e672072657761726420746f6b656e006044820152606401610390565b6001600160a01b038381166000908152600c60209081526040808320600354948716808552600a9093528184205491516370a0823160e01b81523060048201529094939192906370a0823190602401602060405180830381865afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d89919061186b565b6002549091506000906001600160a01b03888116911614610daa5781610db4565b610db48285611245565b6001600160a01b0388166000908152600660205260409020549091508114801590610dde57508315155b15610e30576001600160a01b038716600090815260066020526040812054610e07908390611245565b9050610e2c610e2586610743600b548561125890919063ffffffff16565b859061141c565b9350505b6001600160a01b0387166000908152600186016020526040902054600b548654610e639291610749916107439088611258565b98975050505050505050565b600260015403610e915760405162461bcd60e51b8152600401610390906117c2565b6002600155336000908152600c60205260408120600954600854919291610ebe9190610743908690611258565b90506000610ecc8483611245565b83549091506000610edd828461141c565b80865560045490915060005b8181101561101d57600060048281548110610f0657610f066117f9565b6000918252602090912001546001600160a01b03169050610f2681610a6f565b6001600160a01b0381166000908152600189016020908152604080832054600b54600a909352922054610f5f9190610743908890611258565b6001600160a01b038316600090815260018b016020526040902055851561100857600b546001600160a01b0383166000908152600a60205260408120549091610fb391849161074991610743908c90611258565b9050801561100657610fc583336107a4565b6040518181526001600160a01b0384169033907f7e77f685b38c861064cb08f2776eb5dfd3c82f652ed9f21221b8c53b75628e519060200160405180910390a35b505b5050808061101590611825565b915050610ee9565b5060035461102b908561141c565b60035561104c336007546002546001600160a01b0390811692911688611478565b611064336002546001600160a01b0316903087611478565b604080518581526020810187905233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a25050600180555050505050565b6002600154036110ce5760405162461bcd60e51b8152600401610390906117c2565b6002600155336000908152600c60205260408120805482825560045491929091905b818110156111445760006004828154811061110d5761110d6117f9565b60009182526020808320909101546001600160a01b031682526001870190526040812055508061113c81611825565b9150506110f0565b506003546111529083611245565b60035561116c336002546001600160a01b031690846113b4565b60405182815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b031633146111d45760405162461bcd60e51b81526004016103909061178d565b6001600160a01b0381166112395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610390565b61124281611428565b50565b6000611251828461183e565b9392505050565b60006112518284611884565b600061125182846118a3565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156112b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112db919061186b565b6002549091506000906001600160a01b038681169116146112fc578161130a565b60035461130a908390611245565b905080831115611363576001600160a01b0385166000908152600660205260409020546113379082611245565b6001600160a01b03861660008181526006602052604090209190915561135e9085836113b4565b6113ad565b6001600160a01b0385166000908152600660205260409020546113869084611245565b6001600160a01b0386166000818152600660205260409020919091556113ad9085856113b4565b5050505050565b6040516001600160a01b03831660248201526044810182905261141790849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114b6565b505050565b600061125182846118c5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526114b09085906323b872dd60e01b906084016113e0565b50505050565b600061150b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115889092919063ffffffff16565b805190915015611417578080602001905181019061152991906118dd565b6114175760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610390565b6060611597848460008561159f565b949350505050565b6060824710156116005760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610390565b6001600160a01b0385163b6116575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610390565b600080866001600160a01b03168587604051611673919061192b565b60006040518083038185875af1925050503d80600081146116b0576040519150601f19603f3d011682016040523d82523d6000602084013e6116b5565b606091505b50915091506116c58282866116d0565b979650505050505050565b606083156116df575081611251565b8251156116ef5782518084602001fd5b8160405162461bcd60e51b81526004016103909190611947565b6001600160a01b038116811461124257600080fd5b60006020828403121561173057600080fd5b813561125181611709565b60006020828403121561174d57600080fd5b5035919050565b6000806040838503121561176757600080fd5b823561177281611709565b9150602083013561178281611709565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016118375761183761180f565b5060010190565b6000828210156118505761185061180f565b500390565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561187d57600080fd5b5051919050565b600081600019048311821515161561189e5761189e61180f565b500290565b6000826118c057634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156118d8576118d861180f565b500190565b6000602082840312156118ef57600080fd5b8151801515811461125157600080fd5b60005b8381101561191a578181015183820152602001611902565b838111156114b05750506000910152565b6000825161193d8184602087016118ff565b9190910192915050565b60208152600082518060208401526119668160408501602087016118ff565b601f01601f1916919091016040019291505056fea26469706673582212200ebe555f0d1ca76034b9485e4bdbde0f2705e5ba9e8dd5ab20082333455c8f4164736f6c634300080e00330000000000000000000000004d0f56d728c5232ab07faa0bdcba23670a35451f0000000000000000000000004d0f56d728c5232ab07faa0bdcba23670a35451f0000000000000000000000003e822d55e79ea9f53c744bd9179d89ddec0815560000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80639ced7e76116100c3578063cc1252ae1161007c578063cc1252ae146102d0578063cd5dfd87146102d9578063db2e21bc146102ec578063eb553a5e146102f4578063f2801fe7146102fd578063f2fde38b1461035357600080fd5b80639ced7e7614610253578063a610708a14610266578063b5fd73f81461026f578063b6b55f25146102a2578063bf199e62146102b5578063c415b95c146102bd57600080fd5b80635dcea4d4116101155780635dcea4d4146101bc5780635fc0d9e0146101dc578063632447c9146101fc578063715018a61461020f5780637bb7bed1146102175780638da5cb5b1461024257600080fd5b80631c03e6cc146101525780632052eb77146101675780632e1a7d4d1461017a5780633c97d5ae1461018d5780633d509c97146101a9575b600080fd5b61016561016036600461171e565b610366565b005b61016561017536600461173b565b610528565b61016561018836600461173b565b61060b565b610196600b5481565b6040519081526020015b60405180910390f35b6101656101b736600461171e565b610869565b6101966101ca36600461171e565b600a6020526000908152604090205481565b6101966101ea36600461171e565b60066020526000908152604090205481565b61016561020a36600461171e565b610a6f565b610165610c31565b61022a61022536600461173b565b610c67565b6040516001600160a01b0390911681526020016101a0565b6000546001600160a01b031661022a565b610196610261366004611754565b610c91565b61019660095481565b61029261027d36600461171e565b60056020526000908152604090205460ff1681565b60405190151581526020016101a0565b6101656102b036600461173b565b610e6f565b600454610196565b60075461022a906001600160a01b031681565b61019660085481565b60025461022a906001600160a01b031681565b6101656110ac565b61019660035481565b61033e61030b366004611754565b6001600160a01b038083166000908152600c60209081526040808320805494861684526001019091529020549250929050565b604080519283526020830191909152016101a0565b61016561036136600461171e565b6111aa565b6000546001600160a01b031633146103995760405162461bcd60e51b81526004016103909061178d565b60405180910390fd5b6001600160a01b03811660009081526005602052604090205460ff161580156103ca57506001600160a01b03811615155b6104205760405162461bcd60e51b815260206004820152602160248201527f414746495374616b696e673a20746f6b656e2063616e277420626520616464656044820152601960fa1b6064820152608401610390565b60045460191161047d5760405162461bcd60e51b815260206004820152602260248201527f414746495374616b696e673a206c697374206f6620746f6b656e20746f6f2062604482015261696760f01b6064820152608401610390565b6004805460018082019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0384169081179091556000908152600560205260409020805460ff191690911790556104e981610a6f565b6040516001600160a01b03821681527ff3e4c2c64e71e6ba2eaab9a599bced62f9eb91d2cda610bf41aa8c80ff2cf8269060200160405180910390a150565b6000546001600160a01b031633146105525760405162461bcd60e51b81526004016103909061178d565b6706f05b59d3b200008111156105c55760405162461bcd60e51b815260206004820152603260248201527f414746495374616b696e673a206465706f736974206665652063616e27742062604482015271652067726561746572207468616e2035302560701b6064820152608401610390565b600880549082905560408051838152602081018390527f6be5411ea11f30380402ca68832d060d744cbc5f62d2344495c10256ba93904a91015b60405180910390a15050565b60026001540361062d5760405162461bcd60e51b8152600401610390906117c2565b6002600155336000908152600c602052604090208054808311156106a85760405162461bcd60e51b815260206004820152602c60248201527f414746495374616b696e673a20776974686472617720616d6f756e742065786360448201526b656564732062616c616e636560a01b6064820152608401610390565b81546000906106b79085611245565b80845560045490915082156108025760005b81811015610800576000600482815481106106e6576106e66117f9565b6000918252602090912001546001600160a01b0316905061070681610a6f565b6001600160a01b0381166000908152600187016020908152604080832054600b54600a9093529083205461074f9261074991610743908b90611258565b90611264565b90611245565b600b546001600160a01b0384166000908152600a602052604090205491925061077d91610743908890611258565b6001600160a01b038316600090815260018901602052604090205580156107eb576107aa82335b83611270565b6040518181526001600160a01b0383169033907f7e77f685b38c861064cb08f2776eb5dfd3c82f652ed9f21221b8c53b75628e519060200160405180910390a35b505080806107f890611825565b9150506106c9565b505b60035461080f9086611245565b600355610829336002546001600160a01b031690876113b4565b60405185815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2505060018055505050565b6000546001600160a01b031633146108935760405162461bcd60e51b81526004016103909061178d565b6001600160a01b03811660009081526005602052604090205460ff166109075760405162461bcd60e51b815260206004820152602360248201527f414746495374616b696e673a20746f6b656e2063616e27742062652072656d6f6044820152621d995960ea1b6064820152608401610390565b61091081610a6f565b6001600160a01b0381166000908152600560205260408120805460ff19169055600454905b81811015610a3557826001600160a01b03166004828154811061095a5761095a6117f9565b6000918252602090912001546001600160a01b031603610a2357600461098160018461183e565b81548110610991576109916117f9565b600091825260209091200154600480546001600160a01b0390921691839081106109bd576109bd6117f9565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060048054806109fc576109fc611855565b600082815260209020810160001990810180546001600160a01b0319169055019055610a35565b80610a2d81611825565b915050610935565b506040516001600160a01b03831681527f66257bcef574219c04f7c05f7a1c78d599da10491294c92a5805c48b4cdf5009906020016105ff565b6001600160a01b03811660009081526005602052604090205460ff16610ad75760405162461bcd60e51b815260206004820152601f60248201527f414746495374616b696e673a2077726f6e672072657761726420746f6b656e006044820152606401610390565b6003546040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b45919061186b565b6002549091506000906001600160a01b03858116911614610b665781610b70565b610b708284611245565b6001600160a01b038516600090815260066020526040902054909150811480610b97575082155b15610ba25750505050565b6001600160a01b038416600090815260066020526040812054610bc6908390611245565b9050610c03610be485610743600b548561125890919063ffffffff16565b6001600160a01b0387166000908152600a60205260409020549061141c565b6001600160a01b039095166000908152600a6020908152604080832097909755600690529490942055505050565b6000546001600160a01b03163314610c5b5760405162461bcd60e51b81526004016103909061178d565b610c656000611428565b565b60048181548110610c7757600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03811660009081526005602052604081205460ff16610cf95760405162461bcd60e51b815260206004820152601f60248201527f414746495374616b696e673a2077726f6e672072657761726420746f6b656e006044820152606401610390565b6001600160a01b038381166000908152600c60209081526040808320600354948716808552600a9093528184205491516370a0823160e01b81523060048201529094939192906370a0823190602401602060405180830381865afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d89919061186b565b6002549091506000906001600160a01b03888116911614610daa5781610db4565b610db48285611245565b6001600160a01b0388166000908152600660205260409020549091508114801590610dde57508315155b15610e30576001600160a01b038716600090815260066020526040812054610e07908390611245565b9050610e2c610e2586610743600b548561125890919063ffffffff16565b859061141c565b9350505b6001600160a01b0387166000908152600186016020526040902054600b548654610e639291610749916107439088611258565b98975050505050505050565b600260015403610e915760405162461bcd60e51b8152600401610390906117c2565b6002600155336000908152600c60205260408120600954600854919291610ebe9190610743908690611258565b90506000610ecc8483611245565b83549091506000610edd828461141c565b80865560045490915060005b8181101561101d57600060048281548110610f0657610f066117f9565b6000918252602090912001546001600160a01b03169050610f2681610a6f565b6001600160a01b0381166000908152600189016020908152604080832054600b54600a909352922054610f5f9190610743908890611258565b6001600160a01b038316600090815260018b016020526040902055851561100857600b546001600160a01b0383166000908152600a60205260408120549091610fb391849161074991610743908c90611258565b9050801561100657610fc583336107a4565b6040518181526001600160a01b0384169033907f7e77f685b38c861064cb08f2776eb5dfd3c82f652ed9f21221b8c53b75628e519060200160405180910390a35b505b5050808061101590611825565b915050610ee9565b5060035461102b908561141c565b60035561104c336007546002546001600160a01b0390811692911688611478565b611064336002546001600160a01b0316903087611478565b604080518581526020810187905233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a25050600180555050505050565b6002600154036110ce5760405162461bcd60e51b8152600401610390906117c2565b6002600155336000908152600c60205260408120805482825560045491929091905b818110156111445760006004828154811061110d5761110d6117f9565b60009182526020808320909101546001600160a01b031682526001870190526040812055508061113c81611825565b9150506110f0565b506003546111529083611245565b60035561116c336002546001600160a01b031690846113b4565b60405182815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b031633146111d45760405162461bcd60e51b81526004016103909061178d565b6001600160a01b0381166112395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610390565b61124281611428565b50565b6000611251828461183e565b9392505050565b60006112518284611884565b600061125182846118a3565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156112b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112db919061186b565b6002549091506000906001600160a01b038681169116146112fc578161130a565b60035461130a908390611245565b905080831115611363576001600160a01b0385166000908152600660205260409020546113379082611245565b6001600160a01b03861660008181526006602052604090209190915561135e9085836113b4565b6113ad565b6001600160a01b0385166000908152600660205260409020546113869084611245565b6001600160a01b0386166000818152600660205260409020919091556113ad9085856113b4565b5050505050565b6040516001600160a01b03831660248201526044810182905261141790849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114b6565b505050565b600061125182846118c5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526114b09085906323b872dd60e01b906084016113e0565b50505050565b600061150b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115889092919063ffffffff16565b805190915015611417578080602001905181019061152991906118dd565b6114175760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610390565b6060611597848460008561159f565b949350505050565b6060824710156116005760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610390565b6001600160a01b0385163b6116575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610390565b600080866001600160a01b03168587604051611673919061192b565b60006040518083038185875af1925050503d80600081146116b0576040519150601f19603f3d011682016040523d82523d6000602084013e6116b5565b606091505b50915091506116c58282866116d0565b979650505050505050565b606083156116df575081611251565b8251156116ef5782518084602001fd5b8160405162461bcd60e51b81526004016103909190611947565b6001600160a01b038116811461124257600080fd5b60006020828403121561173057600080fd5b813561125181611709565b60006020828403121561174d57600080fd5b5035919050565b6000806040838503121561176757600080fd5b823561177281611709565b9150602083013561178281611709565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016118375761183761180f565b5060010190565b6000828210156118505761185061180f565b500390565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561187d57600080fd5b5051919050565b600081600019048311821515161561189e5761189e61180f565b500290565b6000826118c057634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156118d8576118d861180f565b500190565b6000602082840312156118ef57600080fd5b8151801515811461125157600080fd5b60005b8381101561191a578181015183820152602001611902565b838111156114b05750506000910152565b6000825161193d8184602087016118ff565b9190910192915050565b60208152600082518060208401526119668160408501602087016118ff565b601f01601f1916919091016040019291505056fea26469706673582212200ebe555f0d1ca76034b9485e4bdbde0f2705e5ba9e8dd5ab20082333455c8f4164736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004d0f56d728c5232ab07faa0bdcba23670a35451f0000000000000000000000004d0f56d728c5232ab07faa0bdcba23670a35451f0000000000000000000000003e822d55e79ea9f53c744bd9179d89ddec0815560000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x4D0F56d728c5232ab07fAA0BdcbA23670A35451f
Arg [1] : _agfi (address): 0x4D0F56d728c5232ab07fAA0BdcbA23670A35451f
Arg [2] : _feeCollector (address): 0x3e822d55e79eA9F53C744BD9179d89dDec081556
Arg [3] : _depositFeePercent (uint256): 0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004d0f56d728c5232ab07faa0bdcba23670a35451f
Arg [1] : 0000000000000000000000004d0f56d728c5232ab07faa0bdcba23670a35451f
Arg [2] : 0000000000000000000000003e822d55e79ea9f53c744bd9179d89ddec081556
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
29341:14337:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36338:514;;;;;;:::i;:::-;;:::i;:::-;;37744:350;;;;;;:::i;:::-;;:::i;39527:1373::-;;;;;;:::i;:::-;;:::i;31245:45::-;;;;;;;;;763:25:1;;;751:2;736:18;31245:45:0;;;;;;;;36988:612;;;;;;:::i;:::-;;:::i;31129:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;30692;;;;;;:::i;:::-;;;;;;;;;;;;;;41773:857;;;;;;:::i;:::-;;:::i;5365:103::-;;;:::i;30552:28::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;977:32:1;;;959:51;;947:2;932:18;30552:28:0;799:217:1;4714:87:0;4760:7;4787:6;-1:-1:-1;;;;;4787:6:0;4714:87;;38345:1036;;;;;;:::i;:::-;;:::i;30971:44::-;;;;;;30589;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1817:14:1;;1810:22;1792:41;;1780:2;1765:18;30589:44:0;1652:187:1;33847:1611:0;;;;;;:::i;:::-;;:::i;36094:111::-;36176:12;:19;36094:111;;30756:27;;;;;-1:-1:-1;;;;;30756:27:0;;;30874:32;;;;;;30282:18;;;;;-1:-1:-1;;;;;30282:18:0;;;41006:568;;;:::i;30453:34::-;;;;;;35744:224;;;;;;:::i;:::-;-1:-1:-1;;;;;35879:15:0;;;35824:7;35879:15;;;:8;:15;;;;;;;;35915:11;;35928:29;;;;;:15;;:29;;;;;;35744:224;;;;;;;;;;2018:25:1;;;2074:2;2059:18;;2052:34;;;;1991:18;35744:224:0;1844:248:1;5623:201:0;;;;;;:::i;:::-;;:::i;36338:514::-;4760:7;4787:6;-1:-1:-1;;;;;4787:6:0;3518:10;4934:23;4926:68;;;;-1:-1:-1;;;4926:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;36440:27:0;::::1;;::::0;;;:13:::1;:27;::::0;;;;;::::1;;36439:28;:67:::0;::::1;;;-1:-1:-1::0;;;;;;36471:35:0;::::1;::::0;::::1;36439:67;36415:156;;;::::0;-1:-1:-1;;;36415:156:0;;2920:2:1;36415:156:0::1;::::0;::::1;2902:21:1::0;2959:2;2939:18;;;2932:30;2998:34;2978:18;;;2971:62;-1:-1:-1;;;3049:18:1;;;3042:31;3090:19;;36415:156:0::1;2718:397:1::0;36415:156:0::1;36592:12;:19:::0;36614:2:::1;-1:-1:-1::0;36584:71:0::1;;;::::0;-1:-1:-1;;;36584:71:0;;3322:2:1;36584:71:0::1;::::0;::::1;3304:21:1::0;3361:2;3341:18;;;3334:30;3400:34;3380:18;;;3373:62;-1:-1:-1;;;3451:18:1;;;3444:32;3493:19;;36584:71:0::1;3120:398:1::0;36584:71:0::1;36668:12;:31:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;36668:31:0::1;-1:-1:-1::0;;;;;36668:31:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;36712:27:0;;;:13:::1;36668:31;36712:27:::0;;;;:34;;-1:-1:-1;;36712:34:0::1;::::0;;::::1;::::0;;36759:26:::1;36668:31:::0;36759:12:::1;:26::i;:::-;36803:39;::::0;-1:-1:-1;;;;;977:32:1;;959:51;;36803:39:0::1;::::0;947:2:1;932:18;36803:39:0::1;;;;;;;36338:514:::0;:::o;37744:350::-;4760:7;4787:6;-1:-1:-1;;;;;4787:6:0;3518:10;4934:23;4926:68;;;;-1:-1:-1;;;4926:68:0;;;;;;;:::i;:::-;37864:4:::1;37842:18;:26;;37834:89;;;::::0;-1:-1:-1;;;37834:89:0;;3725:2:1;37834:89:0::1;::::0;::::1;3707:21:1::0;3764:2;3744:18;;;3737:30;3803:34;3783:18;;;3776:62;-1:-1:-1;;;3854:18:1;;;3847:48;3912:19;;37834:89:0::1;3523:414:1::0;37834:89:0::1;37953:17;::::0;;37983:38;;;;38039:45:::1;::::0;;2018:25:1;;;2074:2;2059:18;;2052:34;;;38039:45:0::1;::::0;1991:18:1;38039:45:0::1;;;;;;;;37821:273;37744:350:::0;:::o;39527:1373::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;3518:10;39597:21:::1;39621:22:::0;;;:8:::1;:22;::::0;;;;39682:11;;39714:26;;::::1;;39706:83;;;::::0;-1:-1:-1;;;39706:83:0;;4504:2:1;39706:83:0::1;::::0;::::1;4486:21:1::0;4543:2;4523:18;;;4516:30;4582:34;4562:18;;;4555:62;-1:-1:-1;;;4633:18:1;;;4626:42;4685:19;;39706:83:0::1;4302:408:1::0;39706:83:0::1;39823:11:::0;;39802:18:::1;::::0;39823:24:::1;::::0;39839:7;39823:15:::1;:24::i;:::-;39860::::0;;;39916:12:::1;:19:::0;39802:45;;-1:-1:-1;39952:20:0;;39948:770:::1;;39996:9;39991:714;40011:4;40007:1;:8;39991:714;;;40043:13;40059:12;40072:1;40059:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40059:15:0::1;::::0;-1:-1:-1;40095:20:0::1;40059:15:::0;40095:12:::1;:20::i;:::-;-1:-1:-1::0;;;;;40318:23:0;::::1;40140:16;40318:23:::0;;;:15:::1;::::0;::::1;:23;::::0;;;;;;;;40258:30:::1;::::0;40203:17:::1;:25:::0;;;;;;;40159:183:::1;::::0;:130:::1;::::0;:70:::1;::::0;:15;;:43:::1;:70::i;:::-;:98:::0;::::1;:130::i;:::-;:158:::0;::::1;:183::i;:::-;40435:30;::::0;-1:-1:-1;;;;;40404:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;40140:202;;-1:-1:-1;40389:77:0::1;::::0;:41:::1;::::0;:10;;:14:::1;:41::i;:77::-;-1:-1:-1::0;;;;;40363:23:0;::::1;;::::0;;;:15:::1;::::0;::::1;:23;::::0;;;;:103;40495:13;;40491:197:::1;;40535:49;40553:6:::0;3518:10;40561:12:::1;40575:8;40535:17;:49::i;:::-;40614:52;::::0;763:25:1;;;-1:-1:-1;;;;;40614:52:0;::::1;::::0;3518:10;;40614:52:::1;::::0;751:2:1;736:18;40614:52:0::1;;;;;;;40491:197;40022:683;;40017:3;;;;;:::i;:::-;;;;39991:714;;;;39948:770;40756:19;::::0;:32:::1;::::0;40780:7;40756:23:::1;:32::i;:::-;40734:19;:54:::0;40801:40:::1;3518:10:::0;40801:4:::1;::::0;-1:-1:-1;;;;;40801:4:0::1;::::0;40833:7;40801:17:::1;:40::i;:::-;40859:31;::::0;763:25:1;;;3518:10:0;;40859:31:::1;::::0;751:2:1;736:18;40859:31:0::1;;;;;;;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;;;39527:1373:0:o;36988:612::-;4760:7;4787:6;-1:-1:-1;;;;;4787:6:0;3518:10;4934:23;4926:68;;;;-1:-1:-1;;;4926:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37076:27:0;::::1;;::::0;;;:13:::1;:27;::::0;;;;;::::1;;37068:75;;;::::0;-1:-1:-1;;;37068:75:0;;5321:2:1;37068:75:0::1;::::0;::::1;5303:21:1::0;5360:2;5340:18;;;5333:30;5399:34;5379:18;;;5372:62;-1:-1:-1;;;5450:18:1;;;5443:33;5493:19;;37068:75:0::1;5119:399:1::0;37068:75:0::1;37156:26;37169:12;37156;:26::i;:::-;-1:-1:-1::0;;;;;37195:27:0;::::1;37225:5;37195:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;37195:35:0::1;::::0;;37258:12:::1;:19:::0;;37290:242:::1;37310:4;37306:1;:8;37290:242;;;37361:12;-1:-1:-1::0;;;;;37342:31:0::1;:12;37355:1;37342:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;37342:15:0::1;:31:::0;37338:181:::1;;37414:12;37427:8;37434:1;37427:4:::0;:8:::1;:::i;:::-;37414:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;37396:12:::1;:15:::0;;-1:-1:-1;;;;;37414:22:0;;::::1;::::0;37409:1;;37396:15;::::1;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1::0;;;;;37396:40:0::1;;;;;-1:-1:-1::0;;;;;37396:40:0::1;;;;;;37457:12;:18;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;37457:18:0;;;;;-1:-1:-1;;;;;;37457:18:0::1;::::0;;;;;37496:5:::1;;37338:181;37316:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37290:242;;;-1:-1:-1::0;37549:41:0::1;::::0;-1:-1:-1;;;;;977:32:1;;959:51;;37549:41:0::1;::::0;947:2:1;932:18;37549:41:0::1;799:217:1::0;41773:857:0;-1:-1:-1;;;;;41838:21:0;;;;;;:13;:21;;;;;;;;41830:65;;;;-1:-1:-1;;;41830:65:0;;5987:2:1;41830:65:0;;;5969:21:1;6026:2;6006:18;;;5999:30;6065:33;6045:18;;;6038:61;6116:18;;41830:65:0;5785:355:1;41830:65:0;41933:19;;41998:31;;-1:-1:-1;;;41998:31:0;;42023:4;41998:31;;;959:51:1;41912:18:0;;-1:-1:-1;;;;;41998:16:0;;;;;932:18:1;;41998:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42077:4;;41969:60;;-1:-1:-1;42042:22:0;;-1:-1:-1;;;;;42067:14:0;;;42077:4;;42067:14;:72;;42121:18;42067:72;;;42084:34;:18;42107:10;42084:22;:34::i;:::-;-1:-1:-1;;;;;42226:25:0;;;;;;:17;:25;;;;;;42042:97;;-1:-1:-1;42208:43:0;;;:62;;-1:-1:-1;42255:15:0;;42208:62;42204:105;;;42289:7;;;41773:857;:::o;42204:105::-;-1:-1:-1;;;;;42369:25:0;;42325:22;42369:25;;;:17;:25;;;;;;42350:45;;:14;;:18;:45::i;:::-;42325:70;;42440:125;42486:66;42541:10;42486:50;42505:30;;42486:14;:18;;:50;;;;:::i;:66::-;-1:-1:-1;;;;;42440:25:0;;;;;;:17;:25;;;;;;;:29;:125::i;:::-;-1:-1:-1;;;;;42412:25:0;;;;;;;:17;:25;;;;;;;;:153;;;;42578:17;:25;;;;;;:42;-1:-1:-1;;;41773:857:0:o;5365:103::-;4760:7;4787:6;-1:-1:-1;;;;;4787:6:0;3518:10;4934:23;4926:68;;;;-1:-1:-1;;;4926:68:0;;;;;;;:::i;:::-;5430:30:::1;5457:1;5430:18;:30::i;:::-;5365:103::o:0;30552:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30552:28:0;;-1:-1:-1;30552:28:0;:::o;38345:1036::-;-1:-1:-1;;;;;38451:21:0;;38421:7;38451:21;;;:13;:21;;;;;;;;38443:65;;;;-1:-1:-1;;;38443:65:0;;5987:2:1;38443:65:0;;;5969:21:1;6026:2;6006:18;;;5999:30;6065:33;6045:18;;;6038:61;6116:18;;38443:65:0;5785:355:1;38443:65:0;-1:-1:-1;;;;;38545:15:0;;;38521:21;38545:15;;;:8;:15;;;;;;;;38594:19;;38660:25;;;;;;:17;:25;;;;;;;38731:31;;-1:-1:-1;;;38731:31:0;;38756:4;38731:31;;;959:51:1;38545:15:0;;38594:19;38660:25;;;38731:16;;932:18:1;;38731:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38810:4;;38702:60;;-1:-1:-1;38775:22:0;;-1:-1:-1;;;;;38800:14:0;;;38810:4;;38800:14;:72;;38854:18;38800:72;;;38817:34;:18;38840:10;38817:22;:34::i;:::-;-1:-1:-1;;;;;38911:25:0;;;;;;:17;:25;;;;;;38775:97;;-1:-1:-1;38893:43:0;;;;;:62;;-1:-1:-1;38940:15:0;;;38893:62;38889:343;;;-1:-1:-1;;;;;39018:25:0;;38974:22;39018:25;;;:17;:25;;;;;;38999:45;;:14;;:18;:45::i;:::-;38974:70;;39087:131;39135:66;39190:10;39135:50;39154:30;;39135:14;:18;;:50;;;;:::i;:66::-;39087:23;;:27;:131::i;:::-;39061:157;;38957:275;38889:343;-1:-1:-1;;;;;39347:23:0;;;;;;:15;;;:23;;;;;;39311:30;;39266:11;;:105;;39347:23;39266:76;;:40;;39282:23;39266:15;:40::i;:105::-;39244:127;38345:1036;-1:-1:-1;;;;;;;;38345:1036:0:o;33847:1611::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;3518:10;33916:21:::1;33940:22:::0;;;:8:::1;:22;::::0;;;;34029:29:::1;::::0;34006:17:::1;::::0;33940:22;;33916:21;33994:65:::1;::::0;34029:29;33994:30:::1;::::0;:7;;:11:::1;:30::i;:65::-;33979:80:::0;-1:-1:-1;34072:23:0::1;34098:17;:7:::0;33979:80;34098:11:::1;:17::i;:::-;34158:11:::0;;34072:43;;-1:-1:-1;34132:23:0::1;34203:32;34158:11:::0;34072:43;34203:15:::1;:32::i;:::-;34248:24:::0;;;34304:12:::1;:19:::0;34182:53;;-1:-1:-1;34248:11:0::1;34336:824;34356:4;34352:1;:8;34336:824;;;34384:13;34400:12;34413:1;34400:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;34400:15:0::1;::::0;-1:-1:-1;34432:20:0::1;34400:15:::0;34432:12:::1;:20::i;:::-;-1:-1:-1::0;;;;;34503:23:0;::::1;34473:27;34503:23:::0;;;:15:::1;::::0;::::1;:23;::::0;;;;;;;;34615:30:::1;::::0;34584:17:::1;:25:::0;;;;;;34569:77:::1;::::0;34615:30;34569:41:::1;::::0;:10;;:14:::1;:41::i;:77::-;-1:-1:-1::0;;;;;34543:23:0;::::1;;::::0;;;:15:::1;::::0;::::1;:23;::::0;;;;:103;34671:20;;34667:480:::1;;34832:30;::::0;-1:-1:-1;;;;;34777:25:0;::::1;34714:16;34777:25:::0;;;:17:::1;:25;::::0;;;;;34714:16;;34733:179:::1;::::0;34892:19;;34733:130:::1;::::0;:70:::1;::::0;:15;;:43:::1;:70::i;:179::-;34714:198:::0;-1:-1:-1;34937:13:0;;34933:197:::1;;34977:49;34995:6:::0;3518:10;35003:12:::1;3438:98:::0;34977:49:::1;35056:52;::::0;763:25:1;;;-1:-1:-1;;;;;35056:52:0;::::1;::::0;3518:10;;35056:52:::1;::::0;751:2:1;736:18;35056:52:0::1;;;;;;;34933:197;34693:454;34667:480;34367:793;;34362:3;;;;;:::i;:::-;;;;34336:824;;;-1:-1:-1::0;35198:19:0::1;::::0;:40:::1;::::0;35222:15;35198:23:::1;:40::i;:::-;35176:19;:62:::0;35251:55:::1;3518:10:::0;35287:12:::1;::::0;35251:4:::1;::::0;-1:-1:-1;;;;;35251:4:0;;::::1;::::0;:55;35287:12:::1;35301:4:::0;35251:21:::1;:55::i;:::-;35319:67;3518:10:::0;35319:4:::1;::::0;-1:-1:-1;;;;;35319:4:0::1;::::0;35363::::1;35370:15:::0;35319:21:::1;:67::i;:::-;35404:44;::::0;;2018:25:1;;;2074:2;2059:18;;2052:34;;;3518:10:0;;35404:44:::1;::::0;1991:18:1;35404:44:0::1;;;;;;;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;;;;;33847:1611:0:o;41006:568::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;3518:10;41070:21:::1;41094:22:::0;;;:8:::1;:22;::::0;;;;41151:11;;41175:15;;;41218:12:::1;:19:::0;41094:22;;41151:11;;41218:19;41250:137:::1;41270:4;41266:1;:8;41250:137;;;41298:13;41314:12;41327:1;41314:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;41314:15:0::1;41346:23:::0;;41314:15;41346;::::1;:23:::0;;;;;:27;-1:-1:-1;41276:3:0;::::1;::::0;::::1;:::i;:::-;;;;41250:137;;;-1:-1:-1::0;41421:19:0::1;::::0;:32:::1;::::0;41445:7;41421:23:::1;:32::i;:::-;41399:19;:54:::0;41466:40:::1;3518:10:::0;41466:4:::1;::::0;-1:-1:-1;;;;;41466:4:0::1;::::0;41498:7;41466:17:::1;:40::i;:::-;41524;::::0;763:25:1;;;3518:10:0;;41524:40:::1;::::0;751:2:1;736:18;41524:40:0::1;;;;;;;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;41006:568:0:o;5623:201::-;4760:7;4787:6;-1:-1:-1;;;;;4787:6:0;3518:10;4934:23;4926:68;;;;-1:-1:-1;;;4926:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5712:22:0;::::1;5704:73;;;::::0;-1:-1:-1;;;5704:73:0;;6536:2:1;5704:73:0::1;::::0;::::1;6518:21:1::0;6575:2;6555:18;;;6548:30;6614:34;6594:18;;;6587:62;-1:-1:-1;;;6665:18:1;;;6658:36;6711:19;;5704:73:0::1;6334:402:1::0;5704:73:0::1;5788:28;5807:8;5788:18;:28::i;:::-;5623:201:::0;:::o;24814:98::-;24872:7;24899:5;24903:1;24899;:5;:::i;:::-;24892:12;24814:98;-1:-1:-1;;;24814:98:0:o;25171:::-;25229:7;25256:5;25260:1;25256;:5;:::i;25570:98::-;25628:7;25655:5;25659:1;25655;:5;:::i;42988:685::-;43153:31;;-1:-1:-1;;;43153:31:0;;43178:4;43153:31;;;959:51:1;43124:26:0;;-1:-1:-1;;;;;43153:16:0;;;;;932:18:1;;43153:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43232:4;;43124:60;;-1:-1:-1;43197:22:0;;-1:-1:-1;;;;;43222:14:0;;;43232:4;;43222:14;:81;;43285:18;43222:81;;;43262:19;;43239:43;;:18;;:22;:43::i;:::-;43197:106;;43334:14;43324:7;:24;43320:344;;;-1:-1:-1;;;;;43395:25:0;;;;;;:17;:25;;;;;;:45;;43425:14;43395:29;:45::i;:::-;-1:-1:-1;;;;;43367:25:0;;;;;;:17;:25;;;;;:73;;;;43457:40;;43477:3;43482:14;43457:19;:40::i;:::-;43320:344;;;-1:-1:-1;;;;;43562:25:0;;;;;;:17;:25;;;;;;:38;;43592:7;43562:29;:38::i;:::-;-1:-1:-1;;;;;43534:25:0;;;;;;:17;:25;;;;;:66;;;;43617:33;;43637:3;43642:7;43617:19;:33::i;:::-;43111:562;;42988:685;;;:::o;18261:211::-;18405:58;;-1:-1:-1;;;;;7328:32:1;;18405:58:0;;;7310:51:1;7377:18;;;7370:34;;;18378:86:0;;18398:5;;-1:-1:-1;;;18428:23:0;7283:18:1;;18405:58:0;;;;-1:-1:-1;;18405:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18405:58:0;-1:-1:-1;;;;;;18405:58:0;;;;;;;;;;18378:19;:86::i;:::-;18261:211;;;:::o;24433:98::-;24491:7;24518:5;24522:1;24518;:5;:::i;5984:191::-;6058:16;6077:6;;-1:-1:-1;;;;;6094:17:0;;;-1:-1:-1;;;;;;6094:17:0;;;;;;6127:40;;6077:6;;;;;;;6127:40;;6058:16;6127:40;6047:128;5984:191;:::o;18480:248::-;18651:68;;-1:-1:-1;;;;;7806:15:1;;;18651:68:0;;;7788:34:1;7858:15;;7838:18;;;7831:43;7890:18;;;7883:34;;;18624:96:0;;18644:5;;-1:-1:-1;;;18674:27:0;7723:18:1;;18651:68:0;7548:375:1;18624:96:0;18480:248;;;;:::o;20834:716::-;21258:23;21284:69;21312:4;21284:69;;;;;;;;;;;;;;;;;21292:5;-1:-1:-1;;;;;21284:27:0;;;:69;;;;;:::i;:::-;21368:17;;21258:95;;-1:-1:-1;21368:21:0;21364:179;;21465:10;21454:30;;;;;;;;;;;;:::i;:::-;21446:85;;;;-1:-1:-1;;;21446:85:0;;8412:2:1;21446:85:0;;;8394:21:1;8451:2;8431:18;;;8424:30;8490:34;8470:18;;;8463:62;-1:-1:-1;;;8541:18:1;;;8534:40;8591:19;;21446:85:0;8210:406:1;10160:229:0;10297:12;10329:52;10351:6;10359:4;10365:1;10368:12;10329:21;:52::i;:::-;10322:59;10160:229;-1:-1:-1;;;;10160:229:0:o;11280:510::-;11450:12;11508:5;11483:21;:30;;11475:81;;;;-1:-1:-1;;;11475:81:0;;8823:2:1;11475:81:0;;;8805:21:1;8862:2;8842:18;;;8835:30;8901:34;8881:18;;;8874:62;-1:-1:-1;;;8952:18:1;;;8945:36;8998:19;;11475:81:0;8621:402:1;11475:81:0;-1:-1:-1;;;;;7710:19:0;;;11567:60;;;;-1:-1:-1;;;11567:60:0;;9230:2:1;11567:60:0;;;9212:21:1;9269:2;9249:18;;;9242:30;9308:31;9288:18;;;9281:59;9357:18;;11567:60:0;9028:353:1;11567:60:0;11641:12;11655:23;11682:6;-1:-1:-1;;;;;11682:11:0;11701:5;11708:4;11682:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11640:73;;;;11731:51;11748:7;11757:10;11769:12;11731:16;:51::i;:::-;11724:58;11280:510;-1:-1:-1;;;;;;;11280:510:0:o;13966:712::-;14116:12;14145:7;14141:530;;;-1:-1:-1;14176:10:0;14169:17;;14141:530;14290:17;;:21;14286:374;;14488:10;14482:17;14549:15;14536:10;14532:2;14528:19;14521:44;14286:374;14631:12;14624:20;;-1:-1:-1;;;14624:20:0;;;;;;;;:::i;14:139:1:-;-1:-1:-1;;;;;97:31:1;;87:42;;77:70;;143:1;140;133:12;158:269;231:6;284:2;272:9;263:7;259:23;255:32;252:52;;;300:1;297;290:12;252:52;339:9;326:23;358:39;391:5;358:39;:::i;432:180::-;491:6;544:2;532:9;523:7;519:23;515:32;512:52;;;560:1;557;550:12;512:52;-1:-1:-1;583:23:1;;432:180;-1:-1:-1;432:180:1:o;1229:418::-;1311:6;1319;1372:2;1360:9;1351:7;1347:23;1343:32;1340:52;;;1388:1;1385;1378:12;1340:52;1427:9;1414:23;1446:39;1479:5;1446:39;:::i;:::-;1504:5;-1:-1:-1;1561:2:1;1546:18;;1533:32;1574:41;1533:32;1574:41;:::i;:::-;1634:7;1624:17;;;1229:418;;;;;:::o;2357:356::-;2559:2;2541:21;;;2578:18;;;2571:30;2637:34;2632:2;2617:18;;2610:62;2704:2;2689:18;;2357:356::o;3942:355::-;4144:2;4126:21;;;4183:2;4163:18;;;4156:30;4222:33;4217:2;4202:18;;4195:61;4288:2;4273:18;;3942:355::o;4715:127::-;4776:10;4771:3;4767:20;4764:1;4757:31;4807:4;4804:1;4797:15;4831:4;4828:1;4821:15;4847:127;4908:10;4903:3;4899:20;4896:1;4889:31;4939:4;4936:1;4929:15;4963:4;4960:1;4953:15;4979:135;5018:3;5039:17;;;5036:43;;5059:18;;:::i;:::-;-1:-1:-1;5106:1:1;5095:13;;4979:135::o;5523:125::-;5563:4;5591:1;5588;5585:8;5582:34;;;5596:18;;:::i;:::-;-1:-1:-1;5633:9:1;;5523:125::o;5653:127::-;5714:10;5709:3;5705:20;5702:1;5695:31;5745:4;5742:1;5735:15;5769:4;5766:1;5759:15;6145:184;6215:6;6268:2;6256:9;6247:7;6243:23;6239:32;6236:52;;;6284:1;6281;6274:12;6236:52;-1:-1:-1;6307:16:1;;6145:184;-1:-1:-1;6145:184:1:o;6741:168::-;6781:7;6847:1;6843;6839:6;6835:14;6832:1;6829:21;6824:1;6817:9;6810:17;6806:45;6803:71;;;6854:18;;:::i;:::-;-1:-1:-1;6894:9:1;;6741:168::o;6914:217::-;6954:1;6980;6970:132;;7024:10;7019:3;7015:20;7012:1;7005:31;7059:4;7056:1;7049:15;7087:4;7084:1;7077:15;6970:132;-1:-1:-1;7116:9:1;;6914:217::o;7415:128::-;7455:3;7486:1;7482:6;7479:1;7476:13;7473:39;;;7492:18;;:::i;:::-;-1:-1:-1;7528:9:1;;7415:128::o;7928:277::-;7995:6;8048:2;8036:9;8027:7;8023:23;8019:32;8016:52;;;8064:1;8061;8054:12;8016:52;8096:9;8090:16;8149:5;8142:13;8135:21;8128:5;8125:32;8115:60;;8171:1;8168;8161:12;9386:258;9458:1;9468:113;9482:6;9479:1;9476:13;9468:113;;;9558:11;;;9552:18;9539:11;;;9532:39;9504:2;9497:10;9468:113;;;9599:6;9596:1;9593:13;9590:48;;;-1:-1:-1;;9634:1:1;9616:16;;9609:27;9386:258::o;9649:274::-;9778:3;9816:6;9810:13;9832:53;9878:6;9873:3;9866:4;9858:6;9854:17;9832:53;:::i;:::-;9901:16;;;;;9649:274;-1:-1:-1;;9649:274:1:o;9928:383::-;10077:2;10066:9;10059:21;10040:4;10109:6;10103:13;10152:6;10147:2;10136:9;10132:18;10125:34;10168:66;10227:6;10222:2;10211:9;10207:18;10202:2;10194:6;10190:15;10168:66;:::i;:::-;10295:2;10274:15;-1:-1:-1;;10270:29:1;10255:45;;;;10302:2;10251:54;;9928:383;-1:-1:-1;;9928:383:1:o
Swarm Source
ipfs://0ebe555f0d1ca76034b9485e4bdbde0f2705e5ba9e8dd5ab20082333455c8f41
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.