Contract 0xad22900062e4cd766102a1f33e530f5303fe1adf

 
Ad
Ad
Txn Hash
Block
From
To
Value [Txn Fee]
0xe057829cfd0d53767d9c80a2c8b87c917f1fa75acba9ac45d84a07e2d741058766750302021-04-18 13:51:273 days 13 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00102401
0x5ca486bd244d3af04e9ce22da35a6884ab17b3a45218cafd2c08dc50bed3998066600242021-04-18 1:20:214 days 2 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00256983
0xadcdcbd05be5c38596a32a98d215347bd5a884a16e8dc132c51c631b375629fb65919642021-04-15 16:28:346 days 11 hrs ago0x75e7c0e3698ba64c3385a12ce8e573854511b7ff IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.000677815
0x50d73b308cdc345436215d9437aa04de264fc340c5123f58ff5a0a22c0ceba8e65775312021-04-15 4:26:336 days 23 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00080174
0x04974e6d30abaa9e36a42e5d8c90dbc9e8e8d74c308f2686b95d49a30172006865775002021-04-15 4:25:006 days 23 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00080174
0x236050b542f8368f710aa0b65217a9b5120ac0472864971de2dacdc0ee1d752965760292021-04-15 3:10:417 days 19 mins ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00084374
0x01c01bd12123bd360f296c1d5a6e56754b853be11aa7f60031e160def88a8c3965759992021-04-15 3:09:087 days 21 mins ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00082917
0x02659d9a29fbda5acfb3fe7f9980f0c7f2493a52905e210093edf1a0fcb062e165745152021-04-15 1:54:567 days 1 hr ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00087117
0xef41b53b16a58b2052c65e320f9886c16ce56a781b6029b5c5a568b715d157c665725372021-04-15 0:16:027 days 3 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00105567
0xdfb9d705fc75ede14295866cb42186e945cca161393141828498244a53f3c21d65715302021-04-14 23:25:417 days 4 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00080174
0xa3149c117ab32a56a366a452ac1dc7cc5b8eb79a89be15618ac071cb3fa241b365715012021-04-14 23:24:147 days 4 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00152831
0xda0b6d5252b2f1ef7dea23b3e98a57d7a47c8f9e1920c3b7863acb3b080a4f0f65700152021-04-14 22:09:567 days 5 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.0004892
0x6721afc94025b96734cac1ee997180c95f63eea2e3317bc0c3f7da9a6d37690865685182021-04-14 20:55:057 days 6 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00085624
0x827336e443f586c5cb2caa17444760544ccb3f8ddc25683e887183fa44a83b9d65655032021-04-14 18:24:087 days 9 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00089824
0x255fce904ec1dee877fcf8200ea6affd14680f1dab537f01c6725f63e435b1de65640172021-04-14 17:09:507 days 10 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00092531
0x8ee27978631ee73d109ef84db418637b386136b31ef8525bb897d6fcf8ef379a65625172021-04-14 15:54:507 days 11 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00085624
0x26a3074879e5b6bd911f25fa421b6698afbd4b713b219ff3e43ba7ad315d728965610022021-04-14 14:38:087 days 12 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00089824
0xe8086cfd3d4588c4b17a20c21e5dbbace174f4d60b001d28b5c264e8b2cd38e465595022021-04-14 13:23:087 days 14 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00092531
0x4e14968ef2795142e6414fc0af15ab5198874fb2c70b4c67442838a1304ddf3b65571442021-04-14 11:25:147 days 16 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00059618
0xe96cd8d8bda2b001172aa57dfe28ecb7fbe7aac7226d4a3734ae701bb5a7a5cb65550172021-04-14 9:38:527 days 17 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.0008083
0x1e2f35dd9829bc0cc8f3ba0d054438cc58f203fd0772baf11bd5326114cc37d565520242021-04-14 7:09:137 days 20 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00092664
0xc312a27cb599d2222d6cdb5dba51f5c80c24386b9fac41c27acc135154154c3365490312021-04-14 4:39:347 days 22 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00091171
0x7a560a7eff7f5e65ec1fbaff5ead4d5e377819407ec6bf9af9687f51926c586365475302021-04-14 3:24:318 days 6 mins ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00095371
0xee4b6e095549e5f3cb523fa86db0139f39d7ccce58551b32b0a532f32dbdbe9a65445312021-04-14 0:54:348 days 2 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00088464
0x1031e329ed67703531a8130808599074ffb182bc8e611de3f940ec7e6372549f65445002021-04-14 0:53:018 days 2 hrs ago0x417c72ca842e4e0c998f9ae908e62f17d9c0229e IN  0xad22900062e4cd766102a1f33e530f5303fe1adf0 BNB0.00115467
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SwapContract

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-03-30
*/

// File: contracts/interfaces/IERC20.sol

// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.6.0 <0.8.0;

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the bep token owner. (This is a BEP-20 token specific.)
     */
    function getOwner() external view returns (address);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address _owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// File: contracts/interfaces/IBurnableToken.sol

pragma solidity >=0.6.0 <0.8.0;


interface IBurnableToken is IERC20 {
    function mint(address target, uint256 amount) external returns (bool);

    function burn(uint256 amount) external returns (bool);

    function mintable() external returns (bool);
}

// File: contracts/interfaces/ISwapContract.sol

pragma solidity >=0.6.0 <0.8.0;

interface ISwapContract {
    function singleTransferERC20(
        address _destToken,
        address _to,
        uint256 _amount,
        uint256 _totalSwapped,
        uint256 _rewardsAmount,
        bytes32[] memory _redeemedFloatTxIds
    ) external returns (bool);

    function multiTransferERC20TightlyPacked(
        address _destToken,
        bytes32[] memory _addressesAndAmounts,
        uint256 _totalSwapped,
        uint256 _rewardsAmount,
        bytes32[] memory _redeemedFloatTxIds
    ) external returns (bool);

    function collectSwapFeesForBTC(
        address _destToken,
        uint256 _incomingAmount,
        uint256 _minerFee,
        uint256 _rewardsAmount
    ) external returns (bool);

    function recordIncomingFloat(
        address _token,
        bytes32 _addressesAndAmountOfFloat,
        bool _zerofee,
        bytes32 _txid
    ) external returns (bool);

    function recordOutcomingFloat(
        address _token,
        bytes32 _addressesAndAmountOfLPtoken,
        uint256 _minerFee,
        bytes32 _txid
    ) external returns (bool);

    function distributeNodeRewards() external returns (bool);

    function recordUTXOSweepMinerFee(uint256 _minerFee, bytes32 _txid)
        external
        returns (bool);

    function churn(
        address _newOwner,
        bytes32[] memory _rewardAddressAndAmounts,
        bool[] memory _isRemoved,
        uint8 _churnedInCount,
        uint8 _tssThreshold,
        uint8 _nodeRewardsRatio,
        uint8 _withdrawalFeeBPS
    ) external returns (bool);

    function isTxUsed(bytes32 _txid) external view returns (bool);

    function getCurrentPriceLP() external view returns (uint256);

    function getDepositFeeRate(address _token, uint256 _amountOfFloat)
        external
        view
        returns (uint256);

    function getFloatReserve(address _tokenA, address _tokenB)
        external
        returns (uint256 reserveA, uint256 reserveB);

    function getActiveNodes() external returns (bytes32[] memory);
}

// File: @openzeppelin/contracts/utils/Context.sol


pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: contracts/SwapContract.sol

pragma solidity >=0.6.0 <0.8.0;






contract SwapContract is Ownable, ISwapContract {
    using SafeMath for uint256;

    address public BTCT_ADDR;
    address public lpToken;

    mapping(address => bool) public whitelist;

    uint8 public churnedInCount;
    uint8 public tssThreshold;
    uint8 public nodeRewardsRatio;
    uint8 public depositFeesBPS;
    uint8 public withdrawalFeeBPS;
    uint256 public lockedLPTokensForNode;
    uint256 public feesLPTokensForNode;
    uint256 public initialExchangeRate;

    uint256 private convertScale;
    uint256 private lpDecimals;

    mapping(address => uint256) private floatAmountOf;
    mapping(bytes32 => bool) private used;
    // Node lists
    mapping(address => bytes32) private nodes;
    mapping(address => bool) private isInList;
    address[] private nodeAddrs;

    /**
     * Events
     */

    event Swap(address from, address to, uint256 amount);

    event RewardsCollection(
        address feesToken,
        uint256 rewards,
        uint256 amountLPTokensForNode,
        uint256 currentPriceLP
    );

    event IssueLPTokensForFloat(
        address to,
        uint256 amountOfFloat,
        uint256 amountOfLP,
        uint256 currentPriceLP,
        uint256 depositFees,
        bytes32 txid
    );

    event BurnLPTokensForFloat(
        address token,
        uint256 amountOfLP,
        uint256 amountOfFloat,
        uint256 currentPriceLP,
        uint256 withdrawal,
        bytes32 txid
    );

    event DistributeNodeRewards(uint256 rewardLPTsForNodes);

    modifier priceCheck() {
        uint256 beforePrice = getCurrentPriceLP();
        _;
        require(getCurrentPriceLP() >= beforePrice, "Invalid LPT price");
    }

    constructor(
        address _lpToken,
        address _btct,
        uint256 _existingBTCFloat
    ) public {
        // Set lpToken address
        lpToken = _lpToken;
        // Set initial lpDecimals of LP token
        lpDecimals = 10**IERC20(lpToken).decimals();
        // Set BTCT address
        BTCT_ADDR = _btct;
        // Set nodeRewardsRatio
        nodeRewardsRatio = 66;
        // Set depositFeesBPS
        depositFeesBPS = 50;
        // Set withdrawalFeeBPS
        withdrawalFeeBPS = 20;
        // Set convertScale
        convertScale = 10**(IERC20(_btct).decimals() - 8);
        // Set initialExchangeRate
        initialExchangeRate = lpDecimals;
        // Set lockedLPTokensForNode
        lockedLPTokensForNode = 0;
        // Set feesLPTokensForNode
        feesLPTokensForNode = 0;
        // Set whitelist addresses
        whitelist[BTCT_ADDR] = true;
        whitelist[lpToken] = true;
        whitelist[address(0)] = true;
        floatAmountOf[address(0)] = _existingBTCFloat;
    }

    /**
     * Transfer part
     */

    /// @dev singleTransferERC20 sends tokens from contract.
    /// @param _destToken The address of target token.
    /// @param _to The address of recipient.
    /// @param _amount The amount of tokens.
    /// @param _totalSwapped The amount of swap.
    /// @param _rewardsAmount The fees that should be paid.
    /// @param _redeemedFloatTxIds The txids which is for recording.
    function singleTransferERC20(
        address _destToken,
        address _to,
        uint256 _amount,
        uint256 _totalSwapped,
        uint256 _rewardsAmount,
        bytes32[] memory _redeemedFloatTxIds
    ) external override onlyOwner returns (bool) {
        require(whitelist[_destToken], "_destToken is not whitelisted");
        require(
            _destToken != address(0),
            "_destToken should not be address(0)"
        );
        address _feesToken = address(0);
        if (_totalSwapped > 0) {
            _swap(address(0), BTCT_ADDR, _totalSwapped);
        } else if (_totalSwapped == 0) {
            _feesToken = BTCT_ADDR;
        }
        if (_destToken == lpToken) {
            _feesToken = lpToken;
        }
        _rewardsCollection(_feesToken, _rewardsAmount);
        _addUsedTxs(_redeemedFloatTxIds);
        _safeTransfer(_destToken, _to, _amount);
        return true;
    }

    /// @dev multiTransferERC20TightlyPacked sends tokens from contract.
    /// @param _destToken The address of target token.
    /// @param _addressesAndAmounts The address of recipient and amount.
    /// @param _totalSwapped The amount of swap.
    /// @param _rewardsAmount The fees that should be paid.
    /// @param _redeemedFloatTxIds The txids which is for recording.
    function multiTransferERC20TightlyPacked(
        address _destToken,
        bytes32[] memory _addressesAndAmounts,
        uint256 _totalSwapped,
        uint256 _rewardsAmount,
        bytes32[] memory _redeemedFloatTxIds
    ) external override onlyOwner returns (bool) {
        require(whitelist[_destToken], "_destToken is not whitelisted");
        require(
            _destToken != address(0),
            "_destToken should not be address(0)"
        );
        address _feesToken = address(0);
        if (_totalSwapped > 0) {
            _swap(address(0), BTCT_ADDR, _totalSwapped);
        } else if (_totalSwapped == 0) {
            _feesToken = BTCT_ADDR;
        }
        if (_destToken == lpToken) {
            _feesToken = lpToken;
        }
        _rewardsCollection(_feesToken, _rewardsAmount);
        _addUsedTxs(_redeemedFloatTxIds);
        for (uint256 i = 0; i < _addressesAndAmounts.length; i++) {
            _safeTransfer(
                _destToken,
                address(uint160(uint256(_addressesAndAmounts[i]))),
                uint256(uint96(bytes12(_addressesAndAmounts[i])))
            );
        }
        return true;
    }

    /// @dev collectSwapFeesForBTC collects fees in the case of swap BTCT to BTC.
    /// @param _destToken The address of target token.
    /// @param _incomingAmount The spent amount. (BTCT)
    /// @param _minerFee The miner fees of BTC transaction.
    /// @param _rewardsAmount The fees that should be paid.
    function collectSwapFeesForBTC(
        address _destToken,
        uint256 _incomingAmount,
        uint256 _minerFee,
        uint256 _rewardsAmount
    ) external override onlyOwner returns (bool) {
        require(_destToken == address(0), "_destToken should be address(0)");
        address _feesToken = BTCT_ADDR;
        if (_incomingAmount > 0) {
            uint256 swapAmount =
                _incomingAmount.sub(_rewardsAmount).sub(_minerFee);
            _swap(BTCT_ADDR, address(0), swapAmount.add(_minerFee));
        } else if (_incomingAmount == 0) {
            _feesToken = address(0);
        }
        _rewardsCollection(_feesToken, _rewardsAmount);
        return true;
    }

    /**
     * Float part
     */

    /// @dev recordIncomingFloat mints LP token.
    /// @param _token The address of target token.
    /// @param _addressesAndAmountOfFloat The address of recipient and amount.
    /// @param _zerofee The flag to accept zero fees.
    /// @param _txid The txids which is for recording.
    function recordIncomingFloat(
        address _token,
        bytes32 _addressesAndAmountOfFloat,
        bool _zerofee,
        bytes32 _txid
    ) external override onlyOwner priceCheck returns (bool) {
        require(whitelist[_token], "_token is invalid");
        require(
            _issueLPTokensForFloat(
                _token,
                _addressesAndAmountOfFloat,
                _zerofee,
                _txid
            )
        );
        return true;
    }

    /// @dev recordOutcomingFloat burns LP token.
    /// @param _token The address of target token.
    /// @param _addressesAndAmountOfLPtoken The address of recipient and amount.
    /// @param _minerFee The miner fees of BTC transaction.
    /// @param _txid The txid which is for recording.
    function recordOutcomingFloat(
        address _token,
        bytes32 _addressesAndAmountOfLPtoken,
        uint256 _minerFee,
        bytes32 _txid
    ) external override onlyOwner priceCheck returns (bool) {
        require(whitelist[_token], "_token is invalid");
        require(
            _burnLPTokensForFloat(
                _token,
                _addressesAndAmountOfLPtoken,
                _minerFee,
                _txid
            )
        );
        return true;
    }

    /// @dev distributeNodeRewards sends rewards for Nodes.
    function distributeNodeRewards() external override returns (bool) {
        // Reduce Gas
        uint256 rewardLPTsForNodes =
            lockedLPTokensForNode.add(feesLPTokensForNode);
        require(
            rewardLPTsForNodes > 0,
            "totalRewardLPsForNode is not positive"
        );
        bytes32[] memory nodeList = getActiveNodes();
        uint256 totalStaked = 0;
        for (uint256 i = 0; i < nodeList.length; i++) {
            totalStaked = totalStaked.add(
                uint256(uint96(bytes12(nodeList[i])))
            );
        }
        IBurnableToken(lpToken).mint(address(this), lockedLPTokensForNode);
        for (uint256 i = 0; i < nodeList.length; i++) {
            IBurnableToken(lpToken).transfer(
                address(uint160(uint256(nodeList[i]))),
                rewardLPTsForNodes
                    .mul(uint256(uint96(bytes12(nodeList[i]))))
                    .div(totalStaked)
            );
        }
        emit DistributeNodeRewards(rewardLPTsForNodes);
        lockedLPTokensForNode = 0;
        feesLPTokensForNode = 0;
        return true;
    }

    /**
     * Life cycle part
     */

    /// @dev recordUTXOSweepMinerFee reduces float amount by collected miner fees.
    /// @param _minerFee The miner fees of BTC transaction.
    /// @param _txid The txid which is for recording.
    function recordUTXOSweepMinerFee(uint256 _minerFee, bytes32 _txid)
        public
        override
        onlyOwner
        returns (bool)
    {
        require(!isTxUsed(_txid), "The txid is already used");
        floatAmountOf[address(0)] = floatAmountOf[address(0)].sub(
            _minerFee,
            "BTC float amount insufficient"
        );
        _addUsedTx(_txid);
        return true;
    }

    /// @dev churn transfers contract ownership and set variables of the next TSS validator set.
    /// @param _newOwner The address of new Owner.
    /// @param _rewardAddressAndAmounts The reward addresses and amounts.
    /// @param _isRemoved The flags to remove node.
    /// @param _churnedInCount The number of next party size of TSS group.
    /// @param _tssThreshold The number of next threshold.
    /// @param _nodeRewardsRatio The number of rewards ratio for node owners
    /// @param _withdrawalFeeBPS The amount of wthdrawal fees.
    function churn(
        address _newOwner,
        bytes32[] memory _rewardAddressAndAmounts,
        bool[] memory _isRemoved,
        uint8 _churnedInCount,
        uint8 _tssThreshold,
        uint8 _nodeRewardsRatio,
        uint8 _withdrawalFeeBPS
    ) external override onlyOwner returns (bool) {
        require(
            _tssThreshold >= tssThreshold && _tssThreshold <= 2**8 - 1,
            "_tssThreshold should be >= tssThreshold"
        );
        require(
            _churnedInCount >= _tssThreshold + uint8(1),
            "n should be >= t+1"
        );
        require(
            _nodeRewardsRatio >= 0 && _nodeRewardsRatio <= 100,
            "_nodeRewardsRatio is not valid"
        );
        require(
            _withdrawalFeeBPS >= 0 && _withdrawalFeeBPS <= 100,
            "_withdrawalFeeBPS is invalid"
        );
        require(
            _rewardAddressAndAmounts.length == _isRemoved.length,
            "_rewardAddressAndAmounts and _isRemoved length is not match"
        );
        transferOwnership(_newOwner);
        // Update active node list
        for (uint256 i = 0; i < _rewardAddressAndAmounts.length; i++) {
            (address newNode, ) = _splitToValues(_rewardAddressAndAmounts[i]);
            _addNode(newNode, _rewardAddressAndAmounts[i], _isRemoved[i]);
        }
        bytes32[] memory nodeList = getActiveNodes();
        if (nodeList.length > 100) {
            revert("Stored node size should be <= 100");
        }
        churnedInCount = _churnedInCount;
        tssThreshold = _tssThreshold;
        nodeRewardsRatio = _nodeRewardsRatio;
        withdrawalFeeBPS = _withdrawalFeeBPS;
        return true;
    }

    /// @dev isTxUsed sends rewards for Nodes.
    /// @param _txid The txid which is for recording.
    function isTxUsed(bytes32 _txid) public view override returns (bool) {
        return used[_txid];
    }

    /// @dev getCurrentPriceLP returns the current exchange rate of LP token.
    function getCurrentPriceLP()
        public
        view
        override
        returns (uint256 nowPrice)
    {
        (uint256 reserveA, uint256 reserveB) =
            getFloatReserve(address(0), BTCT_ADDR);
        uint256 totalLPs = IBurnableToken(lpToken).totalSupply();
        // decimals of totalReserved == 8, lpDecimals == 8, decimals of rate == 8
        nowPrice = totalLPs == 0
            ? initialExchangeRate
            : (reserveA.add(reserveB)).mul(lpDecimals).div(
                totalLPs.add(lockedLPTokensForNode)
            );
        return nowPrice;
    }

    /// @dev getDepositFeeRate returns deposit fees rate
    /// @param _token The address of target token.
    /// @param _amountOfFloat The amount of float.
    function getDepositFeeRate(address _token, uint256 _amountOfFloat)
        public
        view
        override
        returns (uint256 depositFeeRate)
    {
        uint8 isFlip = _checkFlips(_token, _amountOfFloat);
        if (isFlip == 1) {
            depositFeeRate = _token == BTCT_ADDR ? depositFeesBPS : 0;
        } else if (isFlip == 2) {
            depositFeeRate = _token == address(0) ? depositFeesBPS : 0;
        }
    }

    /// @dev getFloatReserve returns float reserves
    /// @param _tokenA The address of target tokenA.
    /// @param _tokenB The address of target tokenB.
    function getFloatReserve(address _tokenA, address _tokenB)
        public
        view
        override
        returns (uint256 reserveA, uint256 reserveB)
    {
        (reserveA, reserveB) = (floatAmountOf[_tokenA], floatAmountOf[_tokenB]);
    }

    /// @dev getActiveNodes returns active nodes list (stakes and amount)
    function getActiveNodes() public view override returns (bytes32[] memory) {
        uint256 nodeCount = 0;
        uint256 count = 0;
        // Seek all nodes
        for (uint256 i = 0; i < nodeAddrs.length; i++) {
            if (nodes[nodeAddrs[i]] != 0x0) {
                nodeCount = nodeCount.add(1);
            }
        }
        bytes32[] memory _nodes = new bytes32[](nodeCount);
        for (uint256 i = 0; i < nodeAddrs.length; i++) {
            if (nodes[nodeAddrs[i]] != 0x0) {
                _nodes[count] = nodes[nodeAddrs[i]];
                count = count.add(1);
            }
        }
        return _nodes;
    }

    /// @dev _issueLPTokensForFloat
    /// @param _token The address of target token.
    /// @param _transaction The recevier address and amount.
    /// @param _zerofee The flag to accept zero fees.
    /// @param _txid The txid which is for recording.
    function _issueLPTokensForFloat(
        address _token,
        bytes32 _transaction,
        bool _zerofee,
        bytes32 _txid
    ) internal returns (bool) {
        require(!isTxUsed(_txid), "The txid is already used");
        require(_transaction != 0x0, "The transaction is not valid");
        // Define target address which is recorded on the tx data (20 bytes)
        // Define amountOfFloat which is recorded top on tx data (12 bytes)
        (address to, uint256 amountOfFloat) = _splitToValues(_transaction);
        // Calculate the amount of LP token
        uint256 nowPrice = getCurrentPriceLP();
        uint256 amountOfLP = amountOfFloat.mul(lpDecimals).div(nowPrice);
        uint256 depositFeeRate = getDepositFeeRate(_token, amountOfFloat);
        uint256 depositFees =
            depositFeeRate != 0 ? amountOfLP.mul(depositFeeRate).div(10000) : 0;

        if (_zerofee && depositFees != 0) {
            revert();
        }
        // Send LP tokens to LP
        IBurnableToken(lpToken).mint(to, amountOfLP.sub(depositFees));
        // Add deposit fees
        lockedLPTokensForNode = lockedLPTokensForNode.add(depositFees);
        // Add float amount
        _addFloat(_token, amountOfFloat);
        _addUsedTx(_txid);
        emit IssueLPTokensForFloat(
            to,
            amountOfFloat,
            amountOfLP,
            nowPrice,
            depositFees,
            _txid
        );
        return true;
    }

    /// @dev _burnLPTokensForFloat
    /// @param _token The address of target token.
    /// @param _transaction The address of sender and amount.
    /// @param _minerFee The miner fees of BTC transaction.
    /// @param _txid The txid which is for recording.
    function _burnLPTokensForFloat(
        address _token,
        bytes32 _transaction,
        uint256 _minerFee,
        bytes32 _txid
    ) internal returns (bool) {
        require(!isTxUsed(_txid), "The txid is already used");
        require(_transaction != 0x0, "The transaction is not valid");
        // Define target address which is recorded on the tx data (20bytes)
        // Define amountLP which is recorded top on tx data (12bytes)
        (address to, uint256 amountOfLP) = _splitToValues(_transaction);
        // Calculate the amount of LP token
        uint256 nowPrice = getCurrentPriceLP();
        // Calculate the amountOfFloat
        uint256 amountOfFloat = amountOfLP.mul(nowPrice).div(lpDecimals);
        uint256 withdrawalFees = amountOfFloat.mul(withdrawalFeeBPS).div(10000);
        require(
            amountOfFloat.sub(withdrawalFees) >= _minerFee,
            "Error: amountOfFloat.sub(withdrawalFees) < _minerFee"
        );
        uint256 withdrawal = amountOfFloat.sub(withdrawalFees).sub(_minerFee);
        (uint256 reserveA, uint256 reserveB) =
            getFloatReserve(address(0), BTCT_ADDR);
        if (_token == address(0)) {
            require(
                reserveA >= amountOfFloat.sub(withdrawalFees),
                "The float balance insufficient."
            );
        } else if (_token == BTCT_ADDR) {
            require(
                reserveB >= amountOfFloat.sub(withdrawalFees),
                "The float balance insufficient."
            );
        }
        // Collect fees before remove float
        _rewardsCollection(_token, withdrawalFees);
        // Remove float amount
        _removeFloat(_token, amountOfFloat);
        // Add txid for recording.
        _addUsedTx(_txid);
        // BTCT transfer if token address is BTCT_ADDR
        if (_token == BTCT_ADDR) {
            // _minerFee should be zero
            _safeTransfer(_token, to, withdrawal);
        }
        // Burn LP tokens
        require(IBurnableToken(lpToken).burn(amountOfLP));
        emit BurnLPTokensForFloat(
            to,
            amountOfLP,
            amountOfFloat,
            nowPrice,
            withdrawal,
            _txid
        );
        return true;
    }

    /// @dev _checkFlips checks whether the fees are activated.
    /// @param _token The address of target token.
    /// @param _amountOfFloat The amount of float.
    function _checkFlips(address _token, uint256 _amountOfFloat)
        internal
        view
        returns (uint8)
    {
        (uint256 reserveA, uint256 reserveB) =
            getFloatReserve(address(0), BTCT_ADDR);
        uint256 threshold =
            reserveA.add(reserveB).add(_amountOfFloat).mul(2).div(3);
        if (_token == BTCT_ADDR && reserveB.add(_amountOfFloat) >= threshold) {
            return 1; // BTC float insufficient
        }
        if (_token == address(0) && reserveA.add(_amountOfFloat) >= threshold) {
            return 2; // BTCT float insufficient
        }
        return 0;
    }

    /// @dev _addFloat updates one side of the float.
    /// @param _token The address of target token.
    /// @param _amount The amount of float.
    function _addFloat(address _token, uint256 _amount) internal {
        floatAmountOf[_token] = floatAmountOf[_token].add(_amount);
    }

    /// @dev _removeFloat remove one side of the float.
    /// @param _token The address of target token.
    /// @param _amount The amount of float.
    function _removeFloat(address _token, uint256 _amount) internal {
        floatAmountOf[_token] = floatAmountOf[_token].sub(
            _amount,
            "_removeFloat: float amount insufficient"
        );
    }

    /// @dev _swap collects swap amount to change float.
    /// @param _sourceToken The address of source token
    /// @param _destToken The address of target token.
    /// @param _swapAmount The amount of swap.
    function _swap(
        address _sourceToken,
        address _destToken,
        uint256 _swapAmount
    ) internal {
        floatAmountOf[_destToken] = floatAmountOf[_destToken].sub(
            _swapAmount,
            "_swap: float amount insufficient"
        );
        floatAmountOf[_sourceToken] = floatAmountOf[_sourceToken].add(
            _swapAmount
        );
        emit Swap(_sourceToken, _destToken, _swapAmount);
    }

    /// @dev _safeTransfer executes tranfer erc20 tokens
    /// @param _token The address of target token
    /// @param _to The address of receiver.
    /// @param _amount The amount of transfer.
    function _safeTransfer(
        address _token,
        address _to,
        uint256 _amount
    ) internal {
        if (_token == BTCT_ADDR) {
            _amount = _amount.mul(convertScale);
        }
        require(IERC20(_token).transfer(_to, _amount));
    }

    /// @dev _rewardsCollection collects tx rewards.
    /// @param _feesToken The token address for collection fees.
    /// @param _rewardsAmount The amount of rewards.
    function _rewardsCollection(address _feesToken, uint256 _rewardsAmount)
        internal
    {
        if (_rewardsAmount == 0) return;
        if (_feesToken == lpToken) {
            feesLPTokensForNode = feesLPTokensForNode.add(_rewardsAmount);
            emit RewardsCollection(_feesToken, _rewardsAmount, 0, 0);
            return;
        }
        // Get current LP token price.
        uint256 nowPrice = getCurrentPriceLP();
        // Add all fees into pool
        floatAmountOf[_feesToken] = floatAmountOf[_feesToken].add(
            _rewardsAmount
        );
        uint256 amountForNodes = _rewardsAmount.mul(nodeRewardsRatio).div(100);
        // Alloc LP tokens for nodes as fees
        uint256 amountLPTokensForNode =
            amountForNodes.mul(lpDecimals).div(nowPrice);
        // Add minted LP tokens for Nodes
        lockedLPTokensForNode = lockedLPTokensForNode.add(
            amountLPTokensForNode
        );
        emit RewardsCollection(
            _feesToken,
            _rewardsAmount,
            amountLPTokensForNode,
            nowPrice
        );
    }

    /// @dev _addUsedTx updates txid list which is spent. (single hash)
    /// @param _txid The array of txid.
    function _addUsedTx(bytes32 _txid) internal {
        used[_txid] = true;
    }

    /// @dev _addUsedTxs updates txid list which is spent. (multiple hashes)
    /// @param _txids The array of txid.
    function _addUsedTxs(bytes32[] memory _txids) internal {
        for (uint256 i = 0; i < _txids.length; i++) {
            used[_txids[i]] = true;
        }
    }

    /// @dev _addNode updates a staker's info.
    /// @param _addr The address of staker.
    /// @param _data The data of staker.
    /// @param _remove The flag to remove node.
    function _addNode(
        address _addr,
        bytes32 _data,
        bool _remove
    ) internal returns (bool) {
        if (_remove) {
            delete nodes[_addr];
            return true;
        }
        if (!isInList[_addr]) {
            nodeAddrs.push(_addr);
            isInList[_addr] = true;
        }
        if (nodes[_addr] == 0x0) {
            nodes[_addr] = _data;
        }
        return true;
    }

    /// @dev _splitToValues returns address and amount of staked SWINGBYs
    /// @param _data The info of a staker.
    function _splitToValues(bytes32 _data)
        internal
        pure
        returns (address, uint256)
    {
        return (
            address(uint160(uint256(_data))),
            uint256(uint96(bytes12(_data)))
        );
    }

    /// @dev The contract doesn't allow receiving Ether.
    fallback() external {
        revert();
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_btct","type":"address"},{"internalType":"uint256","name":"_existingBTCFloat","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfFloat","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPriceLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawal","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"txid","type":"bytes32"}],"name":"BurnLPTokensForFloat","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardLPTsForNodes","type":"uint256"}],"name":"DistributeNodeRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfFloat","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPriceLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFees","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"txid","type":"bytes32"}],"name":"IssueLPTokensForFloat","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feesToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLPTokensForNode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPriceLP","type":"uint256"}],"name":"RewardsCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Swap","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"BTCT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bytes32[]","name":"_rewardAddressAndAmounts","type":"bytes32[]"},{"internalType":"bool[]","name":"_isRemoved","type":"bool[]"},{"internalType":"uint8","name":"_churnedInCount","type":"uint8"},{"internalType":"uint8","name":"_tssThreshold","type":"uint8"},{"internalType":"uint8","name":"_nodeRewardsRatio","type":"uint8"},{"internalType":"uint8","name":"_withdrawalFeeBPS","type":"uint8"}],"name":"churn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"churnedInCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_destToken","type":"address"},{"internalType":"uint256","name":"_incomingAmount","type":"uint256"},{"internalType":"uint256","name":"_minerFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsAmount","type":"uint256"}],"name":"collectSwapFeesForBTC","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFeesBPS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeNodeRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesLPTokensForNode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveNodes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPriceLP","outputs":[{"internalType":"uint256","name":"nowPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountOfFloat","type":"uint256"}],"name":"getDepositFeeRate","outputs":[{"internalType":"uint256","name":"depositFeeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"}],"name":"getFloatReserve","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialExchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_txid","type":"bytes32"}],"name":"isTxUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedLPTokensForNode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_destToken","type":"address"},{"internalType":"bytes32[]","name":"_addressesAndAmounts","type":"bytes32[]"},{"internalType":"uint256","name":"_totalSwapped","type":"uint256"},{"internalType":"uint256","name":"_rewardsAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_redeemedFloatTxIds","type":"bytes32[]"}],"name":"multiTransferERC20TightlyPacked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nodeRewardsRatio","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bytes32","name":"_addressesAndAmountOfFloat","type":"bytes32"},{"internalType":"bool","name":"_zerofee","type":"bool"},{"internalType":"bytes32","name":"_txid","type":"bytes32"}],"name":"recordIncomingFloat","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bytes32","name":"_addressesAndAmountOfLPtoken","type":"bytes32"},{"internalType":"uint256","name":"_minerFee","type":"uint256"},{"internalType":"bytes32","name":"_txid","type":"bytes32"}],"name":"recordOutcomingFloat","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minerFee","type":"uint256"},{"internalType":"bytes32","name":"_txid","type":"bytes32"}],"name":"recordUTXOSweepMinerFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_destToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_totalSwapped","type":"uint256"},{"internalType":"uint256","name":"_rewardsAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_redeemedFloatTxIds","type":"bytes32[]"}],"name":"singleTransferERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tssThreshold","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalFeeBPS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162002d0738038062002d07833981810160405260608110156200003757600080fd5b508051602082015160409092015190919060006200005462000296565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b0319166001600160a01b0385811691909117918290556040805163313ce56760e01b81529051929091169163313ce56791600480820192602092909190829003018186803b158015620000fb57600080fd5b505afa15801562000110573d6000803e3d6000fd5b505050506040513d60208110156200012757600080fd5b505160ff16600a0a600955600180546001600160a01b0319166001600160a01b0384169081179091556004805462ff00001916624200001763ff000000191663320000001760ff60201b19166414000000001781556040805163313ce56760e01b815290516008939263313ce56792808201926020929091829003018186803b158015620001b457600080fd5b505afa158015620001c9573d6000803e3d6000fd5b505050506040513d6020811015620001e057600080fd5b50510360ff16600a90810a600855600954600755600060058190556006819055600180546001600160a01b039081168352600360209081526040808520805460ff1990811686179091556002549093168552842080548316841790559280527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff80549091169091179055527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e355506200029a9050565b3390565b612a5d80620002aa6000396000f3fe608060405234801561001057600080fd5b50600436106101a85760003560e01c80636b51e919116100f9578063b6268e5d11610097578063e9e9bf6a11610071578063e9e9bf6a14610755578063ec4827291461075d578063f2fde38b146107a4578063f7824bc7146107ca576101a8565b8063b6268e5d1461070d578063c810a53914610715578063e6ca208414610738576101a8565b80638006cc3e116100d35780638006cc3e146105685780638da5cb5b146105a05780639b19251a146105a8578063ad289e76146105ce576101a8565b80636b51e919146104fe5780636d019f3514610556578063715018a61461055e576101a8565b80632d55282d1161016657806345137e271161014057806345137e27146103665780634e54cee01461036e5780635fcbd285146104bc57806363f289d9146104c4576101a8565b80632d55282d146103185780633b6fa12714610332578063424192551461035e576101a8565b806289356f146101ad5780630b68134d146101cb5780630d63aca7146101d35780630f909486146102b457806312d1441e146102d85780632586c562146102e0575b600080fd5b6101b56107d2565b6040805160ff9092168252519081900360200190f35b6101b56107db565b6102a0600480360360c08110156101e957600080fd5b6001600160a01b0382358116926020810135909116916040820135916060810135916080820135919081019060c0810160a0820135600160201b81111561022f57600080fd5b82018360208201111561024157600080fd5b803590602001918460208302840111600160201b8311171561026257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107ea945050505050565b604080519115158252519081900360200190f35b6102bc610989565b604080516001600160a01b039092168252519081900360200190f35b6101b5610998565b6102a0600480360360808110156102f657600080fd5b506001600160a01b0381351690602081013590604081013590606001356109a6565b610320610aea565b60408051918252519081900360200190f35b6103206004803603604081101561034857600080fd5b506001600160a01b038135169060200135610af0565b6101b5610b7c565b610320610b8c565b6102a0600480360360e081101561038457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103ae57600080fd5b8201836020820111156103c057600080fd5b803590602001918460208302840111600160201b831117156103e157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561043057600080fd5b82018360208201111561044257600080fd5b803590602001918460208302840111600160201b8311171561046357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505060ff833581169450602084013581169360408101358216935060600135169050610c78565b6102bc610f96565b6102a0600480360360808110156104da57600080fd5b506001600160a01b0381351690602081013590604081013515159060600135610fa5565b610506611083565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561054257818101518382015260200161052a565b505050509050019250505060405180910390f35b6103206111e2565b6105666111e8565b005b6102a06004803603608081101561057e57600080fd5b506001600160a01b038135169060208101359060408101359060600135611294565b6102bc6113c5565b6102a0600480360360208110156105be57600080fd5b50356001600160a01b03166113d4565b6102a0600480360360a08110156105e457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561060e57600080fd5b82018360208201111561062057600080fd5b803590602001918460208302840111600160201b8311171561064157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b81111561069c57600080fd5b8201836020820111156106ae57600080fd5b803590602001918460208302840111600160201b831117156106cf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506113e9945050505050565b6101b56115c3565b6102a06004803603604081101561072b57600080fd5b50803590602001356115d3565b6102a06004803603602081101561074e57600080fd5b5035611738565b6102a061174d565b61078b6004803603604081101561077357600080fd5b506001600160a01b03813581169160200135166119b4565b6040805192835260208301919091528051918290030190f35b610566600480360360208110156107ba57600080fd5b50356001600160a01b03166119de565b610320611ae0565b60045460ff1681565b60045462010000900460ff1681565b60006107f4611ae6565b6001600160a01b03166108056113c5565b6001600160a01b03161461084e576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b6001600160a01b03871660009081526003602052604090205460ff166108bb576040805162461bcd60e51b815260206004820152601d60248201527f5f64657374546f6b656e206973206e6f742077686974656c6973746564000000604482015290519081900360640190fd5b6001600160a01b0387166109005760405162461bcd60e51b8152600401808060200182810382526023815260200180612a056023913960400191505060405180910390fd5b6000841561092657600154610921906000906001600160a01b031687611aea565b610939565b8461093957506001546001600160a01b03165b6002546001600160a01b038981169116141561095d57506002546001600160a01b03165b6109678185611bd6565b61097083611d4d565b61097b888888611d9c565b506001979650505050505050565b6001546001600160a01b031681565b600454610100900460ff1681565b60006109b0611ae6565b6001600160a01b03166109c16113c5565b6001600160a01b031614610a0a576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b6000610a14610b8c565b6001600160a01b03871660009081526003602052604090205490915060ff16610a78576040805162461bcd60e51b815260206004820152601160248201527017dd1bdad95b881a5cc81a5b9d985b1a59607a1b604482015290519081900360640190fd5b610a8486868686611e54565b610a8d57600080fd5b6001915080610a9a610b8c565b1015610ae1576040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964204c505420707269636560781b604482015290519081900360640190fd5b50949350505050565b60055481565b600080610afd84846121f0565b90508060ff1660011415610b3f576001546001600160a01b03858116911614610b27576000610b35565b6004546301000000900460ff165b60ff169150610b75565b8060ff1660021415610b75576001600160a01b03841615610b61576000610b6f565b6004546301000000900460ff165b60ff1691505b5092915050565b6004546301000000900460ff1681565b60015460009081908190610baa9082906001600160a01b03166119b4565b915091506000600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfe57600080fd5b505afa158015610c12573d6000803e3d6000fd5b505050506040513d6020811015610c2857600080fd5b505190508015610c6c57610c67610c4a600554836122aa90919063ffffffff16565b600954610c6190610c5b87876122aa565b9061230b565b90612364565b610c70565b6007545b935050505090565b6000610c82611ae6565b6001600160a01b0316610c936113c5565b6001600160a01b031614610cdc576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b60045460ff610100909104811690851610801590610cfe575060ff8460ff1611155b610d395760405162461bcd60e51b815260040180806020018281038252602781526020018061291a6027913960400191505060405180910390fd5b6001840160ff168560ff161015610d8c576040805162461bcd60e51b81526020600482015260126024820152716e2073686f756c64206265203e3d20742b3160701b604482015290519081900360640190fd5b60648360ff161115610de5576040805162461bcd60e51b815260206004820152601e60248201527f5f6e6f646552657761726473526174696f206973206e6f742076616c69640000604482015290519081900360640190fd5b60648260ff161115610e3e576040805162461bcd60e51b815260206004820152601c60248201527f5f7769746864726177616c46656542505320697320696e76616c696400000000604482015290519081900360640190fd5b8551875114610e7e5760405162461bcd60e51b815260040180806020018281038252603b8152602001806129ca603b913960400191505060405180910390fd5b610e87886119de565b60005b8751811015610eef576000610eb1898381518110610ea457fe5b60200260200101516123cb565b509050610ee5818a8481518110610ec457fe5b60200260200101518a8581518110610ed857fe5b60200260200101516123d4565b5050600101610e8a565b506060610efa611083565b9050606481511115610f3d5760405162461bcd60e51b81526004018080602001828103825260218152602001806129626021913960400191505060405180910390fd5b50506004805460ff191660ff9586161761ff001916610100948616949094029390931762ff0000191662010000928516929092029190911764ff000000001916600160201b919093160291909117905550600192915050565b6002546001600160a01b031681565b6000610faf611ae6565b6001600160a01b0316610fc06113c5565b6001600160a01b031614611009576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b6000611013610b8c565b6001600160a01b03871660009081526003602052604090205490915060ff16611077576040805162461bcd60e51b815260206004820152601160248201527017dd1bdad95b881a5cc81a5b9d985b1a59607a1b604482015290519081900360640190fd5b610a84868686866124c4565b606060008060005b600e548110156110e657600c6000600e83815481106110a657fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054156110de576110db8360016122aa565b92505b60010161108b565b5060608267ffffffffffffffff8111801561110057600080fd5b5060405190808252806020026020018201604052801561112a578160200160208202803683370190505b50905060005b600e548110156111da57600c6000600e838154811061114b57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054156111d257600c6000600e838154811061118657fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205482518390859081106111b957fe5b60209081029190910101526111cf8360016122aa565b92505b600101611130565b509250505090565b60075481565b6111f0611ae6565b6001600160a01b03166112016113c5565b6001600160a01b03161461124a576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061129e611ae6565b6001600160a01b03166112af6113c5565b6001600160a01b0316146112f8576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b6001600160a01b03851615611354576040805162461bcd60e51b815260206004820152601f60248201527f5f64657374546f6b656e2073686f756c64206265206164647265737328302900604482015290519081900360640190fd5b6001546001600160a01b031684156113a657600061137c85611376888761270b565b9061270b565b6001549091506113a0906001600160a01b0316600061139b84896122aa565b611aea565b506113af565b846113af575060005b6113b98184611bd6565b50600195945050505050565b6000546001600160a01b031690565b60036020526000908152604090205460ff1681565b60006113f3611ae6565b6001600160a01b03166114046113c5565b6001600160a01b03161461144d576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526003602052604090205460ff166114ba576040805162461bcd60e51b815260206004820152601d60248201527f5f64657374546f6b656e206973206e6f742077686974656c6973746564000000604482015290519081900360640190fd5b6001600160a01b0386166114ff5760405162461bcd60e51b8152600401808060200182810382526023815260200180612a056023913960400191505060405180910390fd5b6000841561152557600154611520906000906001600160a01b031687611aea565b611538565b8461153857506001546001600160a01b03165b6002546001600160a01b038881169116141561155c57506002546001600160a01b03165b6115668185611bd6565b61156f83611d4d565b60005b865181101561097b576115bb8888838151811061158b57fe5b602002602001015160001c8984815181106115a257fe5b602002602001015160a01c6001600160601b0316611d9c565b600101611572565b600454600160201b900460ff1681565b60006115dd611ae6565b6001600160a01b03166115ee6113c5565b6001600160a01b031614611637576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b61164082611738565b1561168d576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1e1a59081a5cc8185b1c9958591e481d5cd95960421b604482015290519081900360640190fd5b60408051808201909152601d81527f42544320666c6f617420616d6f756e7420696e73756666696369656e7400000060208083019190915260008052600a90527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3546116fa918590612768565b60008052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e35561172e826127ff565b5060015b92915050565b6000908152600b602052604090205460ff1690565b6000806117676006546005546122aa90919063ffffffff16565b9050600081116117a85760405162461bcd60e51b815260040180806020018281038252602581526020018061289b6025913960400191505060405180910390fd5b60606117b2611083565b90506000805b82518110156117fd576117f38382815181106117d057fe5b602002602001015160a01c6001600160601b0316836122aa90919063ffffffff16565b91506001016117b8565b50600254600554604080516340c10f1960e01b81523060048201526024810192909252516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561185557600080fd5b505af1158015611869573d6000803e3d6000fd5b505050506040513d602081101561187f57600080fd5b50600090505b825181101561196c5760025483516001600160a01b039091169063a9059cbb908590849081106118b157fe5b602002602001015160001c6118f285610c618887815181106118cf57fe5b602002602001015160a01c6001600160601b03168a61230b90919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561193857600080fd5b505af115801561194c573d6000803e3d6000fd5b505050506040513d602081101561196257600080fd5b5050600101611885565b506040805184815290517f86dd6ae252e62228b47b3c1a12762cbf634952b2d29319b04f4f72fb153bcbdd9181900360200190a1505060006005819055600655506001905090565b6001600160a01b039182166000908152600a60205260408082205492909316815291909120549091565b6119e6611ae6565b6001600160a01b03166119f76113c5565b6001600160a01b031614611a40576040805162461bcd60e51b81526020600482018190526024820152600080516020612983833981519152604482015290519081900360640190fd5b6001600160a01b038116611a855760405162461bcd60e51b81526004018080602001828103825260268152602001806128f46026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60065481565b3390565b60408051808201825260208082527f5f737761703a20666c6f617420616d6f756e7420696e73756666696369656e74818301526001600160a01b0385166000908152600a9091529190912054611b41918390612768565b6001600160a01b038084166000908152600a60205260408082209390935590851681522054611b7090826122aa565b6001600160a01b038085166000818152600a602090815260409182902094909455805191825291851692810192909252818101839052517fea368a40e9570069bb8e6511d668293ad2e1f03b0d982431fd223de9f3b70ca69181900360600190a1505050565b80611be057611d49565b6002546001600160a01b0383811691161415611c5b57600654611c0390826122aa565b600655604080516001600160a01b0384168152602081018390526000818301819052606082015290517fe3debe835f6848edc082b32a1d729781d3bfcd7e14422d80bcaa6794d3816b2f9181900360800190a1611d49565b6000611c65610b8c565b6001600160a01b0384166000908152600a6020526040902054909150611c8b90836122aa565b6001600160a01b0384166000908152600a6020526040812091909155600454611cc590606490610c6190869062010000900460ff1661230b565b90506000611ce283610c616009548561230b90919063ffffffff16565b600554909150611cf290826122aa565b600555604080516001600160a01b0387168152602081018690528082018390526060810185905290517fe3debe835f6848edc082b32a1d729781d3bfcd7e14422d80bcaa6794d3816b2f9181900360800190a15050505b5050565b60005b8151811015611d49576001600b6000848481518110611d6b57fe5b6020908102919091018101518252810191909152604001600020805460ff1916911515919091179055600101611d50565b6001546001600160a01b0384811691161415611dc357600854611dc090829061230b565b90505b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e1a57600080fd5b505af1158015611e2e573d6000803e3d6000fd5b505050506040513d6020811015611e4457600080fd5b5051611e4f57600080fd5b505050565b6000611e5f82611738565b15611eac576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1e1a59081a5cc8185b1c9958591e481d5cd95960421b604482015290519081900360640190fd5b83611efe576040805162461bcd60e51b815260206004820152601c60248201527f546865207472616e73616374696f6e206973206e6f742076616c696400000000604482015290519081900360640190fd5b600080611f0a866123cb565b915091506000611f18610b8c565b90506000611f35600954610c61848661230b90919063ffffffff16565b600454909150600090611f5b9061271090610c61908590600160201b900460ff1661230b565b905087611f68838361270b565b1015611fa55760405162461bcd60e51b81526004018080602001828103825260348152602001806128c06034913960400191505060405180910390fd5b6000611fb589611376858561270b565b6001549091506000908190611fd49082906001600160a01b03166119b4565b90925090506001600160a01b038d1661204a57611ff1858561270b565b821015612045576040805162461bcd60e51b815260206004820152601f60248201527f54686520666c6f61742062616c616e636520696e73756666696369656e742e00604482015290519081900360640190fd5b6120be565b6001546001600160a01b038e8116911614156120be5761206a858561270b565b8110156120be576040805162461bcd60e51b815260206004820152601f60248201527f54686520666c6f61742062616c616e636520696e73756666696369656e742e00604482015290519081900360640190fd5b6120c88d85611bd6565b6120d28d8661281a565b6120db8a6127ff565b6001546001600160a01b038e8116911614156120fc576120fc8d8985611d9c565b60025460408051630852cd8d60e31b8152600481018a905290516001600160a01b03909216916342966c68916024808201926020929091908290030181600087803b15801561214a57600080fd5b505af115801561215e573d6000803e3d6000fd5b505050506040513d602081101561217457600080fd5b505161217f57600080fd5b604080516001600160a01b038a16815260208101899052808201879052606081018890526080810185905260a081018c905290517fa9da34e5e4a956b744307ae7611795634e8365951073bf049d76b64b2ae7a0589181900360c00190a15060019c9b505050505050505050505050565b6001546000908190819061220e9082906001600160a01b03166119b4565b909250905060006122336003610c616002610c5b8961222d89896122aa565b906122aa565b6001549091506001600160a01b03878116911614801561225c57508061225983876122aa565b10155b1561226d5760019350505050611732565b6001600160a01b03861615801561228d57508061228a84876122aa565b10155b1561229e5760029350505050611732565b50600095945050505050565b600082820183811015612304576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261231a57506000611732565b8282028284828161232757fe5b04146123045760405162461bcd60e51b81526004018080602001828103825260218152602001806129416021913960400191505060405180910390fd5b60008082116123ba576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816123c357fe5b049392505050565b9060a082901c90565b600081156123fd57506001600160a01b0383166000908152600c60205260408120556001612304565b6001600160a01b0384166000908152600d602052604090205460ff1661248157600e805460018082019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0387169081179091556000908152600d60205260409020805460ff191690911790555b6001600160a01b0384166000908152600c60205260409020546124ba576001600160a01b0384166000908152600c602052604090208390555b5060019392505050565b60006124cf82611738565b1561251c576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1e1a59081a5cc8185b1c9958591e481d5cd95960421b604482015290519081900360640190fd5b8361256e576040805162461bcd60e51b815260206004820152601c60248201527f546865207472616e73616374696f6e206973206e6f742076616c696400000000604482015290519081900360640190fd5b60008061257a866123cb565b915091506000612588610b8c565b905060006125a582610c616009548661230b90919063ffffffff16565b905060006125b38a85610af0565b90506000816125c35760006125d3565b6125d3612710610c61858561230b565b90508880156125e157508015155b156125eb57600080fd5b6002546001600160a01b03166340c10f1987612607868561270b565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561264d57600080fd5b505af1158015612661573d6000803e3d6000fd5b505050506040513d602081101561267757600080fd5b505060055461268690826122aa565b6005556126938b86612877565b61269c886127ff565b604080516001600160a01b038816815260208101879052808201859052606081018690526080810183905260a081018a905290517fdfaf4e23f7030adafec91a682e05bf9fb30c721f9cec3d8bcfae0459c5362db19181900360c00190a15060019a9950505050505050505050565b600082821115612762576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600081848411156127f75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127bc5781810151838201526020016127a4565b50505050905090810190601f1680156127e95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000908152600b60205260409020805460ff19166001179055565b612857816040518060600160405280602781526020016129a3602791396001600160a01b0385166000908152600a60205260409020549190612768565b6001600160a01b039092166000908152600a602052604090209190915550565b6001600160a01b0382166000908152600a602052604090205461285790826122aa56fe746f74616c5265776172644c5073466f724e6f6465206973206e6f7420706f7369746976654572726f723a20616d6f756e744f66466c6f61742e737562287769746864726177616c4665657329203c205f6d696e65724665654f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735f7473735468726573686f6c642073686f756c64206265203e3d207473735468726573686f6c64536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753746f726564206e6f64652073697a652073686f756c64206265203c3d203130304f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f72656d6f7665466c6f61743a20666c6f617420616d6f756e7420696e73756666696369656e745f72657761726441646472657373416e64416d6f756e747320616e64205f697352656d6f766564206c656e677468206973206e6f74206d617463685f64657374546f6b656e2073686f756c64206e6f742062652061646472657373283029a26469706673582212209b023bc416b6704d7f75748a14a1171246a4a20e05c96b0e3372ea216cdf6c7a64736f6c63430007050033000000000000000000000000dba68bef9b541999fd9650ff72c19d5e1ceecd100000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c0000000000000000000000000000000000000000000000000000000000000000

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

000000000000000000000000dba68bef9b541999fd9650ff72c19d5e1ceecd100000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c0000000000000000000000000000000000000000000000000000000000000000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000dba68bef9b541999fd9650ff72c19d5e1ceecd10
Arg [1] : 0000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

16728:25254:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41963:8;;;16930:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16996:29;;;:::i;19965:950::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19965:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19965:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19965:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19965:950:0;;-1:-1:-1;19965:950:0;;-1:-1:-1;;;;;19965:950:0:i;:::-;;;;;;;;;;;;;;;;;;16818:24;;;:::i;:::-;;;;-1:-1:-1;;;;;16818:24:0;;;;;;;;;;;;;;16964:25;;;:::i;24696:507::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24696:507:0;;;;;;;;;;;;;;;;;;:::i;17102:36::-;;;:::i;:::-;;;;;;;;;;;;;;;;30451:450;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30451:450:0;;;;;;;;:::i;17032:27::-;;;:::i;29679:602::-;;;:::i;27650:1725::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27650:1725:0;;;;;;;;;;;;;;;-1:-1:-1;;;27650:1725:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27650:1725:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27650:1725:0;;;;;;;;-1:-1:-1;27650:1725:0;;-1:-1:-1;;;;;27650:1725:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27650:1725:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27650:1725:0;;-1:-1:-1;;27650:1725:0;;;;;;-1:-1:-1;27650:1725:0;;;;;;;;;;;;;;-1:-1:-1;27650:1725:0;;;;;-1:-1:-1;27650:1725:0;:::i;16849:22::-;;;:::i;23889:498::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23889:498:0;;;;;;;;;;;;;;;;;;;;:::i;31409:656::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17186:34;;;:::i;8628:148::-;;;:::i;:::-;;22835:714;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22835:714:0;;;;;;;;;;;;;;;;;;:::i;7977:87::-;;;:::i;16880:41::-;;;;;;;;;;;;;;;;-1:-1:-1;16880:41:0;-1:-1:-1;;;;;16880:41:0;;:::i;21308:1201::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21308:1201:0;;;;;;;;;;;;;;;-1:-1:-1;;;21308:1201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21308:1201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21308:1201:0;;;;;;;;;;;;-1:-1:-1;21308:1201:0;-1:-1:-1;21308:1201:0;;;;-1:-1:-1;21308:1201:0;;;-1:-1:-1;;;21308:1201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21308:1201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21308:1201:0;;-1:-1:-1;21308:1201:0;;-1:-1:-1;;;;;21308:1201:0:i;17066:29::-;;;:::i;26666:420::-;;;;;;;;;;;;;;;;-1:-1:-1;26666:420:0;;;;;;;:::i;29486:106::-;;;;;;;;;;;;;;;;-1:-1:-1;29486:106:0;;:::i;25272:1142::-;;;:::i;31070:256::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31070:256:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8931:244;;;;;;;;;;;;;;;;-1:-1:-1;8931:244:0;-1:-1:-1;;;;;8931:244:0;;:::i;17145:34::-;;;:::i;16930:27::-;;;;;;:::o;16996:29::-;;;;;;;;;:::o;19965:950::-;20227:4;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20252:21:0;::::1;;::::0;;;:9:::1;:21;::::0;;;;;::::1;;20244:63;;;::::0;;-1:-1:-1;;;20244:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;20340:24:0;::::1;20318:109;;;;-1:-1:-1::0;;;20318:109:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20438:18;20484:17:::0;;20480:172:::1;;20536:9;::::0;20518:43:::1;::::0;20532:1:::1;::::0;-1:-1:-1;;;;;20536:9:0::1;20547:13:::0;20518:5:::1;:43::i;:::-;20480:172;;;20583:18:::0;20579:73:::1;;-1:-1:-1::0;20631:9:0::1;::::0;-1:-1:-1;;;;;20631:9:0::1;20579:73;20680:7;::::0;-1:-1:-1;;;;;20666:21:0;;::::1;20680:7:::0;::::1;20666:21;20662:74;;;-1:-1:-1::0;20717:7:0::1;::::0;-1:-1:-1;;;;;20717:7:0::1;20662:74;20746:46;20765:10;20777:14;20746:18;:46::i;:::-;20803:32;20815:19;20803:11;:32::i;:::-;20846:39;20860:10;20872:3;20877:7;20846:13;:39::i;:::-;-1:-1:-1::0;20903:4:0::1;::::0;19965:950;-1:-1:-1;;;;;;;19965:950:0:o;16818:24::-;;;-1:-1:-1;;;;;16818:24:0;;:::o;16964:25::-;;;;;;;;;:::o;24696:507::-;24905:4;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;18332:19:::1;18354;:17;:19::i;:::-;-1:-1:-1::0;;;;;24930:17:0;::::2;;::::0;;;:9:::2;:17;::::0;;;;;18332:41;;-1:-1:-1;24930:17:0::2;;24922:47;;;::::0;;-1:-1:-1;;;24922:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;24922:47:0;;;;;;;;;;;;;::::2;;25002:160;25042:6;25067:28;25114:9;25142:5;25002:21;:160::i;:::-;24980:193;;;::::0;::::2;;25191:4;25184:11;;18427::::1;18404:19;:17;:19::i;:::-;:34;;18396:64;;;::::0;;-1:-1:-1;;;18396:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18396:64:0;;;;;;;;;;;;;::::1;;8268:1;24696:507:::0;;;;;;:::o;17102:36::-;;;;:::o;30451:450::-;30584:22;30624:12;30639:35;30651:6;30659:14;30639:11;:35::i;:::-;30624:50;;30689:6;:11;;30699:1;30689:11;30685:209;;;30744:9;;-1:-1:-1;;;;;30734:19:0;;;30744:9;;30734:19;:40;;30773:1;30734:40;;;30756:14;;;;;;;30734:40;30717:57;;;;30685:209;;;30796:6;:11;;30806:1;30796:11;30792:102;;;-1:-1:-1;;;;;30841:20:0;;;:41;;30881:1;30841:41;;;30864:14;;;;;;;30841:41;30824:58;;;;30792:102;30451:450;;;;;:::o;17032:27::-;;;;;;;;;:::o;29679:602::-;29888:9;;29774:16;;;;;;29860:38;;29774:16;;-1:-1:-1;;;;;29888:9:0;29860:15;:38::i;:::-;29808:90;;;;29909:16;29943:7;;;;;;;;;-1:-1:-1;;;;;29943:7:0;-1:-1:-1;;;;;29928:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29928:37:0;;-1:-1:-1;30070:13:0;;:177;;30134:113;30197:35;30210:21;;30197:8;:12;;:35;;;;:::i;:::-;30163:10;;30134:40;;30135:22;:8;30148;30135:12;:22::i;:::-;30134:28;;:40::i;:::-;:44;;:113::i;:::-;30070:177;;;30099:19;;30070:177;30059:188;;30258:15;;;29679:602;:::o;27650:1725::-;27954:4;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;28010:12:::1;::::0;::::1;;::::0;;::::1;::::0;::::1;27993:29:::0;;::::1;;::::0;::::1;::::0;:58:::1;;;28043:8;28026:13;:25;;;;27993:58;27971:147;;;;-1:-1:-1::0;;;27971:147:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28192:1;28170:13;:24;28151:43;;:15;:43;;;;28129:111;;;::::0;;-1:-1:-1;;;28129:111:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28129:111:0;;;;;;;;;;;;;::::1;;28320:3;28299:17;:24;;;;28251:130;;;::::0;;-1:-1:-1;;;28251:130:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28461:3;28440:17;:24;;;;28392:128;;;::::0;;-1:-1:-1;;;28392:128:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28588:10;:17;28553:24;:31;:52;28531:161;;;;-1:-1:-1::0;;;28531:161:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28703:28;28721:9;28703:17;:28::i;:::-;28783:9;28778:230;28802:24;:31;28798:1;:35;28778:230;;;28856:15;28877:43;28892:24;28917:1;28892:27;;;;;;;;;;;;;;28877:14;:43::i;:::-;28855:65;;;28935:61;28944:7;28953:24;28978:1;28953:27;;;;;;;;;;;;;;28982:10;28993:1;28982:13;;;;;;;;;;;;;;28935:8;:61::i;:::-;-1:-1:-1::0;;28835:3:0::1;;28778:230;;;;29018:25;29046:16;:14;:16::i;:::-;29018:44;;29095:3;29077:8;:15;:21;29073:97;;;29115:43;;-1:-1:-1::0;;;29115:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29073:97;-1:-1:-1::0;;29180:14:0::1;:32:::0;;-1:-1:-1;;29180:32:0::1;;::::0;;::::1;;-1:-1:-1::0;;29223:28:0::1;29180:32;29223:28:::0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;29262:36:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;29309:36:0::1;-1:-1:-1::0;;;29309:36:0;;;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;;27650:1725:0;-1:-1:-1;;27650:1725:0:o;16849:22::-;;;-1:-1:-1;;;;;16849:22:0;;:::o;23889:498::-;24091:4;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;18332:19:::1;18354;:17;:19::i;:::-;-1:-1:-1::0;;;;;24116:17:0;::::2;;::::0;;;:9:::2;:17;::::0;;;;;18332:41;;-1:-1:-1;24116:17:0::2;;24108:47;;;::::0;;-1:-1:-1;;;24108:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;24108:47:0;;;;;;;;;;;;;::::2;;24188:158;24229:6;24254:26;24299:8;24326:5;24188:22;:158::i;31409:656::-:0;31465:16;31494:17;31526:13;31586:9;31581:168;31605:9;:16;31601:20;;31581:168;;;31647:5;:19;31653:9;31663:1;31653:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31653:12:0;31647:19;;;;;;;;;;;;;:26;31643:95;;31706:16;:9;31720:1;31706:13;:16::i;:::-;31694:28;;31643:95;31623:3;;31581:168;;;;31759:23;31799:9;31785:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31785:24:0;;31759:50;;31825:9;31820:214;31844:9;:16;31840:20;;31820:214;;;31886:5;:19;31892:9;31902:1;31892:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31892:12:0;31886:19;;;;;;;;;;;;;:26;31882:141;;31949:5;:19;31955:9;31965:1;31955:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31955:12:0;31949:19;;;;;;;;;;;;;31933:13;;:6;;31940:5;;31933:13;;;;;;;;;;;;;;;:35;31995:12;:5;32005:1;31995:9;:12::i;:::-;31987:20;;31882:141;31862:3;;31820:214;;;-1:-1:-1;32051:6:0;-1:-1:-1;;;31409:656:0;:::o;17186:34::-;;;;:::o;8628:148::-;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;8735:1:::1;8719:6:::0;;8698:40:::1;::::0;-1:-1:-1;;;;;8719:6:0;;::::1;::::0;8698:40:::1;::::0;8735:1;;8698:40:::1;8766:1;8749:19:::0;;-1:-1:-1;;;;;;8749:19:0::1;::::0;;8628:148::o;22835:714::-;23034:4;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23059:24:0;::::1;::::0;23051:68:::1;;;::::0;;-1:-1:-1;;;23051:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23151:9;::::0;-1:-1:-1;;;;;23151:9:0::1;23175:19:::0;;23171:292:::1;;23211:18;23249:50;23289:9:::0;23249:35:::1;:15:::0;23269:14;23249:19:::1;:35::i;:::-;:39:::0;::::1;:50::i;:::-;23320:9;::::0;23211:88;;-1:-1:-1;23314:55:0::1;::::0;-1:-1:-1;;;;;23320:9:0::1;;23343:25;23211:88:::0;23358:9;23343:14:::1;:25::i;:::-;23314:5;:55::i;:::-;23171:292;;;;23391:20:::0;23387:76:::1;;-1:-1:-1::0;23449:1:0::1;23387:76;23473:46;23492:10;23504:14;23473:18;:46::i;:::-;-1:-1:-1::0;23537:4:0::1;::::0;22835:714;-1:-1:-1;;;;;22835:714:0:o;7977:87::-;8023:7;8050:6;-1:-1:-1;;;;;8050:6:0;7977:87;:::o;16880:41::-;;;;;;;;;;;;;;;:::o;21308:1201::-;21582:4;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21607:21:0;::::1;;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21599:63;;;::::0;;-1:-1:-1;;;21599:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21695:24:0;::::1;21673:109;;;;-1:-1:-1::0;;;21673:109:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21793:18;21839:17:::0;;21835:172:::1;;21891:9;::::0;21873:43:::1;::::0;21887:1:::1;::::0;-1:-1:-1;;;;;21891:9:0::1;21902:13:::0;21873:5:::1;:43::i;:::-;21835:172;;;21938:18:::0;21934:73:::1;;-1:-1:-1::0;21986:9:0::1;::::0;-1:-1:-1;;;;;21986:9:0::1;21934:73;22035:7;::::0;-1:-1:-1;;;;;22021:21:0;;::::1;22035:7:::0;::::1;22021:21;22017:74;;;-1:-1:-1::0;22072:7:0::1;::::0;-1:-1:-1;;;;;22072:7:0::1;22017:74;22101:46;22120:10;22132:14;22101:18;:46::i;:::-;22158:32;22170:19;22158:11;:32::i;:::-;22206:9;22201:279;22225:20;:27;22221:1;:31;22201:279;;;22274:194;22306:10;22359:20;22380:1;22359:23;;;;;;;;;;;;;;22351:32;;22427:20;22448:1;22427:23;;;;;;;;;;;;;;22412:40;;-1:-1:-1::0;;;;;22404:49:0::1;22274:13;:194::i;:::-;22254:3;;22201:279;;17066:29:::0;;;-1:-1:-1;;;17066:29:0;;;;;:::o;26666:420::-;26804:4;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;26835:15:::1;26844:5;26835:8;:15::i;:::-;26834:16;26826:53;;;::::0;;-1:-1:-1;;;26826:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26826:53:0;;;;;;;;;;;;;::::1;;26918:110;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;-1:-1:-1;26918:25:0;;:13:::1;:25:::0;;;;:110:::1;::::0;26962:9;;26918:29:::1;:110::i;:::-;26890:25;::::0;;:13:::1;:25;::::0;;:138;27039:17:::1;27050:5:::0;27039:10:::1;:17::i;:::-;-1:-1:-1::0;27074:4:0::1;8268:1;26666:420:::0;;;;:::o;29486:106::-;29549:4;29573:11;;;:4;:11;;;;;;;;;29486:106::o;25272:1142::-;25332:4;25372:26;25414:46;25440:19;;25414:21;;:25;;:46;;;;:::i;:::-;25372:88;;25514:1;25493:18;:22;25471:109;;;;-1:-1:-1;;;25471:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25591:25;25619:16;:14;:16::i;:::-;25591:44;;25646:19;25685:9;25680:173;25704:8;:15;25700:1;:19;25680:173;;;25755:86;25812:8;25821:1;25812:11;;;;;;;;;;;;;;25797:28;;-1:-1:-1;;;;;25789:37:0;25755:11;:15;;:86;;;;:::i;:::-;25741:100;-1:-1:-1;25721:3:0;;25680:173;;;-1:-1:-1;25878:7:0;;25907:21;;25863:66;;;-1:-1:-1;;;25863:66:0;;25900:4;25863:66;;;;;;;;;;;;-1:-1:-1;;;;;25878:7:0;;;;25863:28;;:66;;;;;;;;;;;;;;;25878:7;;25863:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25945:9:0;;-1:-1:-1;25940:318:0;25964:8;:15;25960:1;:19;25940:318;;;26016:7;;26076:11;;-1:-1:-1;;;;;26016:7:0;;;;26001:32;;26076:8;;26085:1;;26076:11;;;;;;;;;;;;26068:20;;26109:122;26219:11;26109:83;26177:8;26186:1;26177:11;;;;;;;;;;;;;;26162:28;;-1:-1:-1;;;;;26154:37:0;26109:18;:44;;:83;;;;:::i;:122::-;26001:245;;;;;;;;;;;;;-1:-1:-1;;;;;26001:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25981:3:0;;25940:318;;;-1:-1:-1;26273:41:0;;;;;;;;;;;;;;;;;-1:-1:-1;;26349:1:0;26325:21;:25;;;26361:19;:23;-1:-1:-1;26402:4:0;;-1:-1:-1;25272:1142:0;:::o;31070:256::-;-1:-1:-1;;;;;31271:22:0;;;31195:16;31271:22;;;:13;:22;;;;;;;31295;;;;;;;;;;;31271;;31070:256::o;8931:244::-;8208:12;:10;:12::i;:::-;-1:-1:-1;;;;;8197:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;8197:23:0;;8189:68;;;;;-1:-1:-1;;;8189:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8189:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;9020:22:0;::::1;9012:73;;;;-1:-1:-1::0;;;9012:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9122:6;::::0;;9101:38:::1;::::0;-1:-1:-1;;;;;9101:38:0;;::::1;::::0;9122:6;::::1;::::0;9101:38:::1;::::0;::::1;9150:6;:17:::0;;-1:-1:-1;;;;;;9150:17:0::1;-1:-1:-1::0;;;;;9150:17:0;;;::::1;::::0;;;::::1;::::0;;8931:244::o;17145:34::-;;;;:::o;6514:106::-;6602:10;6514:106;:::o;38119:451::-;38279:115;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38279:25:0;;-1:-1:-1;38279:25:0;;;:13;:25;;;;;;;;:115;;38323:11;;38279:29;:115::i;:::-;-1:-1:-1;;;;;38251:25:0;;;;;;;:13;:25;;;;;;:143;;;;38435:27;;;;;;;:68;;38481:11;38435:31;:68::i;:::-;-1:-1:-1;;;;;38405:27:0;;;;;;;:13;:27;;;;;;;;;:98;;;;38519:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38119:451;;;:::o;39236:1128::-;39346:19;39342:32;;39367:7;;39342:32;39402:7;;-1:-1:-1;;;;;39388:21:0;;;39402:7;;39388:21;39384:207;;;39448:19;;:39;;39472:14;39448:23;:39::i;:::-;39426:19;:61;39507:51;;;-1:-1:-1;;;;;39507:51:0;;;;;;;;;;39553:1;39507:51;;;;;;;;;;;;;;;;;;;;;39573:7;;39384:207;39641:16;39660:19;:17;:19::i;:::-;-1:-1:-1;;;;;39753:25:0;;;;;;:13;:25;;;;;;39641:38;;-1:-1:-1;39753:69:0;;39797:14;39753:29;:69::i;:::-;-1:-1:-1;;;;;39725:25:0;;;;;;:13;:25;;;;;:97;;;;39877:16;;39858:45;;39899:3;;39858:36;;:14;;39877:16;;;;;39858:18;:36::i;:45::-;39833:70;;39960:29;40005:44;40040:8;40005:30;40024:10;;40005:14;:18;;:30;;;;:::i;:44::-;40127:21;;39960:89;;-1:-1:-1;40127:72:0;;39960:89;40127:25;:72::i;:::-;40103:21;:96;40215:141;;;-1:-1:-1;;;;;40215:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39236:1128;;;;;;:::o;40695:166::-;40766:9;40761:93;40785:6;:13;40781:1;:17;40761:93;;;40838:4;40820;:15;40825:6;40832:1;40825:9;;;;;;;;;;;;;;;;;;;40820:15;;;;;;;;;;-1:-1:-1;40820:15:0;:22;;-1:-1:-1;;40820:22:0;;;;;;;;;;-1:-1:-1;40800:3:0;40761:93;;38780:274;38917:9;;-1:-1:-1;;;;;38907:19:0;;;38917:9;;38907:19;38903:87;;;38965:12;;38953:25;;:7;;:11;:25::i;:::-;38943:35;;38903:87;39015:6;-1:-1:-1;;;;;39008:23:0;;39032:3;39037:7;39008:37;;;;;;;;;;;;;-1:-1:-1;;;;;39008:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39008:37:0;39000:46;;;;;;38780:274;;;:::o;34106:2293::-;34270:4;34296:15;34305:5;34296:8;:15::i;:::-;34295:16;34287:53;;;;;-1:-1:-1;;;34287:53:0;;;;;;;;;;;;-1:-1:-1;;;34287:53:0;;;;;;;;;;;;;;;34359:19;34351:60;;;;;-1:-1:-1;;;34351:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34571:10;34583:18;34605:28;34620:12;34605:14;:28::i;:::-;34570:63;;;;34689:16;34708:19;:17;:19::i;:::-;34689:38;;34778:21;34802:40;34831:10;;34802:24;34817:8;34802:10;:14;;:24;;;;:::i;:40::-;34896:16;;34778:64;;-1:-1:-1;34853:22:0;;34878:46;;34918:5;;34878:35;;34778:64;;-1:-1:-1;;;34896:16:0;;;;34878:17;:35::i;:46::-;34853:71;-1:-1:-1;34994:9:0;34957:33;:13;34853:71;34957:17;:33::i;:::-;:46;;34935:148;;;;-1:-1:-1;;;34935:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35094:18;35115:48;35153:9;35115:33;:13;35133:14;35115:17;:33::i;:48::-;35254:9;;35094:69;;-1:-1:-1;35175:16:0;;;;35226:38;;35175:16;;-1:-1:-1;;;;;35254:9:0;35226:15;:38::i;:::-;35174:90;;-1:-1:-1;35174:90:0;-1:-1:-1;;;;;;35279:20:0;;35275:387;;35354:33;:13;35372:14;35354:17;:33::i;:::-;35342:8;:45;;35316:138;;;;;-1:-1:-1;;;35316:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35275:387;;;35486:9;;-1:-1:-1;;;;;35476:19:0;;;35486:9;;35476:19;35472:190;;;35550:33;:13;35568:14;35550:17;:33::i;:::-;35538:8;:45;;35512:138;;;;;-1:-1:-1;;;35512:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35717:42;35736:6;35744:14;35717:18;:42::i;:::-;35802:35;35815:6;35823:13;35802:12;:35::i;:::-;35884:17;35895:5;35884:10;:17::i;:::-;35982:9;;-1:-1:-1;;;;;35972:19:0;;;35982:9;;35972:19;35968:130;;;36049:37;36063:6;36071:2;36075:10;36049:13;:37::i;:::-;36158:7;;36143:40;;;-1:-1:-1;;;36143:40:0;;;;;;;;;;-1:-1:-1;;;;;36158:7:0;;;;36143:28;;:40;;;;;;;;;;;;;;;36158:7;;36143:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36143:40:0;36135:49;;;;;;36200:169;;;-1:-1:-1;;;;;36200:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36387:4:0;;34106:2293;-1:-1:-1;;;;;;;;;;;;34106:2293:0:o;36576:635::-;36790:9;;36687:5;;;;;;36762:38;;36687:5;;-1:-1:-1;;;;;36790:9:0;36762:15;:38::i;:::-;36710:90;;-1:-1:-1;36710:90:0;-1:-1:-1;36811:17:0;36844:56;36898:1;36844:49;36891:1;36844:42;36871:14;36844:22;36710:90;;36844:12;:22::i;:::-;:26;;:42::i;:56::-;36925:9;;36811:89;;-1:-1:-1;;;;;;36915:19:0;;;36925:9;;36915:19;:64;;;;-1:-1:-1;36970:9:0;36938:28;:8;36951:14;36938:12;:28::i;:::-;:41;;36915:64;36911:131;;;37003:1;36996:8;;;;;;;36911:131;-1:-1:-1;;;;;37056:20:0;;;:65;;;;-1:-1:-1;37112:9:0;37080:28;:8;37093:14;37080:12;:28::i;:::-;:41;;37056:65;37052:133;;;37145:1;37138:8;;;;;;;37052:133;-1:-1:-1;37202:1:0;;36576:635;-1:-1:-1;;;;;36576:635:0:o;11977:179::-;12035:7;12067:5;;;12091:6;;;;12083:46;;;;;-1:-1:-1;;;12083:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12147:1;11977:179;-1:-1:-1;;;11977:179:0:o;12856:220::-;12914:7;12938:6;12934:20;;-1:-1:-1;12953:1:0;12946:8;;12934:20;12977:5;;;12981:1;12977;:5;:1;13001:5;;;;;:10;12993:56;;;;-1:-1:-1;;;12993:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13554:153;13612:7;13644:1;13640;:5;13632:44;;;;;-1:-1:-1;;;13632:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13698:1;13694;:5;;;;;;;13554:153;-1:-1:-1;;;13554:153:0:o;41624:242::-;41793:5;41824:22;;;;;41624:242::o;41053:444::-;41167:4;41188:7;41184:85;;;-1:-1:-1;;;;;;41219:12:0;;;;;;:5;:12;;;;;41212:19;41253:4;41246:11;;41184:85;-1:-1:-1;;;;;41284:15:0;;;;;;:8;:15;;;;;;;;41279:107;;41316:9;:21;;;;;;;;;;;;;-1:-1:-1;;;;;;41316:21:0;-1:-1:-1;;;;;41316:21:0;;;;;;;;-1:-1:-1;41352:15:0;;;:8;41316:21;41352:15;;;;:22;;-1:-1:-1;;41352:22:0;;;;;;41279:107;-1:-1:-1;;;;;41400:12:0;;;;;;:5;:12;;;;;;41396:72;;-1:-1:-1;;;;;41436:12:0;;;;;;:5;:12;;;;;:20;;;41396:72;-1:-1:-1;41485:4:0;41053:444;;;;;:::o;32334:1497::-;32495:4;32521:15;32530:5;32521:8;:15::i;:::-;32520:16;32512:53;;;;;-1:-1:-1;;;32512:53:0;;;;;;;;;;;;-1:-1:-1;;;32512:53:0;;;;;;;;;;;;;;;32584:19;32576:60;;;;;-1:-1:-1;;;32576:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32803:10;32815:21;32840:28;32855:12;32840:14;:28::i;:::-;32802:66;;;;32924:16;32943:19;:17;:19::i;:::-;32924:38;;32973:18;32994:43;33028:8;32994:29;33012:10;;32994:13;:17;;:29;;;;:::i;:43::-;32973:64;;33048:22;33073:40;33091:6;33099:13;33073:17;:40::i;:::-;33048:65;-1:-1:-1;33124:19:0;33159;:67;;33225:1;33159:67;;;33181:41;33216:5;33181:30;:10;33196:14;33181;:30::i;:41::-;33124:102;;33243:8;:28;;;;-1:-1:-1;33255:16:0;;;33243:28;33239:69;;;33288:8;;;33239:69;33366:7;;-1:-1:-1;;;;;33366:7:0;33351:28;33380:2;33384:27;:10;33399:11;33384:14;:27::i;:::-;33351:61;;;;;;;;;;;;;-1:-1:-1;;;;;33351:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33476:21:0;;:38;;33502:11;33476:25;:38::i;:::-;33452:21;:62;33554:32;33564:6;33572:13;33554:9;:32::i;:::-;33597:17;33608:5;33597:10;:17::i;:::-;33630:171;;;-1:-1:-1;;;;;33630:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33819:4:0;;32334:1497;-1:-1:-1;;;;;;;;;;32334:1497:0:o;12439:158::-;12497:7;12530:1;12525;:6;;12517:49;;;;;-1:-1:-1;;;12517:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12584:5:0;;;12439:158::o;14804:166::-;14890:7;14926:12;14918:6;;;;14910:29;;;;-1:-1:-1;;;14910:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14957:5:0;;;14804:166::o;40486:81::-;40541:11;;;;:4;:11;;;;;:18;;-1:-1:-1;;40541:18:0;40555:4;40541:18;;;40486:81::o;37671:221::-;37770:114;37810:7;37770:114;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37770:21:0;;;;;;:13;:21;;;;;;;:114;:25;:114::i;:::-;-1:-1:-1;;;;;37746:21:0;;;;;;;:13;:21;;;;;:138;;;;-1:-1:-1;37671:221:0:o;37371:138::-;-1:-1:-1;;;;;37467:21:0;;;;;;:13;:21;;;;;;:34;;37493:7;37467:25;:34::i

Swarm Source

ipfs://9b023bc416b6704d7f75748a14a1171246a4a20e05c96b0e3372ea216cdf6c7a
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.