ETH Price: $2,743.45 (+2.84%)

Contract

0x08d4225f0995D770C4C8ea85380602B3499164a9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Redemption B...123883282021-05-07 16:50:491379 days ago1620406249IN
Enzyme Finance: Guaranteed Redemption
0 ETH0.00577005110

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GuaranteedRedemption

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license
File 1 of 8 : GuaranteedRedemption.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "@openzeppelin/contracts/math/SafeMath.sol";
import "../../../utils/FundDeployerOwnerMixin.sol";
import "./utils/PreCallOnIntegrationValidatePolicyBase.sol";

/// @title GuaranteedRedemption Contract
/// @author Enzyme Council <[email protected]>
/// @notice A policy that guarantees that shares will either be continuously redeemable or
/// redeemable within a predictable daily window by preventing trading during a configurable daily period
contract GuaranteedRedemption is PreCallOnIntegrationValidatePolicyBase, FundDeployerOwnerMixin {
    using SafeMath for uint256;

    event AdapterAdded(address adapter);

    event AdapterRemoved(address adapter);

    event FundSettingsSet(
        address indexed comptrollerProxy,
        uint256 startTimestamp,
        uint256 duration
    );

    event RedemptionWindowBufferSet(uint256 prevBuffer, uint256 nextBuffer);

    struct RedemptionWindow {
        uint256 startTimestamp;
        uint256 duration;
    }

    uint256 private constant ONE_DAY = 24 * 60 * 60;

    mapping(address => bool) private adapterToCanBlockRedemption;
    mapping(address => RedemptionWindow) private comptrollerProxyToRedemptionWindow;
    uint256 private redemptionWindowBuffer;

    constructor(
        address _policyManager,
        address _fundDeployer,
        uint256 _redemptionWindowBuffer,
        address[] memory _redemptionBlockingAdapters
    ) public PolicyBase(_policyManager) FundDeployerOwnerMixin(_fundDeployer) {
        redemptionWindowBuffer = _redemptionWindowBuffer;

        __addRedemptionBlockingAdapters(_redemptionBlockingAdapters);
    }

    // EXTERNAL FUNCTIONS

    /// @notice Add the initial policy settings for a fund
    /// @param _comptrollerProxy The fund's ComptrollerProxy address
    /// @param _encodedSettings Encoded settings to apply to a fund
    function addFundSettings(address _comptrollerProxy, bytes calldata _encodedSettings)
        external
        override
        onlyPolicyManager
    {
        (uint256 startTimestamp, uint256 duration) = abi.decode(
            _encodedSettings,
            (uint256, uint256)
        );

        if (startTimestamp == 0) {
            require(duration == 0, "addFundSettings: duration must be 0 if startTimestamp is 0");
            return;
        }

        // Use 23 hours instead of 1 day to allow up to 1 hr of redemptionWindowBuffer
        require(
            duration > 0 && duration <= 23 hours,
            "addFundSettings: duration must be between 1 second and 23 hours"
        );

        comptrollerProxyToRedemptionWindow[_comptrollerProxy].startTimestamp = startTimestamp;
        comptrollerProxyToRedemptionWindow[_comptrollerProxy].duration = duration;

        emit FundSettingsSet(_comptrollerProxy, startTimestamp, duration);
    }

    /// @notice Provides a constant string identifier for a policy
    /// @return identifier_ The identifer string
    function identifier() external pure override returns (string memory identifier_) {
        return "GUARANTEED_REDEMPTION";
    }

    /// @notice Checks whether a particular condition passes the rule for a particular fund
    /// @param _comptrollerProxy The fund's ComptrollerProxy address
    /// @param _adapter The adapter for which to check the rule
    /// @return isValid_ True if the rule passes
    function passesRule(address _comptrollerProxy, address _adapter)
        public
        view
        returns (bool isValid_)
    {
        if (!adapterCanBlockRedemption(_adapter)) {
            return true;
        }


            RedemptionWindow memory redemptionWindow
         = comptrollerProxyToRedemptionWindow[_comptrollerProxy];

        // If no RedemptionWindow is set, the fund can never use redemption-blocking adapters
        if (redemptionWindow.startTimestamp == 0) {
            return false;
        }

        uint256 latestRedemptionWindowStart = calcLatestRedemptionWindowStart(
            redemptionWindow.startTimestamp
        );

        // A fund can't trade during its redemption window, nor in the buffer beforehand.
        // The lower bound is only relevant when the startTimestamp is in the future,
        // so we check it last.
        if (
            block.timestamp >= latestRedemptionWindowStart.add(redemptionWindow.duration) ||
            block.timestamp <= latestRedemptionWindowStart.sub(redemptionWindowBuffer)
        ) {
            return true;
        }

        return false;
    }

    /// @notice Sets a new value for the redemptionWindowBuffer variable
    /// @param _nextRedemptionWindowBuffer The number of seconds for the redemptionWindowBuffer
    /// @dev The redemptionWindowBuffer is added to the beginning of the redemption window,
    /// and should always be >= the longest potential block on redemption amongst all adapters.
    /// (e.g., Synthetix blocks token transfers during a timelock after trading synths)
    function setRedemptionWindowBuffer(uint256 _nextRedemptionWindowBuffer)
        external
        onlyFundDeployerOwner
    {
        uint256 prevRedemptionWindowBuffer = redemptionWindowBuffer;
        require(
            _nextRedemptionWindowBuffer != prevRedemptionWindowBuffer,
            "setRedemptionWindowBuffer: Value already set"
        );

        redemptionWindowBuffer = _nextRedemptionWindowBuffer;

        emit RedemptionWindowBufferSet(prevRedemptionWindowBuffer, _nextRedemptionWindowBuffer);
    }

    /// @notice Apply the rule with the specified parameters of a PolicyHook
    /// @param _comptrollerProxy The fund's ComptrollerProxy address
    /// @param _encodedArgs Encoded args with which to validate the rule
    /// @return isValid_ True if the rule passes
    function validateRule(
        address _comptrollerProxy,
        address,
        IPolicyManager.PolicyHook,
        bytes calldata _encodedArgs
    ) external override returns (bool isValid_) {
        (address adapter, ) = __decodeRuleArgs(_encodedArgs);

        return passesRule(_comptrollerProxy, adapter);
    }

    // PUBLIC FUNCTIONS

    /// @notice Calculates the start of the most recent redemption window
    /// @param _startTimestamp The initial startTimestamp for the redemption window
    /// @return latestRedemptionWindowStart_ The starting timestamp of the most recent redemption window
    function calcLatestRedemptionWindowStart(uint256 _startTimestamp)
        public
        view
        returns (uint256 latestRedemptionWindowStart_)
    {
        if (block.timestamp <= _startTimestamp) {
            return _startTimestamp;
        }

        uint256 timeSinceStartTimestamp = block.timestamp.sub(_startTimestamp);
        uint256 timeSincePeriodStart = timeSinceStartTimestamp.mod(ONE_DAY);

        return block.timestamp.sub(timeSincePeriodStart);
    }

    ///////////////////////////////////////////
    // REDEMPTION-BLOCKING ADAPTERS REGISTRY //
    ///////////////////////////////////////////

    /// @notice Add adapters which can block shares redemption
    /// @param _adapters The addresses of adapters to be added
    function addRedemptionBlockingAdapters(address[] calldata _adapters)
        external
        onlyFundDeployerOwner
    {
        require(
            _adapters.length > 0,
            "__addRedemptionBlockingAdapters: _adapters cannot be empty"
        );

        __addRedemptionBlockingAdapters(_adapters);
    }

    /// @notice Remove adapters which can block shares redemption
    /// @param _adapters The addresses of adapters to be removed
    function removeRedemptionBlockingAdapters(address[] calldata _adapters)
        external
        onlyFundDeployerOwner
    {
        require(
            _adapters.length > 0,
            "removeRedemptionBlockingAdapters: _adapters cannot be empty"
        );

        for (uint256 i; i < _adapters.length; i++) {
            require(
                adapterCanBlockRedemption(_adapters[i]),
                "removeRedemptionBlockingAdapters: adapter is not added"
            );

            adapterToCanBlockRedemption[_adapters[i]] = false;

            emit AdapterRemoved(_adapters[i]);
        }
    }

    /// @dev Helper to mark adapters that can block shares redemption
    function __addRedemptionBlockingAdapters(address[] memory _adapters) private {
        for (uint256 i; i < _adapters.length; i++) {
            require(
                _adapters[i] != address(0),
                "__addRedemptionBlockingAdapters: adapter cannot be empty"
            );
            require(
                !adapterCanBlockRedemption(_adapters[i]),
                "__addRedemptionBlockingAdapters: adapter already added"
            );

            adapterToCanBlockRedemption[_adapters[i]] = true;

            emit AdapterAdded(_adapters[i]);
        }
    }

    ///////////////////
    // STATE GETTERS //
    ///////////////////

    /// @notice Gets the `redemptionWindowBuffer` variable
    /// @return redemptionWindowBuffer_ The `redemptionWindowBuffer` variable value
    function getRedemptionWindowBuffer() external view returns (uint256 redemptionWindowBuffer_) {
        return redemptionWindowBuffer;
    }

    /// @notice Gets the RedemptionWindow settings for a given fund
    /// @param _comptrollerProxy The ComptrollerProxy of the fund
    /// @return redemptionWindow_ The RedemptionWindow settings
    function getRedemptionWindowForFund(address _comptrollerProxy)
        external
        view
        returns (RedemptionWindow memory redemptionWindow_)
    {
        return comptrollerProxyToRedemptionWindow[_comptrollerProxy];
    }

    /// @notice Checks whether an adapter can block shares redemption
    /// @param _adapter The address of the adapter to check
    /// @return canBlockRedemption_ True if the adapter can block shares redemption
    function adapterCanBlockRedemption(address _adapter)
        public
        view
        returns (bool canBlockRedemption_)
    {
        return adapterToCanBlockRedemption[_adapter];
    }
}

File 2 of 8 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 3 of 8 : IFundDeployer.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

/// @title IFundDeployer Interface
/// @author Enzyme Council <[email protected]>
interface IFundDeployer {
    enum ReleaseStatus {PreLaunch, Live, Paused}

    function getOwner() external view returns (address);

    function getReleaseStatus() external view returns (ReleaseStatus);

    function isRegisteredVaultCall(address, bytes4) external view returns (bool);
}

File 4 of 8 : IPolicy.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

import "./IPolicyManager.sol";

/// @title Policy Interface
/// @author Enzyme Council <[email protected]>
interface IPolicy {
    function activateForFund(address _comptrollerProxy, address _vaultProxy) external;

    function addFundSettings(address _comptrollerProxy, bytes calldata _encodedSettings) external;

    function identifier() external pure returns (string memory identifier_);

    function implementedHooks()
        external
        view
        returns (IPolicyManager.PolicyHook[] memory implementedHooks_);

    function updateFundSettings(
        address _comptrollerProxy,
        address _vaultProxy,
        bytes calldata _encodedSettings
    ) external;

    function validateRule(
        address _comptrollerProxy,
        address _vaultProxy,
        IPolicyManager.PolicyHook _hook,
        bytes calldata _encodedArgs
    ) external returns (bool isValid_);
}

File 5 of 8 : IPolicyManager.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

/// @title PolicyManager Interface
/// @author Enzyme Council <[email protected]>
/// @notice Interface for the PolicyManager
interface IPolicyManager {
    enum PolicyHook {
        BuySharesSetup,
        PreBuyShares,
        PostBuyShares,
        BuySharesCompleted,
        PreCallOnIntegration,
        PostCallOnIntegration
    }

    function validatePolicies(
        address,
        PolicyHook,
        bytes calldata
    ) external;
}

File 6 of 8 : PreCallOnIntegrationValidatePolicyBase.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

import "../../utils/PolicyBase.sol";

/// @title CallOnIntegrationPreValidatePolicyMixin Contract
/// @author Enzyme Council <[email protected]>
/// @notice A mixin contract for policies that only implement the PreCallOnIntegration policy hook
abstract contract PreCallOnIntegrationValidatePolicyBase is PolicyBase {
    /// @notice Gets the implemented PolicyHooks for a policy
    /// @return implementedHooks_ The implemented PolicyHooks
    function implementedHooks()
        external
        view
        override
        returns (IPolicyManager.PolicyHook[] memory implementedHooks_)
    {
        implementedHooks_ = new IPolicyManager.PolicyHook[](1);
        implementedHooks_[0] = IPolicyManager.PolicyHook.PreCallOnIntegration;

        return implementedHooks_;
    }

    /// @notice Helper to decode rule arguments
    function __decodeRuleArgs(bytes memory _encodedRuleArgs)
        internal
        pure
        returns (address adapter_, bytes4 selector_)
    {
        return abi.decode(_encodedRuleArgs, (address, bytes4));
    }
}

File 7 of 8 : PolicyBase.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

import "../../IPolicy.sol";

/// @title PolicyBase Contract
/// @author Enzyme Council <[email protected]>
/// @notice Abstract base contract for all policies
abstract contract PolicyBase is IPolicy {
    address internal immutable POLICY_MANAGER;

    modifier onlyPolicyManager {
        require(msg.sender == POLICY_MANAGER, "Only the PolicyManager can make this call");
        _;
    }

    constructor(address _policyManager) public {
        POLICY_MANAGER = _policyManager;
    }

    /// @notice Validates and initializes a policy as necessary prior to fund activation
    /// @dev Unimplemented by default, can be overridden by the policy
    function activateForFund(address, address) external virtual override {
        return;
    }

    /// @notice Updates the policy settings for a fund
    /// @dev Disallowed by default, can be overridden by the policy
    function updateFundSettings(
        address,
        address,
        bytes calldata
    ) external virtual override {
        revert("updateFundSettings: Updates not allowed for this policy");
    }

    ///////////////////
    // STATE GETTERS //
    ///////////////////

    /// @notice Gets the `POLICY_MANAGER` variable value
    /// @return policyManager_ The `POLICY_MANAGER` variable value
    function getPolicyManager() external view returns (address policyManager_) {
        return POLICY_MANAGER;
    }
}

File 8 of 8 : FundDeployerOwnerMixin.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

import "../../core/fund-deployer/IFundDeployer.sol";

/// @title FundDeployerOwnerMixin Contract
/// @author Enzyme Council <[email protected]>
/// @notice A mixin contract that defers ownership to the owner of FundDeployer
abstract contract FundDeployerOwnerMixin {
    address internal immutable FUND_DEPLOYER;

    modifier onlyFundDeployerOwner() {
        require(
            msg.sender == getOwner(),
            "onlyFundDeployerOwner: Only the FundDeployer owner can call this function"
        );
        _;
    }

    constructor(address _fundDeployer) public {
        FUND_DEPLOYER = _fundDeployer;
    }

    /// @notice Gets the owner of this contract
    /// @return owner_ The owner
    /// @dev Ownership is deferred to the owner of the FundDeployer contract
    function getOwner() public view returns (address owner_) {
        return IFundDeployer(FUND_DEPLOYER).getOwner();
    }

    ///////////////////
    // STATE GETTERS //
    ///////////////////

    /// @notice Gets the `FUND_DEPLOYER` variable
    /// @return fundDeployer_ The `FUND_DEPLOYER` variable value
    function getFundDeployer() external view returns (address fundDeployer_) {
        return FUND_DEPLOYER;
    }
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "details": {
      "constantOptimizer": true,
      "cse": true,
      "deduplicate": true,
      "jumpdestRemover": true,
      "orderLiterals": true,
      "peephole": true,
      "yul": false
    },
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_policyManager","type":"address"},{"internalType":"address","name":"_fundDeployer","type":"address"},{"internalType":"uint256","name":"_redemptionWindowBuffer","type":"uint256"},{"internalType":"address[]","name":"_redemptionBlockingAdapters","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adapter","type":"address"}],"name":"AdapterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adapter","type":"address"}],"name":"AdapterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"comptrollerProxy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"FundSettingsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevBuffer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextBuffer","type":"uint256"}],"name":"RedemptionWindowBufferSet","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"activateForFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"}],"name":"adapterCanBlockRedemption","outputs":[{"internalType":"bool","name":"canBlockRedemption_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_comptrollerProxy","type":"address"},{"internalType":"bytes","name":"_encodedSettings","type":"bytes"}],"name":"addFundSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_adapters","type":"address[]"}],"name":"addRedemptionBlockingAdapters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"calcLatestRedemptionWindowStart","outputs":[{"internalType":"uint256","name":"latestRedemptionWindowStart_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundDeployer","outputs":[{"internalType":"address","name":"fundDeployer_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPolicyManager","outputs":[{"internalType":"address","name":"policyManager_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRedemptionWindowBuffer","outputs":[{"internalType":"uint256","name":"redemptionWindowBuffer_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_comptrollerProxy","type":"address"}],"name":"getRedemptionWindowForFund","outputs":[{"components":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"internalType":"struct GuaranteedRedemption.RedemptionWindow","name":"redemptionWindow_","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"identifier","outputs":[{"internalType":"string","name":"identifier_","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"implementedHooks","outputs":[{"internalType":"enum IPolicyManager.PolicyHook[]","name":"implementedHooks_","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_comptrollerProxy","type":"address"},{"internalType":"address","name":"_adapter","type":"address"}],"name":"passesRule","outputs":[{"internalType":"bool","name":"isValid_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_adapters","type":"address[]"}],"name":"removeRedemptionBlockingAdapters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nextRedemptionWindowBuffer","type":"uint256"}],"name":"setRedemptionWindowBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"updateFundSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_comptrollerProxy","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"enum IPolicyManager.PolicyHook","name":"","type":"uint8"},{"internalType":"bytes","name":"_encodedArgs","type":"bytes"}],"name":"validateRule","outputs":[{"internalType":"bool","name":"isValid_","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162001b1b38038062001b1b83398101604081905262000034916200027f565b6001600160601b0319606085811b821660805284901b1660a05260028290556200005e8162000068565b5050505062000471565b60005b8151811015620001b45760006001600160a01b03168282815181106200008d57fe5b60200260200101516001600160a01b03161415620000c85760405162461bcd60e51b8152600401620000bf90620003c2565b60405180910390fd5b620000ed828281518110620000d957fe5b6020026020010151620001b860201b60201c565b156200010d5760405162461bcd60e51b8152600401620000bf90620003d4565b60016000808484815181106200011f57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507fcf9c2c7f9adbb156bd76affb04df84595f8f5e69cab2e61221b05b05a902fa268282815181106200018c57fe5b6020026020010151604051620001a39190620003b2565b60405180910390a16001016200006b565b5050565b6001600160a01b031660009081526020819052604090205460ff1690565b8051620001e3816200044c565b92915050565b600082601f830112620001fb57600080fd5b8151620002126200020c826200040d565b620003e6565b915081818352602084019350602081019050838560208402820111156200023857600080fd5b60005b83811015620002685781620002518882620001d6565b84525060209283019291909101906001016200023b565b5050505092915050565b8051620001e38162000466565b600080600080608085870312156200029657600080fd5b6000620002a48787620001d6565b9450506020620002b787828801620001d6565b9350506040620002ca8782880162000272565b92505060608501516001600160401b03811115620002e757600080fd5b620002f587828801620001e9565b91505092959194509250565b6200030c8162000437565b82525050565b6000620003216038836200042e565b60008051602062001afb83398151915281527f20616461707465722063616e6e6f7420626520656d7074790000000000000000602082015260400192915050565b6000620003716036836200042e565b60008051602062001afb83398151915281527f206164617074657220616c726561647920616464656400000000000000000000602082015260400192915050565b60208101620001e3828462000301565b60208082528101620001e38162000312565b60208082528101620001e38162000362565b6040518181016001600160401b03811182821017156200040557600080fd5b604052919050565b60006001600160401b038211156200042457600080fd5b5060209081020190565b90815260200190565b60006001600160a01b038216620001e3565b90565b620004578162000437565b81146200046357600080fd5b50565b620004578162000449565b60805160601c60a05160601c611656620004a560003980610482528061057152508061027552806107f752506116566000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638945f190116100a2578063b67cb40c11610071578063b67cb40c14610214578063cbf54bb214610227578063d44ad6cb1461023c578063e0b9ae4014610244578063ef877c0f146102575761010b565b80638945f190146101d35780638e05b36a146101e657806397c0ac87146101f95780639c2f61d6146102015761010b565b806371030453116100de578063710304531461017657806374dc6b4b146101895780637998a1c4146101a9578063893d20e8146101be5761010b565b80630f5f6b4f146101105780632057e3b6146101255780633146d058146101435780635b8f1c5a14610156575b600080fd5b61012361011e366004610d83565b61026a565b005b61012d61038e565b60405161013a919061152d565b60405180910390f35b610123610151366004610c6d565b610394565b610169610164366004610d05565b610398565b60405161013a9190611420565b610169610184366004610bf7565b6103f2565b61019c610197366004610bf7565b610414565b60405161013a919061151f565b6101b161044f565b60405161013a919061142e565b6101c661047e565b60405161013a9190611401565b6101236101e1366004610c9d565b610516565b61012d6101f4366004610e1b565b61052e565b6101c661056f565b61012361020f366004610dd9565b610593565b610169610222366004610c6d565b6106e0565b61022f61079e565b60405161013a919061140f565b6101c66107f5565b610123610252366004610e1b565b610819565b610123610265366004610dd9565b6108b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102bb5760405162461bcd60e51b81526004016102b2906114af565b60405180910390fd5b6000806102ca83850185610e39565b9150915081600014156102fc5780156102f55760405162461bcd60e51b81526004016102b29061147f565b5050610389565b60008111801561030f5750620143708111155b61032b5760405162461bcd60e51b81526004016102b29061150f565b6001600160a01b03851660008181526001602081905260409182902085815501839055517fed112d6c0e84b6900209ce5a4c04541bc63a517e0160888c447ee70be47ce60f9061037e908590859061153b565b60405180910390a250505b505050565b60025490565b5050565b6000806103da84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061094892505050565b5090506103e787826106e0565b979650505050505050565b6001600160a01b03811660009081526020819052604090205460ff165b919050565b61041c610b1b565b506001600160a01b0316600090815260016020818152604092839020835180850190945280548452909101549082015290565b60408051808201909152601581527423aaa0a920a72a22a2a22fa922a222a6a82a24a7a760591b602082015290565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156104d957600080fd5b505afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105119190610c15565b905090565b60405162461bcd60e51b81526004016102b29061146f565b600081421161053e57508061040f565b600061054a4284610968565b9050600061055b8262015180610990565b90506105674282610968565b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b61059b61047e565b6001600160a01b0316336001600160a01b0316146105cb5760405162461bcd60e51b81526004016102b29061144f565b806105e85760405162461bcd60e51b81526004016102b2906114ef565b60005b818110156103895761061783838381811061060257fe5b90506020020160208101906101849190610bf7565b6106335760405162461bcd60e51b81526004016102b2906114cf565b600080600085858581811061064457fe5b90506020020160208101906106599190610bf7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557fdf980d21d8c7bb34800e668dbe003299093bac8e693614151d3c57f73f98a93d8383838181106106ae57fe5b90506020020160208101906106c39190610bf7565b6040516106d09190611401565b60405180910390a16001016105eb565b60006106eb826103f2565b6106f757506001610798565b6106ff610b1b565b506001600160a01b038316600090815260016020818152604092839020835180850190945280548085529201549083015261073e576000915050610798565b600061074d826000015161052e565b90506107668260200151826109c290919063ffffffff16565b42101580610781575060025461077d908290610968565b4211155b1561079157600192505050610798565b6000925050505b92915050565b604080516001808252818301909252606091602080830190803683370190505090506004816000815181106107cf57fe5b602002602001019060058111156107e257fe5b908160058111156107ef57fe5b90525090565b7f000000000000000000000000000000000000000000000000000000000000000090565b61082161047e565b6001600160a01b0316336001600160a01b0316146108515760405162461bcd60e51b81526004016102b29061144f565b600254818114156108745760405162461bcd60e51b81526004016102b2906114ff565b60028290556040517f72325148df4fbe9f28de10305dd97d6bf5531327e3db352c17dd75f123a90751906108ab908390859061153b565b60405180910390a15050565b6108bf61047e565b6001600160a01b0316336001600160a01b0316146108ef5760405162461bcd60e51b81526004016102b29061144f565b8061090c5760405162461bcd60e51b81526004016102b2906114bf565b6103948282808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506109ee92505050565b6000808280602001905181019061095f9190610c33565b91509150915091565b60008282111561098a5760405162461bcd60e51b81526004016102b29061148f565b50900390565b60008082116109b15760405162461bcd60e51b81526004016102b29061149f565b8183816109ba57fe5b069392505050565b6000828201838110156109e75760405162461bcd60e51b81526004016102b29061145f565b9392505050565b60005b81518110156103945760006001600160a01b0316828281518110610a1157fe5b60200260200101516001600160a01b03161415610a405760405162461bcd60e51b81526004016102b29061143f565b610a5c828281518110610a4f57fe5b60200260200101516103f2565b15610a795760405162461bcd60e51b81526004016102b2906114df565b6001600080848481518110610a8a57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507fcf9c2c7f9adbb156bd76affb04df84595f8f5e69cab2e61221b05b05a902fa26828281518110610af657fe5b6020026020010151604051610b0b9190611401565b60405180910390a16001016109f1565b604051806040016040528060008152602001600081525090565b8035610798816115ed565b8051610798816115ed565b60008083601f840112610b5d57600080fd5b50813567ffffffffffffffff811115610b7557600080fd5b602083019150836020820283011115610b8d57600080fd5b9250929050565b805161079881611601565b60008083601f840112610bb157600080fd5b50813567ffffffffffffffff811115610bc957600080fd5b602083019150836001820283011115610b8d57600080fd5b80356107988161160a565b803561079881611617565b600060208284031215610c0957600080fd5b60006105678484610b35565b600060208284031215610c2757600080fd5b60006105678484610b40565b60008060408385031215610c4657600080fd5b6000610c528585610b40565b9250506020610c6385828601610b94565b9150509250929050565b60008060408385031215610c8057600080fd5b6000610c8c8585610b35565b9250506020610c6385828601610b35565b60008060008060608587031215610cb357600080fd5b6000610cbf8787610b35565b9450506020610cd087828801610b35565b935050604085013567ffffffffffffffff811115610ced57600080fd5b610cf987828801610b9f565b95989497509550505050565b600080600080600060808688031215610d1d57600080fd5b6000610d298888610b35565b9550506020610d3a88828901610b35565b9450506040610d4b88828901610be1565b935050606086013567ffffffffffffffff811115610d6857600080fd5b610d7488828901610b9f565b92509250509295509295909350565b600080600060408486031215610d9857600080fd5b6000610da48686610b35565b935050602084013567ffffffffffffffff811115610dc157600080fd5b610dcd86828701610b9f565b92509250509250925092565b60008060208385031215610dec57600080fd5b823567ffffffffffffffff811115610e0357600080fd5b610e0f85828601610b4b565b92509250509250929050565b600060208284031215610e2d57600080fd5b60006105678484610bec565b60008060408385031215610e4c57600080fd5b6000610e588585610bec565b9250506020610c6385828601610bec565b6000610e758383610eee565b505060200190565b610e8681611569565b82525050565b6000610e978261155c565b610ea18185611560565b9350610eac83611556565b8060005b83811015610eda578151610ec48882610e69565b9750610ecf83611556565b925050600101610eb0565b509495945050505050565b610e8681611574565b610e868161159f565b6000610f028261155c565b610f0c8185611560565b9350610f1c8185602086016115aa565b610f25816115d6565b9093019392505050565b6000610f3c603883611560565b7f5f5f616464526564656d7074696f6e426c6f636b696e6741646170746572733a81527f20616461707465722063616e6e6f7420626520656d7074790000000000000000602082015260400192915050565b6000610f9b604983611560565b7f6f6e6c7946756e644465706c6f7965724f776e65723a204f6e6c79207468652081527f46756e644465706c6f796572206f776e65722063616e2063616c6c207468697360208201526810333ab731ba34b7b760b91b604082015260600192915050565b600061100c601b83611560565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611045603783611560565b7f75706461746546756e6453657474696e67733a2055706461746573206e6f742081527f616c6c6f77656420666f72207468697320706f6c696379000000000000000000602082015260400192915050565b60006110a4603a83611560565b7f61646446756e6453657474696e67733a206475726174696f6e206d757374206281527f65203020696620737461727454696d657374616d702069732030000000000000602082015260400192915050565b6000611103601e83611560565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b600061113c601883611560565b7f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815260200192915050565b6000611175602983611560565b7f4f6e6c792074686520506f6c6963794d616e616765722063616e206d616b65208152681d1a1a5cc818d85b1b60ba1b602082015260400192915050565b60006111c0603a83611560565b7f5f5f616464526564656d7074696f6e426c6f636b696e6741646170746572733a81527f205f61646170746572732063616e6e6f7420626520656d707479000000000000602082015260400192915050565b600061121f603683611560565b7f72656d6f7665526564656d7074696f6e426c6f636b696e6741646170746572738152750e881859185c1d195c881a5cc81b9bdd08185919195960521b602082015260400192915050565b6000611277603683611560565b7f5f5f616464526564656d7074696f6e426c6f636b696e6741646170746572733a815275081859185c1d195c88185b1c9958591e48185919195960521b602082015260400192915050565b60006112cf603b83611560565b7f72656d6f7665526564656d7074696f6e426c6f636b696e67416461707465727381527f3a205f61646170746572732063616e6e6f7420626520656d7074790000000000602082015260400192915050565b600061132e602c83611560565b7f736574526564656d7074696f6e57696e646f774275666665723a2056616c756581526b08185b1c9958591e481cd95d60a21b602082015260400192915050565b600061137c603f83611560565b7f61646446756e6453657474696e67733a206475726174696f6e206d757374206281527f65206265747765656e2031207365636f6e6420616e6420323320686f75727300602082015260400192915050565b805160408301906113df84826113f8565b5060208201516113f260208501826113f8565b50505050565b610e868161159c565b602081016107988284610e7d565b602080825281016109e78184610e8c565b602081016107988284610ee5565b602080825281016109e78184610ef7565b6020808252810161079881610f2f565b6020808252810161079881610f8e565b6020808252810161079881610fff565b6020808252810161079881611038565b6020808252810161079881611097565b60208082528101610798816110f6565b602080825281016107988161112f565b6020808252810161079881611168565b60208082528101610798816111b3565b6020808252810161079881611212565b602080825281016107988161126a565b60208082528101610798816112c2565b6020808252810161079881611321565b602080825281016107988161136f565b6040810161079882846113ce565b6020810161079882846113f8565b6040810161154982856113f8565b6109e760208301846113f8565b60200190565b5190565b90815260200190565b600061079882611590565b151590565b6001600160e01b03191690565b8061040f816115e0565b6001600160a01b031690565b90565b600061079882611586565b60005b838110156115c55781810151838201526020016115ad565b838111156113f25750506000910152565b601f01601f191690565b600681106115ea57fe5b50565b6115f681611569565b81146115ea57600080fd5b6115f681611579565b600681106115ea57600080fd5b6115f68161159c56fea264697066735822122033b3bf05b5ddfbd2dfc16bc96503766f8d6ab33981abb505194e39ad73fbd52064736f6c634300060c00335f5f616464526564656d7074696f6e426c6f636b696e6741646170746572733a0000000000000000000000000bd9f0465d21d4c300c7b8d781a013bdc87a31e80000000000000000000000007e6d3b1161df9c9c7527f68d651b297d2fdb820b000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80638945f190116100a2578063b67cb40c11610071578063b67cb40c14610214578063cbf54bb214610227578063d44ad6cb1461023c578063e0b9ae4014610244578063ef877c0f146102575761010b565b80638945f190146101d35780638e05b36a146101e657806397c0ac87146101f95780639c2f61d6146102015761010b565b806371030453116100de578063710304531461017657806374dc6b4b146101895780637998a1c4146101a9578063893d20e8146101be5761010b565b80630f5f6b4f146101105780632057e3b6146101255780633146d058146101435780635b8f1c5a14610156575b600080fd5b61012361011e366004610d83565b61026a565b005b61012d61038e565b60405161013a919061152d565b60405180910390f35b610123610151366004610c6d565b610394565b610169610164366004610d05565b610398565b60405161013a9190611420565b610169610184366004610bf7565b6103f2565b61019c610197366004610bf7565b610414565b60405161013a919061151f565b6101b161044f565b60405161013a919061142e565b6101c661047e565b60405161013a9190611401565b6101236101e1366004610c9d565b610516565b61012d6101f4366004610e1b565b61052e565b6101c661056f565b61012361020f366004610dd9565b610593565b610169610222366004610c6d565b6106e0565b61022f61079e565b60405161013a919061140f565b6101c66107f5565b610123610252366004610e1b565b610819565b610123610265366004610dd9565b6108b7565b336001600160a01b037f0000000000000000000000000bd9f0465d21d4c300c7b8d781a013bdc87a31e816146102bb5760405162461bcd60e51b81526004016102b2906114af565b60405180910390fd5b6000806102ca83850185610e39565b9150915081600014156102fc5780156102f55760405162461bcd60e51b81526004016102b29061147f565b5050610389565b60008111801561030f5750620143708111155b61032b5760405162461bcd60e51b81526004016102b29061150f565b6001600160a01b03851660008181526001602081905260409182902085815501839055517fed112d6c0e84b6900209ce5a4c04541bc63a517e0160888c447ee70be47ce60f9061037e908590859061153b565b60405180910390a250505b505050565b60025490565b5050565b6000806103da84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061094892505050565b5090506103e787826106e0565b979650505050505050565b6001600160a01b03811660009081526020819052604090205460ff165b919050565b61041c610b1b565b506001600160a01b0316600090815260016020818152604092839020835180850190945280548452909101549082015290565b60408051808201909152601581527423aaa0a920a72a22a2a22fa922a222a6a82a24a7a760591b602082015290565b60007f0000000000000000000000007e6d3b1161df9c9c7527f68d651b297d2fdb820b6001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156104d957600080fd5b505afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105119190610c15565b905090565b60405162461bcd60e51b81526004016102b29061146f565b600081421161053e57508061040f565b600061054a4284610968565b9050600061055b8262015180610990565b90506105674282610968565b949350505050565b7f0000000000000000000000007e6d3b1161df9c9c7527f68d651b297d2fdb820b90565b61059b61047e565b6001600160a01b0316336001600160a01b0316146105cb5760405162461bcd60e51b81526004016102b29061144f565b806105e85760405162461bcd60e51b81526004016102b2906114ef565b60005b818110156103895761061783838381811061060257fe5b90506020020160208101906101849190610bf7565b6106335760405162461bcd60e51b81526004016102b2906114cf565b600080600085858581811061064457fe5b90506020020160208101906106599190610bf7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557fdf980d21d8c7bb34800e668dbe003299093bac8e693614151d3c57f73f98a93d8383838181106106ae57fe5b90506020020160208101906106c39190610bf7565b6040516106d09190611401565b60405180910390a16001016105eb565b60006106eb826103f2565b6106f757506001610798565b6106ff610b1b565b506001600160a01b038316600090815260016020818152604092839020835180850190945280548085529201549083015261073e576000915050610798565b600061074d826000015161052e565b90506107668260200151826109c290919063ffffffff16565b42101580610781575060025461077d908290610968565b4211155b1561079157600192505050610798565b6000925050505b92915050565b604080516001808252818301909252606091602080830190803683370190505090506004816000815181106107cf57fe5b602002602001019060058111156107e257fe5b908160058111156107ef57fe5b90525090565b7f0000000000000000000000000bd9f0465d21d4c300c7b8d781a013bdc87a31e890565b61082161047e565b6001600160a01b0316336001600160a01b0316146108515760405162461bcd60e51b81526004016102b29061144f565b600254818114156108745760405162461bcd60e51b81526004016102b2906114ff565b60028290556040517f72325148df4fbe9f28de10305dd97d6bf5531327e3db352c17dd75f123a90751906108ab908390859061153b565b60405180910390a15050565b6108bf61047e565b6001600160a01b0316336001600160a01b0316146108ef5760405162461bcd60e51b81526004016102b29061144f565b8061090c5760405162461bcd60e51b81526004016102b2906114bf565b6103948282808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506109ee92505050565b6000808280602001905181019061095f9190610c33565b91509150915091565b60008282111561098a5760405162461bcd60e51b81526004016102b29061148f565b50900390565b60008082116109b15760405162461bcd60e51b81526004016102b29061149f565b8183816109ba57fe5b069392505050565b6000828201838110156109e75760405162461bcd60e51b81526004016102b29061145f565b9392505050565b60005b81518110156103945760006001600160a01b0316828281518110610a1157fe5b60200260200101516001600160a01b03161415610a405760405162461bcd60e51b81526004016102b29061143f565b610a5c828281518110610a4f57fe5b60200260200101516103f2565b15610a795760405162461bcd60e51b81526004016102b2906114df565b6001600080848481518110610a8a57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507fcf9c2c7f9adbb156bd76affb04df84595f8f5e69cab2e61221b05b05a902fa26828281518110610af657fe5b6020026020010151604051610b0b9190611401565b60405180910390a16001016109f1565b604051806040016040528060008152602001600081525090565b8035610798816115ed565b8051610798816115ed565b60008083601f840112610b5d57600080fd5b50813567ffffffffffffffff811115610b7557600080fd5b602083019150836020820283011115610b8d57600080fd5b9250929050565b805161079881611601565b60008083601f840112610bb157600080fd5b50813567ffffffffffffffff811115610bc957600080fd5b602083019150836001820283011115610b8d57600080fd5b80356107988161160a565b803561079881611617565b600060208284031215610c0957600080fd5b60006105678484610b35565b600060208284031215610c2757600080fd5b60006105678484610b40565b60008060408385031215610c4657600080fd5b6000610c528585610b40565b9250506020610c6385828601610b94565b9150509250929050565b60008060408385031215610c8057600080fd5b6000610c8c8585610b35565b9250506020610c6385828601610b35565b60008060008060608587031215610cb357600080fd5b6000610cbf8787610b35565b9450506020610cd087828801610b35565b935050604085013567ffffffffffffffff811115610ced57600080fd5b610cf987828801610b9f565b95989497509550505050565b600080600080600060808688031215610d1d57600080fd5b6000610d298888610b35565b9550506020610d3a88828901610b35565b9450506040610d4b88828901610be1565b935050606086013567ffffffffffffffff811115610d6857600080fd5b610d7488828901610b9f565b92509250509295509295909350565b600080600060408486031215610d9857600080fd5b6000610da48686610b35565b935050602084013567ffffffffffffffff811115610dc157600080fd5b610dcd86828701610b9f565b92509250509250925092565b60008060208385031215610dec57600080fd5b823567ffffffffffffffff811115610e0357600080fd5b610e0f85828601610b4b565b92509250509250929050565b600060208284031215610e2d57600080fd5b60006105678484610bec565b60008060408385031215610e4c57600080fd5b6000610e588585610bec565b9250506020610c6385828601610bec565b6000610e758383610eee565b505060200190565b610e8681611569565b82525050565b6000610e978261155c565b610ea18185611560565b9350610eac83611556565b8060005b83811015610eda578151610ec48882610e69565b9750610ecf83611556565b925050600101610eb0565b509495945050505050565b610e8681611574565b610e868161159f565b6000610f028261155c565b610f0c8185611560565b9350610f1c8185602086016115aa565b610f25816115d6565b9093019392505050565b6000610f3c603883611560565b7f5f5f616464526564656d7074696f6e426c6f636b696e6741646170746572733a81527f20616461707465722063616e6e6f7420626520656d7074790000000000000000602082015260400192915050565b6000610f9b604983611560565b7f6f6e6c7946756e644465706c6f7965724f776e65723a204f6e6c79207468652081527f46756e644465706c6f796572206f776e65722063616e2063616c6c207468697360208201526810333ab731ba34b7b760b91b604082015260600192915050565b600061100c601b83611560565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611045603783611560565b7f75706461746546756e6453657474696e67733a2055706461746573206e6f742081527f616c6c6f77656420666f72207468697320706f6c696379000000000000000000602082015260400192915050565b60006110a4603a83611560565b7f61646446756e6453657474696e67733a206475726174696f6e206d757374206281527f65203020696620737461727454696d657374616d702069732030000000000000602082015260400192915050565b6000611103601e83611560565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b600061113c601883611560565b7f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815260200192915050565b6000611175602983611560565b7f4f6e6c792074686520506f6c6963794d616e616765722063616e206d616b65208152681d1a1a5cc818d85b1b60ba1b602082015260400192915050565b60006111c0603a83611560565b7f5f5f616464526564656d7074696f6e426c6f636b696e6741646170746572733a81527f205f61646170746572732063616e6e6f7420626520656d707479000000000000602082015260400192915050565b600061121f603683611560565b7f72656d6f7665526564656d7074696f6e426c6f636b696e6741646170746572738152750e881859185c1d195c881a5cc81b9bdd08185919195960521b602082015260400192915050565b6000611277603683611560565b7f5f5f616464526564656d7074696f6e426c6f636b696e6741646170746572733a815275081859185c1d195c88185b1c9958591e48185919195960521b602082015260400192915050565b60006112cf603b83611560565b7f72656d6f7665526564656d7074696f6e426c6f636b696e67416461707465727381527f3a205f61646170746572732063616e6e6f7420626520656d7074790000000000602082015260400192915050565b600061132e602c83611560565b7f736574526564656d7074696f6e57696e646f774275666665723a2056616c756581526b08185b1c9958591e481cd95d60a21b602082015260400192915050565b600061137c603f83611560565b7f61646446756e6453657474696e67733a206475726174696f6e206d757374206281527f65206265747765656e2031207365636f6e6420616e6420323320686f75727300602082015260400192915050565b805160408301906113df84826113f8565b5060208201516113f260208501826113f8565b50505050565b610e868161159c565b602081016107988284610e7d565b602080825281016109e78184610e8c565b602081016107988284610ee5565b602080825281016109e78184610ef7565b6020808252810161079881610f2f565b6020808252810161079881610f8e565b6020808252810161079881610fff565b6020808252810161079881611038565b6020808252810161079881611097565b60208082528101610798816110f6565b602080825281016107988161112f565b6020808252810161079881611168565b60208082528101610798816111b3565b6020808252810161079881611212565b602080825281016107988161126a565b60208082528101610798816112c2565b6020808252810161079881611321565b602080825281016107988161136f565b6040810161079882846113ce565b6020810161079882846113f8565b6040810161154982856113f8565b6109e760208301846113f8565b60200190565b5190565b90815260200190565b600061079882611590565b151590565b6001600160e01b03191690565b8061040f816115e0565b6001600160a01b031690565b90565b600061079882611586565b60005b838110156115c55781810151838201526020016115ad565b838111156113f25750506000910152565b601f01601f191690565b600681106115ea57fe5b50565b6115f681611569565b81146115ea57600080fd5b6115f681611579565b600681106115ea57600080fd5b6115f68161159c56fea264697066735822122033b3bf05b5ddfbd2dfc16bc96503766f8d6ab33981abb505194e39ad73fbd52064736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000bd9f0465d21d4c300c7b8d781a013bdc87a31e80000000000000000000000007e6d3b1161df9c9c7527f68d651b297d2fdb820b000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _policyManager (address): 0x0Bd9f0465d21d4c300c7B8d781A013bdc87A31E8
Arg [1] : _fundDeployer (address): 0x7e6d3b1161DF9c9c7527F68d651B297d2Fdb820B
Arg [2] : _redemptionWindowBuffer (uint256): 300

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000bd9f0465d21d4c300c7b8d781a013bdc87a31e8
Arg [1] : 0000000000000000000000007e6d3b1161df9c9c7527f68d651b297d2fdb820b
Arg [2] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.