ETH Price: $2,598.81 (-2.41%)

Contract

0xF67A426e110c74c566174a37C9269780fB48096d
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...129528472021-08-03 14:36:191289 days ago1628001379IN
0xF67A426e...0fB48096d
0 ETH0.0015190353
Set Performance ...128370462021-07-16 9:17:341307 days ago1626427054IN
0xF67A426e...0fB48096d
0 ETH0.001212345
Set Controller128370442021-07-16 9:17:051307 days ago1626427025IN
0xF67A426e...0fB48096d
0 ETH0.0021430845

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
183941932023-10-20 21:23:23480 days ago1697837003
0xF67A426e...0fB48096d
0 ETH
167683142023-03-06 9:05:35709 days ago1678093535
0xF67A426e...0fB48096d
0 ETH
167212442023-02-27 18:14:23715 days ago1677521663
0xF67A426e...0fB48096d
0 ETH
167211322023-02-27 17:51:47715 days ago1677520307
0xF67A426e...0fB48096d
0 ETH
167211322023-02-27 17:51:47715 days ago1677520307
0xF67A426e...0fB48096d
0 ETH
167211322023-02-27 17:51:47715 days ago1677520307
0xF67A426e...0fB48096d
0 ETH
167211322023-02-27 17:51:47715 days ago1677520307
0xF67A426e...0fB48096d
0 ETH
167211252023-02-27 17:50:23715 days ago1677520223
0xF67A426e...0fB48096d
0 ETH
167211252023-02-27 17:50:23715 days ago1677520223
0xF67A426e...0fB48096d
0 ETH
167211252023-02-27 17:50:23715 days ago1677520223
0xF67A426e...0fB48096d
0 ETH
167211252023-02-27 17:50:23715 days ago1677520223
0xF67A426e...0fB48096d
0 ETH
167210832023-02-27 17:41:35715 days ago1677519695
0xF67A426e...0fB48096d
0 ETH
167210832023-02-27 17:41:35715 days ago1677519695
0xF67A426e...0fB48096d
0 ETH
167210832023-02-27 17:41:35715 days ago1677519695
0xF67A426e...0fB48096d
0 ETH
167210832023-02-27 17:41:35715 days ago1677519695
0xF67A426e...0fB48096d
0 ETH
167210822023-02-27 17:41:23715 days ago1677519683
0xF67A426e...0fB48096d
0 ETH
167210822023-02-27 17:41:23715 days ago1677519683
0xF67A426e...0fB48096d
0 ETH
167210822023-02-27 17:41:23715 days ago1677519683
0xF67A426e...0fB48096d
0 ETH
167210822023-02-27 17:41:23715 days ago1677519683
0xF67A426e...0fB48096d
0 ETH
167206442023-02-27 16:13:11715 days ago1677514391
0xF67A426e...0fB48096d
0 ETH
167206442023-02-27 16:13:11715 days ago1677514391
0xF67A426e...0fB48096d
0 ETH
167206442023-02-27 16:13:11715 days ago1677514391
0xF67A426e...0fB48096d
0 ETH
167206442023-02-27 16:13:11715 days ago1677514391
0xF67A426e...0fB48096d
0 ETH
167175242023-02-27 5:42:59716 days ago1677476579
0xF67A426e...0fB48096d
0 ETH
167175242023-02-27 5:42:59716 days ago1677476579
0xF67A426e...0fB48096d
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PnL

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-17
*/

// SPDX-License-Identifier: AGPLv3
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, 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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * 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);
        uint256 c = a - b;

        return c;
    }

    /**
     * @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. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

pragma solidity >=0.6.0 <0.7.0;

interface IPnL {
    function calcPnL() external view returns (uint256, uint256);

    function increaseGTokenLastAmount(bool pwrd, uint256 dollarAmount) external;

    function decreaseGTokenLastAmount(
        bool pwrd,
        uint256 dollarAmount,
        uint256 bonus
    ) external;

    function lastGvtAssets() external view returns (uint256);

    function lastPwrdAssets() external view returns (uint256);

    function utilisationRatio() external view returns (uint256);

    function emergencyPnL() external;

    function recover() external;

    function distributeStrategyGainLoss(
        uint256 gain,
        uint256 loss,
        address reward
    ) external;

    function distributePriceChange(uint256 currentTotalAssets) external;
}

pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; 
        return msg.data;
    }
}

pragma solidity >=0.6.0 <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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity >=0.6.0 <0.7.0;

interface IController {
    function stablecoins() external view returns (address[3] memory);

    function vaults() external view returns (address[3] memory);

    function underlyingVaults(uint256 i) external view returns (address vault);

    function curveVault() external view returns (address);

    function pnl() external view returns (address);

    function insurance() external view returns (address);

    function lifeGuard() external view returns (address);

    function buoy() external view returns (address);

    function reward() external view returns (address);

    function isValidBigFish(
        bool pwrd,
        bool deposit,
        uint256 amount
    ) external view returns (bool);

    function withdrawHandler() external view returns (address);

    function emergencyHandler() external view returns (address);

    function depositHandler() external view returns (address);

    function totalAssets() external view returns (uint256);

    function gTokenTotalAssets() external view returns (uint256);

    function eoaOnly(address sender) external;

    function getSkimPercent() external view returns (uint256);

    function gToken(bool _pwrd) external view returns (address);

    function emergencyState() external view returns (bool);

    function deadCoin() external view returns (uint256);

    function distributeStrategyGainLoss(uint256 gain, uint256 loss) external;

    function burnGToken(
        bool pwrd,
        bool all,
        address account,
        uint256 amount,
        uint256 bonus
    ) external;

    function mintGToken(
        bool pwrd,
        address account,
        uint256 amount
    ) external;

    function getUserAssets(bool pwrd, address account) external view returns (uint256 deductUsd);

    function referrals(address account) external view returns (address);

    function addReferral(address account, address referral) external;

    function getStrategiesTargetRatio() external view returns (uint256[] memory);

    function withdrawalFee(bool pwrd) external view returns (uint256);

    function validGTokenDecrease(uint256 amount) external view returns (bool);
}

pragma solidity >=0.6.0 <0.7.0;

interface IPausable {
    function paused() external view returns (bool);
}

pragma solidity >=0.6.0 <0.7.0;

contract Controllable is Ownable {
    address public controller;

    event ChangeController(address indexed oldController, address indexed newController);

    modifier whenNotPaused() {
        require(!_pausable().paused(), "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(_pausable().paused(), "Pausable: not paused");
        _;
    }

    function ctrlPaused() public view returns (bool) {
        return _pausable().paused();
    }

    function setController(address newController) external onlyOwner {
        require(newController != address(0), "setController: !0x");
        address oldController = controller;
        controller = newController;
        emit ChangeController(oldController, newController);
    }

    function _controller() internal view returns (IController) {
        require(controller != address(0), "Controller not set");
        return IController(controller);
    }

    function _pausable() internal view returns (IPausable) {
        require(controller != address(0), "Controller not set");
        return IPausable(controller);
    }
}

pragma solidity >=0.6.0 <0.7.0;

contract Constants {
    uint8 public constant N_COINS = 3;
    uint8 public constant DEFAULT_DECIMALS = 18; 
    uint256 public constant DEFAULT_DECIMALS_FACTOR = uint256(10)**DEFAULT_DECIMALS;
    uint8 public constant CHAINLINK_PRICE_DECIMALS = 8;
    uint256 public constant CHAINLINK_PRICE_DECIMAL_FACTOR = uint256(10)**CHAINLINK_PRICE_DECIMALS;
    uint8 public constant PERCENTAGE_DECIMALS = 4;
    uint256 public constant PERCENTAGE_DECIMAL_FACTOR = uint256(10)**PERCENTAGE_DECIMALS;
    uint256 public constant CURVE_RATIO_DECIMALS = 6;
    uint256 public constant CURVE_RATIO_DECIMALS_FACTOR = uint256(10)**CURVE_RATIO_DECIMALS;
}

pragma solidity >=0.6.0 <0.7.0;

interface IToken {
    function factor() external view returns (uint256);

    function factor(uint256 totalAssets) external view returns (uint256);

    function mint(
        address account,
        uint256 _factor,
        uint256 amount
    ) external;

    function burn(
        address account,
        uint256 _factor,
        uint256 amount
    ) external;

    function burnAll(address account) external;

    function totalAssets() external view returns (uint256);

    function getPricePerShare() external view returns (uint256);

    function getShareAssets(uint256 shares) external view returns (uint256);

    function getAssets(address account) external view returns (uint256);
}

pragma solidity >=0.6.0 <0.7.0;

interface IVault {
    function withdraw(uint256 amount) external;

    function withdraw(uint256 amount, address recipient) external;

    function withdrawByStrategyOrder(
        uint256 amount,
        address recipient,
        bool reversed
    ) external;

    function withdrawByStrategyIndex(
        uint256 amount,
        address recipient,
        uint256 strategyIndex
    ) external;

    function deposit(uint256 amount) external;

    function updateStrategyRatio(uint256[] calldata strategyRetios) external;

    function totalAssets() external view returns (uint256);

    function getStrategiesLength() external view returns (uint256);

    function strategyHarvestTrigger(uint256 index, uint256 callCost) external view returns (bool);

    function strategyHarvest(uint256 index) external returns (bool);

    function getStrategyAssets(uint256 index) external view returns (uint256);

    function token() external view returns (address);

    function vault() external view returns (address);

    function investTrigger() external view returns (bool);

    function invest() external;
}

pragma solidity >=0.6.0 <0.7.0;

contract FixedStablecoins is Constants {
    address public immutable DAI; 
    address public immutable USDC; 
    address public immutable USDT; 

    uint256 public immutable DAI_DECIMALS; 
    uint256 public immutable USDC_DECIMALS; 
    uint256 public immutable USDT_DECIMALS; 

    constructor(address[N_COINS] memory _tokens, uint256[N_COINS] memory _decimals) public {
        DAI = _tokens[0];
        USDC = _tokens[1];
        USDT = _tokens[2];
        DAI_DECIMALS = _decimals[0];
        USDC_DECIMALS = _decimals[1];
        USDT_DECIMALS = _decimals[2];
    }

    function underlyingTokens() internal view returns (address[N_COINS] memory tokens) {
        tokens[0] = DAI;
        tokens[1] = USDC;
        tokens[2] = USDT;
    }

    function getToken(uint256 index) internal view returns (address) {
        if (index == 0) {
            return DAI;
        } else if (index == 1) {
            return USDC;
        } else {
            return USDT;
        }
    }

    function decimals() internal view returns (uint256[N_COINS] memory _decimals) {
        _decimals[0] = DAI_DECIMALS;
        _decimals[1] = USDC_DECIMALS;
        _decimals[2] = USDT_DECIMALS;
    }

    function getDecimal(uint256 index) internal view returns (uint256) {
        if (index == 0) {
            return DAI_DECIMALS;
        } else if (index == 1) {
            return USDC_DECIMALS;
        } else {
            return USDT_DECIMALS;
        }
    }
}

contract FixedGTokens {
    IToken public immutable pwrd;
    IToken public immutable gvt;

    constructor(address _pwrd, address _gvt) public {
        pwrd = IToken(_pwrd);
        gvt = IToken(_gvt);
    }

    function gTokens(bool _pwrd) internal view returns (IToken) {
        if (_pwrd) {
            return pwrd;
        } else {
            return gvt;
        }
    }
}

contract FixedVaults is Constants {
    address public immutable DAI_VAULT;
    address public immutable USDC_VAULT;
    address public immutable USDT_VAULT;

    constructor(address[N_COINS] memory _vaults) public {
        DAI_VAULT = _vaults[0];
        USDC_VAULT = _vaults[1];
        USDT_VAULT = _vaults[2];
    }

    function getVault(uint256 index) internal view returns (address) {
        if (index == 0) {
            return DAI_VAULT;
        } else if (index == 1) {
            return USDC_VAULT;
        } else {
            return USDT_VAULT;
        }
    }

    function vaults() internal view returns (address[N_COINS] memory _vaults) {
        _vaults[0] = DAI_VAULT;
        _vaults[1] = USDC_VAULT;
        _vaults[2] = USDT_VAULT;
    }
}

pragma solidity >=0.6.0 <0.7.0;

contract PnL is Controllable, Constants, FixedGTokens, IPnL {
    using SafeMath for uint256;

    uint256 public override lastGvtAssets;
    uint256 public override lastPwrdAssets;
    bool public rebase = true;

    uint256 public performanceFee; 

    event LogRebaseSwitch(bool status);
    event LogNewPerfromanceFee(uint256 fee);
    event LogNewGtokenChange(bool pwrd, int256 change);
    event LogPnLExecution(
        uint256 deductedAssets,
        int256 totalPnL,
        int256 investPnL,
        int256 pricePnL,
        uint256 withdrawalBonus,
        uint256 performanceBonus,
        uint256 beforeGvtAssets,
        uint256 beforePwrdAssets,
        uint256 afterGvtAssets,
        uint256 afterPwrdAssets
    );

    constructor(
        address pwrd,
        address gvt,
        uint256 pwrdAssets,
        uint256 gvtAssets
    ) public FixedGTokens(pwrd, gvt) {
        lastPwrdAssets = pwrdAssets;
        lastGvtAssets = gvtAssets;
    }

    function setRebase(bool _rebase) external onlyOwner {
        rebase = _rebase;
        emit LogRebaseSwitch(_rebase);
    }

    function setPerformanceFee(uint256 _performanceFee) external onlyOwner {
        performanceFee = _performanceFee;
        emit LogNewPerfromanceFee(_performanceFee);
    }

    function increaseGTokenLastAmount(bool pwrd, uint256 dollarAmount) external override {
        require(msg.sender == controller, "increaseGTokenLastAmount: !controller");
        if (!pwrd) {
            lastGvtAssets = lastGvtAssets.add(dollarAmount);
        } else {
            lastPwrdAssets = lastPwrdAssets.add(dollarAmount);
        }
        emit LogNewGtokenChange(pwrd, int256(dollarAmount));
    }

    function decreaseGTokenLastAmount(
        bool pwrd,
        uint256 dollarAmount,
        uint256 bonus
    ) external override {
        require(msg.sender == controller, "decreaseGTokenLastAmount: !controller");
        uint256 lastGA = lastGvtAssets;
        uint256 lastPA = lastPwrdAssets;
        if (!pwrd) {
            lastGA = dollarAmount > lastGA ? 0 : lastGA.sub(dollarAmount);
        } else {
            lastPA = dollarAmount > lastPA ? 0 : lastPA.sub(dollarAmount);
        }
        if (bonus > 0) {
            uint256 preGABeforeBonus = lastGA;
            uint256 prePABeforeBonus = lastPA;
            uint256 preTABeforeBonus = preGABeforeBonus.add(prePABeforeBonus);
            if (rebase) {
                lastGA = preGABeforeBonus.add(bonus.mul(preGABeforeBonus).div(preTABeforeBonus));
                lastPA = prePABeforeBonus.add(bonus.mul(prePABeforeBonus).div(preTABeforeBonus));
            } else {
                lastGA = preGABeforeBonus.add(bonus);
            }
            emit LogPnLExecution(0, int256(bonus), 0, 0, bonus, 0, preGABeforeBonus, prePABeforeBonus, lastGA, lastPA);
        }

        lastGvtAssets = lastGA;
        lastPwrdAssets = lastPA;
        emit LogNewGtokenChange(pwrd, -int256(dollarAmount));
    }

    function calcPnL() external view override returns (uint256, uint256) {
        return (lastGvtAssets, lastPwrdAssets);
    }

    function utilisationRatio() external view override returns (uint256) {
        return lastGvtAssets != 0 ? lastPwrdAssets.mul(PERCENTAGE_DECIMAL_FACTOR).div(lastGvtAssets) : 0;
    }

    function emergencyPnL() external override {
        require(msg.sender == controller, "emergencyPnL: !controller");
        forceDistribute();
    }

    function recover() external override {
        require(msg.sender == controller, "recover: !controller");
        forceDistribute();
    }

    function handleInvestGain(
        uint256 gvtAssets,
        uint256 pwrdAssets,
        uint256 profit,
        address reward
    )
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 performanceBonus;
        if (performanceFee > 0 && reward != address(0)) {
            performanceBonus = profit.mul(performanceFee).div(PERCENTAGE_DECIMAL_FACTOR);
            profit = profit.sub(performanceBonus);
        }
        if (rebase) {
            uint256 totalAssets = gvtAssets.add(pwrdAssets);
            uint256 gvtProfit = profit.mul(gvtAssets).div(totalAssets);
            uint256 pwrdProfit = profit.mul(pwrdAssets).div(totalAssets);

            uint256 factor = pwrdAssets.mul(10000).div(gvtAssets);
            if (factor > 10000) factor = 10000;
            if (factor < 8000) {
                factor = factor.mul(3).div(8).add(3000);
            } else {
                factor = factor.sub(8000).mul(2).add(6000);
            }

            uint256 portionFromPwrdProfit = pwrdProfit.mul(factor).div(10000);
            gvtAssets = gvtAssets.add(gvtProfit.add(portionFromPwrdProfit));
            pwrdAssets = pwrdAssets.add(pwrdProfit.sub(portionFromPwrdProfit));
        } else {
            gvtAssets = gvtAssets.add(profit);
        }
        return (gvtAssets, pwrdAssets, performanceBonus);
    }

    function handleLoss(
        uint256 gvtAssets,
        uint256 pwrdAssets,
        uint256 loss
    ) private pure returns (uint256, uint256) {
        uint256 maxGvtLoss = gvtAssets.sub(DEFAULT_DECIMALS_FACTOR);
        if (loss > maxGvtLoss) {
            gvtAssets = DEFAULT_DECIMALS_FACTOR;
            pwrdAssets = pwrdAssets.sub(loss.sub(maxGvtLoss));
        } else {
            gvtAssets = gvtAssets - loss;
        }
        return (gvtAssets, pwrdAssets);
    }

    function forceDistribute() private {
        uint256 total = _controller().totalAssets();

        if (total > lastPwrdAssets.add(DEFAULT_DECIMALS_FACTOR)) {
            lastGvtAssets = total - lastPwrdAssets;
        } else {
            lastGvtAssets = DEFAULT_DECIMALS_FACTOR;
            lastPwrdAssets = total.sub(DEFAULT_DECIMALS_FACTOR);
        }
    }

    function distributeStrategyGainLoss(
        uint256 gain,
        uint256 loss,
        address reward
    ) external override {
        require(msg.sender == controller, "!Controller");
        uint256 lastGA = lastGvtAssets;
        uint256 lastPA = lastPwrdAssets;
        uint256 performanceBonus;
        uint256 gvtAssets;
        uint256 pwrdAssets;
        int256 investPnL;
        if (gain > 0) {
            (gvtAssets, pwrdAssets, performanceBonus) = handleInvestGain(lastGA, lastPA, gain, reward);
            if (performanceBonus > 0) {
                gvt.mint(reward, gvt.factor(gvtAssets), performanceBonus);
                gvtAssets = gvtAssets.add(performanceBonus);
            }

            lastGvtAssets = gvtAssets;
            lastPwrdAssets = pwrdAssets;
            investPnL = int256(gain);
        } else if (loss > 0) {
            (lastGvtAssets, lastPwrdAssets) = handleLoss(lastGA, lastPA, loss);
            investPnL = -int256(loss);
        }

        emit LogPnLExecution(
            0,
            investPnL,
            investPnL,
            0,
            0,
            performanceBonus,
            lastGA,
            lastPA,
            lastGvtAssets,
            lastPwrdAssets
        );
    }

    function distributePriceChange(uint256 currentTotalAssets) external override {
        require(msg.sender == controller, "!Controller");
        uint256 gvtAssets = lastGvtAssets;
        uint256 pwrdAssets = lastPwrdAssets;
        uint256 totalAssets = gvtAssets.add(pwrdAssets);

        if (currentTotalAssets > totalAssets) {
            lastGvtAssets = gvtAssets.add(currentTotalAssets.sub(totalAssets));
        } else if (currentTotalAssets < totalAssets) {
            (lastGvtAssets, lastPwrdAssets) = handleLoss(gvtAssets, pwrdAssets, totalAssets.sub(currentTotalAssets));
        }
        int256 priceChange = int256(currentTotalAssets) - int256(totalAssets);

        emit LogPnLExecution(
            0,
            priceChange,
            0,
            priceChange,
            0,
            0,
            gvtAssets,
            pwrdAssets,
            lastGvtAssets,
            lastPwrdAssets
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"pwrd","type":"address"},{"internalType":"address","name":"gvt","type":"address"},{"internalType":"uint256","name":"pwrdAssets","type":"uint256"},{"internalType":"uint256","name":"gvtAssets","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldController","type":"address"},{"indexed":true,"internalType":"address","name":"newController","type":"address"}],"name":"ChangeController","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"pwrd","type":"bool"},{"indexed":false,"internalType":"int256","name":"change","type":"int256"}],"name":"LogNewGtokenChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LogNewPerfromanceFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deductedAssets","type":"uint256"},{"indexed":false,"internalType":"int256","name":"totalPnL","type":"int256"},{"indexed":false,"internalType":"int256","name":"investPnL","type":"int256"},{"indexed":false,"internalType":"int256","name":"pricePnL","type":"int256"},{"indexed":false,"internalType":"uint256","name":"withdrawalBonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"performanceBonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beforeGvtAssets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beforePwrdAssets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"afterGvtAssets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"afterPwrdAssets","type":"uint256"}],"name":"LogPnLExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"LogRebaseSwitch","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"},{"inputs":[],"name":"CHAINLINK_PRICE_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAINLINK_PRICE_DECIMAL_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_RATIO_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_RATIO_DECIMALS_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_DECIMALS_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"N_COINS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_DECIMAL_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcPnL","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ctrlPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"pwrd","type":"bool"},{"internalType":"uint256","name":"dollarAmount","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"decreaseGTokenLastAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentTotalAssets","type":"uint256"}],"name":"distributePriceChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gain","type":"uint256"},{"internalType":"uint256","name":"loss","type":"uint256"},{"internalType":"address","name":"reward","type":"address"}],"name":"distributeStrategyGainLoss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyPnL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gvt","outputs":[{"internalType":"contract IToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"pwrd","type":"bool"},{"internalType":"uint256","name":"dollarAmount","type":"uint256"}],"name":"increaseGTokenLastAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastGvtAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPwrdAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pwrd","outputs":[{"internalType":"contract IToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_rebase","type":"bool"}],"name":"setRebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"utilisationRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040526004805460ff1916600117905534801561001d57600080fd5b506040516117423803806117428339818101604052608081101561004057600080fd5b5080516020820151604083015160609093015191929091838360006100636100d7565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606092831b8116608052911b1660a052600391909155600255506100db9050565b3390565b60805160601c60a05160601c61163461010e60003980610ac95280610b645280610b9452508061043e52506116346000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063907064251161010f578063c5008f46116100a2578063e963f18f11610071578063e963f18f146103fe578063ea0d5c5214610406578063f2fde38b1461040e578063f77c479114610434576101e5565b8063c5008f46146103c9578063ce746024146103d1578063e0501ecf146103d9578063e3d94944146103e1576101e5565b80639ecf47c1116100de5780639ecf47c11461037f578063a4723e2e146103b1578063ae70b98a146103b9578063af14052c146103c1576101e5565b8063907064251461034157806392eefe9b146103495780639bcd8aa11461036f5780639e574a1e14610377576101e5565b806343e35fd411610187578063715018a611610156578063715018a6146103045780637e2168c41461030c57806387788782146103315780638da5cb5b14610339576101e5565b806343e35fd4146102cf57806355f4253a146102d75780636f923e73146102df57806370897b23146102e7576101e5565b806320458c55116101c357806320458c551461024b578063250108f61461026c57806329357750146102865780634175e521146102a4576101e5565b8063087eb737146101ea57806313bd44811461020e57806319e409931461022f575b600080fd5b6101f261043c565b604080516001600160a01b039092168252519081900360200190f35b61022d6004803603602081101561022457600080fd5b50351515610460565b005b6102376104ff565b604080519115158252519081900360200190f35b610253610572565b6040805192835260208301919091528051918290030190f35b61027461057c565b60408051918252519081900360200190f35b61028e610583565b6040805160ff9092168252519081900360200190f35b61022d600480360360608110156102ba57600080fd5b50803515159060208101359060400135610588565b61027461074f565b61022d610755565b61028e6107be565b61022d600480360360208110156102fd57600080fd5b50356107c3565b61022d610856565b61022d6004803603604081101561032257600080fd5b508035151590602001356108f8565b6102746109ad565b6101f26109b3565b61028e6109c2565b61022d6004803603602081101561035f57600080fd5b50356001600160a01b03166109c7565b610274610ac1565b6101f2610ac7565b61022d6004803603606081101561039557600080fd5b50803590602081013590604001356001600160a01b0316610aeb565b610274610d5a565b610274610d8a565b610237610d90565b61028e610d99565b61022d610d9e565b610274610df4565b61022d600480360360208110156103f757600080fd5b5035610df9565b610274610f22565b610274610f2a565b61022d6004803603602081101561042457600080fd5b50356001600160a01b0316610f36565b6101f261102e565b7f000000000000000000000000000000000000000000000000000000000000000081565b61046861103d565b6000546001600160a01b039081169116146104b8576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b6004805482151560ff19909116811790915560408051918252517f308a325a9a7c180e9ab721beb4d3cd1c25d8f1870c68c51a355de2161212964b9181900360200190a150565b6000610509611041565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561054157600080fd5b505afa158015610555573d6000803e3d6000fd5b505050506040513d602081101561056b57600080fd5b5051905090565b6002546003549091565b620f424081565b600381565b6001546001600160a01b031633146105d15760405162461bcd60e51b815260040180806020018281038252602581526020018061154e6025913960400191505060405180910390fd5b600254600354846105fc578184116105f2576105ed82856110a6565b6105f5565b60005b9150610618565b8084116106125761060d81856110a6565b610615565b60005b90505b82156106fe578181600061062c83836110f1565b60045490915060ff1615610679576106586106518261064b898761114b565b906111a4565b84906110f1565b945061067261066b8261064b898661114b565b83906110f1565b9350610686565b61068383876110f1565b94505b60408051600080825260208201899052818301819052606082018190526080820189905260a082015260c0810185905260e081018490526101008101879052610120810186905290517ff2d119552d7316f99d27eb713660ea3aecb21208fb6be5db18863114fd2cc6d6918190036101400190a15050505b600282905560038190556040805186151581526000869003602082015281517f0c9b8acb6da02b6a2b3147cd65dc109190905599b269cb241db9f074f3c66426929181900390910190a15050505050565b60025481565b6001546001600160a01b031633146107b4576040805162461bcd60e51b815260206004820152601960248201527f656d657267656e6379506e4c3a2021636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6107bc6111e6565b565b600881565b6107cb61103d565b6000546001600160a01b0390811691161461081b576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b60058190556040805182815290517f0af2e26cbe8023b3d5bc41b2b0425695395082fd6ee7462be3dc716bbfc702d69181900360200190a150565b61085e61103d565b6000546001600160a01b039081169116146108ae576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001546001600160a01b031633146109415760405162461bcd60e51b81526004018080602001828103825260258152602001806115da6025913960400191505060405180910390fd5b8161095b5760025461095390826110f1565b60025561096c565b60035461096890826110f1565b6003555b6040805183151581526020810183905281517f0c9b8acb6da02b6a2b3147cd65dc109190905599b269cb241db9f074f3c66426929181900390910190a15050565b60055481565b6000546001600160a01b031690565b600481565b6109cf61103d565b6000546001600160a01b03908116911614610a1f576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b6001600160a01b038116610a6f576040805162461bcd60e51b81526020600482015260126024820152710e6cae886dedce8e4ded8d8cae474404260f60731b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f7bd9aab74fc8b860dff8328bda449632993abb9bd61340154740618a3debeb8990600090a35050565b60035481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b03163314610b38576040805162461bcd60e51b815260206004820152600b60248201526a10a1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b60025460035460008080808815610cb657610b5586868b8a6112a0565b955090935091508315610ca5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663156e29f6887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636131858e876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610bf657600080fd5b505afa158015610c0a573d6000803e3d6000fd5b505050506040513d6020811015610c2057600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526044820188905251606480830192600092919082900301818387803b158015610c7757600080fd5b505af1158015610c8b573d6000803e3d6000fd5b50505050610ca284846110f190919063ffffffff16565b92505b506002829055600381905587610cd4565b8715610cd457610cc786868a6113fb565b6003556002555060008790035b6002546003546040805160008082526020820186905281830186905260608201819052608082015260a0810188905260c081018a905260e08101899052610100810193909352610120830191909152517ff2d119552d7316f99d27eb713660ea3aecb21208fb6be5db18863114fd2cc6d6918190036101400190a1505050505050505050565b600060025460001415610d6e576000610d85565b600254600354610d85919061064b9061271061114b565b905090565b61271081565b60045460ff1681565b601281565b6001546001600160a01b031633146107b4576040805162461bcd60e51b81526020600482015260146024820152733932b1b7bb32b91d1010b1b7b73a3937b63632b960611b604482015290519081900360640190fd5b600681565b6001546001600160a01b03163314610e46576040805162461bcd60e51b815260206004820152600b60248201526a10a1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6002546003546000610e5883836110f1565b905080841115610e7757610e6f61065185836110a6565b600255610e9a565b80841015610e9a57610e938383610e8e84886110a6565b6113fb565b6003556002555b60025460035460408051600080825285890360208301819052828401829052606083018190526080830182905260a083019190915260c0820188905260e08201879052610100820194909452610120810192909252517ff2d119552d7316f99d27eb713660ea3aecb21208fb6be5db18863114fd2cc6d6918190036101400190a15050505050565b6305f5e10081565b670de0b6b3a764000081565b610f3e61103d565b6000546001600160a01b03908116911614610f8e576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b6001600160a01b038116610fd35760405162461bcd60e51b81526004018080602001828103825260268152602001806115736026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b3390565b6001546000906001600160a01b0316611096576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9bdb1b195c881b9bdd081cd95d60721b604482015290519081900360640190fd5b506001546001600160a01b031690565b60006110e883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611451565b90505b92915050565b6000828201838110156110e8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261115a575060006110eb565b8282028284828161116757fe5b04146110e85760405162461bcd60e51b81526004018080602001828103825260218152602001806115996021913960400191505060405180910390fd5b60006110e883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506114e8565b60006111f0611041565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b15801561122857600080fd5b505afa15801561123c573d6000803e3d6000fd5b505050506040513d602081101561125257600080fd5b505160035490915061126c90670de0b6b3a76400006110f1565b81111561128057600354810360025561129d565b670de0b6b3a764000060028190556112999082906110a6565b6003555b50565b60008060008060006005541180156112c057506001600160a01b03851615155b156112ea576005546112db906127109061064b90899061114b565b90506112e786826110a6565b95505b60045460ff16156113e157600061130189896110f1565b905060006113138261064b8a8d61114b565b905060006113258361064b8b8d61114b565b905060006113398c61064b8d61271061114b565b905061271081111561134a57506127105b611f4081101561137757611370610bb861136a600861064b85600361114b565b906110f1565b9050611397565b61139461177061136a600261138e85611f406110a6565b9061114b565b90505b60006113a961271061064b858561114b565b90506113bf6113b885836110f1565b8e906110f1565b9c506113d56113ce84836110a6565b8d906110f1565b9b5050505050506113ee565b6113eb88876110f1565b97505b9697959695945050505050565b6000808061141186670de0b6b3a76400006110a6565b90508084111561144157670de0b6b3a7640000955061143a61143385836110a6565b86906110a6565b9450611447565b83860395505b5093949293505050565b600081848411156114e05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156114a557818101518382015260200161148d565b50505050905090810190601f1680156114d25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836115375760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156114a557818101518382015260200161148d565b50600083858161154357fe5b049594505050505056fe646563726561736547546f6b656e4c617374416d6f756e743a2021636f6e74726f6c6c65724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572696e63726561736547546f6b656e4c617374416d6f756e743a2021636f6e74726f6c6c6572a264697066735822122067c1e1b843e865c250d9de13f99ad977cf44e80b5210fe4dca163fe36d882bfa64736f6c634300060c0033000000000000000000000000f0a93d4994b3d98fb5e3a2f90dbc2d69073cb86b0000000000000000000000003adb04e127b9c0a5d36094125669d4603ac52a0c00000000000000000000000000000000000000000000863731abbde088da577700000000000000000000000000000000000000000001a2920710413463cccfe7

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063907064251161010f578063c5008f46116100a2578063e963f18f11610071578063e963f18f146103fe578063ea0d5c5214610406578063f2fde38b1461040e578063f77c479114610434576101e5565b8063c5008f46146103c9578063ce746024146103d1578063e0501ecf146103d9578063e3d94944146103e1576101e5565b80639ecf47c1116100de5780639ecf47c11461037f578063a4723e2e146103b1578063ae70b98a146103b9578063af14052c146103c1576101e5565b8063907064251461034157806392eefe9b146103495780639bcd8aa11461036f5780639e574a1e14610377576101e5565b806343e35fd411610187578063715018a611610156578063715018a6146103045780637e2168c41461030c57806387788782146103315780638da5cb5b14610339576101e5565b806343e35fd4146102cf57806355f4253a146102d75780636f923e73146102df57806370897b23146102e7576101e5565b806320458c55116101c357806320458c551461024b578063250108f61461026c57806329357750146102865780634175e521146102a4576101e5565b8063087eb737146101ea57806313bd44811461020e57806319e409931461022f575b600080fd5b6101f261043c565b604080516001600160a01b039092168252519081900360200190f35b61022d6004803603602081101561022457600080fd5b50351515610460565b005b6102376104ff565b604080519115158252519081900360200190f35b610253610572565b6040805192835260208301919091528051918290030190f35b61027461057c565b60408051918252519081900360200190f35b61028e610583565b6040805160ff9092168252519081900360200190f35b61022d600480360360608110156102ba57600080fd5b50803515159060208101359060400135610588565b61027461074f565b61022d610755565b61028e6107be565b61022d600480360360208110156102fd57600080fd5b50356107c3565b61022d610856565b61022d6004803603604081101561032257600080fd5b508035151590602001356108f8565b6102746109ad565b6101f26109b3565b61028e6109c2565b61022d6004803603602081101561035f57600080fd5b50356001600160a01b03166109c7565b610274610ac1565b6101f2610ac7565b61022d6004803603606081101561039557600080fd5b50803590602081013590604001356001600160a01b0316610aeb565b610274610d5a565b610274610d8a565b610237610d90565b61028e610d99565b61022d610d9e565b610274610df4565b61022d600480360360208110156103f757600080fd5b5035610df9565b610274610f22565b610274610f2a565b61022d6004803603602081101561042457600080fd5b50356001600160a01b0316610f36565b6101f261102e565b7f000000000000000000000000f0a93d4994b3d98fb5e3a2f90dbc2d69073cb86b81565b61046861103d565b6000546001600160a01b039081169116146104b8576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b6004805482151560ff19909116811790915560408051918252517f308a325a9a7c180e9ab721beb4d3cd1c25d8f1870c68c51a355de2161212964b9181900360200190a150565b6000610509611041565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561054157600080fd5b505afa158015610555573d6000803e3d6000fd5b505050506040513d602081101561056b57600080fd5b5051905090565b6002546003549091565b620f424081565b600381565b6001546001600160a01b031633146105d15760405162461bcd60e51b815260040180806020018281038252602581526020018061154e6025913960400191505060405180910390fd5b600254600354846105fc578184116105f2576105ed82856110a6565b6105f5565b60005b9150610618565b8084116106125761060d81856110a6565b610615565b60005b90505b82156106fe578181600061062c83836110f1565b60045490915060ff1615610679576106586106518261064b898761114b565b906111a4565b84906110f1565b945061067261066b8261064b898661114b565b83906110f1565b9350610686565b61068383876110f1565b94505b60408051600080825260208201899052818301819052606082018190526080820189905260a082015260c0810185905260e081018490526101008101879052610120810186905290517ff2d119552d7316f99d27eb713660ea3aecb21208fb6be5db18863114fd2cc6d6918190036101400190a15050505b600282905560038190556040805186151581526000869003602082015281517f0c9b8acb6da02b6a2b3147cd65dc109190905599b269cb241db9f074f3c66426929181900390910190a15050505050565b60025481565b6001546001600160a01b031633146107b4576040805162461bcd60e51b815260206004820152601960248201527f656d657267656e6379506e4c3a2021636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6107bc6111e6565b565b600881565b6107cb61103d565b6000546001600160a01b0390811691161461081b576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b60058190556040805182815290517f0af2e26cbe8023b3d5bc41b2b0425695395082fd6ee7462be3dc716bbfc702d69181900360200190a150565b61085e61103d565b6000546001600160a01b039081169116146108ae576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001546001600160a01b031633146109415760405162461bcd60e51b81526004018080602001828103825260258152602001806115da6025913960400191505060405180910390fd5b8161095b5760025461095390826110f1565b60025561096c565b60035461096890826110f1565b6003555b6040805183151581526020810183905281517f0c9b8acb6da02b6a2b3147cd65dc109190905599b269cb241db9f074f3c66426929181900390910190a15050565b60055481565b6000546001600160a01b031690565b600481565b6109cf61103d565b6000546001600160a01b03908116911614610a1f576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b6001600160a01b038116610a6f576040805162461bcd60e51b81526020600482015260126024820152710e6cae886dedce8e4ded8d8cae474404260f60731b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f7bd9aab74fc8b860dff8328bda449632993abb9bd61340154740618a3debeb8990600090a35050565b60035481565b7f0000000000000000000000003adb04e127b9c0a5d36094125669d4603ac52a0c81565b6001546001600160a01b03163314610b38576040805162461bcd60e51b815260206004820152600b60248201526a10a1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b60025460035460008080808815610cb657610b5586868b8a6112a0565b955090935091508315610ca5577f0000000000000000000000003adb04e127b9c0a5d36094125669d4603ac52a0c6001600160a01b031663156e29f6887f0000000000000000000000003adb04e127b9c0a5d36094125669d4603ac52a0c6001600160a01b0316636131858e876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610bf657600080fd5b505afa158015610c0a573d6000803e3d6000fd5b505050506040513d6020811015610c2057600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526044820188905251606480830192600092919082900301818387803b158015610c7757600080fd5b505af1158015610c8b573d6000803e3d6000fd5b50505050610ca284846110f190919063ffffffff16565b92505b506002829055600381905587610cd4565b8715610cd457610cc786868a6113fb565b6003556002555060008790035b6002546003546040805160008082526020820186905281830186905260608201819052608082015260a0810188905260c081018a905260e08101899052610100810193909352610120830191909152517ff2d119552d7316f99d27eb713660ea3aecb21208fb6be5db18863114fd2cc6d6918190036101400190a1505050505050505050565b600060025460001415610d6e576000610d85565b600254600354610d85919061064b9061271061114b565b905090565b61271081565b60045460ff1681565b601281565b6001546001600160a01b031633146107b4576040805162461bcd60e51b81526020600482015260146024820152733932b1b7bb32b91d1010b1b7b73a3937b63632b960611b604482015290519081900360640190fd5b600681565b6001546001600160a01b03163314610e46576040805162461bcd60e51b815260206004820152600b60248201526a10a1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6002546003546000610e5883836110f1565b905080841115610e7757610e6f61065185836110a6565b600255610e9a565b80841015610e9a57610e938383610e8e84886110a6565b6113fb565b6003556002555b60025460035460408051600080825285890360208301819052828401829052606083018190526080830182905260a083019190915260c0820188905260e08201879052610100820194909452610120810192909252517ff2d119552d7316f99d27eb713660ea3aecb21208fb6be5db18863114fd2cc6d6918190036101400190a15050505050565b6305f5e10081565b670de0b6b3a764000081565b610f3e61103d565b6000546001600160a01b03908116911614610f8e576040805162461bcd60e51b815260206004820181905260248201526000805160206115ba833981519152604482015290519081900360640190fd5b6001600160a01b038116610fd35760405162461bcd60e51b81526004018080602001828103825260268152602001806115736026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b3390565b6001546000906001600160a01b0316611096576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9bdb1b195c881b9bdd081cd95d60721b604482015290519081900360640190fd5b506001546001600160a01b031690565b60006110e883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611451565b90505b92915050565b6000828201838110156110e8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261115a575060006110eb565b8282028284828161116757fe5b04146110e85760405162461bcd60e51b81526004018080602001828103825260218152602001806115996021913960400191505060405180910390fd5b60006110e883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506114e8565b60006111f0611041565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b15801561122857600080fd5b505afa15801561123c573d6000803e3d6000fd5b505050506040513d602081101561125257600080fd5b505160035490915061126c90670de0b6b3a76400006110f1565b81111561128057600354810360025561129d565b670de0b6b3a764000060028190556112999082906110a6565b6003555b50565b60008060008060006005541180156112c057506001600160a01b03851615155b156112ea576005546112db906127109061064b90899061114b565b90506112e786826110a6565b95505b60045460ff16156113e157600061130189896110f1565b905060006113138261064b8a8d61114b565b905060006113258361064b8b8d61114b565b905060006113398c61064b8d61271061114b565b905061271081111561134a57506127105b611f4081101561137757611370610bb861136a600861064b85600361114b565b906110f1565b9050611397565b61139461177061136a600261138e85611f406110a6565b9061114b565b90505b60006113a961271061064b858561114b565b90506113bf6113b885836110f1565b8e906110f1565b9c506113d56113ce84836110a6565b8d906110f1565b9b5050505050506113ee565b6113eb88876110f1565b97505b9697959695945050505050565b6000808061141186670de0b6b3a76400006110a6565b90508084111561144157670de0b6b3a7640000955061143a61143385836110a6565b86906110a6565b9450611447565b83860395505b5093949293505050565b600081848411156114e05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156114a557818101518382015260200161148d565b50505050905090810190601f1680156114d25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836115375760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156114a557818101518382015260200161148d565b50600083858161154357fe5b049594505050505056fe646563726561736547546f6b656e4c617374416d6f756e743a2021636f6e74726f6c6c65724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572696e63726561736547546f6b656e4c617374416d6f756e743a2021636f6e74726f6c6c6572a264697066735822122067c1e1b843e865c250d9de13f99ad977cf44e80b5210fe4dca163fe36d882bfa64736f6c634300060c0033

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

000000000000000000000000f0a93d4994b3d98fb5e3a2f90dbc2d69073cb86b0000000000000000000000003adb04e127b9c0a5d36094125669d4603ac52a0c00000000000000000000000000000000000000000000863731abbde088da577700000000000000000000000000000000000000000001a2920710413463cccfe7

-----Decoded View---------------
Arg [0] : pwrd (address): 0xF0a93d4994B3d98Fb5e3A2F90dBc2d69073Cb86b
Arg [1] : gvt (address): 0x3ADb04E127b9C0a5D36094125669d4603AC52a0c
Arg [2] : pwrdAssets (uint256): 633815258791687426299767
Arg [3] : gvtAssets (uint256): 1976642923452724455198695

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0a93d4994b3d98fb5e3a2f90dbc2d69073cb86b
Arg [1] : 0000000000000000000000003adb04e127b9c0a5d36094125669d4603ac52a0c
Arg [2] : 00000000000000000000000000000000000000000000863731abbde088da5777
Arg [3] : 00000000000000000000000000000000000000000001a2920710413463cccfe7


Deployed Bytecode Sourcemap

17963:8259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16763:28;;;:::i;:::-;;;;-1:-1:-1;;;;;16763:28:0;;;;;;;;;;;;;;18967:127;;;;;;;;;;;;;;;;-1:-1:-1;18967:127:0;;;;:::i;:::-;;11796:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;21014:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13144:87;;;:::i;:::-;;;;;;;;;;;;;;;;12611:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19710:1296;;;;;;;;;;;;;;;;-1:-1:-1;19710:1296:0;;;;;;;;;;;;;;:::i;18065:37::-;;;:::i;21340:151::-;;;:::i;12788:50::-;;;:::i;19102:175::-;;;;;;;;;;;;;;;;-1:-1:-1;19102:175:0;;:::i;8435:148::-;;;:::i;19285:417::-;;;;;;;;;;;;;;;;-1:-1:-1;19285:417:0;;;;;;;;;:::i;18188:29::-;;;:::i;7793:79::-;;;:::i;12946:45::-;;;:::i;11899:286::-;;;;;;;;;;;;;;;;-1:-1:-1;11899:286:0;-1:-1:-1;;;;;11899:286:0;;:::i;18109:38::-;;;:::i;16798:27::-;;;:::i;23973:1282::-;;;;;;;;;;;;;;;;-1:-1:-1;23973:1282:0;;;;;;;;;;;-1:-1:-1;;;;;23973:1282:0;;:::i;21148:184::-;;;:::i;12998:84::-;;;:::i;18154:25::-;;;:::i;12651:43::-;;;:::i;21499:141::-;;;:::i;13089:48::-;;;:::i;25263:956::-;;;;;;;;;;;;;;;;-1:-1:-1;25263:956:0;;:::i;12845:94::-;;;:::i;12702:79::-;;;:::i;8738:244::-;;;;;;;;;;;;;;;;-1:-1:-1;8738:244:0;-1:-1:-1;;;;;8738:244:0;;:::i;11441:25::-;;;:::i;16763:28::-;;;:::o;18967:127::-;8015:12;:10;:12::i;:::-;8005:6;;-1:-1:-1;;;;;8005:6:0;;;:22;;;7997:67;;;;;-1:-1:-1;;;7997:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7997:67:0;;;;;;;;;;;;;;;19030:6:::1;:16:::0;;;::::1;;-1:-1:-1::0;;19030:16:0;;::::1;::::0;::::1;::::0;;;19062:24:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;18967:127:::0;:::o;11796:95::-;11839:4;11863:11;:9;:11::i;:::-;-1:-1:-1;;;;;11863:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11863:20:0;;-1:-1:-1;11796:95:0;:::o;21014:126::-;21102:13;;21117:14;;21014:126;;:::o;13144:87::-;13198:33;13144:87;:::o;12611:33::-;12643:1;12611:33;:::o;19710:1296::-;19877:10;;-1:-1:-1;;;;;19877:10:0;19863;:24;19855:74;;;;-1:-1:-1;;;19855:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19957:13;;19998:14;;20028:4;20023:193;;20073:6;20058:12;:21;:52;;20086:24;:6;20097:12;20086:10;:24::i;:::-;20058:52;;;20082:1;20058:52;20049:61;;20023:193;;;20167:6;20152:12;:21;:52;;20180:24;:6;20191:12;20180:10;:24::i;:::-;20152:52;;;20176:1;20152:52;20143:61;;20023:193;20230:9;;20226:641;;20283:6;20331;20256:24;20379:38;20283:6;20331;20379:20;:38::i;:::-;20436:6;;20352:65;;-1:-1:-1;20436:6:0;;20432:303;;;20472:71;20493:49;20525:16;20493:27;:5;20503:16;20493:9;:27::i;:::-;:31;;:49::i;:::-;20472:16;;:20;:71::i;:::-;20463:80;-1:-1:-1;20571:71:0;20592:49;20624:16;20592:27;:5;20602:16;20592:9;:27::i;:49::-;20571:16;;:20;:71::i;:::-;20562:80;;20432:303;;;20692:27;:16;20713:5;20692:20;:27::i;:::-;20683:36;;20432:303;20754:101;;;20770:1;20754:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20226:641;;;;20879:13;:22;;;20912:14;:23;;;20951:47;;;;;;;;-1:-1:-1;20976:21:0;;;20951:47;;;;;;;;;;;;;;;;;19710:1296;;;;;:::o;18065:37::-;;;;:::o;21340:151::-;21415:10;;-1:-1:-1;;;;;21415:10:0;21401;:24;21393:62;;;;;-1:-1:-1;;;21393:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21466:17;:15;:17::i;:::-;21340:151::o;12788:50::-;12837:1;12788:50;:::o;19102:175::-;8015:12;:10;:12::i;:::-;8005:6;;-1:-1:-1;;;;;8005:6:0;;;:22;;;7997:67;;;;;-1:-1:-1;;;7997:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7997:67:0;;;;;;;;;;;;;;;19184:14:::1;:32:::0;;;19232:37:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;19102:175:::0;:::o;8435:148::-;8015:12;:10;:12::i;:::-;8005:6;;-1:-1:-1;;;;;8005:6:0;;;:22;;;7997:67;;;;;-1:-1:-1;;;7997:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7997:67:0;;;;;;;;;;;;;;;8542:1:::1;8526:6:::0;;8505:40:::1;::::0;-1:-1:-1;;;;;8526:6:0;;::::1;::::0;8505:40:::1;::::0;8542:1;;8505:40:::1;8573:1;8556:19:::0;;-1:-1:-1;;;;;;8556:19:0::1;::::0;;8435:148::o;19285:417::-;19403:10;;-1:-1:-1;;;;;19403:10:0;19389;:24;19381:74;;;;-1:-1:-1;;;19381:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19471:4;19466:167;;19508:13;;:31;;19526:12;19508:17;:31::i;:::-;19492:13;:47;19466:167;;;19589:14;;:32;;19608:12;19589:18;:32::i;:::-;19572:14;:49;19466:167;19648:46;;;;;;;;;;;;;;;;;;;;;;;;;;;19285:417;;:::o;18188:29::-;;;;:::o;7793:79::-;7831:7;7858:6;-1:-1:-1;;;;;7858:6:0;7793:79;:::o;12946:45::-;12990:1;12946:45;:::o;11899:286::-;8015:12;:10;:12::i;:::-;8005:6;;-1:-1:-1;;;;;8005:6:0;;;:22;;;7997:67;;;;;-1:-1:-1;;;7997:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7997:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11983:27:0;::::1;11975:58;;;::::0;;-1:-1:-1;;;11975:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11975:58:0;;;;;;;;;;;;;::::1;;12068:10;::::0;;-1:-1:-1;;;;;12089:26:0;;::::1;-1:-1:-1::0;;;;;;12089:26:0;::::1;::::0;::::1;::::0;;;12131:46:::1;::::0;12068:10;::::1;::::0;12089:26;12068:10;;12131:46:::1;::::0;12044:21:::1;::::0;12131:46:::1;8075:1;11899:286:::0;:::o;18109:38::-;;;;:::o;16798:27::-;;;:::o;23973:1282::-;24138:10;;-1:-1:-1;;;;;24138:10:0;24124;:24;24116:48;;;;;-1:-1:-1;;;24116:48:0;;;;;;;;;;;;-1:-1:-1;;;24116:48:0;;;;;;;;;;;;;;;24192:13;;24233:14;;24175;;;;24381:8;;24377:601;;24450:46;24467:6;24475;24483:4;24489:6;24450:16;:46::i;:::-;24406:90;-1:-1:-1;24406:90:0;;-1:-1:-1;24406:90:0;-1:-1:-1;24515:20:0;;24511:180;;24556:3;-1:-1:-1;;;;;24556:8:0;;24565:6;24573:3;-1:-1:-1;;;;;24573:10:0;;24584:9;24573:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24573:21:0;24556:57;;;-1:-1:-1;;;;;;24556:57:0;;;;;;;-1:-1:-1;;;;;24556:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24556:57:0;;;;;;;-1:-1:-1;24556:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24644:31;24658:16;24644:9;:13;;:31;;;;:::i;:::-;24632:43;;24511:180;-1:-1:-1;24707:13:0;:25;;;24747:14;:27;;;24808:4;24377:601;;;24835:8;;24831:147;;24894:32;24905:6;24913;24921:4;24894:10;:32::i;:::-;24876:14;24860:66;24861:13;24860:66;-1:-1:-1;24861:13:0;24953;;;24831:147;25194:13;;25222:14;;24995:252;;;25025:1;24995:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23973:1282;;;;;;;;;:::o;21148:184::-;21208:7;21235:13;;21252:1;21235:18;;:89;;21323:1;21235:89;;;21306:13;;21256:14;;:64;;21306:13;21256:45;;13050:32;21256:18;:45::i;:64::-;21228:96;;21148:184;:::o;12998:84::-;13050:32;12998:84;:::o;18154:25::-;;;;;;:::o;12651:43::-;12692:2;12651:43;:::o;21499:141::-;21569:10;;-1:-1:-1;;;;;21569:10:0;21555;:24;21547:57;;;;;-1:-1:-1;;;21547:57:0;;;;;;;;;;;;-1:-1:-1;;;21547:57:0;;;;;;;;;;;;;;13089:48;13136:1;13089:48;:::o;25263:956::-;25373:10;;-1:-1:-1;;;;;25373:10:0;25359;:24;25351:48;;;;;-1:-1:-1;;;25351:48:0;;;;;;;;;;;;-1:-1:-1;;;25351:48:0;;;;;;;;;;;;;;;25430:13;;25475:14;;25410:17;25522:25;25430:13;25475:14;25522:13;:25::i;:::-;25500:47;;25585:11;25564:18;:32;25560:306;;;25629:50;25643:35;:18;25666:11;25643:22;:35::i;25629:50::-;25613:13;:66;25560:306;;;25722:11;25701:18;:32;25697:169;;;25784:70;25795:9;25806:10;25818:35;:11;25834:18;25818:15;:35::i;:::-;25784:10;:70::i;:::-;25766:14;25750:104;25751:13;25750:104;25697:169;26158:13;;26186:14;;25963:248;;;25876:18;25963:248;;;25897:48;;;25963:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25263:956;;;;;:::o;12845:94::-;12902:37;12845:94;:::o;12702:79::-;12752:29;12702:79;:::o;8738:244::-;8015:12;:10;:12::i;:::-;8005:6;;-1:-1:-1;;;;;8005:6:0;;;:22;;;7997:67;;;;;-1:-1:-1;;;7997:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7997:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;8827:22:0;::::1;8819:73;;;;-1:-1:-1::0;;;8819:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8929:6;::::0;;8908:38:::1;::::0;-1:-1:-1;;;;;8908:38:0;;::::1;::::0;8929:6;::::1;::::0;8908:38:::1;::::0;::::1;8957:6;:17:::0;;-1:-1:-1;;;;;;8957:17:0::1;-1:-1:-1::0;;;;;8957:17:0;;;::::1;::::0;;;::::1;::::0;;8738:244::o;11441:25::-;;;-1:-1:-1;;;;;11441:25:0;;:::o;6505:106::-;6593:10;6505:106;:::o;12375:168::-;12449:10;;12419:9;;-1:-1:-1;;;;;12449:10:0;12441:55;;;;;-1:-1:-1;;;12441:55:0;;;;;;;;;;;;-1:-1:-1;;;12441:55:0;;;;;;;;;;;;;;;-1:-1:-1;12524:10:0;;-1:-1:-1;;;;;12524:10:0;12375:168;:::o;1375:136::-;1433:7;1460:43;1464:1;1467;1460:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1453:50;;1375:136;;;;;:::o;911:181::-;969:7;1001:5;;;1025:6;;;;1017:46;;;;;-1:-1:-1;;;1017:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2265:280;2323:7;2377:6;2373:47;;-1:-1:-1;2407:1:0;2400:8;;2373:47;2444:5;;;2448:1;2444;:5;:1;2468:5;;;;;:10;2460:56;;;;-1:-1:-1;;;2460:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3021:132;3079:7;3106:39;3110:1;3113;3106:39;;;;;;;;;;;;;;;;;:3;:39::i;23596:369::-;23642:13;23658;:11;:13::i;:::-;-1:-1:-1;;;;;23658:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23658:27:0;23710:14;;23658:27;;-1:-1:-1;23710:43:0;;12752:29;23710:18;:43::i;:::-;23702:5;:51;23698:260;;;23794:14;;23786:22;;23770:13;:38;23698:260;;;12752:29;23841:13;:39;;;23912:34;;:5;;:9;:34::i;:::-;23895:14;:51;23698:260;23596:369;:::o;21648:1446::-;21851:7;21873;21895;21930:24;21986:1;21969:14;;:18;:42;;;;-1:-1:-1;;;;;;21991:20:0;;;;21969:42;21965:203;;;22058:14;;22047:57;;13050:32;;22047:26;;:6;;:10;:26::i;:57::-;22028:76;-1:-1:-1;22128:28:0;:6;22028:76;22128:10;:28::i;:::-;22119:37;;21965:203;22182:6;;;;22178:850;;;22205:19;22227:25;:9;22241:10;22227:13;:25::i;:::-;22205:47;-1:-1:-1;22267:17:0;22287:38;22205:47;22287:21;:6;22298:9;22287:10;:21::i;:38::-;22267:58;-1:-1:-1;22340:18:0;22361:39;22388:11;22361:22;:6;22372:10;22361;:22::i;:39::-;22340:60;-1:-1:-1;22417:14:0;22434:36;22460:9;22434:21;:10;22449:5;22434:14;:21::i;:36::-;22417:53;;22498:5;22489:6;:14;22485:34;;;-1:-1:-1;22514:5:0;22485:34;22547:4;22538:6;:13;22534:176;;;22581:30;22606:4;22581:20;22599:1;22581:13;:6;22592:1;22581:10;:13::i;:20::-;:24;;:30::i;:::-;22572:39;;22534:176;;;22661:33;22689:4;22661:23;22682:1;22661:16;:6;22672:4;22661:10;:16::i;:::-;:20;;:23::i;:33::-;22652:42;;22534:176;22726:29;22758:33;22785:5;22758:22;:10;22773:6;22758:14;:22::i;:33::-;22726:65;-1:-1:-1;22818:51:0;22832:36;:9;22726:65;22832:13;:36::i;:::-;22818:9;;:13;:51::i;:::-;22806:63;-1:-1:-1;22897:53:0;22912:37;:10;22927:21;22912:14;:37::i;:::-;22897:10;;:14;:53::i;:::-;22884:66;;22178:850;;;;;;;;22995:21;:9;23009:6;22995:13;:21::i;:::-;22983:33;;22178:850;23046:9;;23057:10;;23069:16;21648:1446;-1:-1:-1;;;;;21648:1446:0:o;23102:486::-;23231:7;;;23281:38;:9;12752:29;23281:13;:38::i;:::-;23260:59;;23341:10;23334:4;:17;23330:210;;;12752:29;;-1:-1:-1;23431:36:0;23446:20;:4;23455:10;23446:8;:20::i;:::-;23431:10;;:14;:36::i;:::-;23418:49;;23330:210;;;23524:4;23512:9;:16;23500:28;;23330:210;-1:-1:-1;23558:9:0;;23569:10;;-1:-1:-1;;;23102:486:0:o;1814:192::-;1900:7;1936:12;1928:6;;;;1920:29;;;;-1:-1:-1;;;1920:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1972:5:0;;;1814:192::o;3649:201::-;3735:7;3770:12;3763:5;3755:28;;;;-1:-1:-1;;;3755:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3794:9;3810:1;3806;:5;;;;;;;3649:201;-1:-1:-1;;;;;3649:201:0:o

Swarm Source

ipfs://67c1e1b843e865c250d9de13f99ad977cf44e80b5210fe4dca163fe36d882bfa

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.