ETH Price: $3,641.61 (+0.78%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Conversion In215602232025-01-05 18:59:2318 hrs ago1736103563IN
0x63BBC71C...18a35d392
0 ETH0.001064228.2
Conversion In215601612025-01-05 18:46:5918 hrs ago1736102819IN
0x63BBC71C...18a35d392
0 ETH0.001262988.6
Conversion In215574292025-01-05 9:37:5928 hrs ago1736069879IN
0x63BBC71C...18a35d392
0 ETH0.000814995.54905894
Conversion In215570182025-01-05 8:14:5929 hrs ago1736064899IN
0x63BBC71C...18a35d392
0 ETH0.000761465.1850362
Conversion Out215519182025-01-04 15:09:4746 hrs ago1736003387IN
0x63BBC71C...18a35d392
0 ETH0.0015219511.92274726
Conversion In215467352025-01-03 21:46:592 days ago1735940819IN
0x63BBC71C...18a35d392
0 ETH0.0015390111.85945177
Conversion In215466572025-01-03 21:31:232 days ago1735939883IN
0x63BBC71C...18a35d392
0 ETH0.0019190113.06921538
Conversion In215462982025-01-03 20:19:112 days ago1735935551IN
0x63BBC71C...18a35d392
0 ETH0.0023688916.1277913
Conversion Out215438752025-01-03 12:11:593 days ago1735906319IN
0x63BBC71C...18a35d392
0 ETH0.001175848.87757496
Conversion Out215437902025-01-03 11:54:593 days ago1735905299IN
0x63BBC71C...18a35d392
0 ETH0.001097438.59632085
Conversion Out215437252025-01-03 11:41:593 days ago1735904519IN
0x63BBC71C...18a35d392
0 ETH0.000820386.42616897
Conversion Out215423152025-01-03 6:58:353 days ago1735887515IN
0x63BBC71C...18a35d392
0 ETH0.000680525.33063993
Conversion Out215421032025-01-03 6:16:113 days ago1735884971IN
0x63BBC71C...18a35d392
0 ETH0.000709315.55618706
Conversion Out215413662025-01-03 3:48:113 days ago1735876091IN
0x63BBC71C...18a35d392
0 ETH0.000834426.29932692
Conversion In215395552025-01-02 21:44:233 days ago1735854263IN
0x63BBC71C...18a35d392
0 ETH0.001445559.84155784
Conversion In215365312025-01-02 11:37:354 days ago1735817855IN
0x63BBC71C...18a35d392
0 ETH0.0016188611.0223513
Conversion Out215362702025-01-02 10:45:114 days ago1735814711IN
0x63BBC71C...18a35d392
0 ETH0.0020909815.7854511
Conversion Out215333892025-01-02 1:06:234 days ago1735779983IN
0x63BBC71C...18a35d392
0 ETH0.0043377632.74700635
Conversion Out215255562024-12-31 22:52:355 days ago1735685555IN
0x63BBC71C...18a35d392
0 ETH0.000616154.65152352
Conversion In215246702024-12-31 19:54:595 days ago1735674899IN
0x63BBC71C...18a35d392
0 ETH0.000838925.71196631
Conversion In215244962024-12-31 19:19:475 days ago1735672787IN
0x63BBC71C...18a35d392
0 ETH0.000767925.9175685
Conversion Out215218952024-12-31 10:35:116 days ago1735641311IN
0x63BBC71C...18a35d392
0 ETH0.0019094814.41520759
Conversion In215166582024-12-30 17:02:596 days ago1735578179IN
0x63BBC71C...18a35d392
0 ETH0.001443289.82689845
Conversion In215161342024-12-30 15:17:356 days ago1735571855IN
0x63BBC71C...18a35d392
0 ETH0.0018760312.77334426
Conversion In215154642024-12-30 13:03:117 days ago1735563791IN
0x63BBC71C...18a35d392
0 ETH0.00082096.32580127
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenConversionManagerV2

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : TokenConversionManagerV2.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import "./Commission.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

// Errors
error ViolationOfTxAmountLimits();
error InvalidRequestOrSignature();
error UsedSignature();
error ConversionFailed();
error ConversionMintFailed();
error InvalidUpdateConfigurations();
error MintingMoreThanMaxSupply();

contract TokenConversionManagerV2 is Commission {
    address private _conversionAuthorizer; // Authorizer Address for the conversion

    /**
     * @dev Selector for the `mint(address,uint256)` function
     * calculated as bytes4(keccak256("mint(address,uint256)"))
     */
    bytes4 private constant MINT_SELECTOR = 0x40c10f19;
    
    /**
     * @dev Selector for the `burnFrom(address,uint256)` function
     * calculated as bytes4(keccak256("burnFrom(address,uint256)"))
     */
    bytes4 private constant BURN_SELECTOR = 0x79cc6790;

    //already used conversion signature from authorizer in order to prevent replay attack
    mapping (bytes32 => bool) private _usedSignatures; 

    // Conversion Configurations
    uint256 private _perTxnMinAmount;
    uint256 private _perTxnMaxAmount;
    uint256 private _maxSupply;

    // Events
    event NewAuthorizer(address conversionAuthorizer);
    event UpdateConfiguration(uint256 perTxnMinAmount, uint256 perTxnMaxAmount, uint256 maxSupply);

    event ConversionOut(address indexed tokenHolder, bytes32 conversionId, uint256 amount);
    event ConversionIn(address indexed tokenHolder, bytes32 conversionId, uint256 amount);


    // Modifiers
    modifier checkLimits(uint256 amount) {
        // Check for min, max per transaction limits
        if (amount < _perTxnMinAmount || amount > _perTxnMaxAmount)
            revert ViolationOfTxAmountLimits();
        _;
    }

    constructor(
        address token, 
        bool commissionIsEnabled,
        uint8 receiverCommissionProportion,
        uint8 bridgeOwnerCommissionProportion,
        uint256 fixedNativeTokenCommissionLimit,
        address payable commissionReceiver,
        address payable bridgeOwner
    ) 
        Commission(
            token,
            commissionIsEnabled,
            receiverCommissionProportion,
            bridgeOwnerCommissionProportion,
            fixedNativeTokenCommissionLimit,
            commissionReceiver,
            bridgeOwner
        )
    {   
        _conversionAuthorizer = _msgSender(); 
    }

    /**
    * @dev To update the authorizer who can authorize the conversions.
    * @param newAuthorizer - new contract authorizer address
    */
    function updateAuthorizer(address newAuthorizer) external notZeroAddress(newAuthorizer) onlyOwner {
        _conversionAuthorizer = newAuthorizer;

        emit NewAuthorizer(newAuthorizer);
    }

    /**
    * @dev To update the per transaction limits for the conversion and to provide max total supply 
    * @param perTxnMinAmount - min amount for conversion
    * @param perTxnMaxAmount - max amount for conversion
    * @param maxSupply - value of max supply for bridging token
    */
    function updateConfigurations(
        uint256 perTxnMinAmount, 
        uint256 perTxnMaxAmount, 
        uint256 maxSupply
    )
        external 
        onlyOwner 
    {
        // Check for the valid inputs
        if (perTxnMinAmount == 0 || perTxnMaxAmount <= perTxnMinAmount || maxSupply == 0) 
            revert InvalidUpdateConfigurations();

        // Update the configurations
        _perTxnMinAmount = perTxnMinAmount;
        _perTxnMaxAmount = perTxnMaxAmount;
        _maxSupply = maxSupply;

        emit UpdateConfiguration(perTxnMinAmount, perTxnMaxAmount, maxSupply);
    }


    /**
    * @dev To convert the tokens from Ethereum to non Ethereum network. 
    * The tokens which needs to be convereted will be burned on the host network.
    * The conversion authorizer needs to provide the signature to call this function.
    * @param amount - conversion amount
    * @param conversionId - hashed conversion id
    * @param v - split authorizer signature
    */
    function conversionOut(
        uint256 amount, 
        bytes32 conversionId, 
        uint8 v, 
        bytes32 r, 
        bytes32 s
    ) 
        external 
        payable
        checkLimits(amount) 
        nonReentrant 
    {
        bool success;
        // Check for non zero value for the amount is not needed as the Signature will not be generated for zero amount
        
        // Compose the message which was signed
        bytes32 message = prefixed(
            keccak256(
                abi.encodePacked(
                    "__conversionOut", 
                    amount,
                    _msgSender(),
                    conversionId, 
                    this
                )
            )
        );

        // Check that the signature is from the authorizer
        if (ecrecover(message, v, r, s) != _conversionAuthorizer)
            revert InvalidRequestOrSignature();

        // Check for replay attack (message signature can be used only once)
        if (_usedSignatures[message])
            revert UsedSignature();
        _usedSignatures[message] = true;
        
        if (commissionSettings.commissionIsEnabled) {
            if (commissionSettings.commissionType == CommissionType.FixedNativeTokens) {
                _checkPayedCommissionInNative();
                (success, ) = TOKEN.call(abi.encodeWithSelector(BURN_SELECTOR, _msgSender(), amount));
            } else {
                (success, ) = TOKEN.call(abi.encodeWithSelector(BURN_SELECTOR, _msgSender(), amount - _takeCommissionInTokenOutput(amount)));
            }
        } else {
            (success, ) = TOKEN.call(abi.encodeWithSelector(BURN_SELECTOR, _msgSender(), amount));
        }
                    
        // In case if the burn call fails
        if (!success)
            revert ConversionFailed();

        emit ConversionOut(_msgSender(), conversionId, amount);
    }

    /**
    * @dev To convert the tokens from non Ethereum to Ethereum network. 
    * The tokens which needs to be convereted will be minted on the host network.
    * The conversion authorizer needs to provide the signature to call this function.
    * @param to - distination conversion operation address for mint converted tokens
    * @param amount - conversion amount
    * @param conversionId - hashed conversion id
    * @param v - split authorizer signature
    */
    function conversionIn(
        address to, 
        uint256 amount, 
        bytes32 conversionId, 
        uint8 v, 
        bytes32 r, 
        bytes32 s
    ) 
        external
        payable
        checkLimits(amount) 
        nonReentrant 
        notZeroAddress(to)
    {
        bool success;

        // Check for non zero value for the amount is not needed as the Signature will not be generated for zero amount

        // Compose the message which was signed
        bytes32 message = prefixed(
            keccak256(
                abi.encodePacked(
                    "__conversionIn",
                    amount, 
                    _msgSender(), 
                    conversionId, 
                    this
                )
            )
        );

        // Check that the signature is from the authorizer
        if (ecrecover(message, v, r, s) != _conversionAuthorizer)
            revert InvalidRequestOrSignature();

        // Check for replay attack (message signature can be used only once)
        if (_usedSignatures[message])
            revert UsedSignature();
        _usedSignatures[message] = true;

        // Check for the supply
        if (IERC20(TOKEN).totalSupply() + amount > _maxSupply)
            revert MintingMoreThanMaxSupply();

        if (commissionSettings.commissionIsEnabled) {
            if (commissionSettings.commissionType == CommissionType.FixedNativeTokens) {
                _checkPayedCommissionInNative();

                (success, ) = TOKEN.call(abi.encodeWithSelector(MINT_SELECTOR, to, amount));
            } else {
                (success, ) = TOKEN.call(abi.encodeWithSelector(MINT_SELECTOR, address(this), amount));
                if (!success)
                    revert ConversionMintFailed();
                (success, ) = TOKEN.call(abi.encodeWithSelector(TRANSFER_SELECTOR, to, amount - _takeCommissionInTokenInput(amount)));
            }
        } else {
            (success, ) = TOKEN.call(abi.encodeWithSelector(MINT_SELECTOR, to, amount));
        }

        if (!success)
            revert ConversionFailed();

        emit ConversionIn(to, conversionId, amount);
    }

    /// Builds a prefixed hash to mimic the behavior of ethSign.
    function prefixed(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function getConversionAuthorizer() external view returns(address) {
        return _conversionAuthorizer;
    }

    function getConversionConfigurations() external view returns(uint256,uint256,uint256) {
        return(_perTxnMinAmount, _perTxnMaxAmount, _maxSupply);
    }

}

File 2 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 7 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

import "./Ownable.sol";

/**
 * @dev Contract module which provides 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} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

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

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

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

File 4 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

File 5 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

File 6 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 7 of 7 : Commission.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

// Errors
error CommissionTransferFailed();
error NativeClaimFailed();
error NotEnoughBalance();
error ZeroAddress();
error ViolationOfFixedNativeTokensLimit();
error UnauthorizedCommissionReceiver(address caller);
error PercentageLimitExceeded();
error InvalidProportionSum(uint8 proportion1, uint8 proportion2);
error TakeFixedNativeTokensCommissionFailed(uint256 sent, uint256 required);
error ZeroFixedNativeTokensCommissionLimit();
error EnablingZeroFixedNativeTokenCommission();
error EnablingZeroFixedTokenCommission();
error EnablingZeroTokenPercentageCommission();


/// @title Commission module for bridge contract
/// @author SingularityNET
abstract contract Commission is Ownable2Step, ReentrancyGuard {
    // Address of token contract for  
    address internal immutable TOKEN;

    uint256 private constant ONE_HUNDRED = 100;
    uint256 private immutable FIXED_NATIVE_TOKEN_COMMISSION_LIMIT;
    
    enum CommissionType {
        PercentageTokens, // commission in percentage tokens
        FixedTokens, // commission in fix value of tokens
        FixedNativeTokens // commission in native currency
    }

    CommissionSettings public commissionSettings;
    struct CommissionSettings {
        uint8 convertTokenPercentage; // percentage sum of commission in token
        uint8 receiverCommissionProportion; // proportion for commission receiver
        uint8 bridgeOwnerCommissionProportion; // proportion for bridge owner commission receiver
        uint16 pointOffsetShifter; // point offset variable
        bool commissionIsEnabled; // activate/deactivate commission
        uint256 fixedNativeTokensCommission; // fixed value of commission in native tokens
        uint256 fixedTokenCommission; // fixed value of commission in tokens
        CommissionType commissionType; // global type of commission
        address payable receiverCommission;
        address payable bridgeOwner; // can't be zero address
    } 
    
    /**
     * @dev Selector for the `transferFrom(address,address,uint256)` function
     * calculated as bytes4(keccak256("transferFrom(address,address,uint256)"))
     */
    bytes4 private constant TRANSFERFROM_SELECTOR = 0x23b872dd;

    /**
     * @dev Selector for the `transfer(address,uint256)` function
     * calculated as bytes4(keccak256("transfer(address,uint256)"))
     */
    bytes4 internal constant TRANSFER_SELECTOR = 0xa9059cbb;

    // Events
    event UpdateReceiver(address indexed previousReceiver, address indexed newReceiver);
    event UpdateCommissionType(
        bool indexed commissionIsEnabled,
        uint256 indexed commissionType,
        uint256 indexed timestamp     // matches `Update...Commission` events
    );
    event UpdateFixedNativeTokensCommission( 
        uint256 indexed timestamp,
        uint256 fixedNativeTokensCommission
    );
    event UpdateFixedTokensCommission( 
        uint256 indexed timestamp,
        uint256 fixedTokenCommission
    );
     event UpdatePercentageTokensCommission( 
        uint256 indexed timestamp,
        uint256 convertTokenPercentage,
        uint256 pointOffsetShifter
    );
    event UpdateCommissionProportions(
        uint8 receiverCommissionProportion, 
        uint8 bridgeOwnerCommissionProportion,
        uint256 updateTimestamp
    );
    event FixedNativeTokensCommissionClaim(uint256 indexed time);

    // Check that the caller is a recipient of the commission.
    modifier isCommissionReceiver(address caller) {
        if (
            _msgSender() != commissionSettings.receiverCommission &&
            _msgSender() != commissionSettings.bridgeOwner
        ) 
            revert UnauthorizedCommissionReceiver(_msgSender());
        _;
    }

    modifier checkProportion(uint8 proportionOne, uint8 proportionTwo) {
        if (proportionOne + proportionTwo != uint8(100)) 
            revert InvalidProportionSum(proportionOne, proportionTwo);
        _;
    }

    modifier notZeroAddress(address account) {
        if (account == address(0))
            revert ZeroAddress();
        _;
    }

    constructor(
        address token,
        bool commissionIsEnabled,
        uint8 receiverCommissionProportion,
        uint8 bridgeOwnerCommissionProportion,
        uint256 fixedNativeTokensCommissionLimit,
        address payable receiverCommission,
        address payable bridgeOwner
    ) 
        Ownable() 
        notZeroAddress(token) 
        notZeroAddress(bridgeOwner) 
    {

        TOKEN = token;

        if (fixedNativeTokensCommissionLimit == 0)
            revert ZeroFixedNativeTokensCommissionLimit();
        FIXED_NATIVE_TOKEN_COMMISSION_LIMIT = fixedNativeTokensCommissionLimit;
 
        uint256 timestamp = block.timestamp;
        if (commissionIsEnabled) {
            commissionSettings.commissionIsEnabled = true;
            emit UpdateCommissionType(true, 0, timestamp);
        }

        if (receiverCommission != address(0)) {
            commissionSettings.receiverCommission = payable(receiverCommission);
            emit UpdateReceiver(address(0), receiverCommission);
            
            updateCommissionProportions(receiverCommissionProportion, bridgeOwnerCommissionProportion);
        } else {
            updateCommissionProportions(0, 100);
        }

        commissionSettings.bridgeOwner = payable(bridgeOwner);
        emit UpdateReceiver(address(0), bridgeOwner);

        emit UpdateCommissionProportions(
            receiverCommissionProportion, 
            bridgeOwnerCommissionProportion, 
            timestamp
        );
    }

    /**
     * @notice Method to disable commission of any type
     */
    function disableCommission() external onlyOwner {
        commissionSettings.commissionIsEnabled = false;

        emit UpdateCommissionType(false, uint256(commissionSettings.commissionType), block.timestamp);
    }


    /**
     * @notice Method to enable commission, if it's not enabled and
     *  update amount of native tokens charged as a commission
     * @dev Enables the commission if it is currently disabled. Sets the commission type to fixed native tokens if it is not already. 
     * If `newFixedNativeTokensCommission` is non-zero, updates the commission amount. Emits corresponding events.
     * @param newFixedNativeTokensCommission The new amount of native tokens to be charged as commission.
     */
    function enableAndUpdateFixedNativeTokensCommission(
        uint256 newFixedNativeTokensCommission
    ) 
        external 
        onlyOwner 
    {
        uint256 timestamp = block.timestamp;

        if (!commissionSettings.commissionIsEnabled) {
            commissionSettings.commissionIsEnabled = true;
        }

        // enable type of fixed native token commission
        if ( commissionSettings.commissionType != CommissionType.FixedNativeTokens) {
            if (newFixedNativeTokensCommission == 0)
                revert EnablingZeroFixedNativeTokenCommission();
            commissionSettings.commissionType = CommissionType.FixedNativeTokens;
            emit UpdateCommissionType(true, 2, timestamp);
        }

        // update amount of fixed native token commission
        _checkFixedFixedNativeTokensLimit(newFixedNativeTokensCommission);
        commissionSettings.fixedNativeTokensCommission = newFixedNativeTokensCommission;
        emit UpdateFixedNativeTokensCommission(timestamp, newFixedNativeTokensCommission);
    }

    /**
     * @notice Method to enable commission, if it's not enabled and update the amount of fixed tokens charged as a commission.
     * @dev Enables the commission if it is currently disabled. Sets the commission type to fixed tokens if it is not already. 
     * If `newFixedTokenCommission` is non-zero, updates the commission amount. Emits corresponding events.
     * @param newFixedTokenCommission The new amount of fixed tokens to be charged as commission.
     */
    function enableAndUpdateFixedTokensCommission(uint256 newFixedTokenCommission) external onlyOwner {
        uint256 timestamp = block.timestamp;

        if (!commissionSettings.commissionIsEnabled) 
            commissionSettings.commissionIsEnabled = true;

        // enable type of fixed token commission
        if (commissionSettings.commissionType != CommissionType.FixedTokens) {
            if (newFixedTokenCommission == 0)
                revert EnablingZeroFixedTokenCommission();
            commissionSettings.commissionType = CommissionType.FixedTokens;
            emit UpdateCommissionType(true, 1, timestamp);
        }
            
        // update amount of fixed token commission
        commissionSettings.fixedTokenCommission = newFixedTokenCommission;
        emit UpdateFixedTokensCommission(timestamp, newFixedTokenCommission);
    }

    /**
     * @notice Method to enable commission, if it's not enabled and update the percentage of tokens charged as a commission.
     *  Updates together token percentage and point offset shifter
     * @dev Enables the commission if it is currently disabled. Sets the commission type to percentage tokens if it is not already. 
     * If `newConvertTokenPercentage` and `newPointOffsetShifter` are non-zero, updates the commission percentage and point offset. 
     * Emits corresponding events.
     * @param newConvertTokenPercentage The new percentage of tokens to be charged as commission.
     * @param newPointOffsetShifter The new point offset shifter for the token percentage commission.
     */
    function enableAndUpdatePercentageTokensCommission(
        uint8 newConvertTokenPercentage, 
        uint16 newPointOffsetShifter
    ) 
        external 
        onlyOwner 
    {
        uint256 timestamp = block.timestamp;

        if (!commissionSettings.commissionIsEnabled) 
            commissionSettings.commissionIsEnabled = true;

        // enable type of token commission in percentage
        if (commissionSettings.commissionType != CommissionType.PercentageTokens) {
            if (newConvertTokenPercentage == 0 || newPointOffsetShifter == 0)
                revert EnablingZeroTokenPercentageCommission();
            commissionSettings.commissionType = CommissionType.PercentageTokens;
            emit UpdateCommissionType(true, 0, timestamp);
        }

        // update amount of token commission in percentage
        _checkPercentageLimit(newConvertTokenPercentage, newPointOffsetShifter);
        commissionSettings.pointOffsetShifter = newPointOffsetShifter;
        commissionSettings.convertTokenPercentage = newConvertTokenPercentage;
        emit UpdatePercentageTokensCommission(
            timestamp, 
            newConvertTokenPercentage, 
            newPointOffsetShifter
        );
    }

    /**
     * @notice Method for changing bridge commission receiver address
     * @dev newReceiverCommission address can be zero address
     * @param newReceiverCommission - new bridge commission receiver address
     */
    function updateReceiverCommission(address newReceiverCommission) external onlyOwner { 
        if(newReceiverCommission == address(0))
            updateCommissionProportions(0, 100);
        emit UpdateReceiver(commissionSettings.receiverCommission, newReceiverCommission);

        commissionSettings.receiverCommission = payable(newReceiverCommission);
    }

    /**
     * @notice Method for changing bridge owner commission receiver address
     * @param newBridgeOwner - new bridge owner commission receiver address
     */
    function updateBridgeOwner(address newBridgeOwner) 
        external 
        onlyOwner  
        notZeroAddress(newBridgeOwner)
    {
        emit UpdateReceiver(commissionSettings.bridgeOwner, newBridgeOwner);

        commissionSettings.bridgeOwner = payable(newBridgeOwner);
    }

    /**
     * @notice Method for claiming collected native token commission
     * @dev This method can be called by one of the recipients, which will result in receiving
     * its share of the collected commission, as well as sending a share to the second recipient
     * according to the current shares in the contract
     */
    function claimFixedNativeTokensCommission()
        external
        nonReentrant
        isCommissionReceiver(_msgSender())
    {
        CommissionSettings memory cachedCommissionSettings = commissionSettings;
        uint256 contractBalance = address(this).balance;
        if (contractBalance == 0 )
            revert NotEnoughBalance();

        if (
            cachedCommissionSettings.receiverCommissionProportion != 0
        ) {
            (bool sendToReceiver, ) = 
                cachedCommissionSettings.receiverCommission
                    .call{ 
                        value: 
                            contractBalance * cachedCommissionSettings.receiverCommissionProportion 
                                / ONE_HUNDRED 
                    }("");
        
            if (!sendToReceiver) {
                revert NativeClaimFailed();
            }
        }

        (bool sendToOwner,) = 
            commissionSettings.bridgeOwner
                .call{
                    value: 
                        contractBalance * cachedCommissionSettings.bridgeOwnerCommissionProportion 
                            / ONE_HUNDRED
                }("");

        if (!sendToOwner) 
            revert NativeClaimFailed();
        
        emit FixedNativeTokensCommissionClaim(block.timestamp);
    }

    /**
     * @notice Method for get receivers addresses
     * @return Receivers addresses
     */
    function getCommissionReceiverAddresses() external view returns(address, address) {
        return (commissionSettings.receiverCommission, commissionSettings.bridgeOwner);
    }
    

    /**
     * @notice Method for get current commission configuration
     */
    function getCommissionSettings() external view returns (
        bool commissionIsEnabled,
        uint8 receiverCommissionProportion,
        uint8 bridgeOwnerCommissionProportion,
        uint8 convertTokenPercentage,
        uint16 offsetShifter,
        uint256 tokenTypeCommission,
        uint256 fixedTokenCommission,
        uint256 fixedNativeTokensCommission,
        address payable receiverCommission,
        address payable bridgeOwner,
        address token
    ) {
        return (
            commissionSettings.commissionIsEnabled,
            commissionSettings.receiverCommissionProportion,
            commissionSettings.bridgeOwnerCommissionProportion,
            commissionSettings.convertTokenPercentage,
            commissionSettings.pointOffsetShifter,
            uint256(commissionSettings.commissionType),
            commissionSettings.fixedTokenCommission,
            commissionSettings.fixedNativeTokensCommission,
            commissionSettings.receiverCommission,
            commissionSettings.bridgeOwner,
            TOKEN
        );
    }

    /**
     * @notice Method to update the commission proportions for the receiver and the bridge owner.
     * @dev Updates the receiver's commission proportion and the bridge owner's commission proportion 
     * if the new values are different from the current ones. Emits an event with the new proportions.
     * @param newReceiverCommissionProportion The new proportion of commission for the receiver.
     * @param newBridgeOwnerCommissionProportion The new proportion of commission for the bridge owner.
     */
    function updateCommissionProportions(
        uint8 newReceiverCommissionProportion,
        uint8 newBridgeOwnerCommissionProportion
    ) 
        public
        onlyOwner
        checkProportion(
            newReceiverCommissionProportion, 
            newBridgeOwnerCommissionProportion
        ) 
    {
        CommissionSettings memory cachedCommissionSettings = commissionSettings;
        // receiverCommissionProportion can be null
        if (cachedCommissionSettings.receiverCommissionProportion != newReceiverCommissionProportion)
            commissionSettings.receiverCommissionProportion = newReceiverCommissionProportion; 

        if (
            newBridgeOwnerCommissionProportion != 0 && 
            cachedCommissionSettings.bridgeOwnerCommissionProportion != newBridgeOwnerCommissionProportion
        )  
            commissionSettings.bridgeOwnerCommissionProportion = newBridgeOwnerCommissionProportion; 

        emit UpdateCommissionProportions(
            cachedCommissionSettings.receiverCommissionProportion, 
            cachedCommissionSettings.bridgeOwnerCommissionProportion,
            block.timestamp
        );
    }


    /**
     * @notice Method to check when charging a fee in native token
     */
    function _checkPayedCommissionInNative() internal {
        CommissionSettings memory cachedCommissionSettings = commissionSettings;

        if (msg.value != cachedCommissionSettings.fixedNativeTokensCommission) {
            revert TakeFixedNativeTokensCommissionFailed(
                msg.value,
                cachedCommissionSettings.fixedNativeTokensCommission
            );
        }
    }
    
    /**
     * @notice Method to take a commission in tokens in conversionOut
     * @param amount - amount of conversion
     * @return charged commission amount
     */
    function _takeCommissionInTokenOutput(uint256 amount) internal returns (uint256) {
        CommissionSettings memory cachedCommissionSettings = commissionSettings;

        (uint256 commissionAmountBridgeOwner, uint256 commissionSum) =
            _calculateCommissionInToken(amount);

        if (cachedCommissionSettings.receiverCommissionProportion != 0 && commissionSum != commissionAmountBridgeOwner) {
            (bool transferToReceiver, ) = TOKEN.call(
                abi.encodeWithSelector(
                    TRANSFERFROM_SELECTOR,
                    _msgSender(),
                    cachedCommissionSettings.receiverCommission,
                    commissionSum - commissionAmountBridgeOwner
                )
            );
            
            if (!transferToReceiver) 
                revert CommissionTransferFailed();
        }
        (bool transferToBridgeOwner, ) = TOKEN.call(
            abi.encodeWithSelector(
                TRANSFERFROM_SELECTOR,
                _msgSender(),
                cachedCommissionSettings.bridgeOwner,
                commissionAmountBridgeOwner
            )
        );

        if(!transferToBridgeOwner) 
            revert CommissionTransferFailed();

        return commissionSum;
    }

    /**
     * @notice Method to take a commission in tokens in conversionIn
     * @param amount - amount of conversion
     * @return charged commission amount
     */
    function _takeCommissionInTokenInput(uint256 amount) internal returns (uint256) {
        CommissionSettings memory cachedCommissionSettings = commissionSettings;

        (uint256 commissionAmountBridgeOwner, uint256 commissionSum) =
            _calculateCommissionInToken(amount);

        if (cachedCommissionSettings.receiverCommissionProportion != 0 && commissionSum != commissionAmountBridgeOwner) {
            (bool transferToReceiver, ) = TOKEN.call(
                abi.encodeWithSelector(
                    TRANSFER_SELECTOR,
                    cachedCommissionSettings.receiverCommission,
                    commissionSum - commissionAmountBridgeOwner
                )
            );
            
            if (!transferToReceiver) 
                revert CommissionTransferFailed();
        }

        (bool transferToBridgeOwner, ) = TOKEN.call(
            abi.encodeWithSelector(
                TRANSFER_SELECTOR,
                cachedCommissionSettings.bridgeOwner,
                commissionAmountBridgeOwner
            )
        );

        if (!transferToBridgeOwner) 
            revert CommissionTransferFailed();

        return commissionSum;
    }

    /**
     * @notice Method for calculating a charging commission in tokens
     * @param amount - amount of conversion
     * @return commission amount for bridge owner and the whole sum of commission
     */
    function _calculateCommissionInToken(uint256 amount) internal view returns (uint256, uint256) {
        CommissionSettings memory cachedCommissionSettings = commissionSettings;

        if (cachedCommissionSettings.commissionType == CommissionType.PercentageTokens) {
            uint256 commissionSum = amount* uint256(cachedCommissionSettings.convertTokenPercentage) / cachedCommissionSettings.pointOffsetShifter;
            return (
                _calculateCommissionBridgeOwnerProportion(commissionSum), 
                commissionSum
            );
        }
        return (
            _calculateCommissionBridgeOwnerProportion(
                cachedCommissionSettings.fixedTokenCommission
            ), 
            cachedCommissionSettings.fixedTokenCommission
        );
    }

    /**
     * @notice Method for calculating a bridge owner proportion of the whole sum of commission
     * @param amount - amount of conversion
     * @return bridge owner proportion of commission
     */
    function _calculateCommissionBridgeOwnerProportion(uint256 amount) private view returns(uint256) {
        return (amount * uint256(commissionSettings.bridgeOwnerCommissionProportion) / ONE_HUNDRED);
    }

    /**
     * @notice Method to disable commission
     * @param fixedNativeTokensCommission - value native tokens commission value for check
     */
    function _checkFixedFixedNativeTokensLimit(uint256 fixedNativeTokensCommission) private view {
        if (fixedNativeTokensCommission > FIXED_NATIVE_TOKEN_COMMISSION_LIMIT)
            revert ViolationOfFixedNativeTokensLimit();
    }

    /**
     * @notice Method to check customization of percenatage parameters
     * @param convertTokenPercentage - new convert token percentage
     * @param pointOffsetShifter - new offset point shifter
     */
    // convertTokenPercentage <= pointOffsetShifter in order to represent 
    // floating point fees with one decimal place
    function _checkPercentageLimit(uint8 convertTokenPercentage, uint16 pointOffsetShifter) private pure {
        if (convertTokenPercentage > pointOffsetShifter) 
            revert PercentageLimitExceeded();
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"commissionIsEnabled","type":"bool"},{"internalType":"uint8","name":"receiverCommissionProportion","type":"uint8"},{"internalType":"uint8","name":"bridgeOwnerCommissionProportion","type":"uint8"},{"internalType":"uint256","name":"fixedNativeTokenCommissionLimit","type":"uint256"},{"internalType":"address payable","name":"commissionReceiver","type":"address"},{"internalType":"address payable","name":"bridgeOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CommissionTransferFailed","type":"error"},{"inputs":[],"name":"ConversionFailed","type":"error"},{"inputs":[],"name":"ConversionMintFailed","type":"error"},{"inputs":[],"name":"EnablingZeroFixedNativeTokenCommission","type":"error"},{"inputs":[],"name":"EnablingZeroFixedTokenCommission","type":"error"},{"inputs":[],"name":"EnablingZeroTokenPercentageCommission","type":"error"},{"inputs":[{"internalType":"uint8","name":"proportion1","type":"uint8"},{"internalType":"uint8","name":"proportion2","type":"uint8"}],"name":"InvalidProportionSum","type":"error"},{"inputs":[],"name":"InvalidRequestOrSignature","type":"error"},{"inputs":[],"name":"InvalidUpdateConfigurations","type":"error"},{"inputs":[],"name":"MintingMoreThanMaxSupply","type":"error"},{"inputs":[],"name":"NativeClaimFailed","type":"error"},{"inputs":[],"name":"NotEnoughBalance","type":"error"},{"inputs":[],"name":"PercentageLimitExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"sent","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"TakeFixedNativeTokensCommissionFailed","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"UnauthorizedCommissionReceiver","type":"error"},{"inputs":[],"name":"UsedSignature","type":"error"},{"inputs":[],"name":"ViolationOfFixedNativeTokensLimit","type":"error"},{"inputs":[],"name":"ViolationOfTxAmountLimits","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroFixedNativeTokensCommissionLimit","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"},{"indexed":false,"internalType":"bytes32","name":"conversionId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ConversionIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"},{"indexed":false,"internalType":"bytes32","name":"conversionId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ConversionOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"FixedNativeTokensCommissionClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"conversionAuthorizer","type":"address"}],"name":"NewAuthorizer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":"uint8","name":"receiverCommissionProportion","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"bridgeOwnerCommissionProportion","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"updateTimestamp","type":"uint256"}],"name":"UpdateCommissionProportions","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"commissionIsEnabled","type":"bool"},{"indexed":true,"internalType":"uint256","name":"commissionType","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateCommissionType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"perTxnMinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"perTxnMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"UpdateConfiguration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fixedNativeTokensCommission","type":"uint256"}],"name":"UpdateFixedNativeTokensCommission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fixedTokenCommission","type":"uint256"}],"name":"UpdateFixedTokensCommission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"convertTokenPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pointOffsetShifter","type":"uint256"}],"name":"UpdatePercentageTokensCommission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousReceiver","type":"address"},{"indexed":true,"internalType":"address","name":"newReceiver","type":"address"}],"name":"UpdateReceiver","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFixedNativeTokensCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commissionSettings","outputs":[{"internalType":"uint8","name":"convertTokenPercentage","type":"uint8"},{"internalType":"uint8","name":"receiverCommissionProportion","type":"uint8"},{"internalType":"uint8","name":"bridgeOwnerCommissionProportion","type":"uint8"},{"internalType":"uint16","name":"pointOffsetShifter","type":"uint16"},{"internalType":"bool","name":"commissionIsEnabled","type":"bool"},{"internalType":"uint256","name":"fixedNativeTokensCommission","type":"uint256"},{"internalType":"uint256","name":"fixedTokenCommission","type":"uint256"},{"internalType":"enum Commission.CommissionType","name":"commissionType","type":"uint8"},{"internalType":"address payable","name":"receiverCommission","type":"address"},{"internalType":"address payable","name":"bridgeOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"conversionId","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"conversionIn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"conversionId","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"conversionOut","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"disableCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFixedNativeTokensCommission","type":"uint256"}],"name":"enableAndUpdateFixedNativeTokensCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFixedTokenCommission","type":"uint256"}],"name":"enableAndUpdateFixedTokensCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newConvertTokenPercentage","type":"uint8"},{"internalType":"uint16","name":"newPointOffsetShifter","type":"uint16"}],"name":"enableAndUpdatePercentageTokensCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommissionReceiverAddresses","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCommissionSettings","outputs":[{"internalType":"bool","name":"commissionIsEnabled","type":"bool"},{"internalType":"uint8","name":"receiverCommissionProportion","type":"uint8"},{"internalType":"uint8","name":"bridgeOwnerCommissionProportion","type":"uint8"},{"internalType":"uint8","name":"convertTokenPercentage","type":"uint8"},{"internalType":"uint16","name":"offsetShifter","type":"uint16"},{"internalType":"uint256","name":"tokenTypeCommission","type":"uint256"},{"internalType":"uint256","name":"fixedTokenCommission","type":"uint256"},{"internalType":"uint256","name":"fixedNativeTokensCommission","type":"uint256"},{"internalType":"address payable","name":"receiverCommission","type":"address"},{"internalType":"address payable","name":"bridgeOwner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConversionAuthorizer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConversionConfigurations","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAuthorizer","type":"address"}],"name":"updateAuthorizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBridgeOwner","type":"address"}],"name":"updateBridgeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newReceiverCommissionProportion","type":"uint8"},{"internalType":"uint8","name":"newBridgeOwnerCommissionProportion","type":"uint8"}],"name":"updateCommissionProportions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"perTxnMinAmount","type":"uint256"},{"internalType":"uint256","name":"perTxnMaxAmount","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"updateConfigurations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newReceiverCommission","type":"address"}],"name":"updateReceiverCommission","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b506040516200541638038062005416833981810160405281019062000037919062000a47565b868686868686866200005e620000526200044e60201b60201c565b6200045660201b60201c565b600160028190555086600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000136576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8873ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060008503620001a5576040517ffcab2c8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460a08181525050600042905088156200020b576001600360000160056101000a81548160ff021916908315150217905550806000600115157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a45b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614620002f657846003800160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f62904549814f5511a5d36a62611a6e2fe1d2c29b6de74de25d95395e0a7d009b60405160405180910390a3620002f088886200048f60201b60201c565b6200030b565b6200030a600060646200048f60201b60201c565b5b83600360040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f62904549814f5511a5d36a62611a6e2fe1d2c29b6de74de25d95395e0a7d009b60405160405180910390a37f8849d9036ec7068880bd56182e37500d89a0664b4800e4b44fba2e01a6940501888883604051620003df9392919062000b1c565b60405180910390a150505050505050505050620004016200044e60201b60201c565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ca3565b600033905090565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556200048c816200076460201b60201c565b50565b6200049f6200082860201b60201c565b8181606460ff168183620004b4919062000b88565b60ff1614620004fe5781816040517f8efe3fd5000000000000000000000000000000000000000000000000000000008152600401620004f592919062000bc4565b60405180910390fd5b60006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff166002811115620005dc57620005db62000bf1565b5b6002811115620005f157620005f062000bf1565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508460ff16816020015160ff1614620006d45784600360000160016101000a81548160ff021916908360ff1602179055505b60008460ff1614158015620006f357508360ff16816040015160ff1614155b15620007185783600360000160026101000a81548160ff021916908360ff1602179055505b7f8849d9036ec7068880bd56182e37500d89a0664b4800e4b44fba2e01a69405018160200151826040015142604051620007559392919062000b1c565b60405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620008386200044e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200085e620008b960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620008b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008ae9062000c81565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200091482620008e7565b9050919050565b620009268162000907565b81146200093257600080fd5b50565b60008151905062000946816200091b565b92915050565b60008115159050919050565b62000963816200094c565b81146200096f57600080fd5b50565b600081519050620009838162000958565b92915050565b600060ff82169050919050565b620009a18162000989565b8114620009ad57600080fd5b50565b600081519050620009c18162000996565b92915050565b6000819050919050565b620009dc81620009c7565b8114620009e857600080fd5b50565b600081519050620009fc81620009d1565b92915050565b600062000a0f82620008e7565b9050919050565b62000a218162000a02565b811462000a2d57600080fd5b50565b60008151905062000a418162000a16565b92915050565b600080600080600080600060e0888a03121562000a695762000a68620008e2565b5b600062000a798a828b0162000935565b975050602062000a8c8a828b0162000972565b965050604062000a9f8a828b01620009b0565b955050606062000ab28a828b01620009b0565b945050608062000ac58a828b01620009eb565b93505060a062000ad88a828b0162000a30565b92505060c062000aeb8a828b0162000a30565b91505092959891949750929550565b62000b058162000989565b82525050565b62000b1681620009c7565b82525050565b600060608201905062000b33600083018662000afa565b62000b42602083018562000afa565b62000b51604083018462000b0b565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b958262000989565b915062000ba28362000989565b9250828201905060ff81111562000bbe5762000bbd62000b59565b5b92915050565b600060408201905062000bdb600083018562000afa565b62000bea602083018462000afa565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c6960208362000c20565b915062000c768262000c31565b602082019050919050565b6000602082019050818103600083015262000c9c8162000c5a565b9050919050565b60805160a0516146f962000d1d600039600061343d015260008181610d920152818161102c01528181611159015281816112620152818161139d015281816114ba01528181612021015281816121310152818161225501528181612cfd01528181612e4a0152818161319401526132ea01526146f96000f3fe6080604052600436106101355760003560e01c80639548f477116100ab578063b2d1bb521161006f578063b2d1bb5214610384578063c72304ac146103ad578063e0a66578146103d8578063e30c397814610401578063f2fde38b1461042c578063feea15291461045557610135565b80639548f477146102d35780639b58bfed146102fc5780639cb71686146103255780639f23c9e214610351578063b26e099f1461036d57610135565b80636a02fcc4116100fd5780636a02fcc41461020c578063715018a61461022857806379ba50971461023f5780637c522d28146102565780638da5cb5b1461027f57806394aca02a146102aa57610135565b80632b100f5c1461013a5780632b84301f14610151578063529c09701461017a5780635531e774146101a357806358a93688146101d7575b600080fd5b34801561014657600080fd5b5061014f610482565b005b34801561015d57600080fd5b5061017860048036038101906101739190613838565b610970565b005b34801561018657600080fd5b506101a1600480360381019061019c91906138ae565b610b25565b005b3480156101af57600080fd5b506101b8610bd3565b6040516101ce9a99989796959493929190613a01565b60405180910390f35b3480156101e357600080fd5b506101ec610ca4565b6040516102039b9a99989796959493929190613abe565b60405180910390f35b61022660048036038101906102219190613bcb565b610dd4565b005b34801561023457600080fd5b5061023d611658565b005b34801561024b57600080fd5b5061025461166c565b005b34801561026257600080fd5b5061027d60048036038101906102789190613c58565b6116f9565b005b34801561028b57600080fd5b5061029461182f565b6040516102a19190613c85565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc9190613c58565b611858565b005b3480156102df57600080fd5b506102fa60048036038101906102f59190613ca0565b611965565b005b34801561030857600080fd5b50610323600480360381019061031e9190613ccd565b611ac5565b005b34801561033157600080fd5b5061033a611d82565b604051610348929190613d0d565b60405180910390f35b61036b60048036038101906103669190613d36565b611dd8565b005b34801561037957600080fd5b506103826123ff565b005b34801561039057600080fd5b506103ab60048036038101906103a69190613ca0565b61247c565b005b3480156103b957600080fd5b506103c26125e5565b6040516103cf9190613c85565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613c58565b61260f565b005b34801561040d57600080fd5b506104166126fa565b6040516104239190613c85565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613c58565b612724565b005b34801561046157600080fd5b5061046a6127d1565b60405161047993929190613db1565b60405180910390f35b61048a6127ea565b610492612837565b6003800160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166104d5612837565b73ffffffffffffffffffffffffffffffffffffffff16141580156105515750600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610538612837565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561059a5761055e612837565b6040517f0f287a3f0000000000000000000000000000000000000000000000000000000081526004016105919190613c85565b60405180910390fd5b60006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16600281111561067557610674613949565b5b600281111561068757610686613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050600047905060008103610778576040517fad3a8b9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826020015160ff161461084f57600082610100015173ffffffffffffffffffffffffffffffffffffffff166064846020015160ff16846107ba9190613e17565b6107c49190613e88565b6040516107d090613eea565b60006040518083038185875af1925050503d806000811461080d576040519150601f19603f3d011682016040523d82523d6000602084013e610812565b606091505b505090508061084d576040517f244ec49600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6000600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166064846040015160ff16846108a29190613e17565b6108ac9190613e88565b6040516108b890613eea565b60006040518083038185875af1925050503d80600081146108f5576040519150601f19603f3d011682016040523d82523d6000602084013e6108fa565b606091505b5050905080610935576040517f244ec49600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b427f5e4ae8571f79274a16bfb15067cbf26ceca499fd2d7aa8b710e08e697d46518060405160405180910390a25050505061096e61283f565b565b610978612849565b6000429050600360000160059054906101000a900460ff166109b3576001600360000160056101000a81548160ff0219169083151502179055505b600060028111156109c7576109c6613949565b5b6003800160009054906101000a900460ff1660028111156109eb576109ea613949565b5b14610a9e5760008360ff161480610a06575060008261ffff16145b15610a3d576040517f8f12086700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003800160006101000a81548160ff02191690836002811115610a6557610a64613949565b5b0217905550806000600115157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a45b610aa883836128c7565b81600360000160036101000a81548161ffff021916908361ffff16021790555082600360000160006101000a81548160ff021916908360ff160217905550807f422dd4708a15598e4d5684fba6e31da6e941a6751d420a03ed97e323d4c7cfe78484604051610b18929190613f6b565b60405180910390a2505050565b610b2d612849565b6000831480610b3c5750828211155b80610b475750600081145b15610b7e576040517f0eca686c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600a8190555081600b8190555080600c819055507fb2efb0aa6e279553a1e5567ebb495d322192aa43c5fc3073cba4601d52009ab4838383604051610bc693929190613db1565b60405180910390a1505050565b60038060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900461ffff16908060000160059054906101000a900460ff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508a565b6000806000806000806000806000806000600360000160059054906101000a900460ff16600360000160019054906101000a900460ff16600360000160029054906101000a900460ff16600360000160009054906101000a900460ff16600360000160039054906101000a900461ffff166003800160009054906101000a900460ff166002811115610d3957610d38613949565b5b6003600201546003600101546003800160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000009a509a509a509a509a509a509a509a509a509a509a50909192939495969798999a565b84600a54811080610de65750600b5481115b15610e1d576040517f17dfb4ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e256127ea565b86600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e8c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ecb89610e9b612837565b8a30604051602001610eb094939291906140d2565b6040516020818303038152906040528051906020012061290c565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018289898960405160008152602001604052604051610f29949392919061413a565b6020604051602081039080840390855afa158015610f4b573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614610fa2576040517fa7a059bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600082815260200190815260200160002060009054906101000a900460ff1615610ffa576040517fcce9a82400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016009600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600c54897f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190614194565b6110c391906141c1565b11156110fb576040517f28b53d4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360000160059054906101000a900460ff16156114b85760028081111561112657611125613949565b5b6003800160009054906101000a900460ff16600281111561114a57611149613949565b5b036112605761115761293c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1960e01b8b8b6040516024016111a99291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112139190614284565b6000604051808303816000865af19150503d8060008114611250576040519150601f19603f3d011682016040523d82523d6000602084013e611255565b606091505b5050809250506114b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1960e01b308b6040516024016112b29291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161131c9190614284565b6000604051808303816000865af19150503d8060008114611359576040519150601f19603f3d011682016040523d82523d6000602084013e61135e565b606091505b5050809250508161139b576040517fcb57cf5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8b6113e48c612b2c565b8c6113ef919061429b565b6040516024016114009291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161146a9190614284565b6000604051808303816000865af19150503d80600081146114a7576040519150601f19603f3d011682016040523d82523d6000602084013e6114ac565b606091505b5050809250505b6115bd565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1960e01b8b8b60405160240161150a9291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516115749190614284565b6000604051808303816000865af19150503d80600081146115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b5050809250505b816115f4576040517f384ec20400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8973ffffffffffffffffffffffffffffffffffffffff167f62a9b3e6446ab559d6b82c4f02cc923cd3b4e47444ef86446dab81a4d781c5af898b60405161163c9291906142cf565b60405180910390a250505061164f61283f565b50505050505050565b611660612849565b61166a6000612f92565b565b6000611676612837565b90508073ffffffffffffffffffffffffffffffffffffffff166116976126fa565b73ffffffffffffffffffffffffffffffffffffffff16146116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e49061437b565b60405180910390fd5b6116f681612f92565b50565b611701612849565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611768576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f62904549814f5511a5d36a62611a6e2fe1d2c29b6de74de25d95395e0a7d009b60405160405180910390a381600360040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611860612849565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118a1576118a060006064611ac5565b5b8073ffffffffffffffffffffffffffffffffffffffff166003800160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f62904549814f5511a5d36a62611a6e2fe1d2c29b6de74de25d95395e0a7d009b60405160405180910390a3806003800160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61196d612849565b6000429050600360000160059054906101000a900460ff166119a8576001600360000160056101000a81548160ff0219169083151502179055505b600160028111156119bc576119bb613949565b5b6003800160009054906101000a900460ff1660028111156119e0576119df613949565b5b14611a7f5760008203611a1f576040517fcdd848be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003800160006101000a81548160ff02191690836002811115611a4757611a46613949565b5b02179055508060018015157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a45b81600360020181905550807f81f61b66aa862aaadf659b5ba822fcd562282026c64807a61769a8187d332a8a83604051611ab9919061439b565b60405180910390a25050565b611acd612849565b8181606460ff168183611ae091906143b6565b60ff1614611b275781816040517f8efe3fd5000000000000000000000000000000000000000000000000000000008152600401611b1e9291906143eb565b60405180910390fd5b60006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff166002811115611c0257611c01613949565b5b6002811115611c1457611c13613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508460ff16816020015160ff1614611cf65784600360000160016101000a81548160ff021916908360ff1602179055505b60008460ff1614158015611d1457508360ff16816040015160ff1614155b15611d385783600360000160026101000a81548160ff021916908360ff1602179055505b7f8849d9036ec7068880bd56182e37500d89a0664b4800e4b44fba2e01a69405018160200151826040015142604051611d7393929190614414565b60405180910390a15050505050565b6000806003800160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b84600a54811080611dea5750600b5481115b15611e21576040517f17dfb4ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e296127ea565b600080611e6888611e38612837565b8930604051602001611e4d9493929190614497565b6040516020818303038152906040528051906020012061290c565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018288888860405160008152602001604052604051611ec6949392919061413a565b6020604051602081039080840390855afa158015611ee8573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517fa7a059bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600082815260200190815260200160002060009054906101000a900460ff1615611f97576040517fcce9a82400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016009600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600360000160059054906101000a900460ff161561225357600280811115611fee57611fed613949565b5b6003800160009054906101000a900460ff16600281111561201257612011613949565b5b0361212f5761201f61293c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379cc679060e01b612066612837565b8a6040516024016120789291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516120e29190614284565b6000604051808303816000865af19150503d806000811461211f576040519150601f19603f3d011682016040523d82523d6000602084013e612124565b606091505b50508092505061224e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379cc679060e01b612176612837565b61217f8b612fc3565b8b61218a919061429b565b60405160240161219b9291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516122059190614284565b6000604051808303816000865af19150503d8060008114612242576040519150601f19603f3d011682016040523d82523d6000602084013e612247565b606091505b5050809250505b61235f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379cc679060e01b61229a612837565b8a6040516024016122ac9291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123169190614284565b6000604051808303816000865af19150503d8060008114612353576040519150601f19603f3d011682016040523d82523d6000602084013e612358565b606091505b5050809250505b81612396576040517f384ec20400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61239e612837565b73ffffffffffffffffffffffffffffffffffffffff167fb999b06746a947f1958636b9b9377ae814fe578413dfffd4d3a7a96196fe02fc888a6040516123e59291906142cf565b60405180910390a250506123f761283f565b505050505050565b612407612849565b6000600360000160056101000a81548160ff021916908315150217905550426003800160009054906101000a900460ff16600281111561244a57612449613949565b5b600015157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a4565b612484612849565b6000429050600360000160059054906101000a900460ff166124bf576001600360000160056101000a81548160ff0219169083151502179055505b6002808111156124d2576124d1613949565b5b6003800160009054906101000a900460ff1660028111156124f6576124f5613949565b5b146125965760008203612535576040517f4d05b1ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003800160006101000a81548160ff0219169083600281111561255d5761255c613949565b5b0217905550806002600115157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a45b61259f8261343b565b81600360010181905550807fb5277ec6eaac4c7f711dcdecd6b7951d4cff3badcfb82ca3a735e6bafedd82bc836040516125d9919061439b565b60405180910390a25050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612676576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61267e612849565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f08f53e6a9fbc3949bc0b9266bbe1927f0b282a34d92876ccbe188c24d17c6cbb826040516126ee9190613c85565b60405180910390a15050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61272c612849565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1661278c61182f565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000806000600a54600b54600c54925092509250909192565b600280540361282e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128259061453c565b60405180910390fd5b60028081905550565b600033905090565b6001600281905550565b612851612837565b73ffffffffffffffffffffffffffffffffffffffff1661286f61182f565b73ffffffffffffffffffffffffffffffffffffffff16146128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc906145a8565b60405180910390fd5b565b8061ffff168260ff161115612908576040517feaf5947400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60008160405160200161291f9190614614565b604051602081830303815290604052805190602001209050919050565b60006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff166002811115612a1757612a16613949565b5b6002811115612a2957612a28613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508060a001513414612b2957348160a001516040517fd326bf05000000000000000000000000000000000000000000000000000000008152600401612b2092919061463a565b60405180910390fd5b50565b6000806003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff166002811115612c0857612c07613949565b5b6002811115612c1a57612c19613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050600080612cd885613498565b915091506000836020015160ff1614158015612cf45750818114155b15612e465760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8561010001518585612d4c919061429b565b604051602401612d5d929190614663565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612dc79190614284565b6000604051808303816000865af19150503d8060008114612e04576040519150601f19603f3d011682016040523d82523d6000602084013e612e09565b606091505b5050905080612e44576040517fd291274f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85610120015185604051602401612e9f929190614663565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612f099190614284565b6000604051808303816000865af19150503d8060008114612f46576040519150601f19603f3d011682016040523d82523d6000602084013e612f4b565b606091505b5050905080612f86576040517fd291274f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81945050505050919050565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055612fc0816136c6565b50565b6000806003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16600281111561309f5761309e613949565b5b60028111156130b1576130b0613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905060008061316f85613498565b915091506000836020015160ff161415801561318b5750818114155b156132e65760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b6131d9612837565b86610100015186866131eb919061429b565b6040516024016131fd9392919061468c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516132679190614284565b6000604051808303816000865af19150503d80600081146132a4576040519150601f19603f3d011682016040523d82523d6000602084013e6132a9565b606091505b50509050806132e4576040517fd291274f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b61332f612837565b866101200151866040516024016133489392919061468c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516133b29190614284565b6000604051808303816000865af19150503d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b505090508061342f576040517fd291274f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81945050505050919050565b7f0000000000000000000000000000000000000000000000000000000000000000811115613495576040517f4ea10e1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60008060006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16600281111561357657613575613949565b5b600281111561358857613587613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090506000600281111561364e5761364d613949565b5b8160e00151600281111561366557613664613949565b5b036136a9576000816060015161ffff16826000015160ff16866136889190613e17565b6136929190613e88565b905061369d8161378a565b819350935050506136c1565b6136b68160c0015161378a565b8160c0015192509250505b915091565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064600360000160029054906101000a900460ff1660ff16836137af9190613e17565b6137b99190613e88565b9050919050565b600080fd5b600060ff82169050919050565b6137db816137c5565b81146137e657600080fd5b50565b6000813590506137f8816137d2565b92915050565b600061ffff82169050919050565b613815816137fe565b811461382057600080fd5b50565b6000813590506138328161380c565b92915050565b6000806040838503121561384f5761384e6137c0565b5b600061385d858286016137e9565b925050602061386e85828601613823565b9150509250929050565b6000819050919050565b61388b81613878565b811461389657600080fd5b50565b6000813590506138a881613882565b92915050565b6000806000606084860312156138c7576138c66137c0565b5b60006138d586828701613899565b93505060206138e686828701613899565b92505060406138f786828701613899565b9150509250925092565b61390a816137c5565b82525050565b613919816137fe565b82525050565b60008115159050919050565b6139348161391f565b82525050565b61394381613878565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061398957613988613949565b5b50565b600081905061399a82613978565b919050565b60006139aa8261398c565b9050919050565b6139ba8161399f565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139eb826139c0565b9050919050565b6139fb816139e0565b82525050565b600061014082019050613a17600083018d613901565b613a24602083018c613901565b613a31604083018b613901565b613a3e606083018a613910565b613a4b608083018961392b565b613a5860a083018861393a565b613a6560c083018761393a565b613a7260e08301866139b1565b613a806101008301856139f2565b613a8e6101208301846139f2565b9b9a5050505050505050505050565b6000613aa8826139c0565b9050919050565b613ab881613a9d565b82525050565b600061016082019050613ad4600083018e61392b565b613ae1602083018d613901565b613aee604083018c613901565b613afb606083018b613901565b613b08608083018a613910565b613b1560a083018961393a565b613b2260c083018861393a565b613b2f60e083018761393a565b613b3d6101008301866139f2565b613b4b6101208301856139f2565b613b59610140830184613aaf565b9c9b505050505050505050505050565b613b7281613a9d565b8114613b7d57600080fd5b50565b600081359050613b8f81613b69565b92915050565b6000819050919050565b613ba881613b95565b8114613bb357600080fd5b50565b600081359050613bc581613b9f565b92915050565b60008060008060008060c08789031215613be857613be76137c0565b5b6000613bf689828a01613b80565b9650506020613c0789828a01613899565b9550506040613c1889828a01613bb6565b9450506060613c2989828a016137e9565b9350506080613c3a89828a01613bb6565b92505060a0613c4b89828a01613bb6565b9150509295509295509295565b600060208284031215613c6e57613c6d6137c0565b5b6000613c7c84828501613b80565b91505092915050565b6000602082019050613c9a6000830184613aaf565b92915050565b600060208284031215613cb657613cb56137c0565b5b6000613cc484828501613899565b91505092915050565b60008060408385031215613ce457613ce36137c0565b5b6000613cf2858286016137e9565b9250506020613d03858286016137e9565b9150509250929050565b6000604082019050613d226000830185613aaf565b613d2f6020830184613aaf565b9392505050565b600080600080600060a08688031215613d5257613d516137c0565b5b6000613d6088828901613899565b9550506020613d7188828901613bb6565b9450506040613d82888289016137e9565b9350506060613d9388828901613bb6565b9250506080613da488828901613bb6565b9150509295509295909350565b6000606082019050613dc6600083018661393a565b613dd3602083018561393a565b613de0604083018461393a565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e2282613878565b9150613e2d83613878565b9250828202613e3b81613878565b91508282048414831517613e5257613e51613de8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e9382613878565b9150613e9e83613878565b925082613eae57613ead613e59565b5b828204905092915050565b600081905092915050565b50565b6000613ed4600083613eb9565b9150613edf82613ec4565b600082019050919050565b6000613ef582613ec7565b9150819050919050565b6000819050919050565b6000613f24613f1f613f1a846137c5565b613eff565b613878565b9050919050565b613f3481613f09565b82525050565b6000613f55613f50613f4b846137fe565b613eff565b613878565b9050919050565b613f6581613f3a565b82525050565b6000604082019050613f806000830185613f2b565b613f8d6020830184613f5c565b9392505050565b600081905092915050565b7f5f5f636f6e76657273696f6e496e000000000000000000000000000000000000600082015250565b6000613fd5600e83613f94565b9150613fe082613f9f565b600e82019050919050565b6000819050919050565b61400661400182613878565b613feb565b82525050565b60008160601b9050919050565b60006140248261400c565b9050919050565b600061403682614019565b9050919050565b61404e61404982613a9d565b61402b565b82525050565b6000819050919050565b61406f61406a82613b95565b614054565b82525050565b600061409061408b614086846139c0565b613eff565b6139c0565b9050919050565b60006140a282614075565b9050919050565b60006140b482614097565b9050919050565b6140cc6140c7826140a9565b61402b565b82525050565b60006140dd82613fc8565b91506140e98287613ff5565b6020820191506140f9828661403d565b601482019150614109828561405e565b60208201915061411982846140bb565b60148201915081905095945050505050565b61413481613b95565b82525050565b600060808201905061414f600083018761412b565b61415c6020830186613901565b614169604083018561412b565b614176606083018461412b565b95945050505050565b60008151905061418e81613882565b92915050565b6000602082840312156141aa576141a96137c0565b5b60006141b88482850161417f565b91505092915050565b60006141cc82613878565b91506141d783613878565b92508282019050808211156141ef576141ee613de8565b5b92915050565b600060408201905061420a6000830185613aaf565b614217602083018461393a565b9392505050565b600081519050919050565b60005b8381101561424757808201518184015260208101905061422c565b60008484015250505050565b600061425e8261421e565b6142688185613eb9565b9350614278818560208601614229565b80840191505092915050565b60006142908284614253565b915081905092915050565b60006142a682613878565b91506142b183613878565b92508282039050818111156142c9576142c8613de8565b5b92915050565b60006040820190506142e4600083018561412b565b6142f1602083018461393a565b9392505050565b600082825260208201905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b60006143656029836142f8565b915061437082614309565b604082019050919050565b6000602082019050818103600083015261439481614358565b9050919050565b60006020820190506143b0600083018461393a565b92915050565b60006143c1826137c5565b91506143cc836137c5565b9250828201905060ff8111156143e5576143e4613de8565b5b92915050565b60006040820190506144006000830185613901565b61440d6020830184613901565b9392505050565b60006060820190506144296000830186613901565b6144366020830185613901565b614443604083018461393a565b949350505050565b7f5f5f636f6e76657273696f6e4f75740000000000000000000000000000000000600082015250565b6000614481600f83613f94565b915061448c8261444b565b600f82019050919050565b60006144a282614474565b91506144ae8287613ff5565b6020820191506144be828661403d565b6014820191506144ce828561405e565b6020820191506144de82846140bb565b60148201915081905095945050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614526601f836142f8565b9150614531826144f0565b602082019050919050565b6000602082019050818103600083015261455581614519565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006145926020836142f8565b915061459d8261455c565b602082019050919050565b600060208201905081810360008301526145c181614585565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006145fe601c83613f94565b9150614609826145c8565b601c82019050919050565b600061461f826145f1565b915061462b828461405e565b60208201915081905092915050565b600060408201905061464f600083018561393a565b61465c602083018461393a565b9392505050565b600060408201905061467860008301856139f2565b614685602083018461393a565b9392505050565b60006060820190506146a16000830186613aaf565b6146ae60208301856139f2565b6146bb604083018461393a565b94935050505056fea264697066735822122047af6e3f6070aeffcb3e477a62fd6955fd7c647756e0445904c66da844f1c62264736f6c63430008130033000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000e7b81ea23bbb4bf4e8f72da8d159dfe3d94ca93d00000000000000000000000010a26e27bdbadcf6e5dfc8584108f3024678d5de

Deployed Bytecode

0x6080604052600436106101355760003560e01c80639548f477116100ab578063b2d1bb521161006f578063b2d1bb5214610384578063c72304ac146103ad578063e0a66578146103d8578063e30c397814610401578063f2fde38b1461042c578063feea15291461045557610135565b80639548f477146102d35780639b58bfed146102fc5780639cb71686146103255780639f23c9e214610351578063b26e099f1461036d57610135565b80636a02fcc4116100fd5780636a02fcc41461020c578063715018a61461022857806379ba50971461023f5780637c522d28146102565780638da5cb5b1461027f57806394aca02a146102aa57610135565b80632b100f5c1461013a5780632b84301f14610151578063529c09701461017a5780635531e774146101a357806358a93688146101d7575b600080fd5b34801561014657600080fd5b5061014f610482565b005b34801561015d57600080fd5b5061017860048036038101906101739190613838565b610970565b005b34801561018657600080fd5b506101a1600480360381019061019c91906138ae565b610b25565b005b3480156101af57600080fd5b506101b8610bd3565b6040516101ce9a99989796959493929190613a01565b60405180910390f35b3480156101e357600080fd5b506101ec610ca4565b6040516102039b9a99989796959493929190613abe565b60405180910390f35b61022660048036038101906102219190613bcb565b610dd4565b005b34801561023457600080fd5b5061023d611658565b005b34801561024b57600080fd5b5061025461166c565b005b34801561026257600080fd5b5061027d60048036038101906102789190613c58565b6116f9565b005b34801561028b57600080fd5b5061029461182f565b6040516102a19190613c85565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc9190613c58565b611858565b005b3480156102df57600080fd5b506102fa60048036038101906102f59190613ca0565b611965565b005b34801561030857600080fd5b50610323600480360381019061031e9190613ccd565b611ac5565b005b34801561033157600080fd5b5061033a611d82565b604051610348929190613d0d565b60405180910390f35b61036b60048036038101906103669190613d36565b611dd8565b005b34801561037957600080fd5b506103826123ff565b005b34801561039057600080fd5b506103ab60048036038101906103a69190613ca0565b61247c565b005b3480156103b957600080fd5b506103c26125e5565b6040516103cf9190613c85565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613c58565b61260f565b005b34801561040d57600080fd5b506104166126fa565b6040516104239190613c85565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613c58565b612724565b005b34801561046157600080fd5b5061046a6127d1565b60405161047993929190613db1565b60405180910390f35b61048a6127ea565b610492612837565b6003800160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166104d5612837565b73ffffffffffffffffffffffffffffffffffffffff16141580156105515750600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610538612837565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561059a5761055e612837565b6040517f0f287a3f0000000000000000000000000000000000000000000000000000000081526004016105919190613c85565b60405180910390fd5b60006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16600281111561067557610674613949565b5b600281111561068757610686613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050600047905060008103610778576040517fad3a8b9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826020015160ff161461084f57600082610100015173ffffffffffffffffffffffffffffffffffffffff166064846020015160ff16846107ba9190613e17565b6107c49190613e88565b6040516107d090613eea565b60006040518083038185875af1925050503d806000811461080d576040519150601f19603f3d011682016040523d82523d6000602084013e610812565b606091505b505090508061084d576040517f244ec49600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6000600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166064846040015160ff16846108a29190613e17565b6108ac9190613e88565b6040516108b890613eea565b60006040518083038185875af1925050503d80600081146108f5576040519150601f19603f3d011682016040523d82523d6000602084013e6108fa565b606091505b5050905080610935576040517f244ec49600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b427f5e4ae8571f79274a16bfb15067cbf26ceca499fd2d7aa8b710e08e697d46518060405160405180910390a25050505061096e61283f565b565b610978612849565b6000429050600360000160059054906101000a900460ff166109b3576001600360000160056101000a81548160ff0219169083151502179055505b600060028111156109c7576109c6613949565b5b6003800160009054906101000a900460ff1660028111156109eb576109ea613949565b5b14610a9e5760008360ff161480610a06575060008261ffff16145b15610a3d576040517f8f12086700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003800160006101000a81548160ff02191690836002811115610a6557610a64613949565b5b0217905550806000600115157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a45b610aa883836128c7565b81600360000160036101000a81548161ffff021916908361ffff16021790555082600360000160006101000a81548160ff021916908360ff160217905550807f422dd4708a15598e4d5684fba6e31da6e941a6751d420a03ed97e323d4c7cfe78484604051610b18929190613f6b565b60405180910390a2505050565b610b2d612849565b6000831480610b3c5750828211155b80610b475750600081145b15610b7e576040517f0eca686c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600a8190555081600b8190555080600c819055507fb2efb0aa6e279553a1e5567ebb495d322192aa43c5fc3073cba4601d52009ab4838383604051610bc693929190613db1565b60405180910390a1505050565b60038060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900461ffff16908060000160059054906101000a900460ff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508a565b6000806000806000806000806000806000600360000160059054906101000a900460ff16600360000160019054906101000a900460ff16600360000160029054906101000a900460ff16600360000160009054906101000a900460ff16600360000160039054906101000a900461ffff166003800160009054906101000a900460ff166002811115610d3957610d38613949565b5b6003600201546003600101546003800160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d79a509a509a509a509a509a509a509a509a509a509a50909192939495969798999a565b84600a54811080610de65750600b5481115b15610e1d576040517f17dfb4ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e256127ea565b86600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e8c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ecb89610e9b612837565b8a30604051602001610eb094939291906140d2565b6040516020818303038152906040528051906020012061290c565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018289898960405160008152602001604052604051610f29949392919061413a565b6020604051602081039080840390855afa158015610f4b573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614610fa2576040517fa7a059bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600082815260200190815260200160002060009054906101000a900460ff1615610ffa576040517fcce9a82400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016009600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600c54897f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190614194565b6110c391906141c1565b11156110fb576040517f28b53d4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360000160059054906101000a900460ff16156114b85760028081111561112657611125613949565b5b6003800160009054906101000a900460ff16600281111561114a57611149613949565b5b036112605761115761293c565b7f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166340c10f1960e01b8b8b6040516024016111a99291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112139190614284565b6000604051808303816000865af19150503d8060008114611250576040519150601f19603f3d011682016040523d82523d6000602084013e611255565b606091505b5050809250506114b3565b7f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166340c10f1960e01b308b6040516024016112b29291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161131c9190614284565b6000604051808303816000865af19150503d8060008114611359576040519150601f19603f3d011682016040523d82523d6000602084013e61135e565b606091505b5050809250508161139b576040517fcb57cf5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8b6113e48c612b2c565b8c6113ef919061429b565b6040516024016114009291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161146a9190614284565b6000604051808303816000865af19150503d80600081146114a7576040519150601f19603f3d011682016040523d82523d6000602084013e6114ac565b606091505b5050809250505b6115bd565b7f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166340c10f1960e01b8b8b60405160240161150a9291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516115749190614284565b6000604051808303816000865af19150503d80600081146115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b5050809250505b816115f4576040517f384ec20400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8973ffffffffffffffffffffffffffffffffffffffff167f62a9b3e6446ab559d6b82c4f02cc923cd3b4e47444ef86446dab81a4d781c5af898b60405161163c9291906142cf565b60405180910390a250505061164f61283f565b50505050505050565b611660612849565b61166a6000612f92565b565b6000611676612837565b90508073ffffffffffffffffffffffffffffffffffffffff166116976126fa565b73ffffffffffffffffffffffffffffffffffffffff16146116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e49061437b565b60405180910390fd5b6116f681612f92565b50565b611701612849565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611768576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f62904549814f5511a5d36a62611a6e2fe1d2c29b6de74de25d95395e0a7d009b60405160405180910390a381600360040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611860612849565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118a1576118a060006064611ac5565b5b8073ffffffffffffffffffffffffffffffffffffffff166003800160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f62904549814f5511a5d36a62611a6e2fe1d2c29b6de74de25d95395e0a7d009b60405160405180910390a3806003800160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61196d612849565b6000429050600360000160059054906101000a900460ff166119a8576001600360000160056101000a81548160ff0219169083151502179055505b600160028111156119bc576119bb613949565b5b6003800160009054906101000a900460ff1660028111156119e0576119df613949565b5b14611a7f5760008203611a1f576040517fcdd848be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003800160006101000a81548160ff02191690836002811115611a4757611a46613949565b5b02179055508060018015157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a45b81600360020181905550807f81f61b66aa862aaadf659b5ba822fcd562282026c64807a61769a8187d332a8a83604051611ab9919061439b565b60405180910390a25050565b611acd612849565b8181606460ff168183611ae091906143b6565b60ff1614611b275781816040517f8efe3fd5000000000000000000000000000000000000000000000000000000008152600401611b1e9291906143eb565b60405180910390fd5b60006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff166002811115611c0257611c01613949565b5b6002811115611c1457611c13613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508460ff16816020015160ff1614611cf65784600360000160016101000a81548160ff021916908360ff1602179055505b60008460ff1614158015611d1457508360ff16816040015160ff1614155b15611d385783600360000160026101000a81548160ff021916908360ff1602179055505b7f8849d9036ec7068880bd56182e37500d89a0664b4800e4b44fba2e01a69405018160200151826040015142604051611d7393929190614414565b60405180910390a15050505050565b6000806003800160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b84600a54811080611dea5750600b5481115b15611e21576040517f17dfb4ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e296127ea565b600080611e6888611e38612837565b8930604051602001611e4d9493929190614497565b6040516020818303038152906040528051906020012061290c565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018288888860405160008152602001604052604051611ec6949392919061413a565b6020604051602081039080840390855afa158015611ee8573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517fa7a059bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600082815260200190815260200160002060009054906101000a900460ff1615611f97576040517fcce9a82400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016009600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600360000160059054906101000a900460ff161561225357600280811115611fee57611fed613949565b5b6003800160009054906101000a900460ff16600281111561201257612011613949565b5b0361212f5761201f61293c565b7f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166379cc679060e01b612066612837565b8a6040516024016120789291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516120e29190614284565b6000604051808303816000865af19150503d806000811461211f576040519150601f19603f3d011682016040523d82523d6000602084013e612124565b606091505b50508092505061224e565b7f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166379cc679060e01b612176612837565b61217f8b612fc3565b8b61218a919061429b565b60405160240161219b9291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516122059190614284565b6000604051808303816000865af19150503d8060008114612242576040519150601f19603f3d011682016040523d82523d6000602084013e612247565b606091505b5050809250505b61235f565b7f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166379cc679060e01b61229a612837565b8a6040516024016122ac9291906141f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123169190614284565b6000604051808303816000865af19150503d8060008114612353576040519150601f19603f3d011682016040523d82523d6000602084013e612358565b606091505b5050809250505b81612396576040517f384ec20400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61239e612837565b73ffffffffffffffffffffffffffffffffffffffff167fb999b06746a947f1958636b9b9377ae814fe578413dfffd4d3a7a96196fe02fc888a6040516123e59291906142cf565b60405180910390a250506123f761283f565b505050505050565b612407612849565b6000600360000160056101000a81548160ff021916908315150217905550426003800160009054906101000a900460ff16600281111561244a57612449613949565b5b600015157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a4565b612484612849565b6000429050600360000160059054906101000a900460ff166124bf576001600360000160056101000a81548160ff0219169083151502179055505b6002808111156124d2576124d1613949565b5b6003800160009054906101000a900460ff1660028111156124f6576124f5613949565b5b146125965760008203612535576040517f4d05b1ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003800160006101000a81548160ff0219169083600281111561255d5761255c613949565b5b0217905550806002600115157fc4a8c097b5d93dcebaa4f0f65b88ca288e38ff724fa55d3d2af8ecd63c3c9be760405160405180910390a45b61259f8261343b565b81600360010181905550807fb5277ec6eaac4c7f711dcdecd6b7951d4cff3badcfb82ca3a735e6bafedd82bc836040516125d9919061439b565b60405180910390a25050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612676576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61267e612849565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f08f53e6a9fbc3949bc0b9266bbe1927f0b282a34d92876ccbe188c24d17c6cbb826040516126ee9190613c85565b60405180910390a15050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61272c612849565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1661278c61182f565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000806000600a54600b54600c54925092509250909192565b600280540361282e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128259061453c565b60405180910390fd5b60028081905550565b600033905090565b6001600281905550565b612851612837565b73ffffffffffffffffffffffffffffffffffffffff1661286f61182f565b73ffffffffffffffffffffffffffffffffffffffff16146128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc906145a8565b60405180910390fd5b565b8061ffff168260ff161115612908576040517feaf5947400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60008160405160200161291f9190614614565b604051602081830303815290604052805190602001209050919050565b60006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff166002811115612a1757612a16613949565b5b6002811115612a2957612a28613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508060a001513414612b2957348160a001516040517fd326bf05000000000000000000000000000000000000000000000000000000008152600401612b2092919061463a565b60405180910390fd5b50565b6000806003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff166002811115612c0857612c07613949565b5b6002811115612c1a57612c19613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050600080612cd885613498565b915091506000836020015160ff1614158015612cf45750818114155b15612e465760007f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8561010001518585612d4c919061429b565b604051602401612d5d929190614663565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612dc79190614284565b6000604051808303816000865af19150503d8060008114612e04576040519150601f19603f3d011682016040523d82523d6000602084013e612e09565b606091505b5050905080612e44576040517fd291274f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60007f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85610120015185604051602401612e9f929190614663565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612f099190614284565b6000604051808303816000865af19150503d8060008114612f46576040519150601f19603f3d011682016040523d82523d6000602084013e612f4b565b606091505b5050905080612f86576040517fd291274f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81945050505050919050565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055612fc0816136c6565b50565b6000806003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16600281111561309f5761309e613949565b5b60028111156130b1576130b0613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905060008061316f85613498565b915091506000836020015160ff161415801561318b5750818114155b156132e65760007f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b6131d9612837565b86610100015186866131eb919061429b565b6040516024016131fd9392919061468c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516132679190614284565b6000604051808303816000865af19150503d80600081146132a4576040519150601f19603f3d011682016040523d82523d6000602084013e6132a9565b606091505b50509050806132e4576040517fd291274f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60007f000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d773ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b61332f612837565b866101200151866040516024016133489392919061468c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516133b29190614284565b6000604051808303816000865af19150503d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b505090508061342f576040517fd291274f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81945050505050919050565b7f000000000000000000000000000000000000000000000000016345785d8a0000811115613495576040517f4ea10e1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60008060006003604051806101400160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900461ffff1661ffff1661ffff1681526020016000820160059054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16600281111561357657613575613949565b5b600281111561358857613587613949565b5b81526020016003820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090506000600281111561364e5761364d613949565b5b8160e00151600281111561366557613664613949565b5b036136a9576000816060015161ffff16826000015160ff16866136889190613e17565b6136929190613e88565b905061369d8161378a565b819350935050506136c1565b6136b68160c0015161378a565b8160c0015192509250505b915091565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064600360000160029054906101000a900460ff1660ff16836137af9190613e17565b6137b99190613e88565b9050919050565b600080fd5b600060ff82169050919050565b6137db816137c5565b81146137e657600080fd5b50565b6000813590506137f8816137d2565b92915050565b600061ffff82169050919050565b613815816137fe565b811461382057600080fd5b50565b6000813590506138328161380c565b92915050565b6000806040838503121561384f5761384e6137c0565b5b600061385d858286016137e9565b925050602061386e85828601613823565b9150509250929050565b6000819050919050565b61388b81613878565b811461389657600080fd5b50565b6000813590506138a881613882565b92915050565b6000806000606084860312156138c7576138c66137c0565b5b60006138d586828701613899565b93505060206138e686828701613899565b92505060406138f786828701613899565b9150509250925092565b61390a816137c5565b82525050565b613919816137fe565b82525050565b60008115159050919050565b6139348161391f565b82525050565b61394381613878565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061398957613988613949565b5b50565b600081905061399a82613978565b919050565b60006139aa8261398c565b9050919050565b6139ba8161399f565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139eb826139c0565b9050919050565b6139fb816139e0565b82525050565b600061014082019050613a17600083018d613901565b613a24602083018c613901565b613a31604083018b613901565b613a3e606083018a613910565b613a4b608083018961392b565b613a5860a083018861393a565b613a6560c083018761393a565b613a7260e08301866139b1565b613a806101008301856139f2565b613a8e6101208301846139f2565b9b9a5050505050505050505050565b6000613aa8826139c0565b9050919050565b613ab881613a9d565b82525050565b600061016082019050613ad4600083018e61392b565b613ae1602083018d613901565b613aee604083018c613901565b613afb606083018b613901565b613b08608083018a613910565b613b1560a083018961393a565b613b2260c083018861393a565b613b2f60e083018761393a565b613b3d6101008301866139f2565b613b4b6101208301856139f2565b613b59610140830184613aaf565b9c9b505050505050505050505050565b613b7281613a9d565b8114613b7d57600080fd5b50565b600081359050613b8f81613b69565b92915050565b6000819050919050565b613ba881613b95565b8114613bb357600080fd5b50565b600081359050613bc581613b9f565b92915050565b60008060008060008060c08789031215613be857613be76137c0565b5b6000613bf689828a01613b80565b9650506020613c0789828a01613899565b9550506040613c1889828a01613bb6565b9450506060613c2989828a016137e9565b9350506080613c3a89828a01613bb6565b92505060a0613c4b89828a01613bb6565b9150509295509295509295565b600060208284031215613c6e57613c6d6137c0565b5b6000613c7c84828501613b80565b91505092915050565b6000602082019050613c9a6000830184613aaf565b92915050565b600060208284031215613cb657613cb56137c0565b5b6000613cc484828501613899565b91505092915050565b60008060408385031215613ce457613ce36137c0565b5b6000613cf2858286016137e9565b9250506020613d03858286016137e9565b9150509250929050565b6000604082019050613d226000830185613aaf565b613d2f6020830184613aaf565b9392505050565b600080600080600060a08688031215613d5257613d516137c0565b5b6000613d6088828901613899565b9550506020613d7188828901613bb6565b9450506040613d82888289016137e9565b9350506060613d9388828901613bb6565b9250506080613da488828901613bb6565b9150509295509295909350565b6000606082019050613dc6600083018661393a565b613dd3602083018561393a565b613de0604083018461393a565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e2282613878565b9150613e2d83613878565b9250828202613e3b81613878565b91508282048414831517613e5257613e51613de8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e9382613878565b9150613e9e83613878565b925082613eae57613ead613e59565b5b828204905092915050565b600081905092915050565b50565b6000613ed4600083613eb9565b9150613edf82613ec4565b600082019050919050565b6000613ef582613ec7565b9150819050919050565b6000819050919050565b6000613f24613f1f613f1a846137c5565b613eff565b613878565b9050919050565b613f3481613f09565b82525050565b6000613f55613f50613f4b846137fe565b613eff565b613878565b9050919050565b613f6581613f3a565b82525050565b6000604082019050613f806000830185613f2b565b613f8d6020830184613f5c565b9392505050565b600081905092915050565b7f5f5f636f6e76657273696f6e496e000000000000000000000000000000000000600082015250565b6000613fd5600e83613f94565b9150613fe082613f9f565b600e82019050919050565b6000819050919050565b61400661400182613878565b613feb565b82525050565b60008160601b9050919050565b60006140248261400c565b9050919050565b600061403682614019565b9050919050565b61404e61404982613a9d565b61402b565b82525050565b6000819050919050565b61406f61406a82613b95565b614054565b82525050565b600061409061408b614086846139c0565b613eff565b6139c0565b9050919050565b60006140a282614075565b9050919050565b60006140b482614097565b9050919050565b6140cc6140c7826140a9565b61402b565b82525050565b60006140dd82613fc8565b91506140e98287613ff5565b6020820191506140f9828661403d565b601482019150614109828561405e565b60208201915061411982846140bb565b60148201915081905095945050505050565b61413481613b95565b82525050565b600060808201905061414f600083018761412b565b61415c6020830186613901565b614169604083018561412b565b614176606083018461412b565b95945050505050565b60008151905061418e81613882565b92915050565b6000602082840312156141aa576141a96137c0565b5b60006141b88482850161417f565b91505092915050565b60006141cc82613878565b91506141d783613878565b92508282019050808211156141ef576141ee613de8565b5b92915050565b600060408201905061420a6000830185613aaf565b614217602083018461393a565b9392505050565b600081519050919050565b60005b8381101561424757808201518184015260208101905061422c565b60008484015250505050565b600061425e8261421e565b6142688185613eb9565b9350614278818560208601614229565b80840191505092915050565b60006142908284614253565b915081905092915050565b60006142a682613878565b91506142b183613878565b92508282039050818111156142c9576142c8613de8565b5b92915050565b60006040820190506142e4600083018561412b565b6142f1602083018461393a565b9392505050565b600082825260208201905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b60006143656029836142f8565b915061437082614309565b604082019050919050565b6000602082019050818103600083015261439481614358565b9050919050565b60006020820190506143b0600083018461393a565b92915050565b60006143c1826137c5565b91506143cc836137c5565b9250828201905060ff8111156143e5576143e4613de8565b5b92915050565b60006040820190506144006000830185613901565b61440d6020830184613901565b9392505050565b60006060820190506144296000830186613901565b6144366020830185613901565b614443604083018461393a565b949350505050565b7f5f5f636f6e76657273696f6e4f75740000000000000000000000000000000000600082015250565b6000614481600f83613f94565b915061448c8261444b565b600f82019050919050565b60006144a282614474565b91506144ae8287613ff5565b6020820191506144be828661403d565b6014820191506144ce828561405e565b6020820191506144de82846140bb565b60148201915081905095945050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614526601f836142f8565b9150614531826144f0565b602082019050919050565b6000602082019050818103600083015261455581614519565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006145926020836142f8565b915061459d8261455c565b602082019050919050565b600060208201905081810360008301526145c181614585565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006145fe601c83613f94565b9150614609826145c8565b601c82019050919050565b600061461f826145f1565b915061462b828461405e565b60208201915081905092915050565b600060408201905061464f600083018561393a565b61465c602083018461393a565b9392505050565b600060408201905061467860008301856139f2565b614685602083018461393a565b9392505050565b60006060820190506146a16000830186613aaf565b6146ae60208301856139f2565b6146bb604083018461393a565b94935050505056fea264697066735822122047af6e3f6070aeffcb3e477a62fd6955fd7c647756e0445904c66da844f1c62264736f6c63430008130033

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

000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000e7b81ea23bbb4bf4e8f72da8d159dfe3d94ca93d00000000000000000000000010a26e27bdbadcf6e5dfc8584108f3024678d5de

-----Decoded View---------------
Arg [0] : token (address): 0xDBB5Cf12408a3Ac17d668037Ce289f9eA75439D7
Arg [1] : commissionIsEnabled (bool): False
Arg [2] : receiverCommissionProportion (uint8): 50
Arg [3] : bridgeOwnerCommissionProportion (uint8): 50
Arg [4] : fixedNativeTokenCommissionLimit (uint256): 100000000000000000
Arg [5] : commissionReceiver (address): 0xE7B81Ea23bbb4Bf4E8f72DA8D159dfe3D94Ca93d
Arg [6] : bridgeOwner (address): 0x10A26e27BDBaDCF6e5Dfc8584108f3024678D5DE

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000dbb5cf12408a3ac17d668037ce289f9ea75439d7
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [4] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [5] : 000000000000000000000000e7b81ea23bbb4bf4e8f72da8d159dfe3d94ca93d
Arg [6] : 00000000000000000000000010a26e27bdbadcf6e5dfc8584108f3024678d5de


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.