ETH Price: $2,053.13 (+4.00%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Policy St...187492792023-12-09 14:30:47814 days ago1702132247IN
0x0bCed28f...ef3159c05
0 ETH0.0030971144.10340785
Update Policy St...187489812023-12-09 13:30:47814 days ago1702128647IN
0x0bCed28f...ef3159c05
0 ETH0.0023665231.54359813
Update Policy St...186338462023-11-23 10:30:47830 days ago1700735447IN
0x0bCed28f...ef3159c05
0 ETH0.0019658726.20333873
Update Policy St...185534912023-11-12 4:36:11841 days ago1699763771IN
0x0bCed28f...ef3159c05
0 ETH0.0012994518.50443016
Update Policy St...185206862023-11-07 14:30:59846 days ago1699367459IN
0x0bCed28f...ef3159c05
0 ETH0.0022027129.3601566
Update Policy St...185203902023-11-07 13:31:11846 days ago1699363871IN
0x0bCed28f...ef3159c05
0 ETH0.0029286839.03657967
Update Policy St...184510882023-10-28 20:30:59855 days ago1698525059IN
0x0bCed28f...ef3159c05
0 ETH0.0012110917.24622544
Update Policy St...184204282023-10-24 13:30:59860 days ago1698154259IN
0x0bCed28f...ef3159c05
0 ETH0.0029892239.84363241
Update Policy St...183057822023-10-08 12:31:59876 days ago1696768319IN
0x0bCed28f...ef3159c05
0 ETH0.000626698.35324747
Update Policy St...183054782023-10-08 11:30:59876 days ago1696764659IN
0x0bCed28f...ef3159c05
0 ETH0.000507896.76975477
Update Policy St...182861082023-10-05 18:31:11878 days ago1696530671IN
0x0bCed28f...ef3159c05
0 ETH0.000541877.71633452
Update Policy St...182858152023-10-05 17:30:47878 days ago1696527047IN
0x0bCed28f...ef3159c05
0 ETH0.001702722.69543403
Update Policy St...182774662023-10-04 13:30:47880 days ago1696426247IN
0x0bCed28f...ef3159c05
0 ETH0.0008969311.95528279
Update Policy St...182491292023-09-30 14:31:23884 days ago1696084283IN
0x0bCed28f...ef3159c05
0 ETH0.000713779.5139548
Update Policy St...182062652023-09-24 14:31:11890 days ago1695565871IN
0x0bCed28f...ef3159c05
0 ETH0.000671299.55928923
Update Policy St...180926012023-09-08 15:30:59906 days ago1694187059IN
0x0bCed28f...ef3159c05
0 ETH0.0016368721.81807876
Update Policy St...180923052023-09-08 14:30:47906 days ago1694183447IN
0x0bCed28f...ef3159c05
0 ETH0.0011755215.66862079
Update Policy St...180637242023-09-04 14:30:47910 days ago1693837847IN
0x0bCed28f...ef3159c05
0 ETH0.0022627530.16036254
Update Policy St...180631272023-09-04 12:30:47910 days ago1693830647IN
0x0bCed28f...ef3159c05
0 ETH0.0008739612.44533136
Update Policy St...180280222023-08-30 14:30:47915 days ago1693405847IN
0x0bCed28f...ef3159c05
0 ETH0.0029248441.65024969
Update Policy St...179798082023-08-23 20:30:59921 days ago1692822659IN
0x0bCed28f...ef3159c05
0 ETH0.0023837433.94493655
Update Policy St...179783152023-08-23 15:30:47922 days ago1692804647IN
0x0bCed28f...ef3159c05
0 ETH0.0021103628.12916844
Update Policy St...179768302023-08-23 10:32:11922 days ago1692786731IN
0x0bCed28f...ef3159c05
0 ETH0.0013241817.65021748
Update Policy St...179744552023-08-23 2:33:59922 days ago1692758039IN
0x0bCed28f...ef3159c05
0 ETH0.0012002315.9980031
Update Policy St...179675842023-08-22 3:31:23923 days ago1692675083IN
0x0bCed28f...ef3159c05
0 ETH0.0014414319.21296749
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CapitalAgent

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, MIT license
// SPDX-License-Identifier: MIT

pragma solidity 0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./interfaces/ISalesPolicy.sol";
import "./interfaces/IExchangeAgent.sol";
import "./interfaces/ISingleSidedInsurancePool.sol";
import "./interfaces/ICapitalAgent.sol";

contract CapitalAgent is ICapitalAgent, ReentrancyGuard, Ownable {
    address public exchangeAgent;
    address public salesPolicyFactory;
    address public UNO_TOKEN;
    address public USDC_TOKEN;
    address public operator;

    struct PoolInfo {
        uint256 totalCapital;
        uint256 SCR;
        address currency;
        bool exist;
    }

    struct PolicyInfo {
        address policy;
        uint256 utilizedAmount;
        bool exist;
    }

    mapping(address => PoolInfo) public poolInfo;

    uint256 public totalCapitalStaked;

    PolicyInfo public policyInfo;

    uint256 public totalUtilizedAmount;

    uint256 public MCR;
    uint256 public MLR;

    uint256 public CALC_PRECISION = 1e18;

    mapping(address => bool) public poolWhiteList;

    event LogAddPool(address indexed _ssip, address _currency, uint256 _scr);
    event LogRemovePool(address indexed _ssip);
    event LogSetPolicy(address indexed _salesPolicy);
    event LogRemovePolicy(address indexed _salesPolicy);
    event LogUpdatePoolCapital(address indexed _ssip, uint256 _poolCapital, uint256 _totalCapital);
    event LogUpdatePolicyCoverage(
        address indexed _policy,
        uint256 _amount,
        uint256 _policyUtilized,
        uint256 _totalUtilizedAmount
    );
    event LogUpdatePolicyExpired(address indexed _policy, uint256 _policyTokenId);
    event LogMarkToClaimPolicy(address indexed _policy, uint256 _policyTokenId);
    event LogSetMCR(address indexed _owner, address indexed _capitalAgent, uint256 _MCR);
    event LogSetMLR(address indexed _owner, address indexed _capitalAgent, uint256 _MLR);
    event LogSetSCR(address indexed _owner, address indexed _capitalAgent, address indexed _pool, uint256 _SCR);
    event LogSetExchangeAgent(address indexed _owner, address indexed _capitalAgent, address _exchangeAgent);
    event LogSetSalesPolicyFactory(address indexed _factory);
    event LogAddPoolWhiteList(address indexed _pool);
    event LogRemovePoolWhiteList(address indexed _pool);
    event LogSetOperator(address indexed _operator);

    constructor(
        address _exchangeAgent,
        address _UNO_TOKEN,
        address _USDC_TOKEN,
        address _multiSigWallet,
        address _operator
    ) {
        require(_exchangeAgent != address(0), "UnoRe: zero exchangeAgent address");
        require(_UNO_TOKEN != address(0), "UnoRe: zero UNO address");
        require(_USDC_TOKEN != address(0), "UnoRe: zero USDC address");
        require(_multiSigWallet != address(0), "UnoRe: zero multisigwallet address");
        exchangeAgent = _exchangeAgent;
        UNO_TOKEN = _UNO_TOKEN;
        USDC_TOKEN = _USDC_TOKEN;
        operator = _operator;
        transferOwnership(_multiSigWallet);
    }

    modifier onlyPoolWhiteList() {
        require(poolWhiteList[msg.sender], "UnoRe: Capital Agent Forbidden");
        _;
    }

    modifier onlyOperator() {
        require(operator == msg.sender, "UnoRe: Capital Agent Forbidden");
        _;
    }

    function setSalesPolicyFactory(address _factory) external onlyOwner nonReentrant {
        require(_factory != address(0), "UnoRe: zero factory address");
        salesPolicyFactory = _factory;
        emit LogSetSalesPolicyFactory(_factory);
    }

    function setOperator(address _operator) external onlyOwner nonReentrant {
        require(_operator != address(0), "UnoRe: zero operator address");
        operator = _operator;
        emit LogSetOperator(_operator);
    }

    function addPoolWhiteList(address _pool) external onlyOwner nonReentrant {
        require(_pool != address(0), "UnoRe: zero pool address");
        require(!poolWhiteList[_pool], "UnoRe: white list already");
        poolWhiteList[_pool] = true;
        emit LogAddPoolWhiteList(_pool);
    }

    function removePoolWhiteList(address _pool) external onlyOwner nonReentrant {
        require(_pool != address(0), "UnoRe: zero pool address");
        require(poolWhiteList[_pool], "UnoRe: no white list");
        poolWhiteList[_pool] = false;
        emit LogRemovePoolWhiteList(_pool);
    }

    function addPool(
        address _ssip,
        address _currency,
        uint256 _scr
    ) external override onlyPoolWhiteList {
        require(_ssip != address(0), "UnoRe: zero address");
        require(!poolInfo[_ssip].exist, "UnoRe: already exist pool");
        poolInfo[_ssip] = PoolInfo({totalCapital: 0, currency: _currency, SCR: _scr, exist: true});

        emit LogAddPool(_ssip, _currency, _scr);
    }

    function addPoolByAdmin(
        address _ssip,
        address _currency,
        uint256 _scr
    ) external onlyOwner {
        require(_ssip != address(0), "UnoRe: zero address");
        require(!poolInfo[_ssip].exist, "UnoRe: already exist pool");
        poolInfo[_ssip] = PoolInfo({totalCapital: 0, currency: _currency, SCR: _scr, exist: true});

        emit LogAddPool(_ssip, _currency, _scr);
    }

    function removePool(address _ssip) external onlyOwner nonReentrant {
        require(_ssip != address(0), "UnoRe: zero address");
        require(poolInfo[_ssip].exist, "UnoRe: no exit pool");
        if (poolInfo[_ssip].totalCapital > 0) {
            totalCapitalStaked = totalCapitalStaked - poolInfo[_ssip].totalCapital;
        }
        delete poolInfo[_ssip];
        emit LogRemovePool(_ssip);
    }

    function setPolicy(address _policy) external override nonReentrant {
        require(salesPolicyFactory != address(0), "UnoRe: not set factory address yet");
        require(salesPolicyFactory == msg.sender, "UnoRe: only salesPolicyFactory can call");
        policyInfo = PolicyInfo({policy: _policy, utilizedAmount: 0, exist: true});

        emit LogSetPolicy(_policy);
    }

    function setPolicyByAdmin(address _policy) external onlyOwner nonReentrant {
        require(_policy != address(0), "UnoRe: zero address");
        policyInfo = PolicyInfo({policy: _policy, utilizedAmount: 0, exist: true});

        emit LogSetPolicy(_policy);
    }

    function removePolicy() external onlyOwner nonReentrant {
        require(policyInfo.exist, "UnoRe: no exit pool");
        totalUtilizedAmount = 0;
        address _policy = policyInfo.policy;
        policyInfo.policy = address(0);
        policyInfo.exist = false;
        policyInfo.utilizedAmount = 0;
        emit LogRemovePolicy(_policy);
    }

    function SSIPWithdraw(uint256 _withdrawAmount) external override nonReentrant {
        require(poolInfo[msg.sender].exist, "UnoRe: no exist ssip");
        require(_checkCapitalByMCRAndSCR(msg.sender, _withdrawAmount), "UnoRe: minimum capital underflow");
        _updatePoolCapital(msg.sender, _withdrawAmount, false);
    }

    function SSIPPolicyCaim(
        uint256 _withdrawAmount,
        uint256 _policyId,
        bool _isFinished
    ) external override nonReentrant {
        require(poolInfo[msg.sender].exist, "UnoRe: no exist ssip");
        _updatePoolCapital(msg.sender, _withdrawAmount, false);
        if (_isFinished) {
            _markToClaimPolicy(_policyId);
        }
    }

    function SSIPStaking(uint256 _stakingAmount) external override nonReentrant {
        require(poolInfo[msg.sender].exist, "UnoRe: no exist ssip");
        _updatePoolCapital(msg.sender, _stakingAmount, true);
    }

    function checkCapitalByMCR(address _pool, uint256 _withdrawAmount) external view override returns (bool) {
        return _checkCapitalByMCRAndSCR(_pool, _withdrawAmount);
    }

    function checkCoverageByMLR(uint256 _coverageAmount) external view override returns (bool) {
        return _checkCoverageByMLR(_coverageAmount);
    }

    function policySale(uint256 _coverageAmount) external override nonReentrant {
        require(msg.sender == policyInfo.policy, "UnoRe: only salesPolicy can call");
        require(policyInfo.exist, "UnoRe: no exist policy");
        require(_checkCoverageByMLR(_coverageAmount), "UnoRe: maximum leverage overflow");
        _updatePolicyCoverage(_coverageAmount, true);
    }

    function updatePolicyStatus(uint256 _policyId) external override nonReentrant {
        require(policyInfo.policy != address(0), "UnoRe: no exist salesPolicy");
        (uint256 _coverageAmount, uint256 _coverageDuration, uint256 _coverStartAt) = ISalesPolicy(policyInfo.policy)
            .getPolicyData(_policyId);
        bool isExpired = block.timestamp >= _coverageDuration + _coverStartAt;
        if (isExpired) {
            _updatePolicyCoverage(_coverageAmount, false);
            ISalesPolicy(policyInfo.policy).updatePolicyExpired(_policyId);
            emit LogUpdatePolicyExpired(policyInfo.policy, _policyId);
        }
    }

    function markToClaimPolicy(uint256 _policyId) external onlyOwner nonReentrant {
        _markToClaimPolicy(_policyId);
    }

    function _markToClaimPolicy(uint256 _policyId) private {
        require(policyInfo.policy != address(0), "UnoRe: no exist salesPolicy");
        (uint256 _coverageAmount, , ) = ISalesPolicy(policyInfo.policy).getPolicyData(_policyId);
        _updatePolicyCoverage(_coverageAmount, false);
        ISalesPolicy(policyInfo.policy).markToClaim(_policyId);
        emit LogMarkToClaimPolicy(policyInfo.policy, _policyId);
    }

    function _updatePoolCapital(
        address _pool,
        uint256 _amount,
        bool isAdd
    ) private {
        address currency = poolInfo[_pool].currency;
        uint256 stakingAmountInUSDC;
        if (currency == USDC_TOKEN) {
            stakingAmountInUSDC = _amount;
        } else {
            stakingAmountInUSDC = currency != address(0)
                ? IExchangeAgent(exchangeAgent).getNeededTokenAmount(currency, USDC_TOKEN, _amount)
                : IExchangeAgent(exchangeAgent).getTokenAmountForETH(USDC_TOKEN, _amount);
        }

        if (!isAdd) {
            require(poolInfo[_pool].totalCapital >= stakingAmountInUSDC, "UnoRe: pool capital overflow");
        }
        poolInfo[_pool].totalCapital = isAdd
            ? poolInfo[_pool].totalCapital + stakingAmountInUSDC
            : poolInfo[_pool].totalCapital - stakingAmountInUSDC;
        totalCapitalStaked = isAdd ? totalCapitalStaked + stakingAmountInUSDC : totalCapitalStaked - stakingAmountInUSDC;
        emit LogUpdatePoolCapital(_pool, poolInfo[_pool].totalCapital, totalCapitalStaked);
    }

    function _updatePolicyCoverage(uint256 _amount, bool isAdd) private {
        if (!isAdd) {
            require(policyInfo.utilizedAmount >= _amount, "UnoRe: policy coverage overflow");
        }
        policyInfo.utilizedAmount = isAdd ? policyInfo.utilizedAmount + _amount : policyInfo.utilizedAmount - _amount;
        totalUtilizedAmount = isAdd ? totalUtilizedAmount + _amount : totalUtilizedAmount - _amount;
        emit LogUpdatePolicyCoverage(policyInfo.policy, _amount, policyInfo.utilizedAmount, totalUtilizedAmount);
    }

    function _checkCapitalByMCRAndSCR(address _pool, uint256 _withdrawAmount) private view returns (bool) {
        address currency = poolInfo[_pool].currency;
        uint256 withdrawAmountInUSDC;
        if (currency == USDC_TOKEN) {
            withdrawAmountInUSDC = _withdrawAmount;
        } else {
            withdrawAmountInUSDC = currency != address(0)
                ? IExchangeAgent(exchangeAgent).getNeededTokenAmount(currency, USDC_TOKEN, _withdrawAmount)
                : IExchangeAgent(exchangeAgent).getTokenAmountForETH(USDC_TOKEN, _withdrawAmount);
        }
        bool isMCRPass = totalCapitalStaked - withdrawAmountInUSDC >= (totalCapitalStaked * MCR) / CALC_PRECISION;
        bool isSCRPass = poolInfo[_pool].totalCapital - withdrawAmountInUSDC >= poolInfo[_pool].SCR;
        return isMCRPass && isSCRPass;
    }

    function _checkCoverageByMLR(uint256 _newCoverageAmount) private view returns (bool) {
        return totalUtilizedAmount + _newCoverageAmount <= (totalCapitalStaked * MLR) / CALC_PRECISION;
    }

    function setMCR(uint256 _MCR) external onlyOperator nonReentrant {
        require(_MCR > 0, "UnoRe: zero mcr");
        MCR = _MCR;
        emit LogSetMCR(msg.sender, address(this), _MCR);
    }

    function setMLR(uint256 _MLR) external onlyOperator nonReentrant {
        require(_MLR > 0, "UnoRe: zero mlr");
        MLR = _MLR;
        emit LogSetMLR(msg.sender, address(this), _MLR);
    }

    function setSCR(uint256 _SCR, address _pool) external onlyOperator nonReentrant {
        require(_SCR > 0, "UnoRe: zero scr");
        poolInfo[_pool].SCR = _SCR;
        emit LogSetSCR(msg.sender, address(this), _pool, _SCR);
    }

    function setExchangeAgent(address _exchangeAgent) external onlyOwner nonReentrant {
        require(_exchangeAgent != address(0), "UnoRe: zero address");
        exchangeAgent = _exchangeAgent;
        emit LogSetExchangeAgent(msg.sender, address(this), _exchangeAgent);
    }
}

// SPDX-License-Identifier: MIT

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() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 9 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

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 make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

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

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

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

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

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

// SPDX-License-Identifier: MIT

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

interface ICapitalAgent {
    function addPool(
        address _ssip,
        address _currency,
        uint256 _scr
    ) external;

    function setPolicy(address _policy) external;

    function SSIPWithdraw(uint256 _withdrawAmount) external;

    function SSIPStaking(uint256 _stakingAmount) external;

    function SSIPPolicyCaim(
        uint256 _withdrawAmount,
        uint256 _policyId,
        bool _isFinished
    ) external;

    function checkCapitalByMCR(address _pool, uint256 _withdrawAmount) external view returns (bool);

    function checkCoverageByMLR(uint256 _coverageAmount) external view returns (bool);

    function policySale(uint256 _coverageAmount) external;

    function updatePolicyStatus(uint256 _policyId) external;
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

interface IExchangeAgent {
    function USDC_TOKEN() external view returns (address);

    function getTokenAmountForUSDC(address _token, uint256 _usdtAmount) external view returns (uint256);

    function getETHAmountForUSDC(uint256 _usdtAmount) external view returns (uint256);

    function getETHAmountForToken(address _token, uint256 _tokenAmount) external view returns (uint256);

    function getTokenAmountForETH(address _token, uint256 _ethAmount) external view returns (uint256);

    function getNeededTokenAmount(
        address _token0,
        address _token1,
        uint256 _token0Amount
    ) external view returns (uint256);

    function convertForToken(
        address _token0,
        address _token1,
        uint256 _token0Amount
    ) external returns (uint256);

    function convertForETH(address _token, uint256 _convertAmount) external returns (uint256);
}

// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.0;

interface ISalesPolicy {
    function setPremiumPool(address _premiumPool) external;

    function setExchangeAgent(address _exchangeAgent) external;

    function setCapitalAgent(address _capitalAgent) external;

    function setBuyPolicyMaxDeadline(uint256 _maxDeadline) external;

    function approvePremium(address _premiumCurrency) external;

    function setProtocolURI(string memory newURI) external;

    function setSigner(address _signer) external;

    function updatePolicyExpired(uint256 _policyId) external;

    function markToClaim(uint256 _policyId) external;

    function allPoliciesLength() external view returns (uint256);

    function getPolicyData(uint256 _policyId)
        external
        view
        returns (
            uint256,
            uint256,
            uint256
        );
}

// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.0;

interface ISingleSidedInsurancePool {
    function updatePool() external;

    function enterInPool(uint256 _amount) external payable;

    function leaveFromPoolInPending(uint256 _amount) external;

    function leaveFromPending() external;

    function harvest(address _to) external;

    function lpTransfer(
        address _from,
        address _to,
        uint256 _amount
    ) external;

    function riskPool() external view returns (address);
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_exchangeAgent","type":"address"},{"internalType":"address","name":"_UNO_TOKEN","type":"address"},{"internalType":"address","name":"_USDC_TOKEN","type":"address"},{"internalType":"address","name":"_multiSigWallet","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_ssip","type":"address"},{"indexed":false,"internalType":"address","name":"_currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"_scr","type":"uint256"}],"name":"LogAddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pool","type":"address"}],"name":"LogAddPoolWhiteList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_policy","type":"address"},{"indexed":false,"internalType":"uint256","name":"_policyTokenId","type":"uint256"}],"name":"LogMarkToClaimPolicy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_salesPolicy","type":"address"}],"name":"LogRemovePolicy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_ssip","type":"address"}],"name":"LogRemovePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pool","type":"address"}],"name":"LogRemovePoolWhiteList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_capitalAgent","type":"address"},{"indexed":false,"internalType":"address","name":"_exchangeAgent","type":"address"}],"name":"LogSetExchangeAgent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_capitalAgent","type":"address"},{"indexed":false,"internalType":"uint256","name":"_MCR","type":"uint256"}],"name":"LogSetMCR","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_capitalAgent","type":"address"},{"indexed":false,"internalType":"uint256","name":"_MLR","type":"uint256"}],"name":"LogSetMLR","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"}],"name":"LogSetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_salesPolicy","type":"address"}],"name":"LogSetPolicy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_capitalAgent","type":"address"},{"indexed":true,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_SCR","type":"uint256"}],"name":"LogSetSCR","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_factory","type":"address"}],"name":"LogSetSalesPolicyFactory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_policy","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_policyUtilized","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalUtilizedAmount","type":"uint256"}],"name":"LogUpdatePolicyCoverage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_policy","type":"address"},{"indexed":false,"internalType":"uint256","name":"_policyTokenId","type":"uint256"}],"name":"LogUpdatePolicyExpired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_ssip","type":"address"},{"indexed":false,"internalType":"uint256","name":"_poolCapital","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalCapital","type":"uint256"}],"name":"LogUpdatePoolCapital","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"CALC_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MLR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"},{"internalType":"uint256","name":"_policyId","type":"uint256"},{"internalType":"bool","name":"_isFinished","type":"bool"}],"name":"SSIPPolicyCaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingAmount","type":"uint256"}],"name":"SSIPStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"}],"name":"SSIPWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UNO_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ssip","type":"address"},{"internalType":"address","name":"_currency","type":"address"},{"internalType":"uint256","name":"_scr","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ssip","type":"address"},{"internalType":"address","name":"_currency","type":"address"},{"internalType":"uint256","name":"_scr","type":"uint256"}],"name":"addPoolByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"addPoolWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"}],"name":"checkCapitalByMCR","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_coverageAmount","type":"uint256"}],"name":"checkCoverageByMLR","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeAgent","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_policyId","type":"uint256"}],"name":"markToClaimPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policyInfo","outputs":[{"internalType":"address","name":"policy","type":"address"},{"internalType":"uint256","name":"utilizedAmount","type":"uint256"},{"internalType":"bool","name":"exist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_coverageAmount","type":"uint256"}],"name":"policySale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"totalCapital","type":"uint256"},{"internalType":"uint256","name":"SCR","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"exist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removePolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ssip","type":"address"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"removePoolWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salesPolicyFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_exchangeAgent","type":"address"}],"name":"setExchangeAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MCR","type":"uint256"}],"name":"setMCR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MLR","type":"uint256"}],"name":"setMLR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_policy","type":"address"}],"name":"setPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_policy","type":"address"}],"name":"setPolicyByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_SCR","type":"uint256"},{"internalType":"address","name":"_pool","type":"address"}],"name":"setSCR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"setSalesPolicyFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalCapitalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUtilizedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_policyId","type":"uint256"}],"name":"updatePolicyStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052670de0b6b3a7640000600f553480156200001d57600080fd5b5060405162002bc538038062002bc5833981016040819052620000409162000265565b6001600055620000596200005362000166565b6200016a565b6001600160a01b0385166200008b5760405162461bcd60e51b8152600401620000829062000393565b60405180910390fd5b6001600160a01b038416620000b45760405162461bcd60e51b8152600401620000829062000409565b6001600160a01b038316620000dd5760405162461bcd60e51b815260040162000082906200035c565b6001600160a01b038216620001065760405162461bcd60e51b815260040162000082906200031a565b600280546001600160a01b038088166001600160a01b031992831617909255600480548784169083161790556005805486841690831617905560068054928416929091169190911790556200015b82620001bc565b505050505062000440565b3390565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001c662000166565b6001600160a01b0316620001d962000239565b6001600160a01b031614620002025760405162461bcd60e51b81526004016200008290620003d4565b6001600160a01b0381166200022b5760405162461bcd60e51b81526004016200008290620002d4565b62000236816200016a565b50565b6001546001600160a01b031690565b80516001600160a01b03811681146200026057600080fd5b919050565b600080600080600060a086880312156200027d578081fd5b620002888662000248565b9450620002986020870162000248565b9350620002a86040870162000248565b9250620002b86060870162000248565b9150620002c86080870162000248565b90509295509295909350565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f556e6f52653a207a65726f206d756c746973696777616c6c6574206164647265604082015261737360f01b606082015260800190565b60208082526018908201527f556e6f52653a207a65726f205553444320616464726573730000000000000000604082015260600190565b60208082526021908201527f556e6f52653a207a65726f2065786368616e67654167656e74206164647265736040820152607360f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f556e6f52653a207a65726f20554e4f2061646472657373000000000000000000604082015260600190565b61277580620004506000396000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c80638bb7083111610160578063b3ab15fb116100d8578063d8c5c8631161008c578063f2fde38b11610071578063f2fde38b146104f2578063fa56927414610505578063fb6cb8471461050d57610292565b8063d8c5c863146104d7578063d9203b91146104ea57610292565b8063c139b04f116100bd578063c139b04f146104a9578063c3ea3a28146104bc578063d4688a45146104cf57610292565b8063b3ab15fb14610483578063be22041b1461049657610292565b8063974e4d851161012f578063a0931af211610114578063a0931af21461044a578063a65888fb1461045d578063a88d2f7a1461047057610292565b8063974e4d85146104105780639a7b5f111461042757610292565b80638bb70831146103e55780638be5a39f146103ed5780638da5cb5b1461040057806392ff38ec1461040857610292565b80634dc70bac1161020e578063715018a6116101c25780637d4163d3116101a75780637d4163d3146103ac5780637e29d6c2146103bf578063869bd44a146103d257610292565b8063715018a61461039c578063794e5724146103a457610292565b80635b44d576116101f35780635b44d5761461036e57806365cb3a8314610381578063706c2d1b1461038957610292565b80634dc70bac14610351578063570ca7351461036657610292565b806325042fe911610265578063385a128f1161024a578063385a128f146103185780633b7d09461461032b5780634a3a3d141461033e57610292565b806325042fe9146102f057806336760a1c1461031057610292565b80630d757531146102975780630f97b97b146102ac57806318a00d8e146102ca5780631dfa426d146102dd575b600080fd5b6102aa6102a5366004611fa7565b610520565b005b6102b46105fb565b6040516102c1919061203b565b60405180910390f35b6102aa6102d8366004611ef9565b61060a565b6102aa6102eb366004611ef9565b6106f6565b6103036102fe366004611ef9565b6107fe565b6040516102c191906120af565b6102b4610813565b6102aa610326366004611f77565b610822565b6102aa610339366004611ef9565b6108ca565b6102aa61034c366004611ef9565b610a5a565b610359610b6d565b6040516102c19190612668565b6102b4610b73565b6102aa61037c366004611f77565b610b82565b6102aa610c1a565b6102aa610397366004611f13565b610d08565b6102aa610e8d565b610359610ed8565b6102aa6103ba366004611ef9565b610ede565b6102aa6103cd366004611f13565b610f58565b6102aa6103e0366004611f77565b610f87565b610359610ff7565b6102aa6103fb366004611f77565b610ffd565b6102b4611067565b610359611076565b61041861107c565b6040516102c19392919061208c565b61043a610435366004611ef9565b611097565b6040516102c1949392919061267f565b6102aa610458366004611f77565b6110cd565b6102aa61046b366004611ef9565b611171565b6102aa61047e366004611ef9565b611288565b6102aa610491366004611ef9565b611364565b6102aa6104a4366004611f77565b611440565b6103036104b7366004611f4e565b6115f3565b6103036104ca366004611f77565b611606565b610359611619565b6102aa6104e5366004611f77565b61161f565b6102b46116c7565b6102aa610500366004611ef9565b6116d6565b6102b4611747565b6102aa61051b366004611fd2565b611756565b6006546001600160a01b031633146105535760405162461bcd60e51b815260040161054a90612126565b60405180910390fd5b600260005414156105765760405162461bcd60e51b815260040161054a906125c5565b6002600055816105985760405162461bcd60e51b815260040161054a906124c3565b6001600160a01b0381166000818152600760205260409081902060010184905551309033907fade0e16d2bd0d685eef1e5355dc835692faac192ef62225adb31cd0c0b99c8a8906105ea908790612668565b60405180910390a450506001600055565b6004546001600160a01b031681565b6106126117d9565b6001600160a01b0316610623611067565b6001600160a01b0316146106495760405162461bcd60e51b815260040161054a9061244c565b6002600054141561066c5760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166106975760405162461bcd60e51b815260040161054a906121ba565b600280546001600160a01b0319166001600160a01b038316179055604051309033907f28e0ff29ad991f2655c48b0b095a69abbf13aec6c8bc181dd526dbb3f8c9d0b9906106e690859061203b565b60405180910390a3506001600055565b6106fe6117d9565b6001600160a01b031661070f611067565b6001600160a01b0316146107355760405162461bcd60e51b815260040161054a9061244c565b600260005414156107585760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166107835760405162461bcd60e51b815260040161054a906121ba565b604080516060810182526001600160a01b0383168082526000602083018190526001928401839052600980546001600160a01b03191683179055600a819055600b805460ff191690931790925591517f8ba1947a8c64577d7adbd8cbc248c72b68738fe23afef984d842ba5ec5af5cfe9190a2506001600055565b60106020526000908152604090205460ff1681565b6003546001600160a01b031681565b6006546001600160a01b0316331461084c5760405162461bcd60e51b815260040161054a90612126565b6002600054141561086f5760405162461bcd60e51b815260040161054a906125c5565b6002600055806108915760405162461bcd60e51b815260040161054a90612228565b600d819055604051309033907fa55ee73f4232498ac4c250ffa77f4337343a213648a66147d8848f6660fa3fdf906106e6908590612668565b6108d26117d9565b6001600160a01b03166108e3611067565b6001600160a01b0316146109095760405162461bcd60e51b815260040161054a9061244c565b6002600054141561092c5760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166109575760405162461bcd60e51b815260040161054a906121ba565b6001600160a01b038116600090815260076020526040902060020154600160a01b900460ff166109995760405162461bcd60e51b815260040161054a906123a9565b6001600160a01b038116600090815260076020526040902054156109e1576001600160a01b0381166000908152600760205260409020546008546109dd9190612712565b6008555b6001600160a01b0381166000818152600760205260408082208281556001810183905560020180547fffffffffffffffffffffff000000000000000000000000000000000000000000169055517ff54e47602c09e6190ae0c9cba6074e2e211bf36944fd714fbb0bd78aba514cab9190a2506001600055565b610a626117d9565b6001600160a01b0316610a73611067565b6001600160a01b031614610a995760405162461bcd60e51b815260040161054a9061244c565b60026000541415610abc5760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b038116610ae75760405162461bcd60e51b815260040161054a906122cd565b6001600160a01b03811660009081526010602052604090205460ff16610b1f5760405162461bcd60e51b815260040161054a906120ba565b6001600160a01b038116600081815260106020526040808220805460ff19169055517f4151e001c03bfed83a194d10eea2c0edf04f98e382c440c94a947a99d38d2c329190a2506001600055565b600f5481565b6006546001600160a01b031681565b60026000541415610ba55760405162461bcd60e51b815260040161054a906125c5565b600260008181553381526007602052604090200154600160a01b900460ff16610be05760405162461bcd60e51b815260040161054a9061258e565b610bea33826117dd565b610c065760405162461bcd60e51b815260040161054a906123e0565b610c12338260006119b1565b506001600055565b610c226117d9565b6001600160a01b0316610c33611067565b6001600160a01b031614610c595760405162461bcd60e51b815260040161054a9061244c565b60026000541415610c7c5760405162461bcd60e51b815260040161054a906125c5565b6002600055600b5460ff16610ca35760405162461bcd60e51b815260040161054a906123a9565b6000600c819055600980546001600160a01b03198116909155600b805460ff19169055600a8290556040516001600160a01b039091169182917fffb315d96bed6cc0b00a9cc39d15fcbcab7d047fca09660a2d73569cfc75817c9190a2506001600055565b610d106117d9565b6001600160a01b0316610d21611067565b6001600160a01b031614610d475760405162461bcd60e51b815260040161054a9061244c565b6001600160a01b038316610d6d5760405162461bcd60e51b815260040161054a906121ba565b6001600160a01b038316600090815260076020526040902060020154600160a01b900460ff1615610db05760405162461bcd60e51b815260040161054a90612372565b60408051608081018252600080825260208083018581526001600160a01b038088168587019081526001606087018181528b84168088526007909652958890209651875592519286019290925590516002909401805493511515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff959092166001600160a01b0319909416939093179390931692909217905590517f4135167fcda3c31ddaa41eecaaa00c3e3ba8aabf49d039cfad433be34bf659ab90610e809085908590612073565b60405180910390a2505050565b610e956117d9565b6001600160a01b0316610ea6611067565b6001600160a01b031614610ecc5760405162461bcd60e51b815260040161054a9061244c565b610ed66000611c37565b565b600d5481565b60026000541415610f015760405162461bcd60e51b815260040161054a906125c5565b60026000556003546001600160a01b0316610f2e5760405162461bcd60e51b815260040161054a90612481565b6003546001600160a01b031633146107835760405162461bcd60e51b815260040161054a90612531565b3360009081526010602052604090205460ff16610d475760405162461bcd60e51b815260040161054a90612126565b610f8f6117d9565b6001600160a01b0316610fa0611067565b6001600160a01b031614610fc65760405162461bcd60e51b815260040161054a9061244c565b60026000541415610fe95760405162461bcd60e51b815260040161054a906125c5565b6002600055610c1281611c89565b600e5481565b600260005414156110205760405162461bcd60e51b815260040161054a906125c5565b600260008181553381526007602052604090200154600160a01b900460ff1661105b5760405162461bcd60e51b815260040161054a9061258e565b610c12338260016119b1565b6001546001600160a01b031690565b60085481565b600954600a54600b546001600160a01b039092169160ff1683565b6007602052600090815260409020805460018201546002909201549091906001600160a01b03811690600160a01b900460ff1684565b600260005414156110f05760405162461bcd60e51b815260040161054a906125c5565b60026000556009546001600160a01b0316331461111f5760405162461bcd60e51b815260040161054a90612633565b600b5460ff166111415760405162461bcd60e51b815260040161054a906124fa565b61114a81611dee565b6111665760405162461bcd60e51b815260040161054a906120f1565b610c12816001611e23565b6111796117d9565b6001600160a01b031661118a611067565b6001600160a01b0316146111b05760405162461bcd60e51b815260040161054a9061244c565b600260005414156111d35760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166111fe5760405162461bcd60e51b815260040161054a906122cd565b6001600160a01b03811660009081526010602052604090205460ff16156112375760405162461bcd60e51b815260040161054a90612296565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517f398e8e2ed05e6be725398a28e81fdf023a447b92941bd666e68ce2091b82bcc79190a2506001600055565b6112906117d9565b6001600160a01b03166112a1611067565b6001600160a01b0316146112c75760405162461bcd60e51b815260040161054a9061244c565b600260005414156112ea5760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166113155760405162461bcd60e51b815260040161054a90612415565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f6507596e94e343212d1c22479359f82fffb65f099deb3ebcae9eb33c3d06de9e90600090a2506001600055565b61136c6117d9565b6001600160a01b031661137d611067565b6001600160a01b0316146113a35760405162461bcd60e51b815260040161054a9061244c565b600260005414156113c65760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166113f15760405162461bcd60e51b815260040161054a90612304565b600680546001600160a01b0319166001600160a01b0383169081179091556040517f08c5d29613b4e7468e893fe5f104f5a3ea6e28298f00fbbab9dc9394578c89de90600090a2506001600055565b600260005414156114635760405162461bcd60e51b815260040161054a906125c5565b60026000556009546001600160a01b03166114905760405162461bcd60e51b815260040161054a906121f1565b600954604051637a5402e960e01b8152600091829182916001600160a01b031690637a5402e9906114c5908790600401612668565b60606040518083038186803b1580156114dd57600080fd5b505afa1580156114f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611515919061200e565b91945092509050600061152882846126bb565b4210801591506115e75761153d846000611e23565b6009546040516352eaf0a160e11b81526001600160a01b039091169063a5d5e1429061156d908890600401612668565b600060405180830381600087803b15801561158757600080fd5b505af115801561159b573d6000803e3d6000fd5b50506009546040516001600160a01b0390911692507faf1c77a8196c946ab8e645210cd1e2685b4fb758ddfd474fd918298854dea6fc91506115de908890612668565b60405180910390a25b50506001600055505050565b60006115ff83836117dd565b9392505050565b600061161182611dee565b90505b919050565b600c5481565b6006546001600160a01b031633146116495760405162461bcd60e51b815260040161054a90612126565b6002600054141561166c5760405162461bcd60e51b815260040161054a906125c5565b60026000558061168e5760405162461bcd60e51b815260040161054a9061233b565b600e819055604051309033907fb2f30bd42a6b499419a01b9b79e7b98934167f5a8a8c389ce446e20a8e5df765906106e6908590612668565b6002546001600160a01b031681565b6116de6117d9565b6001600160a01b03166116ef611067565b6001600160a01b0316146117155760405162461bcd60e51b815260040161054a9061244c565b6001600160a01b03811661173b5760405162461bcd60e51b815260040161054a9061215d565b61174481611c37565b50565b6005546001600160a01b031681565b600260005414156117795760405162461bcd60e51b815260040161054a906125c5565b600260008181553381526007602052604090200154600160a01b900460ff166117b45760405162461bcd60e51b815260040161054a9061258e565b6117c0338460006119b1565b80156117cf576117cf82611c89565b5050600160005550565b3390565b6001600160a01b03808316600090815260076020526040812060020154600554919290811691839116821415611814575082611939565b6001600160a01b0382166118ad5760025460055460405163ba560ed960e01b81526001600160a01b039283169263ba560ed992611858929116908890600401612073565b60206040518083038186803b15801561187057600080fd5b505afa158015611884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a89190611f8f565b611936565b600254600554604051631a44cdf360e11b81526001600160a01b03928316926334899be6926118e692879290911690899060040161204f565b60206040518083038186803b1580156118fe57600080fd5b505afa158015611912573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119369190611f8f565b90505b6000600f54600d5460085461194e91906126f3565b61195891906126d3565b826008546119669190612712565b6001600160a01b0388166000908152600760205260408120600181015490549390921015935091611998908590612712565b101590508180156119a65750805b979650505050505050565b6001600160a01b0380841660009081526007602052604081206002015460055490831692168214156119e4575082611b09565b6001600160a01b038216611a7d5760025460055460405163ba560ed960e01b81526001600160a01b039283169263ba560ed992611a28929116908890600401612073565b60206040518083038186803b158015611a4057600080fd5b505afa158015611a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a789190611f8f565b611b06565b600254600554604051631a44cdf360e11b81526001600160a01b03928316926334899be692611ab692879290911690899060040161204f565b60206040518083038186803b158015611ace57600080fd5b505afa158015611ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b069190611f8f565b90505b82611b46576001600160a01b038516600090815260076020526040902054811115611b465760405162461bcd60e51b815260040161054a906125fc565b82611b74576001600160a01b038516600090815260076020526040902054611b6f908290612712565b611b98565b6001600160a01b038516600090815260076020526040902054611b989082906126bb565b6001600160a01b03861660009081526007602052604090205582611bc95780600854611bc49190612712565b611bd7565b80600854611bd791906126bb565b60088190556001600160a01b0386166000818152600760205260409081902054905191927f4c54f63d510ce2f2f9bf99bf203458cb67aa75fae97ccab560a1654eba9dbf2492611c28929190612671565b60405180910390a25050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009546001600160a01b0316611cb15760405162461bcd60e51b815260040161054a906121f1565b600954604051637a5402e960e01b81526000916001600160a01b031690637a5402e990611ce2908590600401612668565b60606040518083038186803b158015611cfa57600080fd5b505afa158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d32919061200e565b50509050611d41816000611e23565b6009546040516319d9b48f60e11b81526001600160a01b03909116906333b3691e90611d71908590600401612668565b600060405180830381600087803b158015611d8b57600080fd5b505af1158015611d9f573d6000803e3d6000fd5b50506009546040516001600160a01b0390911692507f56b46e5b13fdb3c0b1989f448e91b2ad68cf0c8e8ddd87f996720708ae3a15699150611de2908590612668565b60405180910390a25050565b6000600f54600e54600854611e0391906126f3565b611e0d91906126d3565b82600c54611e1b91906126bb565b111592915050565b80611e4a57600a54821115611e4a5760405162461bcd60e51b815260040161054a9061225f565b80611e6257600a54611e5d908390612712565b611e70565b600a54611e709083906126bb565b600a5580611e8b5781600c54611e869190612712565b611e99565b81600c54611e9991906126bb565b600c819055600954600a546040516001600160a01b03909216927facece99dd8b86cb96519fb17caded4d103b35a8261463d0d11f80a411460730092611de292879290916126a5565b80356001600160a01b038116811461161457600080fd5b600060208284031215611f0a578081fd5b6115ff82611ee2565b600080600060608486031215611f27578182fd5b611f3084611ee2565b9250611f3e60208501611ee2565b9150604084013590509250925092565b60008060408385031215611f60578182fd5b611f6983611ee2565b946020939093013593505050565b600060208284031215611f88578081fd5b5035919050565b600060208284031215611fa0578081fd5b5051919050565b60008060408385031215611fb9578182fd5b82359150611fc960208401611ee2565b90509250929050565b600080600060608486031215611fe6578283fd5b833592506020840135915060408401358015158114612003578182fd5b809150509250925092565b600080600060608486031215612022578283fd5b8351925060208401519150604084015190509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b901515815260200190565b60208082526014908201527f556e6f52653a206e6f207768697465206c697374000000000000000000000000604082015260600190565b6020808252818101527f556e6f52653a206d6178696d756d206c65766572616765206f766572666c6f77604082015260600190565b6020808252601e908201527f556e6f52653a204361706974616c204167656e7420466f7262696464656e0000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f556e6f52653a207a65726f206164647265737300000000000000000000000000604082015260600190565b6020808252601b908201527f556e6f52653a206e6f2065786973742073616c6573506f6c6963790000000000604082015260600190565b6020808252600f908201527f556e6f52653a207a65726f206d63720000000000000000000000000000000000604082015260600190565b6020808252601f908201527f556e6f52653a20706f6c69637920636f766572616765206f766572666c6f7700604082015260600190565b60208082526019908201527f556e6f52653a207768697465206c69737420616c726561647900000000000000604082015260600190565b60208082526018908201527f556e6f52653a207a65726f20706f6f6c20616464726573730000000000000000604082015260600190565b6020808252601c908201527f556e6f52653a207a65726f206f70657261746f72206164647265737300000000604082015260600190565b6020808252600f908201527f556e6f52653a207a65726f206d6c720000000000000000000000000000000000604082015260600190565b60208082526019908201527f556e6f52653a20616c726561647920657869737420706f6f6c00000000000000604082015260600190565b60208082526013908201527f556e6f52653a206e6f206578697420706f6f6c00000000000000000000000000604082015260600190565b6020808252818101527f556e6f52653a206d696e696d756d206361706974616c20756e646572666c6f77604082015260600190565b6020808252601b908201527f556e6f52653a207a65726f20666163746f727920616464726573730000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f556e6f52653a206e6f742073657420666163746f727920616464726573732079604082015261195d60f21b606082015260800190565b6020808252600f908201527f556e6f52653a207a65726f207363720000000000000000000000000000000000604082015260600190565b60208082526016908201527f556e6f52653a206e6f20657869737420706f6c69637900000000000000000000604082015260600190565b60208082526027908201527f556e6f52653a206f6e6c792073616c6573506f6c696379466163746f7279206360408201527f616e2063616c6c00000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f556e6f52653a206e6f2065786973742073736970000000000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601c908201527f556e6f52653a20706f6f6c206361706974616c206f766572666c6f7700000000604082015260600190565b6020808252818101527f556e6f52653a206f6e6c792073616c6573506f6c6963792063616e2063616c6c604082015260600190565b90815260200190565b918252602082015260400190565b93845260208401929092526001600160a01b031660408301521515606082015260800190565b9283526020830191909152604082015260600190565b600082198211156126ce576126ce612729565b500190565b6000826126ee57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561270d5761270d612729565b500290565b60008282101561272457612724612729565b500390565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220cc728986f6a32a1a45223c939a948cd8b142224b99ba597eeb34d87c1d3d288064736f6c634300080000330000000000000000000000006ac1081cbb92524170e61cffd37bdaf3b38fbc4c000000000000000000000000474021845c4643113458ea4414bdb7fb74a01a77000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000008c3d5c9538256dab8eb4b197370574340fe3254f000000000000000000000000721d214267247568da3a9123abfac71fc18a5ee4

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102925760003560e01c80638bb7083111610160578063b3ab15fb116100d8578063d8c5c8631161008c578063f2fde38b11610071578063f2fde38b146104f2578063fa56927414610505578063fb6cb8471461050d57610292565b8063d8c5c863146104d7578063d9203b91146104ea57610292565b8063c139b04f116100bd578063c139b04f146104a9578063c3ea3a28146104bc578063d4688a45146104cf57610292565b8063b3ab15fb14610483578063be22041b1461049657610292565b8063974e4d851161012f578063a0931af211610114578063a0931af21461044a578063a65888fb1461045d578063a88d2f7a1461047057610292565b8063974e4d85146104105780639a7b5f111461042757610292565b80638bb70831146103e55780638be5a39f146103ed5780638da5cb5b1461040057806392ff38ec1461040857610292565b80634dc70bac1161020e578063715018a6116101c25780637d4163d3116101a75780637d4163d3146103ac5780637e29d6c2146103bf578063869bd44a146103d257610292565b8063715018a61461039c578063794e5724146103a457610292565b80635b44d576116101f35780635b44d5761461036e57806365cb3a8314610381578063706c2d1b1461038957610292565b80634dc70bac14610351578063570ca7351461036657610292565b806325042fe911610265578063385a128f1161024a578063385a128f146103185780633b7d09461461032b5780634a3a3d141461033e57610292565b806325042fe9146102f057806336760a1c1461031057610292565b80630d757531146102975780630f97b97b146102ac57806318a00d8e146102ca5780631dfa426d146102dd575b600080fd5b6102aa6102a5366004611fa7565b610520565b005b6102b46105fb565b6040516102c1919061203b565b60405180910390f35b6102aa6102d8366004611ef9565b61060a565b6102aa6102eb366004611ef9565b6106f6565b6103036102fe366004611ef9565b6107fe565b6040516102c191906120af565b6102b4610813565b6102aa610326366004611f77565b610822565b6102aa610339366004611ef9565b6108ca565b6102aa61034c366004611ef9565b610a5a565b610359610b6d565b6040516102c19190612668565b6102b4610b73565b6102aa61037c366004611f77565b610b82565b6102aa610c1a565b6102aa610397366004611f13565b610d08565b6102aa610e8d565b610359610ed8565b6102aa6103ba366004611ef9565b610ede565b6102aa6103cd366004611f13565b610f58565b6102aa6103e0366004611f77565b610f87565b610359610ff7565b6102aa6103fb366004611f77565b610ffd565b6102b4611067565b610359611076565b61041861107c565b6040516102c19392919061208c565b61043a610435366004611ef9565b611097565b6040516102c1949392919061267f565b6102aa610458366004611f77565b6110cd565b6102aa61046b366004611ef9565b611171565b6102aa61047e366004611ef9565b611288565b6102aa610491366004611ef9565b611364565b6102aa6104a4366004611f77565b611440565b6103036104b7366004611f4e565b6115f3565b6103036104ca366004611f77565b611606565b610359611619565b6102aa6104e5366004611f77565b61161f565b6102b46116c7565b6102aa610500366004611ef9565b6116d6565b6102b4611747565b6102aa61051b366004611fd2565b611756565b6006546001600160a01b031633146105535760405162461bcd60e51b815260040161054a90612126565b60405180910390fd5b600260005414156105765760405162461bcd60e51b815260040161054a906125c5565b6002600055816105985760405162461bcd60e51b815260040161054a906124c3565b6001600160a01b0381166000818152600760205260409081902060010184905551309033907fade0e16d2bd0d685eef1e5355dc835692faac192ef62225adb31cd0c0b99c8a8906105ea908790612668565b60405180910390a450506001600055565b6004546001600160a01b031681565b6106126117d9565b6001600160a01b0316610623611067565b6001600160a01b0316146106495760405162461bcd60e51b815260040161054a9061244c565b6002600054141561066c5760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166106975760405162461bcd60e51b815260040161054a906121ba565b600280546001600160a01b0319166001600160a01b038316179055604051309033907f28e0ff29ad991f2655c48b0b095a69abbf13aec6c8bc181dd526dbb3f8c9d0b9906106e690859061203b565b60405180910390a3506001600055565b6106fe6117d9565b6001600160a01b031661070f611067565b6001600160a01b0316146107355760405162461bcd60e51b815260040161054a9061244c565b600260005414156107585760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166107835760405162461bcd60e51b815260040161054a906121ba565b604080516060810182526001600160a01b0383168082526000602083018190526001928401839052600980546001600160a01b03191683179055600a819055600b805460ff191690931790925591517f8ba1947a8c64577d7adbd8cbc248c72b68738fe23afef984d842ba5ec5af5cfe9190a2506001600055565b60106020526000908152604090205460ff1681565b6003546001600160a01b031681565b6006546001600160a01b0316331461084c5760405162461bcd60e51b815260040161054a90612126565b6002600054141561086f5760405162461bcd60e51b815260040161054a906125c5565b6002600055806108915760405162461bcd60e51b815260040161054a90612228565b600d819055604051309033907fa55ee73f4232498ac4c250ffa77f4337343a213648a66147d8848f6660fa3fdf906106e6908590612668565b6108d26117d9565b6001600160a01b03166108e3611067565b6001600160a01b0316146109095760405162461bcd60e51b815260040161054a9061244c565b6002600054141561092c5760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166109575760405162461bcd60e51b815260040161054a906121ba565b6001600160a01b038116600090815260076020526040902060020154600160a01b900460ff166109995760405162461bcd60e51b815260040161054a906123a9565b6001600160a01b038116600090815260076020526040902054156109e1576001600160a01b0381166000908152600760205260409020546008546109dd9190612712565b6008555b6001600160a01b0381166000818152600760205260408082208281556001810183905560020180547fffffffffffffffffffffff000000000000000000000000000000000000000000169055517ff54e47602c09e6190ae0c9cba6074e2e211bf36944fd714fbb0bd78aba514cab9190a2506001600055565b610a626117d9565b6001600160a01b0316610a73611067565b6001600160a01b031614610a995760405162461bcd60e51b815260040161054a9061244c565b60026000541415610abc5760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b038116610ae75760405162461bcd60e51b815260040161054a906122cd565b6001600160a01b03811660009081526010602052604090205460ff16610b1f5760405162461bcd60e51b815260040161054a906120ba565b6001600160a01b038116600081815260106020526040808220805460ff19169055517f4151e001c03bfed83a194d10eea2c0edf04f98e382c440c94a947a99d38d2c329190a2506001600055565b600f5481565b6006546001600160a01b031681565b60026000541415610ba55760405162461bcd60e51b815260040161054a906125c5565b600260008181553381526007602052604090200154600160a01b900460ff16610be05760405162461bcd60e51b815260040161054a9061258e565b610bea33826117dd565b610c065760405162461bcd60e51b815260040161054a906123e0565b610c12338260006119b1565b506001600055565b610c226117d9565b6001600160a01b0316610c33611067565b6001600160a01b031614610c595760405162461bcd60e51b815260040161054a9061244c565b60026000541415610c7c5760405162461bcd60e51b815260040161054a906125c5565b6002600055600b5460ff16610ca35760405162461bcd60e51b815260040161054a906123a9565b6000600c819055600980546001600160a01b03198116909155600b805460ff19169055600a8290556040516001600160a01b039091169182917fffb315d96bed6cc0b00a9cc39d15fcbcab7d047fca09660a2d73569cfc75817c9190a2506001600055565b610d106117d9565b6001600160a01b0316610d21611067565b6001600160a01b031614610d475760405162461bcd60e51b815260040161054a9061244c565b6001600160a01b038316610d6d5760405162461bcd60e51b815260040161054a906121ba565b6001600160a01b038316600090815260076020526040902060020154600160a01b900460ff1615610db05760405162461bcd60e51b815260040161054a90612372565b60408051608081018252600080825260208083018581526001600160a01b038088168587019081526001606087018181528b84168088526007909652958890209651875592519286019290925590516002909401805493511515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff959092166001600160a01b0319909416939093179390931692909217905590517f4135167fcda3c31ddaa41eecaaa00c3e3ba8aabf49d039cfad433be34bf659ab90610e809085908590612073565b60405180910390a2505050565b610e956117d9565b6001600160a01b0316610ea6611067565b6001600160a01b031614610ecc5760405162461bcd60e51b815260040161054a9061244c565b610ed66000611c37565b565b600d5481565b60026000541415610f015760405162461bcd60e51b815260040161054a906125c5565b60026000556003546001600160a01b0316610f2e5760405162461bcd60e51b815260040161054a90612481565b6003546001600160a01b031633146107835760405162461bcd60e51b815260040161054a90612531565b3360009081526010602052604090205460ff16610d475760405162461bcd60e51b815260040161054a90612126565b610f8f6117d9565b6001600160a01b0316610fa0611067565b6001600160a01b031614610fc65760405162461bcd60e51b815260040161054a9061244c565b60026000541415610fe95760405162461bcd60e51b815260040161054a906125c5565b6002600055610c1281611c89565b600e5481565b600260005414156110205760405162461bcd60e51b815260040161054a906125c5565b600260008181553381526007602052604090200154600160a01b900460ff1661105b5760405162461bcd60e51b815260040161054a9061258e565b610c12338260016119b1565b6001546001600160a01b031690565b60085481565b600954600a54600b546001600160a01b039092169160ff1683565b6007602052600090815260409020805460018201546002909201549091906001600160a01b03811690600160a01b900460ff1684565b600260005414156110f05760405162461bcd60e51b815260040161054a906125c5565b60026000556009546001600160a01b0316331461111f5760405162461bcd60e51b815260040161054a90612633565b600b5460ff166111415760405162461bcd60e51b815260040161054a906124fa565b61114a81611dee565b6111665760405162461bcd60e51b815260040161054a906120f1565b610c12816001611e23565b6111796117d9565b6001600160a01b031661118a611067565b6001600160a01b0316146111b05760405162461bcd60e51b815260040161054a9061244c565b600260005414156111d35760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166111fe5760405162461bcd60e51b815260040161054a906122cd565b6001600160a01b03811660009081526010602052604090205460ff16156112375760405162461bcd60e51b815260040161054a90612296565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517f398e8e2ed05e6be725398a28e81fdf023a447b92941bd666e68ce2091b82bcc79190a2506001600055565b6112906117d9565b6001600160a01b03166112a1611067565b6001600160a01b0316146112c75760405162461bcd60e51b815260040161054a9061244c565b600260005414156112ea5760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166113155760405162461bcd60e51b815260040161054a90612415565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f6507596e94e343212d1c22479359f82fffb65f099deb3ebcae9eb33c3d06de9e90600090a2506001600055565b61136c6117d9565b6001600160a01b031661137d611067565b6001600160a01b0316146113a35760405162461bcd60e51b815260040161054a9061244c565b600260005414156113c65760405162461bcd60e51b815260040161054a906125c5565b60026000556001600160a01b0381166113f15760405162461bcd60e51b815260040161054a90612304565b600680546001600160a01b0319166001600160a01b0383169081179091556040517f08c5d29613b4e7468e893fe5f104f5a3ea6e28298f00fbbab9dc9394578c89de90600090a2506001600055565b600260005414156114635760405162461bcd60e51b815260040161054a906125c5565b60026000556009546001600160a01b03166114905760405162461bcd60e51b815260040161054a906121f1565b600954604051637a5402e960e01b8152600091829182916001600160a01b031690637a5402e9906114c5908790600401612668565b60606040518083038186803b1580156114dd57600080fd5b505afa1580156114f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611515919061200e565b91945092509050600061152882846126bb565b4210801591506115e75761153d846000611e23565b6009546040516352eaf0a160e11b81526001600160a01b039091169063a5d5e1429061156d908890600401612668565b600060405180830381600087803b15801561158757600080fd5b505af115801561159b573d6000803e3d6000fd5b50506009546040516001600160a01b0390911692507faf1c77a8196c946ab8e645210cd1e2685b4fb758ddfd474fd918298854dea6fc91506115de908890612668565b60405180910390a25b50506001600055505050565b60006115ff83836117dd565b9392505050565b600061161182611dee565b90505b919050565b600c5481565b6006546001600160a01b031633146116495760405162461bcd60e51b815260040161054a90612126565b6002600054141561166c5760405162461bcd60e51b815260040161054a906125c5565b60026000558061168e5760405162461bcd60e51b815260040161054a9061233b565b600e819055604051309033907fb2f30bd42a6b499419a01b9b79e7b98934167f5a8a8c389ce446e20a8e5df765906106e6908590612668565b6002546001600160a01b031681565b6116de6117d9565b6001600160a01b03166116ef611067565b6001600160a01b0316146117155760405162461bcd60e51b815260040161054a9061244c565b6001600160a01b03811661173b5760405162461bcd60e51b815260040161054a9061215d565b61174481611c37565b50565b6005546001600160a01b031681565b600260005414156117795760405162461bcd60e51b815260040161054a906125c5565b600260008181553381526007602052604090200154600160a01b900460ff166117b45760405162461bcd60e51b815260040161054a9061258e565b6117c0338460006119b1565b80156117cf576117cf82611c89565b5050600160005550565b3390565b6001600160a01b03808316600090815260076020526040812060020154600554919290811691839116821415611814575082611939565b6001600160a01b0382166118ad5760025460055460405163ba560ed960e01b81526001600160a01b039283169263ba560ed992611858929116908890600401612073565b60206040518083038186803b15801561187057600080fd5b505afa158015611884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a89190611f8f565b611936565b600254600554604051631a44cdf360e11b81526001600160a01b03928316926334899be6926118e692879290911690899060040161204f565b60206040518083038186803b1580156118fe57600080fd5b505afa158015611912573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119369190611f8f565b90505b6000600f54600d5460085461194e91906126f3565b61195891906126d3565b826008546119669190612712565b6001600160a01b0388166000908152600760205260408120600181015490549390921015935091611998908590612712565b101590508180156119a65750805b979650505050505050565b6001600160a01b0380841660009081526007602052604081206002015460055490831692168214156119e4575082611b09565b6001600160a01b038216611a7d5760025460055460405163ba560ed960e01b81526001600160a01b039283169263ba560ed992611a28929116908890600401612073565b60206040518083038186803b158015611a4057600080fd5b505afa158015611a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a789190611f8f565b611b06565b600254600554604051631a44cdf360e11b81526001600160a01b03928316926334899be692611ab692879290911690899060040161204f565b60206040518083038186803b158015611ace57600080fd5b505afa158015611ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b069190611f8f565b90505b82611b46576001600160a01b038516600090815260076020526040902054811115611b465760405162461bcd60e51b815260040161054a906125fc565b82611b74576001600160a01b038516600090815260076020526040902054611b6f908290612712565b611b98565b6001600160a01b038516600090815260076020526040902054611b989082906126bb565b6001600160a01b03861660009081526007602052604090205582611bc95780600854611bc49190612712565b611bd7565b80600854611bd791906126bb565b60088190556001600160a01b0386166000818152600760205260409081902054905191927f4c54f63d510ce2f2f9bf99bf203458cb67aa75fae97ccab560a1654eba9dbf2492611c28929190612671565b60405180910390a25050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009546001600160a01b0316611cb15760405162461bcd60e51b815260040161054a906121f1565b600954604051637a5402e960e01b81526000916001600160a01b031690637a5402e990611ce2908590600401612668565b60606040518083038186803b158015611cfa57600080fd5b505afa158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d32919061200e565b50509050611d41816000611e23565b6009546040516319d9b48f60e11b81526001600160a01b03909116906333b3691e90611d71908590600401612668565b600060405180830381600087803b158015611d8b57600080fd5b505af1158015611d9f573d6000803e3d6000fd5b50506009546040516001600160a01b0390911692507f56b46e5b13fdb3c0b1989f448e91b2ad68cf0c8e8ddd87f996720708ae3a15699150611de2908590612668565b60405180910390a25050565b6000600f54600e54600854611e0391906126f3565b611e0d91906126d3565b82600c54611e1b91906126bb565b111592915050565b80611e4a57600a54821115611e4a5760405162461bcd60e51b815260040161054a9061225f565b80611e6257600a54611e5d908390612712565b611e70565b600a54611e709083906126bb565b600a5580611e8b5781600c54611e869190612712565b611e99565b81600c54611e9991906126bb565b600c819055600954600a546040516001600160a01b03909216927facece99dd8b86cb96519fb17caded4d103b35a8261463d0d11f80a411460730092611de292879290916126a5565b80356001600160a01b038116811461161457600080fd5b600060208284031215611f0a578081fd5b6115ff82611ee2565b600080600060608486031215611f27578182fd5b611f3084611ee2565b9250611f3e60208501611ee2565b9150604084013590509250925092565b60008060408385031215611f60578182fd5b611f6983611ee2565b946020939093013593505050565b600060208284031215611f88578081fd5b5035919050565b600060208284031215611fa0578081fd5b5051919050565b60008060408385031215611fb9578182fd5b82359150611fc960208401611ee2565b90509250929050565b600080600060608486031215611fe6578283fd5b833592506020840135915060408401358015158114612003578182fd5b809150509250925092565b600080600060608486031215612022578283fd5b8351925060208401519150604084015190509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b901515815260200190565b60208082526014908201527f556e6f52653a206e6f207768697465206c697374000000000000000000000000604082015260600190565b6020808252818101527f556e6f52653a206d6178696d756d206c65766572616765206f766572666c6f77604082015260600190565b6020808252601e908201527f556e6f52653a204361706974616c204167656e7420466f7262696464656e0000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f556e6f52653a207a65726f206164647265737300000000000000000000000000604082015260600190565b6020808252601b908201527f556e6f52653a206e6f2065786973742073616c6573506f6c6963790000000000604082015260600190565b6020808252600f908201527f556e6f52653a207a65726f206d63720000000000000000000000000000000000604082015260600190565b6020808252601f908201527f556e6f52653a20706f6c69637920636f766572616765206f766572666c6f7700604082015260600190565b60208082526019908201527f556e6f52653a207768697465206c69737420616c726561647900000000000000604082015260600190565b60208082526018908201527f556e6f52653a207a65726f20706f6f6c20616464726573730000000000000000604082015260600190565b6020808252601c908201527f556e6f52653a207a65726f206f70657261746f72206164647265737300000000604082015260600190565b6020808252600f908201527f556e6f52653a207a65726f206d6c720000000000000000000000000000000000604082015260600190565b60208082526019908201527f556e6f52653a20616c726561647920657869737420706f6f6c00000000000000604082015260600190565b60208082526013908201527f556e6f52653a206e6f206578697420706f6f6c00000000000000000000000000604082015260600190565b6020808252818101527f556e6f52653a206d696e696d756d206361706974616c20756e646572666c6f77604082015260600190565b6020808252601b908201527f556e6f52653a207a65726f20666163746f727920616464726573730000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f556e6f52653a206e6f742073657420666163746f727920616464726573732079604082015261195d60f21b606082015260800190565b6020808252600f908201527f556e6f52653a207a65726f207363720000000000000000000000000000000000604082015260600190565b60208082526016908201527f556e6f52653a206e6f20657869737420706f6c69637900000000000000000000604082015260600190565b60208082526027908201527f556e6f52653a206f6e6c792073616c6573506f6c696379466163746f7279206360408201527f616e2063616c6c00000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f556e6f52653a206e6f2065786973742073736970000000000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601c908201527f556e6f52653a20706f6f6c206361706974616c206f766572666c6f7700000000604082015260600190565b6020808252818101527f556e6f52653a206f6e6c792073616c6573506f6c6963792063616e2063616c6c604082015260600190565b90815260200190565b918252602082015260400190565b93845260208401929092526001600160a01b031660408301521515606082015260800190565b9283526020830191909152604082015260600190565b600082198211156126ce576126ce612729565b500190565b6000826126ee57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561270d5761270d612729565b500290565b60008282101561272457612724612729565b500390565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220cc728986f6a32a1a45223c939a948cd8b142224b99ba597eeb34d87c1d3d288064736f6c63430008000033

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

0000000000000000000000006ac1081cbb92524170e61cffd37bdaf3b38fbc4c000000000000000000000000474021845c4643113458ea4414bdb7fb74a01a77000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000008c3d5c9538256dab8eb4b197370574340fe3254f000000000000000000000000721d214267247568da3a9123abfac71fc18a5ee4

-----Decoded View---------------
Arg [0] : _exchangeAgent (address): 0x6aC1081CBb92524170E61CFFD37bDaF3b38FBC4c
Arg [1] : _UNO_TOKEN (address): 0x474021845C4643113458ea4414bdb7fB74A01A77
Arg [2] : _USDC_TOKEN (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [3] : _multiSigWallet (address): 0x8c3d5c9538256DAB8Eb4B197370574340fe3254F
Arg [4] : _operator (address): 0x721d214267247568DA3A9123abfAc71fc18a5EE4

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000006ac1081cbb92524170e61cffd37bdaf3b38fbc4c
Arg [1] : 000000000000000000000000474021845c4643113458ea4414bdb7fb74a01a77
Arg [2] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [3] : 0000000000000000000000008c3d5c9538256dab8eb4b197370574340fe3254f
Arg [4] : 000000000000000000000000721d214267247568da3a9123abfac71fc18a5ee4


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.