Contract 0x3204AF4b290b8f4f0fdf91284818ebB53b90459c 3

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xd469be34135792181c60065af9ba4459361660fc2a0df09c624d7947fba8ff8bRedeem192679662021-09-22 21:47:44556 days 13 hrs ago0x693ad12dba5f6e07de86faa21098b691f60a1bea IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0000991233
0x1a84248e24e09c40ab07f76b6b1421847b6e9f98b67b1b6237388e99e65dbe08Redeem190842952021-09-18 12:11:58560 days 23 hrs ago0x631088af5a770bee50ffa7dd5dc18994616dc1ff IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.00049909212
0x1d740e56a50ba6fb73368de12caa440ce7389a51f061a3cd95794f6ec7f119b4Redeem188442502021-09-12 18:18:53566 days 17 hrs ago0x8f43d451247347a675d75d025987136b1c74d137 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0000831822
0x1a0ce54721851694afe38b988151ab845d0709a6b4ce71f0dcf86ced611c9d24Redeem185934192021-09-06 18:10:03572 days 17 hrs ago0xf125c50b31e538964821c42214afa4724f195928 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0009912330
0xe2a962bc8aeefed525514aa37668f1d74521caabc0ca419cbfe5c83f47866257Redeem181708162021-08-27 15:16:07582 days 20 hrs ago0xdb7f2c92af67632ab6a43ad0ef7bd53a99f634e1 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.000295623573.63
0x326f74ebbcf78e23360b2c35b938993ce43d0c44fe76c7436580ba57f77e34a9Redeem181645112021-08-27 11:39:21582 days 23 hrs ago0x274a434f95cfe49702df41022f2fdb629267f3c8 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0012477330
0x8bdf0b203faaf46873fb08623a5314e76fdd7c84729f0215c968faf382b2cc26Redeem181284682021-08-26 14:56:07583 days 20 hrs ago0xb2b1bea208abe6d9af7e090970cf0803afa5965c IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0012477330
0x7af2740f5602646ba8076b1ee48b866f0d87b72723d991a8a08ac76eed998105Redeem181190252021-08-26 9:31:29584 days 1 hr ago0x7aa6fc0ecec21138a68d4beb6541156be38aa36c IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0008318220
0x8cf63948058b39396f8d3a13cc1097c309d7857a4f7cf196d45997c15e2aec44Redeem181099132021-08-26 4:18:17584 days 7 hrs ago0x375c1dc69f05ff526498c8aca48805eec52861d5 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0009912330
0x05cd267013d7dafdce0429ce2f93059d80b060e6884d819ea53270b7f67d07a4Redeem181095412021-08-26 4:05:29584 days 7 hrs ago0xdb7f2c92af67632ab6a43ad0ef7bd53a99f634e1 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0024431730
0xaaa0cc71f63405ef0ba15b7479f1e44ee52167139017fcf8d67e3e5817efa25eRedeem180996332021-08-25 22:20:37584 days 13 hrs ago0xb5c68163ef35ca846e2dde2144ee18a0570be9f5 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0000643391
0xa171b8bdb8b341f19e1702837107ee1dc1869177780457fc3a6b0f4ae469acfaDeposit180993882021-08-25 22:12:11584 days 13 hrs ago0xb5c68163ef35ca846e2dde2144ee18a0570be9f5 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.007634430
0x84525c1d46149c033da577803f1ec4fc04013d401fbac489b5c24ba814cdbfe2Deposit180745762021-08-25 7:55:03585 days 3 hrs ago0x4bb02c6a86cc516e355bd25ff48ce800355af2b7 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0080840430
0x78cbabee3610b9512c1a175303a59a1e388fedadcd8bf41d57f44c8e349f9bc1Deposit180743982021-08-25 7:48:55585 days 3 hrs ago0x9a5da4e26d99fb53daedae1e947158ecb656c625 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.007634430
0x3a938f7221431193b790486894d44080509ee5c6aa7582658fc13c0a33810314Deposit180673422021-08-25 3:46:23585 days 7 hrs ago0x3f9f7fd77ab68d8512d6df8f91126547047c5421 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0198494478
0x091957c2d58c5ee099f898c388b923d8bbe6a7d846b1fc4f6891ef85ff38d503Redeem180673312021-08-25 3:46:01585 days 7 hrs ago0x3f9f7fd77ab68d8512d6df8f91126547047c5421 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.00261023979
0x83b1a2518306c93a75c5334d0b0d1ae35dc3de99da509743f31b43c74e6e920cDeposit180668792021-08-25 3:30:25585 days 7 hrs ago0xdb7f2c92af67632ab6a43ad0ef7bd53a99f634e1 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.007634430
0x47c328f129ac2acba741f9dc86adcf119b8da244410eadd33b781fd7706b6773Deposit180623182021-08-25 0:53:39585 days 10 hrs ago0x49b144d329b096d2772533f936b5fda6ddf8dbdb IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0080840430
0xcef5144c5d66154dad0d1ba457b37e2c51b84e3210b080732d05ec1f39b52edaDeposit180196462021-08-23 23:33:22586 days 11 hrs ago0x7f82e84c2021a311131e894ceff475047ded4673 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0059480430
0x0a13b321007ef4ce5f5ab6bffc8a2549e0829af949071daf8c5a8fa89ae2650bDeposit180195852021-08-23 23:31:20586 days 11 hrs ago0x7f82e84c2021a311131e894ceff475047ded4673 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0080840430
0xafb031be3fe04d5a100e7a632d974dfd5b8239df0373d710e6a12b4108111a7eDeposit180150032021-08-23 20:53:48586 days 14 hrs ago0xbcc81db2b905742bc15027ef51b8a358d13494c9 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0080840430
0xbd785e217f09badf9176d12b3869663470acd50c0db9c1687c3f0f8962f03b76Redeem180149842021-08-23 20:53:10586 days 14 hrs ago0xbcc81db2b905742bc15027ef51b8a358d13494c9 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0009912330
0xb3c41b1419f41286dfe555e45d1a3a414cb0a2c3f24cf49d79a3670964086a52Redeem180143432021-08-23 20:31:08586 days 14 hrs ago0x7b1dc43d55433ba71d87ddecbd4db27a5b26f800 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.0003216355
0xadb41bf1a7f00b38fe760e14f83f19d03b644717fff489127b5b8ff7618d62a2Deposit180143042021-08-23 20:29:46586 days 14 hrs ago0x6958136b0ed4f162a4ecfab966b12b5e1ea657c4 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.001347345
0x69d78f6071b1eca0f8f8c692b284ac796c162a7a270b3dd528574f5ceb0ce038Deposit180142342021-08-23 20:24:54586 days 14 hrs ago0x7b1dc43d55433ba71d87ddecbd4db27a5b26f800 IN  0x3204af4b290b8f4f0fdf91284818ebb53b90459c0 MATIC0.001272345
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KlimaBondDepository

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-04-16
*/

/**
 *Submitted for verification at polygonscan.com on 2021-10-23
*/

// ██╗  ██╗██╗     ██╗███╗   ███╗ █████╗     ██████╗  █████╗  ██████╗
// ██║ ██╔╝██║     ██║████╗ ████║██╔══██╗    ██╔══██╗██╔══██╗██╔═══██╗
// █████╔╝ ██║     ██║██╔████╔██║███████║    ██║  ██║███████║██║   ██║
// ██╔═██╗ ██║     ██║██║╚██╔╝██║██╔══██║    ██║  ██║██╔══██║██║   ██║
// ██║  ██╗███████╗██║██║ ╚═╝ ██║██║  ██║    ██████╔╝██║  ██║╚██████╔╝
// ╚═╝  ╚═╝╚══════╝╚═╝╚═╝     ╚═╝╚═╝  ╚═╝    ╚═════╝ ╚═╝  ╚═╝ ╚═════╝


// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface IOwnable {
    function policy() external view returns (address);

    function renounceManagement() external;

    function pushManagement( address newOwner_ ) external;

    function pullManagement() external;
}

contract Ownable is IOwnable {

    address internal _owner;
    address internal _newOwner;

    event OwnershipPushed(address indexed previousOwner, address indexed newOwner);
    event OwnershipPulled(address indexed previousOwner, address indexed newOwner);

    constructor () {
        _owner = msg.sender;
        emit OwnershipPushed( address(0), _owner );
    }

    function policy() public view override returns (address) {
        return _owner;
    }

    modifier onlyPolicy() {
        require( _owner == msg.sender, "Ownable: caller is not the owner" );
        _;
    }

    function renounceManagement() public virtual override onlyPolicy() {
        emit OwnershipPushed( _owner, address(0) );
        _owner = address(0);
    }

    function pushManagement( address newOwner_ ) public virtual override onlyPolicy() {
        require( newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipPushed( _owner, newOwner_ );
        _newOwner = newOwner_;
    }

    function pullManagement() public virtual override {
        require( msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled( _owner, _newOwner );
        _owner = _newOwner;
    }
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    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;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function addressToString(address _address) internal pure returns(string memory) {
        bytes32 _bytes = bytes32(uint256(_address));
        bytes memory HEX = "0123456789abcdef";
        bytes memory _addr = new bytes(42);

        _addr[0] = '0';
        _addr[1] = 'x';

        for(uint256 i = 0; i < 20; i++) {
            _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
            _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
        }

        return string(_addr);

    }
}

interface IERC20 {
    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

abstract contract ERC20 is IERC20 {

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );

    mapping (address => uint256) internal _balances;

    mapping (address => mapping (address => uint256)) internal _allowances;

    uint256 internal _totalSupply;

    string internal _name;

    string internal _symbol;

    uint8 internal _decimals;

    constructor (string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view override returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account_, uint256 ammount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address( this ), account_, ammount_);
        _totalSupply = _totalSupply.add(ammount_);
        _balances[account_] = _balances[account_].add(ammount_);
        emit Transfer(address( this ), account_, ammount_);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

interface IERC2612Permit {

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
}

library Counters {
    using SafeMath for uint256;

    struct Counter {

        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name())),
                keccak256(bytes("1")), // Version
                chainID,
                address(this)
            )
        );
    }

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct =
        keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));

        bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));

        address signer = ecrecover(_hash, v, r, s);
        require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {

        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

library FullMath {
    function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & -d;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);
        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;
        require(h < d, 'FullMath::mulDiv: overflow');
        return fullDiv(l, h, d);
    }
}

library FixedPoint {

    struct uq112x112 {
        uint224 _x;
    }

    struct uq144x112 {
        uint256 _x;
    }

    uint8 private constant RESOLUTION = 112;
    uint256 private constant Q112 = 0x10000000000000000000000000000;
    uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000;
    uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits)

    function decode(uq112x112 memory self) internal pure returns (uint112) {
        return uint112(self._x >> RESOLUTION);
    }

    function decode112with18(uq112x112 memory self) internal pure returns (uint) {

        return uint(self._x) / 5192296858534827;
    }

    function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) {
        require(denominator > 0, 'FixedPoint::fraction: division by zero');
        if (numerator == 0) return FixedPoint.uq112x112(0);

        if (numerator <= uint144(-1)) {
            uint256 result = (numerator << RESOLUTION) / denominator;
            require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        } else {
            uint256 result = FullMath.mulDiv(numerator, Q112, denominator);
            require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        }
    }
}

interface ITreasury {
    function deposit( uint _amount, address _token, uint _profit ) external returns ( bool );
    function valueOf( address _token, uint _amount ) external view returns ( uint value_ );
}

interface IBondCalculator {
    function valuation( address _LP, uint _amount ) external view returns ( uint );
    function markdown( address _LP ) external view returns ( uint );
}

interface IStaking {
    function stake( uint _amount, address _recipient ) external returns ( bool );
}

interface IStakingHelper {
    function stake( uint _amount, address _recipient ) external;
}

contract KlimaBondDepository is Ownable {

    using FixedPoint for *;
    using SafeERC20 for IERC20;
    using SafeMath for uint;




    /* ======== EVENTS ======== */

    event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD );
    event BondRedeemed( address indexed recipient, uint payout, uint remaining );
    event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio );
    event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition );




    /* ======== STATE VARIABLES ======== */

    address public immutable KLIMA; // token given as payment for bond
    address public immutable principle; // token used to create bond
    address public immutable treasury; // mints KLIMA when receives principle
    address public immutable DAO; // receives profit share from bond

    bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different
    address public immutable bondCalculator; // calculates value of LP tokens

    address public staking; // to auto-stake payout
    address public stakingHelper; // to stake and claim if no staking warmup
    bool public useHelper;

    Terms public terms; // stores terms for new bonds
    Adjust public adjustment; // stores adjustment to BCV data

    mapping( address => Bond ) public bondInfo; // stores bond information for depositors

    uint public totalDebt; // total value of outstanding bonds; used for pricing
    uint public lastDecay; // reference block for debt decay




    /* ======== STRUCTS ======== */

    // Info for creating new bonds
    struct Terms {
        uint controlVariable; // scaling variable for price
        uint vestingTerm; // in blocks
        uint minimumPrice; // vs principle value
        uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5%
        uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid)
        uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt
    }

    // Info for bond holder
    struct Bond {
        uint payout; // KLIMA remaining to be paid
        uint vesting; // Blocks left to vest
        uint lastBlock; // Last interaction
        uint pricePaid; // In BCT, for front end viewing
    }

    // Info for incremental adjustments to control variable 
    struct Adjust {
        bool add; // addition or subtraction
        uint rate; // increment
        uint target; // BCV when adjustment finished
        uint buffer; // minimum length (in blocks) between adjustments
        uint lastBlock; // block when last adjustment made
    }

    /* ======== INITIALIZATION ======== */

    constructor (
        address _KLIMA,
        address _principle,
        address _treasury,
        address _DAO,
        address _bondCalculator
    ) {
        require( _KLIMA != address(0) );
        KLIMA = _KLIMA;
        require( _principle != address(0) );
        principle = _principle;
        require( _treasury != address(0) );
        treasury = _treasury;
        require( _DAO != address(0) );
        DAO = _DAO;
        // bondCalculator should be address(0) if not LP bond
        bondCalculator = _bondCalculator;
        isLiquidityBond = ( _bondCalculator != address(0) );
    }

    /**
     *  @notice initializes bond parameters
     *  @param _controlVariable uint
     *  @param _vestingTerm uint
     *  @param _minimumPrice uint
     *  @param _maxPayout uint
     *  @param _fee uint
     *  @param _maxDebt uint
     *  @param _initialDebt uint
     */
    function initializeBondTerms(
        uint _controlVariable,
        uint _vestingTerm,
        uint _minimumPrice,
        uint _maxPayout,
        uint _fee,
        uint _maxDebt,
        uint _initialDebt
    ) external onlyPolicy() {
        require( terms.controlVariable == 0, "Bonds must be initialized from 0" );
        terms = Terms ({
        controlVariable: _controlVariable,
        vestingTerm: _vestingTerm,
        minimumPrice: _minimumPrice,
        maxPayout: _maxPayout,
        fee: _fee,
        maxDebt: _maxDebt
        });
        totalDebt = _initialDebt;
        lastDecay = block.number;
    }
    /* ======== POLICY FUNCTIONS ======== */

    enum PARAMETER { VESTING, PAYOUT, FEE, DEBT }
    /**
     *  @notice set parameters for new bonds
     *  @param _parameter PARAMETER
     *  @param _input uint
     */
    function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() {
        if ( _parameter == PARAMETER.VESTING ) { // 0
            require( _input >= 10000, "Vesting must be longer than 36 hours" );
            terms.vestingTerm = _input;
        } else if ( _parameter == PARAMETER.PAYOUT ) { // 1
            require( _input <= 1000, "Payout cannot be above 1 percent" );
            terms.maxPayout = _input;
        } else if ( _parameter == PARAMETER.FEE ) { // 2
            require( _input <= 10000, "DAO fee cannot exceed payout" );
            terms.fee = _input;
        } else if ( _parameter == PARAMETER.DEBT ) { // 3
            terms.maxDebt = _input;
        }
    }

    /**
     *  @notice set control variable adjustment
     *  @param _addition bool
     *  @param _increment uint
     *  @param _target uint
     *  @param _buffer uint
     */
    function setAdjustment (
        bool _addition,
        uint _increment,
        uint _target,
        uint _buffer
    ) external onlyPolicy() {
        require( _increment <= terms.controlVariable.mul( 25 ).div( 1000 ), "Increment too large" );

        adjustment = Adjust({
        add: _addition,
        rate: _increment,
        target: _target,
        buffer: _buffer,
        lastBlock: block.number
        });
    }

    /**
     *  @notice set contract for auto stake
     *  @param _staking address
     *  @param _helper bool
     */
    function setStaking( address _staking, bool _helper ) external onlyPolicy() {
        require( _staking != address(0) );
        if ( _helper ) {
            useHelper = true;
            stakingHelper = _staking;
        } else {
            useHelper = false;
            staking = _staking;
        }
    }

    /* ======== USER FUNCTIONS ======== */

    /**
     *  @notice deposit bond
     *  @param _amount uint
     *  @param _maxPrice uint
     *  @param _depositor address
     *  @return uint
     */
    function deposit(
        uint _amount,
        uint _maxPrice,
        address _depositor
    ) external returns ( uint ) {
        require( _depositor != address(0), "Invalid address" );

        decayDebt();
        require( totalDebt <= terms.maxDebt, "Max capacity reached" );

        uint priceInUSD = bondPriceInUSD(); // Stored in bond info
        uint nativePrice = _bondPrice();

        require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection

        uint value = ITreasury( treasury ).valueOf( principle, _amount );
        uint payout = payoutFor( value ); // payout to bonder is computed

        require( payout >= 10000000, "Bond too small" ); // must be > 0.01 KLIMA ( underflow protection )
        require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage

        // profits are calculated
        uint fee = payout.mul( terms.fee ).div( 10000 );
        uint profit = value.sub( payout ).sub( fee );

        /**
            principle is transferred in
            approved and
            deposited into the treasury, returning (_amount - profit) KLIMA
         */
        IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount );
        IERC20( principle ).approve( address( treasury ), _amount );
        ITreasury( treasury ).deposit( _amount, principle, profit );

        if ( fee != 0 ) { // fee is transferred to dao 
            IERC20( KLIMA ).safeTransfer( DAO, fee );
        }

        // total debt is increased
        totalDebt = totalDebt.add( value );

        // depositor info is stored
        bondInfo[ _depositor ] = Bond({
        payout: bondInfo[ _depositor ].payout.add( payout ),
        vesting: terms.vestingTerm,
        lastBlock: block.number,
        pricePaid: priceInUSD
        });

        // indexed events are emitted
        emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ), priceInUSD );
        emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() );

        adjust(); // control variable is adjusted
        return payout;
    }

    /** 
     *  @notice redeem bond for user
     *  @param _recipient address
     *  @param _stake bool
     *  @return uint
     */
    function redeem( address _recipient, bool _stake ) external returns ( uint ) {
        Bond memory info = bondInfo[ _recipient ];
        uint percentVested = percentVestedFor( _recipient ); // (blocks since last interaction / vesting term remaining)

        if ( percentVested >= 10000 ) { // if fully vested
            delete bondInfo[ _recipient ]; // delete user info
            emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data
            return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due

        } else { // if unfinished
            // calculate payout vested
            uint payout = info.payout.mul( percentVested ).div( 10000 );

            // store updated deposit info
            bondInfo[ _recipient ] = Bond({
            payout: info.payout.sub( payout ),
            vesting: info.vesting.sub( block.number.sub( info.lastBlock ) ),
            lastBlock: block.number,
            pricePaid: info.pricePaid
            });

            emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout );
            return stakeOrSend( _recipient, _stake, payout );
        }
    }




    /* ======== INTERNAL HELPER FUNCTIONS ======== */

    /**
     *  @notice allow user to stake payout automatically
     *  @param _stake bool
     *  @param _amount uint
     *  @return uint
     */
    function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) {
        if ( !_stake ) { // if user does not want to stake
            IERC20( KLIMA ).transfer( _recipient, _amount ); // send payout
        } else { // if user wants to stake
            if ( useHelper ) { // use if staking warmup is 0
                IERC20( KLIMA ).approve( stakingHelper, _amount );
                IStakingHelper( stakingHelper ).stake( _amount, _recipient );
            } else {
                IERC20( KLIMA ).approve( staking, _amount );
                IStaking( staking ).stake( _amount, _recipient );
            }
        }
        return _amount;
    }

    /**
     *  @notice makes incremental adjustment to control variable
     */
    function adjust() internal {
        uint blockCanAdjust = adjustment.lastBlock.add( adjustment.buffer );
        if( adjustment.rate != 0 && block.number >= blockCanAdjust ) {
            uint initial = terms.controlVariable;
            if ( adjustment.add ) {
                terms.controlVariable = terms.controlVariable.add( adjustment.rate );
                if ( terms.controlVariable >= adjustment.target ) {
                    adjustment.rate = 0;
                }
            } else {
                terms.controlVariable = terms.controlVariable.sub( adjustment.rate );
                if ( terms.controlVariable <= adjustment.target ) {
                    adjustment.rate = 0;
                }
            }
            adjustment.lastBlock = block.number;
            emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add );
        }
    }

    /**
     *  @notice reduce total debt
     */
    function decayDebt() internal {
        totalDebt = totalDebt.sub( debtDecay() );
        lastDecay = block.number;
    }




    /* ======== VIEW FUNCTIONS ======== */

    /**
     *  @notice determine maximum bond size
     *  @return uint
     */
    function maxPayout() public view returns ( uint ) {
        return IERC20( KLIMA ).totalSupply().mul( terms.maxPayout ).div( 100000 );
    }

    /**
     *  @notice calculate interest due for new bond
     *  @param _value uint
     *  @return uint
     */
    function payoutFor( uint _value ) public view returns ( uint ) {
        return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 );
    }


    /**
     *  @notice calculate current bond premium
     *  @return price_ uint
     */
    function bondPrice() public view returns ( uint price_ ) {
        price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 );
        if ( price_ < terms.minimumPrice ) {
            price_ = terms.minimumPrice;
        }
    }

    /**
     *  @notice calculate current bond price and remove floor if above
     *  @return price_ uint
     */
    function _bondPrice() internal returns ( uint price_ ) {
        price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 );
        if ( price_ < terms.minimumPrice ) {
            price_ = terms.minimumPrice;
        } else if ( terms.minimumPrice != 0 ) {
            terms.minimumPrice = 0;
        }
    }

    /**
     *  @notice converts bond price to BCT value
     *  @return price_ uint
     */
    function bondPriceInUSD() public view returns ( uint price_ ) {
        if( isLiquidityBond ) {
            price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 );
        } else {
            price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 );
        }
    }


    /**
     *  @notice calculate current ratio of debt to KLIMA supply
     *  @return debtRatio_ uint
     */
    function debtRatio() public view returns ( uint debtRatio_ ) {
        uint supply = IERC20( KLIMA ).totalSupply();
        debtRatio_ = FixedPoint.fraction(
            currentDebt().mul( 1e9 ),
            supply
        ).decode112with18().div( 1e18 );
    }

    /**
     *  @notice debt ratio in same terms for reserve or liquidity bonds
     *  @return uint
     */
    function standardizedDebtRatio() external view returns ( uint ) {
        if ( isLiquidityBond ) {
            return debtRatio().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 1e9 );
        } else {
            return debtRatio();
        }
    }

    /**
     *  @notice calculate debt factoring in decay
     *  @return uint
     */
    function currentDebt() public view returns ( uint ) {
        return totalDebt.sub( debtDecay() );
    }

    /**
     *  @notice amount to decay total debt by
     *  @return decay_ uint
     */
    function debtDecay() public view returns ( uint decay_ ) {
        uint blocksSinceLast = block.number.sub( lastDecay );
        decay_ = totalDebt.mul( blocksSinceLast ).div( terms.vestingTerm );
        if ( decay_ > totalDebt ) {
            decay_ = totalDebt;
        }
    }


    /**
     *  @notice calculate how far into vesting a depositor is
     *  @param _depositor address
     *  @return percentVested_ uint
     */
    function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) {
        Bond memory bond = bondInfo[ _depositor ];
        uint blocksSinceLast = block.number.sub( bond.lastBlock );
        uint vesting = bond.vesting;

        if ( vesting > 0 ) {
            percentVested_ = blocksSinceLast.mul( 10000 ).div( vesting );
        } else {
            percentVested_ = 0;
        }
    }

    /**
     *  @notice calculate amount of KLIMA available for claim by depositor
     *  @param _depositor address
     *  @return pendingPayout_ uint
     */
    function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) {
        uint percentVested = percentVestedFor( _depositor );
        uint payout = bondInfo[ _depositor ].payout;

        if ( percentVested >= 10000 ) {
            pendingPayout_ = payout;
        } else {
            pendingPayout_ = payout.mul( percentVested ).div( 10000 );
        }
    }

    /* ======= AUXILLIARY ======= */

    /**
     *  @notice allow anyone to send lost tokens (excluding principle or KLIMA) to the DAO
     *  @return bool
     */
    function recoverLostToken( address _token ) external returns ( bool ) {
        require( _token != KLIMA );
        require( _token != principle );
        IERC20( _token ).safeTransfer( DAO, IERC20( _token ).balanceOf( address(this) ) );
        return true;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_KLIMA","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KLIMA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum KlimaBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6101406040523480156200001257600080fd5b5060405162002c3e38038062002c3e833981810160405260a08110156200003857600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038516620000b557600080fd5b6001600160601b0319606086901b166080526001600160a01b038416620000db57600080fd5b6001600160601b0319606085901b1660a0526001600160a01b0383166200010157600080fd5b6001600160601b0319606084901b1660c0526001600160a01b0382166200012757600080fd5b6001600160601b0319606092831b811660e0529181901b909116610120526001600160a01b0316151560f81b6101005250505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c612a106200022e60003980610f5852806116dd5280611900525080610f2a52806116ac5280611adb52508061155252806117a6528061184d525080610dc052806111c152806113c452806114a652508061059b5280610f87528061102e52806111f0528061136b52806113955280611475528061170c528061180b52508061153052806117cc528061194e5280611b505280611c205280611cf95280611dde5280611ef35250612a106000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80637927ebf811610125578063d4d863ce116100ad578063e0176de81161007c578063e0176de814610571578063e392a26214610579578063e3ed12a014610581578063f5c2ab5b14610589578063fc7b9c181461059157610211565b8063d4d863ce146104f8578063d502562514610526578063d796906014610561578063d7ccfb0b1461056957610211565b806398fabd3a116100f457806398fabd3a1461046e578063b4abccba14610476578063c5332b7c1461049c578063cd1234b3146104a4578063cea55f57146104f057610211565b80637927ebf81461040f578063844b5c7c1461042c5780638dbdbe6d14610434578063904b3ece1461046657610211565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a146103ae57806361d027b3146103b657806371535008146103be578063759076e5146103ff57806377b818951461040757610211565b8063451ee4a11461032557806346f68ee91461035a5780634cf088d914610380578063507930ec1461038857610211565b80631a3d0068116101e45780631a3d0068146102845780631e321a0f146102b55780631feed31f146102db5780632f3f470a1461030957610211565b8063016a42841461021657806301b88ee81461023a5780630505c8c914610272578063089208d81461027a575b600080fd5b61021e610599565b604080516001600160a01b039092168252519081900360200190f35b6102606004803603602081101561025057600080fd5b50356001600160a01b03166105bd565b60408051918252519081900360200190f35b61021e610616565b610282610626565b005b6102826004803603608081101561029a57600080fd5b508035151590602081013590604081013590606001356106bd565b610282600480360360408110156102cb57600080fd5b5060ff81351690602001356107b5565b610260600480360360408110156102f157600080fd5b506001600160a01b0381351690602001351515610969565b610311610b5e565b604080519115158252519081900360200190f35b61032d610b6e565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102826004803603602081101561037057600080fd5b50356001600160a01b0316610b86565b61021e610c73565b6102606004803603602081101561039e57600080fd5b50356001600160a01b0316610c82565b610282610d14565b61021e610dbe565b610282600480360360e08110156103d457600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610de2565b610260610ed6565b61021e610ef1565b6102606004803603602081101561042557600080fd5b5035610f00565b610260610f26565b6102606004803603606081101561044a57600080fd5b50803590602081013590604001356001600160a01b03166110bf565b6102606116a8565b61021e6117a4565b6103116004803603602081101561048c57600080fd5b50356001600160a01b03166117c8565b61021e6118fe565b6104ca600480360360208110156104ba57600080fd5b50356001600160a01b0316611922565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610260611949565b6102826004803603604081101561050e57600080fd5b506001600160a01b0381351690602001351515611a01565b61052e611ac4565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610311611ad9565b610260611afd565b610260611b3c565b610260611bd9565b61021e611c1e565b610260611c42565b610260611c48565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806105c983610c82565b6001600160a01b0384166000908152600f602052604090205490915061271082106105f65780925061060f565b61060c6127106106068385611c4e565b90611cae565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610673576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461070a576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600454610720906103e890610606906019611c4e565b83111561076a576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b03163314610802576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600082600381111561081057fe5b1415610861576127108110156108575760405162461bcd60e51b815260040180806020018281038252602481526020018061298d6024913960400191505060405180910390fd5b6005819055610965565b600182600381111561086f57fe5b14156108d6576103e88111156108cc576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6007819055610965565b60028260038111156108e457fe5b141561094b57612710811115610941576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6008819055610965565b600382600381111561095957fe5b14156109655760098190555b5050565b6000610973612880565b506001600160a01b0383166000908152600f60209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109c685610c82565b90506127108110610a56576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a4d85858460000151611cf0565b92505050610b58565b8151600090610a6d90612710906106069085611c4e565b90506040518060800160405280610a91838660000151611ff490919063ffffffff16565b8152602001610abb610ab0866040015143611ff490919063ffffffff16565b602087015190611ff4565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b52868683611cf0565b93505050505b92915050565b600354600160a01b900460ff1681565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610bd3576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b6001600160a01b038116610c185760405162461bcd60e51b81526004018080602001828103825260268152602001806128bb6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610c8c612880565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610ce2904390611ff4565b60208301519091508015610d0757610d008161060684612710611c4e565b9350610d0c565b600093505b505050919050565b6001546001600160a01b03163314610d5d5760405162461bcd60e51b81526004018080602001828103825260228152602001806128e16022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314610e2f576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b60045415610e84576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a00182905260049690965560059490945560069290925560075560085560095560105543601155565b6000610eec610ee3611bd9565b60105490611ff4565b905090565b6003546001600160a01b031681565b6000610b58662386f26fc10000610606610f2185610f1c611afd565b612036565b6121ad565b60007f0000000000000000000000000000000000000000000000000000000000000000156110245761101d60646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fe357600080fd5b505afa158015610ff7573d6000803e3d6000fd5b505050506040513d602081101561100d57600080fd5b5051611017611afd565b90611c4e565b9050610623565b610eec60646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561108557600080fd5b505afa158015611099573d6000803e3d6000fd5b505050506040513d60208110156110af57600080fd5b505160ff16600a0a611017611afd565b60006001600160a01b03821661110e576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6111166121c5565b6009546010541115611166576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000611170610f26565b9050600061117c6121d9565b9050808510156111bd5760405162461bcd60e51b815260040180806020018281038252602381526020018061296a6023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561125457600080fd5b505afa158015611268573d6000803e3d6000fd5b505050506040513d602081101561127e57600080fd5b50519050600061128d82610f00565b9050629896808110156112d8576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6112e0611b3c565b811115611325576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6000611344612710610606600480015485611c4e90919063ffffffff16565b9050600061135c826113568686611ff4565b90611ff4565b90506113936001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308d61221b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561142a57600080fd5b505af115801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b50506040805163bc157ac160e01b8152600481018c90526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820184905291517f00000000000000000000000000000000000000000000000000000000000000009092169163bc157ac1916064808201926020929091908290030181600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b50508115611577576115776001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000008461227b565b60105461158490856122d2565b601055604080516080810182526001600160a01b038a166000908152600f602052919091205481906115b690866122d2565b81526005805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600f8452819020865181559286015160018401558501516002830155939092015160039092019190915554879161161b916122d2565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a4611659611949565b6116616121d9565b611669610f26565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a461169a61232c565b509098975050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000001561179c5761101d633b9aca006106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561176857600080fd5b505afa15801561177c573d6000803e3d6000fd5b505050506040513d602081101561179257600080fd5b5051611017611949565b61101d611949565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561180957600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561184857600080fd5b6118f67f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118b957600080fd5b505afa1580156118cd573d6000803e3d6000fd5b505050506040513d60208110156118e357600080fd5b50516001600160a01b038516919061227b565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119a557600080fd5b505afa1580156119b9573d6000803e3d6000fd5b505050506040513d60208110156119cf57600080fd5b505190506119fb670de0b6b3a7640000610606610f216119f5633b9aca00611017610ed6565b85612036565b91505090565b6000546001600160a01b03163314611a4e576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b6001600160a01b038216611a6157600080fd5b8015611a965760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610965565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095486565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b2862989680610606633b9aca00611b22611b19611949565b60045490611c4e565b906122d2565b600654909150811015610623575060065490565b6000610eec620186a06106066004600301547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ba757600080fd5b505afa158015611bbb573d6000803e3d6000fd5b505050506040513d6020811015611bd157600080fd5b505190611c4e565b600080611bf160115443611ff490919063ffffffff16565b600554601054919250611c08916106069084611c4e565b9150601054821115611c1a5760105491505b5090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60115481565b60105481565b600082611c5d57506000610b58565b82820282848281611c6a57fe5b0414611ca75760405162461bcd60e51b81526004018080602001828103825260218152602001806129296021913960400191505060405180910390fd5b9392505050565b6000611ca783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061240c565b600082611da0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611d6e57600080fd5b505af1158015611d82573d6000803e3d6000fd5b505050506040513d6020811015611d9857600080fd5b50611fed9050565b600354600160a01b900460ff1615611ec7576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d6020811015611e5357600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611eaa57600080fd5b505af1158015611ebe573d6000803e3d6000fd5b50505050611fed565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611f3e57600080fd5b505af1158015611f52573d6000803e3d6000fd5b505050506040513d6020811015611f6857600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611fc057600080fd5b505af1158015611fd4573d6000803e3d6000fd5b505050506040513d6020811015611fea57600080fd5b50505b5092915050565b6000611ca783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ae565b61203e6128a8565b6000821161207d5760405162461bcd60e51b81526004018080602001828103825260268152602001806129036026913960400191505060405180910390fd5b826120975750604080516020810190915260008152610b58565b71ffffffffffffffffffffffffffffffffffff831161213e57600082607085901b816120bf57fe5b0490506001600160e01b0381111561211e576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b58565b600061214f84600160701b85612508565b90506001600160e01b0381111561211e576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b6121d0610ee3611bd9565b60105543601155565b60006121f562989680610606633b9aca00611b22611b19611949565b60065490915081101561220b5750600654610623565b6006541561062357600060065590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526122759085906125a8565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526122cd9084906125a8565b505050565b600082820183811015611ca7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e5460009161233f91906122d2565b600b54909150158015906123535750804310155b1561240957600454600a5460ff161561238d57600b54600454612375916122d2565b6004819055600c5411612388576000600b555b6123af565b600b5460045461239c91611ff4565b6004819055600c54106123af576000600b555b43600e55600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600081836124985760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561245d578181015183820152602001612445565b50505050905090810190601f16801561248a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816124a457fe5b0495945050505050565b600081848411156125005760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561245d578181015183820152602001612445565b505050900390565b60008060006125178686612659565b915091506000848061252557fe5b868809905082811115612539576001820391505b8083039250848210612592576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b61259d838387612686565b979650505050505050565b60606125fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126f69092919063ffffffff16565b8051909150156122cd5780806020019051602081101561261c57600080fd5b50516122cd5760405162461bcd60e51b815260040180806020018281038252602a8152602001806129b1602a913960400191505060405180910390fd5b600080806000198486099050838502925082810391508281101561267e576001820391505b509250929050565b6000818103821680838161269657fe5b0492508085816126a257fe5b0494508081600003816126b157fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b6060612705848460008561270d565b949350505050565b60606127188561287a565b612769576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127a85780518252601f199092019160209182019101612789565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461280a576040519150601f19603f3d011682016040523d82523d6000602084013e61280f565b606091505b509150915081156128235791506127059050565b8051156128335780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561245d578181015183820152602001612445565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220260ec13d03070065fe40121a36fedbe53e9d068c3ddccdfb44576b1ba224dba864736f6c634300070500330000000000000000000000006b4499909fd8947a3bdea5d524fb3697018fc7500000000000000000000000008f8b7d5d12c1fc37f20a89bf4dfe1e787da529b5000000000000000000000000e93d6c3563fb3e547f891ef01d8bbd963c0e8436000000000000000000000000693ad12dba5f6e07de86faa21098b691f60a1bea0000000000000000000000000000000000000000000000000000000000000000

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

0000000000000000000000006b4499909fd8947a3bdea5d524fb3697018fc7500000000000000000000000008f8b7d5d12c1fc37f20a89bf4dfe1e787da529b5000000000000000000000000e93d6c3563fb3e547f891ef01d8bbd963c0e8436000000000000000000000000693ad12dba5f6e07de86faa21098b691f60a1bea0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _KLIMA (address): 0x6b4499909fd8947a3bdea5d524fb3697018fc750
Arg [1] : _principle (address): 0x8f8b7d5d12c1fc37f20a89bf4dfe1e787da529b5
Arg [2] : _treasury (address): 0xe93d6c3563fb3e547f891ef01d8bbd963c0e8436
Arg [3] : _DAO (address): 0x693ad12dba5f6e07de86faa21098b691f60a1bea
Arg [4] : _bondCalculator (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b4499909fd8947a3bdea5d524fb3697018fc750
Arg [1] : 0000000000000000000000008f8b7d5d12c1fc37f20a89bf4dfe1e787da529b5
Arg [2] : 000000000000000000000000e93d6c3563fb3e547f891ef01d8bbd963c0e8436
Arg [3] : 000000000000000000000000693ad12dba5f6e07de86faa21098b691f60a1bea
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

22412:17095:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23127:34;;;:::i;:::-;;;;-1:-1:-1;;;;;23127:34:0;;;;;;;;;;;;;;38654:400;;;;;;;;;;;;;;;;-1:-1:-1;38654:400:0;-1:-1:-1;;;;;38654:400:0;;:::i;:::-;;;;;;;;;;;;;;;;1825:89;;;:::i;2050:158::-;;;:::i;:::-;;27919:443;;;;;;;;;;;;;;;;-1:-1:-1;27919:443:0;;;;;;;;;;;;;;;;;;;:::i;27009:714::-;;;;;;;;;;;;;;;;-1:-1:-1;27009:714:0;;;;;;;;;:::i;31375:1182::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31375:1182:0;;;;;;;;;;:::i;23659:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;23744:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2216:260;;;;;;;;;;;;;;;;-1:-1:-1;2216:260:0;-1:-1:-1;;;;;2216:260:0;;:::i;23528:22::-;;;:::i;38053:427::-;;;;;;;;;;;;;;;;-1:-1:-1;38053:427:0;-1:-1:-1;;;;;38053:427:0;;:::i;2484:221::-;;;:::i;23197:33::-;;;:::i;26132:643::-;;;;;;;;;;;;;;;;-1:-1:-1;26132:643:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37396:106::-;;;:::i;23581:28::-;;;:::i;35089:161::-;;;;;;;;;;;;;;;;-1:-1:-1;35089:161:0;;:::i;36177:331::-;;;:::i;29032:2193::-;;;;;;;;;;;;;;;;-1:-1:-1;29032:2193:0;;;;;;;;;;;-1:-1:-1;;;;;29032:2193:0;;:::i;37022:275::-;;;:::i;23276:28::-;;;:::i;39234:270::-;;;;;;;;;;;;;;;;-1:-1:-1;39234:270:0;-1:-1:-1;;;;;39234:270:0;;:::i;23447:39::-;;;:::i;23810:42::-;;;;;;;;;;;;;;;;-1:-1:-1;23810:42:0;-1:-1:-1;;;;;23810:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36634:267;;;:::i;28495:318::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28495:318:0;;;;;;;;;;:::i;23689:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23348:37;;;:::i;35355:253::-;;;:::i;34818:142::-;;;:::i;37604:286::-;;;:::i;23055:30::-;;;:::i;23985:21::-;;;:::i;23903:::-;;;:::i;23127:34::-;;;:::o;38654:400::-;38726:19;38759:18;38780:30;38798:10;38780:16;:30::i;:::-;-1:-1:-1;;;;;38835:22:0;;38821:11;38835:22;;;:8;:22;;;;;:29;38759:51;;-1:-1:-1;38899:5:0;38882:22;;38877:170;;38939:6;38922:23;;38877:170;;;38995:40;39028:5;38995:27;:6;39007:13;38995:10;:27::i;:::-;:31;;:40::i;:::-;38978:57;;38877:170;38654:400;;;;;:::o;1825:89::-;1873:7;1900:6;-1:-1:-1;;;;;1900:6:0;1825:89;;:::o;2050:158::-;1964:6;;-1:-1:-1;;;;;1964:6:0;1974:10;1964:20;1955:67;;;;;-1:-1:-1;;;1955:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1955:67:0;;;;;;;;;;;;;;;2166:1:::1;2150:6:::0;;2133:37:::1;::::0;-1:-1:-1;;;;;2150:6:0;;::::1;::::0;2133:37:::1;::::0;2166:1;;2133:37:::1;2198:1;2181:19:::0;;-1:-1:-1;;;;;;2181:19:0::1;::::0;;2050:158::o;27919:443::-;1964:6;;-1:-1:-1;;;;;1964:6:0;1974:10;1964:20;1955:67;;;;;-1:-1:-1;;;1955:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1955:67:0;;;;;;;;;;;;;;;28103:5:::1;:21:::0;:43:::1;::::0;28140:4:::1;::::0;28103:31:::1;::::0;28130:2:::1;28103:25;:31::i;:43::-;28089:10;:57;;28080:91;;;::::0;;-1:-1:-1;;;28080:91:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28080:91:0;;;;;;;;;;;;;::::1;;28197:157;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;28330:12:::1;28197:157:::0;;;;;;;28184:10:::1;:170:::0;;-1:-1:-1;;28184:170:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;27919:443::o;27009:714::-;1964:6;;-1:-1:-1;;;;;1964:6:0;1974:10;1964:20;1955:67;;;;;-1:-1:-1;;;1955:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1955:67:0;;;;;;;;;;;;;;;27121:17:::1;27107:10;:31;;;;;;;;;27102:614;;;27180:5;27170:6;:15;;27161:66;;;;-1:-1:-1::0;;;27161:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27242:17:::0;:26;;;27102:614:::1;;;27305:16;27291:10;:30;;;;;;;;;27286:430;;;27363:4;27353:6;:14;;27344:61;;;::::0;;-1:-1:-1;;;27344:61:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27420:15:::0;:24;;;27286:430:::1;;;27481:13;27467:10;:27;;;;;;;;;27462:254;;;27536:5;27526:6;:15;;27517:58;;;::::0;;-1:-1:-1;;;27517:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27590:9:::0;:18;;;27462:254:::1;;;27645:14;27631:10;:28;;;;;;;;;27626:90;;;27682:13:::0;:22;;;27626:90:::1;27009:714:::0;;:::o;31375:1182::-;31445:4;31463:16;;:::i;:::-;-1:-1:-1;;;;;;31482:22:0;;;;;;:8;:22;;;;;;;;31463:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31536:30;31492:10;31536:16;:30::i;:::-;31515:51;;31661:5;31644:13;:22;31639:911;;-1:-1:-1;;;;;31710:22:0;;;;;;:8;:22;;;;;;;;31703:29;;;;;;;;;;;;;;;;;;;;31798:11;;31772:42;;;;;;;;;;;;;;;;;;;;;;;;;31854:46;31867:10;31879:6;31887:4;:11;;;31854;:46::i;:::-;31847:53;;;;;;31639:911;32033:11;;32019;;32033:45;;32071:5;;32033:32;;32050:13;32033:15;:32::i;:45::-;32019:59;;32163:225;;;;;;;;32191:25;32208:6;32191:4;:11;;;:15;;:25;;;;:::i;:::-;32163:225;;;;32240:54;32258:34;32276:4;:14;;;32258:12;:16;;:34;;;;:::i;:::-;32240:12;;;;;:16;:54::i;:::-;32163:225;;32320:12;32163:225;;;;;;;;32358:14;;;;;32163:225;;;;;-1:-1:-1;;;;;32138:22:0;;-1:-1:-1;32138:22:0;;;:8;:22;;;;;:250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32410:65;;;;;;;;;;;;;;;;;;;;;;;;;32497:41;32510:10;32522:6;32530;32497:11;:41::i;:::-;32490:48;;;;;31375:1182;;;;;:::o;23659:21::-;;;-1:-1:-1;;;23659:21:0;;;;;:::o;23744:24::-;;;;;;;;;;;;;;;;;:::o;2216:260::-;1964:6;;-1:-1:-1;;;;;1964:6:0;1974:10;1964:20;1955:67;;;;;-1:-1:-1;;;1955:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1955:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2318:23:0;::::1;2309:75;;;;-1:-1:-1::0;;;2309:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2417:6;::::0;;2400:36:::1;::::0;-1:-1:-1;;;;;2400:36:0;;::::1;::::0;2417:6;::::1;::::0;2400:36:::1;::::0;::::1;2447:9;:21:::0;;-1:-1:-1;;;;;;2447:21:0::1;-1:-1:-1::0;;;;;2447:21:0;;;::::1;::::0;;;::::1;::::0;;2216:260::o;23528:22::-;;;-1:-1:-1;;;;;23528:22:0;;:::o;38053:427::-;38123:19;38156:16;;:::i;:::-;-1:-1:-1;;;;;;38175:22:0;;;;;;:8;:22;;;;;;;;38156:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38175:22;38231:34;;:12;;:16;:34::i;:::-;38291:12;;;;38208:57;;-1:-1:-1;38321:11:0;;38316:157;;38367:43;38401:7;38367:28;:15;38388:5;38367:19;:28::i;:43::-;38350:60;;38316:157;;;38460:1;38443:18;;38316:157;38053:427;;;;;;:::o;2484:221::-;2568:9;;-1:-1:-1;;;;;2568:9:0;2554:10;:23;2545:71;;;;-1:-1:-1;;;2545:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2657:9;;;2649:6;;2632:36;;-1:-1:-1;;;;;2657:9:0;;;;2649:6;;;;2632:36;;;2688:9;;;2679:18;;-1:-1:-1;;;;;;2679:18:0;-1:-1:-1;;;;;2688:9:0;;;2679:18;;;;;;2484:221::o;23197:33::-;;;:::o;26132:643::-;1964:6;;-1:-1:-1;;;;;1964:6:0;1974:10;1964:20;1955:67;;;;;-1:-1:-1;;;1955:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1955:67:0;;;;;;;;;;;;;;;26397:5:::1;:21:::0;:26;26388:73:::1;;;::::0;;-1:-1:-1;;;26388:73:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26480:217;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;26472:5:::1;:225:::0;;;;;;;;;;;;;;;;;;;;26708:9:::1;:24:::0;26755:12:::1;26743:9;:24:::0;26132:643::o;37396:106::-;37441:4;37466:28;37481:11;:9;:11::i;:::-;37466:9;;;:13;:28::i;:::-;37459:35;;37396:106;:::o;23581:28::-;;;-1:-1:-1;;;;;23581:28:0;;:::o;35089:161::-;35145:4;35170:72;35236:4;35170:60;:42;35191:6;35199:11;:9;:11::i;:::-;35170:19;:42::i;:::-;:58;:60::i;36177:331::-;36225:11;36254:15;36250:251;;;36296:85;36376:3;36296:74;36330:14;-1:-1:-1;;;;;36313:42:0;;36357:9;36313:55;;;;;;;;;;;;;-1:-1:-1;;;;;36313:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36313:55:0;36296:11;:9;:11::i;:::-;:15;;:74::i;:85::-;36287:94;;36250:251;;;36423:66;36484:3;36423:55;36454:9;-1:-1:-1;;;;;36446:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36446:30:0;36440:36;;:2;:36;36423:11;:9;:11::i;29032:2193::-;29152:4;-1:-1:-1;;;;;29179:24:0;;29170:54;;;;;-1:-1:-1;;;29170:54:0;;;;;;;;;;;;-1:-1:-1;;;29170:54:0;;;;;;;;;;;;;;;29237:11;:9;:11::i;:::-;29281:13;;29268:9;;:26;;29259:61;;;;;-1:-1:-1;;;29259:61:0;;;;;;;;;;;;-1:-1:-1;;;29259:61:0;;;;;;;;;;;;;;;29333:15;29351:16;:14;:16::i;:::-;29333:34;;29401:16;29420:12;:10;:12::i;:::-;29401:31;;29467:11;29454:9;:24;;29445:74;;;;-1:-1:-1;;;29445:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29555:10;29579:8;-1:-1:-1;;;;;29568:29:0;;29599:9;29610:7;29568:51;;;;;;;;;;;;;-1:-1:-1;;;;;29568:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29568:51:0;;-1:-1:-1;29630:11:0;29644:18;29568:51;29644:9;:18::i;:::-;29630:32;;29726:8;29716:6;:18;;29707:47;;;;;-1:-1:-1;;;29707:47:0;;;;;;;;;;;;-1:-1:-1;;;29707:47:0;;;;;;;;;;;;;;;29833:11;:9;:11::i;:::-;29823:6;:21;;29814:49;;;;;-1:-1:-1;;;29814:49:0;;;;;;;;;;;;-1:-1:-1;;;29814:49:0;;;;;;;;;;;;;;;29959:8;29970:36;29999:5;29970:23;29982:5;:9;;;29970:6;:10;;:23;;;;:::i;:36::-;29959:47;-1:-1:-1;30017:11:0;30031:30;29959:47;30031:19;:5;30042:6;30031:9;:19::i;:::-;:23;;:30::i;:::-;30017:44;-1:-1:-1;30244:74:0;-1:-1:-1;;;;;30252:9:0;30244:36;30282:10;30302:4;30309:7;30244:36;:74::i;:::-;30337:9;-1:-1:-1;;;;;30329:27:0;;30367:8;30379:7;30329:59;;;;;;;;;;;;;-1:-1:-1;;;;;30329:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30399:59:0;;;-1:-1:-1;;;30399:59:0;;;;;;;;-1:-1:-1;;;;;30439:9:0;30399:59;;;;;;;;;;;;;;30410:8;30399:29;;;;;;:59;;;;;30329;;30399;;;;;;;;-1:-1:-1;30399:29:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30476:8:0;;30471:113;;30532:40;-1:-1:-1;;;;;30540:5:0;30532:28;30562:3;30567;30532:28;:40::i;:::-;30644:9;;:22;;30659:5;30644:13;:22::i;:::-;30632:9;:34;30741:182;;;;;;;;-1:-1:-1;;;;;30765:22:0;;-1:-1:-1;30765:22:0;;;:8;:22;;;;;;:29;30741:182;;30765:43;;30800:6;30765:33;:43::i;:::-;30741:182;;30828:17;;;30741:182;;;;;;;;30867:12;30741:182;;;;;;;;;;;;;;-1:-1:-1;;;;;30716:22:0;;-1:-1:-1;30716:22:0;;;:8;:22;;;;;:207;;;;;;;;30828:17;30716:207;;;;;;;;;;;;;;;;;;;;;;;31028:17;30901:10;;31010:37;;:16;:37::i;:::-;30980:81;;;;;;;;31002:6;;30980:81;;;;;;;;;;31127:11;:9;:11::i;:::-;31113:12;:10;:12::i;:::-;31095:16;:14;:16::i;:::-;31077:63;;;;;;;31153:8;:6;:8::i;:::-;-1:-1:-1;31211:6:0;;29032:2193;-1:-1:-1;;;;;;;;29032:2193:0:o;37022:275::-;37079:4;37102:15;37097:193;;;37142:85;37222:3;37142:74;37176:14;-1:-1:-1;;;;;37159:42:0;;37203:9;37159:55;;;;;;;;;;;;;-1:-1:-1;;;;;37159:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37159:55:0;37142:11;:9;:11::i;37097:193::-;37267:11;:9;:11::i;23276:28::-;;;:::o;39234:270::-;39297:4;39334:5;-1:-1:-1;;;;;39324:15:0;:6;-1:-1:-1;;;;;39324:15:0;;;39315:26;;;;;;39371:9;-1:-1:-1;;;;;39361:19:0;:6;-1:-1:-1;;;;;39361:19:0;;;39352:30;;;;;;39393:81;39424:3;39437:6;-1:-1:-1;;;;;39429:26:0;;39465:4;39429:43;;;;;;;;;;;;;-1:-1:-1;;;;;39429:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39429:43:0;-1:-1:-1;;;;;39393:29:0;;;:81;:29;:81::i;:::-;-1:-1:-1;39492:4:0;39234:270;;;:::o;23447:39::-;;;:::o;23810:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36634:267::-;36677:15;36706:11;36728:5;-1:-1:-1;;;;;36720:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36720:29:0;;-1:-1:-1;36773:120:0;36887:4;36773:108;:90;36807:24;36826:3;36807:13;:11;:13::i;:24::-;36846:6;36773:19;:90::i;:120::-;36760:133;;36634:267;;:::o;28495:318::-;1964:6;;-1:-1:-1;;;;;1964:6:0;1974:10;1964:20;1955:67;;;;;-1:-1:-1;;;1955:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1955:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28591:22:0;::::1;28582:33;;;::::0;::::1;;28631:7;28626:180;;;28656:9;:16:::0;;-1:-1:-1;;;;;;;28656:16:0;;::::1;;-1:-1:-1::0;;;;;;28687:24:0::1;-1:-1:-1::0;;;;;28687:24:0;::::1;;::::0;;28626:180:::1;;;28744:9;:17:::0;;-1:-1:-1;;;;28744:17:0::1;::::0;;28776:7:::1;:18:::0;;-1:-1:-1;;;;;28776:18:0;::::1;-1:-1:-1::0;;;;;;28776:18:0;;::::1;;::::0;;28495:318;;:::o;23689:18::-;;;;;;;;;;;;;;:::o;23348:37::-;;;:::o;35355:253::-;35398:11;35432:69;35496:3;35432:58;35478:10;35432:40;35459:11;:9;:11::i;:::-;35432:5;:21;;:25;:40::i;:::-;:44;;:58::i;:69::-;35526:18;;35423:78;;-1:-1:-1;35517:27:0;;35512:89;;;-1:-1:-1;35571:18:0;;35355:253;:::o;34818:142::-;34861:4;34886:66;34944:6;34886:52;34921:5;:15;;;34894:5;-1:-1:-1;;;;;34886:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34886:29:0;;:33;:52::i;37604:286::-;37647:11;37672:20;37695:29;37713:9;;37695:12;:16;;:29;;;;:::i;:::-;37782:17;;37744:9;;37672:52;;-1:-1:-1;37744:57:0;;:32;;37672:52;37744:13;:32::i;:57::-;37735:66;;37826:9;;37817:6;:18;37812:71;;;37862:9;;37853:18;;37812:71;37604:286;;:::o;23055:30::-;;;:::o;23985:21::-;;;;:::o;23903:::-;;;;:::o;3271:250::-;3329:7;3353:6;3349:47;;-1:-1:-1;3383:1:0;3376:8;;3349:47;3420:5;;;3424:1;3420;:5;:1;3444:5;;;;;:10;3436:56;;;;-1:-1:-1;;;3436:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3512:1;3271:250;-1:-1:-1;;;3271:250:0:o;3529:132::-;3587:7;3614:39;3618:1;3621;3614:39;;;;;;;;;;;;;;;;;:3;:39::i;32783:696::-;32872:4;32896:6;32890:557;;32962:5;-1:-1:-1;;;;;32954:24:0;;32980:10;32992:7;32954:47;;;;;;;;;;;;;-1:-1:-1;;;;;32954:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32890:557:0;;-1:-1:-1;32890:557:0;;33080:9;;-1:-1:-1;;;33080:9:0;;;;33075:361;;;33166:13;;33141:49;;;-1:-1:-1;;;33141:49:0;;-1:-1:-1;;;;;33166:13:0;;;33141:49;;;;;;;;;;;;33149:5;33141:23;;;;;;:49;;;;;;;;;;;;;;;-1:-1:-1;33141:23:0;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33225:13:0;;33209:60;;;-1:-1:-1;;;33209:60:0;;;;;;;;-1:-1:-1;;;;;33209:60:0;;;;;;;;;33225:13;;;;;33209:37;;:60;;;;;33225:13;;33209:60;;;;;;;33225:13;;33209:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33075:361;;;33335:7;;33310:43;;;-1:-1:-1;;;33310:43:0;;-1:-1:-1;;;;;33335:7:0;;;33310:43;;;;;;;;;;;;33318:5;33310:23;;;;;;:43;;;;;;;;;;;;;;;-1:-1:-1;33310:23:0;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33382:7:0;;33372:48;;;-1:-1:-1;;;33372:48:0;;;;;;;;-1:-1:-1;;;;;33372:48:0;;;;;;;;;33382:7;;;;;33372:25;;:48;;;;;33310:43;;33372:48;;;;;;;33382:7;;33372:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33075:361:0;-1:-1:-1;33464:7:0;32783:696;-1:-1:-1;;32783:696:0:o;2927:136::-;2985:7;3012:43;3016:1;3019;3012:43;;;;;;;;;;;;;;;;;:3;:43::i;21072:719::-;21153:16;;:::i;:::-;21204:1;21190:11;:15;21182:66;;;;-1:-1:-1;;;21182:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21263:14;21259:50;;-1:-1:-1;21286:23:0;;;;;;;;;-1:-1:-1;21286:23:0;;21279:30;;21259:50;21326:24;;;21322:462;;21367:14;21412:11;20498:3;21385:23;;;21412:11;21384:39;;;;;;-1:-1:-1;;;;;;21446:21:0;;;21438:64;;;;;-1:-1:-1;;;21438:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21524:26;;;;;;;;21542:6;-1:-1:-1;;;;;21524:26:0;;;;21517:33;;;;;21322:462;21583:14;21600:45;21616:9;-1:-1:-1;;;21633:11:0;21600:15;:45::i;:::-;21583:62;-1:-1:-1;;;;;;21668:21:0;;;21660:64;;;;;-1:-1:-1;;;21660:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20927:137;21029:7;21040:16;-1:-1:-1;;;;;21024:13:0;;;:32;;20927:137::o;34549:124::-;34602:28;34617:11;:9;:11::i;34602:28::-;34590:9;:40;34653:12;34641:9;:24;34549:124::o;35735:337::-;35776:11;35810:69;35874:3;35810:58;35856:10;35810:40;35837:11;:9;:11::i;35810:69::-;35904:18;;35801:78;;-1:-1:-1;35895:27:0;;35890:175;;;-1:-1:-1;35949:18:0;;35890:175;;;35990:18;;:23;35985:80;;36052:1;36031:18;:22;35735:337;:::o;17609:205::-;17737:68;;;-1:-1:-1;;;;;17737:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17737:68:0;-1:-1:-1;;;17737:68:0;;;17710:96;;17730:5;;17710:19;:96::i;:::-;17609:205;;;;:::o;17424:177::-;17534:58;;;-1:-1:-1;;;;;17534:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17534:58:0;-1:-1:-1;;;17534:58:0;;;17507:86;;17527:5;;17507:19;:86::i;:::-;17424:177;;;:::o;2738:181::-;2796:7;2828:5;;;2852:6;;;;2844:46;;;;;-1:-1:-1;;;2844:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33571:917;33657:17;;33631:20;;33609:19;;33631:45;;:20;:24;:45::i;:::-;33691:15;;33609:67;;-1:-1:-1;33691:20:0;;;;:54;;;33731:14;33715:12;:30;;33691:54;33687:794;;;33778:5;:21;33819:10;:14;;;33814:494;;;33906:15;;33879:5;:21;:44;;:25;:44::i;:::-;33855:5;:68;;;33972:17;;-1:-1:-1;33942:112:0;;34033:1;34015:15;:19;33942:112;33814:494;;;34145:15;;34118:5;:21;:44;;:25;:44::i;:::-;34094:5;:68;;;34211:17;;-1:-1:-1;34181:112:0;;34272:1;34254:15;:19;34181:112;34345:12;34322:20;:35;:20;34413:21;34436:15;;34322:10;34453:14;34377:92;;;;;;;;;;;;;;;;;;;;34453:14;;34377:92;;;;;;;;;;;;;;;;33687:794;;33571:917;:::o;3669:189::-;3755:7;3790:12;3783:5;3775:28;;;;-1:-1:-1;;;3775:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3814:9;3830:1;3826;:5;;;;;;;3669:189;-1:-1:-1;;;;;3669:189:0:o;3071:192::-;3157:7;3193:12;3185:6;;;;3177:29;;;;-1:-1:-1;;;3177:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3229:5:0;;;3071:192::o;19972:347::-;20078:7;20099:9;20110;20123:13;20131:1;20134;20123:7;:13::i;:::-;20098:38;;;;20147:10;20173:1;20160:15;;;;;20170:1;20167;20160:15;20147:28;;20195:1;20190:2;:6;20186:18;;;20203:1;20198:6;;;;20186:18;20220:2;20215:7;;;;20245:1;20241;:5;20233:44;;;;;-1:-1:-1;;;20233:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20295:16;20303:1;20306;20309;20295:7;:16::i;:::-;20288:23;19972:347;-1:-1:-1;;;;;;;19972:347:0:o;18813:420::-;18896:23;18922:69;18950:4;18922:69;;;;;;;;;;;;;;;;;18930:5;-1:-1:-1;;;;;18922:27:0;;;:69;;;;;:::i;:::-;19006:17;;18896:95;;-1:-1:-1;19006:21:0;19002:224;;19148:10;19137:30;;;;;;;;;;;;;;;-1:-1:-1;19137:30:0;19129:85;;;;-1:-1:-1;;;19129:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19264:210;19325:9;;;-1:-1:-1;;19381:1:0;19378;19371:25;19358:38;;19415:1;19411;:5;19407:9;;19436:1;19431:2;:6;19427:10;;19457:1;19452:2;:6;19448:18;;;19465:1;19460:6;;;;19448:18;19264:210;;;;;;:::o;19482:482::-;19588:7;19627:2;;;19623:6;;;19628:1;19623:6;19640:9;;;;;;;19665:4;19660:9;;;;;;;;;19700:4;19692;19691:5;;19690:14;;;;;19749:1;:9;;;19778:5;;;19774:9;;19769:14;19803:5;;;19799:9;;19794:14;19828:5;;;19824:9;;19819:14;19853:5;;;19849:9;;19844:14;19878:5;;;19874:9;;19869:14;19903:5;;;19899:9;;19894:14;19928:5;;;19924:9;;19919:14;;;19690;;19707:1;19690:18;19685:24;;;;19680:29;;;;19951:5;;19482:482;-1:-1:-1;;19482:482:0:o;5372:196::-;5475:12;5507:53;5530:6;5538:4;5544:1;5547:12;5507:22;:53::i;:::-;5500:60;5372:196;-1:-1:-1;;;;5372:196:0:o;6348:979::-;6478:12;6511:18;6522:6;6511:10;:18::i;:::-;6503:60;;;;;-1:-1:-1;;;6503:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6637:12;6651:23;6678:6;-1:-1:-1;;;;;6678:11:0;6698:8;6709:4;6678:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6678:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6636:78;;;;6729:7;6725:595;;;6760:10;-1:-1:-1;6753:17:0;;-1:-1:-1;6753:17:0;6725:595;6874:17;;:21;6870:439;;7137:10;7131:17;7198:15;7185:10;7181:2;7177:19;7170:44;7085:148;7273:20;;-1:-1:-1;;;7273:20:0;;;;;;;;;;;;;;;;;7280:12;;7273:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4543:233;4721:20;4760:8;;;4543:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://260ec13d03070065fe40121a36fedbe53e9d068c3ddccdfb44576b1ba224dba8
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading