ETH Price: $3,255.51 (+3.21%)
Gas: 4 Gwei

Contract

0x79345B06D443FF74242901c8100995a61Ab5c95c
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Transfer To Asse...178028362023-07-30 2:21:35362 days ago1690683695IN
0x79345B06...61Ab5c95c
0.32 ETH0.0037446915.69505664
Transfer To Asse...177692642023-07-25 9:37:11367 days ago1690277831IN
0x79345B06...61Ab5c95c
0 ETH0.0050872620.99780211
Transfer To Asse...177656922023-07-24 21:37:47367 days ago1690234667IN
0x79345B06...61Ab5c95c
0 ETH0.007690831.74241988
Transfer To Asse...177509642023-07-22 20:11:11369 days ago1690056671IN
0x79345B06...61Ab5c95c
0.075 ETH0.003652515.30789163
Transfer To Asse...177449372023-07-21 23:57:23370 days ago1689983843IN
0x79345B06...61Ab5c95c
0 ETH0.0043421117.92127908
Transfer To Asse...177449202023-07-21 23:53:59370 days ago1689983639IN
0x79345B06...61Ab5c95c
0 ETH0.0044352618.30575728
Transfer To Asse...177449082023-07-21 23:51:35370 days ago1689983495IN
0x79345B06...61Ab5c95c
0 ETH0.0046493119.18919667
Transfer To Asse...177275422023-07-19 13:31:23373 days ago1689773483IN
0x79345B06...61Ab5c95c
0 ETH0.0060913324.65250172
Transfer To Asse...177275282023-07-19 13:28:35373 days ago1689773315IN
0x79345B06...61Ab5c95c
0 ETH0.0056302922.78659082
Transfer To Asse...177261792023-07-19 8:54:59373 days ago1689756899IN
0x79345B06...61Ab5c95c
0 ETH0.0037863115.62733314
Transfer To Asse...177261512023-07-19 8:49:23373 days ago1689756563IN
0x79345B06...61Ab5c95c
0 ETH0.0040302916.63433095
Transfer To Asse...177260652023-07-19 8:31:35373 days ago1689755495IN
0x79345B06...61Ab5c95c
0 ETH0.0039530216
Transfer To Asse...177260452023-07-19 8:27:35373 days ago1689755255IN
0x79345B06...61Ab5c95c
0 ETH0.004200717
Transfer To Asse...176904142023-07-14 8:07:59378 days ago1689322079IN
0x79345B06...61Ab5c95c
0 ETH0.0040437116.68971842
Transfer To Asse...176418342023-07-07 12:09:59385 days ago1688731799IN
0x79345B06...61Ab5c95c
0 ETH0.004939620.38732615
Transfer To Asse...176414572023-07-07 10:53:47385 days ago1688727227IN
0x79345B06...61Ab5c95c
0 ETH0.004763819.6617488
Transfer To Asse...176413982023-07-07 10:41:35385 days ago1688726495IN
0x79345B06...61Ab5c95c
0 ETH0.004894920.20284862
Transfer To Asse...176340352023-07-06 9:51:47386 days ago1688637107IN
0x79345B06...61Ab5c95c
0.45 ETH0.0064261327
Transfer To Asse...176339752023-07-06 9:39:47386 days ago1688636387IN
0x79345B06...61Ab5c95c
0.65 ETH0.0075544329.54519225
Transfer To Asse...176339692023-07-06 9:38:35386 days ago1688636315IN
0x79345B06...61Ab5c95c
0.65 ETH0.0074672929.27146689
Transfer To Asse...176339252023-07-06 9:29:47386 days ago1688635787IN
0x79345B06...61Ab5c95c
0 ETH0.0066982528.20458535
Transfer To Asse...176339142023-07-06 9:27:35386 days ago1688635655IN
0x79345B06...61Ab5c95c
0 ETH0.0072558429.94719245
Transfer To Asse...176339032023-07-06 9:25:23386 days ago1688635523IN
0x79345B06...61Ab5c95c
0 ETH0.0076432931.54632428
Transfer To Asse...176275732023-07-05 12:06:35387 days ago1688558795IN
0x79345B06...61Ab5c95c
0.09777501 ETH0.0140191754.823424
Transfer To Asse...172208162023-05-09 5:28:35444 days ago1683610115IN
0x79345B06...61Ab5c95c
0 ETH0.0146740360.56444466
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
178028362023-07-30 2:21:35362 days ago1690683695
0x79345B06...61Ab5c95c
0.32 ETH
177509642023-07-22 20:11:11369 days ago1690056671
0x79345B06...61Ab5c95c
0.075 ETH
176340352023-07-06 9:51:47386 days ago1688637107
0x79345B06...61Ab5c95c
0.45 ETH
176339752023-07-06 9:39:47386 days ago1688636387
0x79345B06...61Ab5c95c
0.65 ETH
176339692023-07-06 9:38:35386 days ago1688636315
0x79345B06...61Ab5c95c
0.65 ETH
176339692023-07-06 9:38:35386 days ago1688636315
0x79345B06...61Ab5c95c
0.65 ETH
176339692023-07-06 9:38:35386 days ago1688636315
0x79345B06...61Ab5c95c
0.65 ETH
176339692023-07-06 9:38:35386 days ago1688636315
0x79345B06...61Ab5c95c
0.65 ETH
176339692023-07-06 9:38:35386 days ago1688636315
0x79345B06...61Ab5c95c
0.65 ETH
176275732023-07-05 12:06:35387 days ago1688558795
0x79345B06...61Ab5c95c
0.09777501 ETH
176275602023-07-05 12:03:59387 days ago1688558639
0x79345B06...61Ab5c95c
0.07420917 ETH
176275602023-07-05 12:03:59387 days ago1688558639
0x79345B06...61Ab5c95c
0.07420917 ETH
176275602023-07-05 12:03:59387 days ago1688558639
0x79345B06...61Ab5c95c
7.49512626 ETH
176275602023-07-05 12:03:59387 days ago1688558639
0x79345B06...61Ab5c95c
7.49512626 ETH
176275602023-07-05 12:03:59387 days ago1688558639
0x79345B06...61Ab5c95c
7.49512626 ETH
176275602023-07-05 12:03:59387 days ago1688558639
0x79345B06...61Ab5c95c
7.49512626 ETH
176275602023-07-05 12:03:59387 days ago1688558639
0x79345B06...61Ab5c95c
7.49512626 ETH
176275602023-07-05 12:03:59387 days ago1688558639
0x79345B06...61Ab5c95c
7.49512626 ETH
172284732023-05-10 7:17:47443 days ago1683703067
0x79345B06...61Ab5c95c
0.00693543 ETH
172284732023-05-10 7:17:47443 days ago1683703067
0x79345B06...61Ab5c95c
0.00693543 ETH
172284732023-05-10 7:17:47443 days ago1683703067
0x79345B06...61Ab5c95c
0.70047909 ETH
172284732023-05-10 7:17:47443 days ago1683703067
0x79345B06...61Ab5c95c
0.70047909 ETH
172284732023-05-10 7:17:47443 days ago1683703067
0x79345B06...61Ab5c95c
0.70047909 ETH
172284732023-05-10 7:17:47443 days ago1683703067
0x79345B06...61Ab5c95c
0.70047909 ETH
172284732023-05-10 7:17:47443 days ago1683703067
0x79345B06...61Ab5c95c
0.70047909 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PositionsController

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 17 : PositionsController.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import '../lib/factories/HasFactories.sol';
import './ItemRef.sol';
import 'contracts/position_trading/IPositionAlgorithm.sol';
import './IPositionsController.sol';
import 'contracts/fee/IFeeSettings.sol';
import 'contracts/position_trading/ItemRefAsAssetLibrary.sol';
import 'contracts/position_trading/AssetTransferData.sol';

interface IErc20Balance {
    function balanceOf(address account) external view returns (uint256);
}

contract PositionsController is HasFactories, IPositionsController {
    using ItemRefAsAssetLibrary for ItemRef;

    IFeeSettings feeSettings;
    uint256 _positionsCount; // total positions created
    uint256 _assetsCount;
    mapping(uint256 => address) public owners; // position owners
    mapping(uint256 => ItemRef) public ownerAssets; // owner's asset (what is offered). by position ids
    mapping(uint256 => ItemRef) public outputAssets; // output asset (what they want in return), may be absent, in case of locks. by position ids
    mapping(uint256 => address) public algorithms; // algorithm for processing the input and output asset
    mapping(uint256 => bool) _buildModes; // build modes by positions
    mapping(uint256 => uint256) _positionsByAssets;

    constructor(address feeSettings_) {
        feeSettings = IFeeSettings(feeSettings_);
    }

    receive() external payable {}

    modifier onlyPositionOwner(uint256 positionId) {
        require(owners[positionId] == msg.sender, 'only for position owner');
        _;
    }

    modifier onlyBuildMode(uint256 positionId) {
        require(this.isBuildMode(positionId), 'only for position build mode');
        _;
    }

    modifier oplyPositionAlgorithm(uint256 positionId) {
        require(
            this.getAlgorithm(positionId) == msg.sender,
            'only for position algotithm'
        );
        _;
    }

    function createPosition(address owner)
        external
        onlyFactory
        returns (uint256)
    {
        ++_positionsCount;
        owners[_positionsCount] = owner;
        _buildModes[_positionsCount] = true;
        return _positionsCount;
    }

    function getPosition(uint256 positionId)
        external
        view
        returns (
            address algorithm,
            AssetData memory asset1,
            AssetData memory asset2
        )
    {
        algorithm = algorithms[positionId];
        ItemRef memory ref = this.getAssetReference(positionId, 1);
        if (ref.addr != address(0)) asset1 = ref.getData();
        ref = this.getAssetReference(positionId, 2);
        if (ref.addr != address(0)) asset2 = ref.getData();
    }

    function positionsCount() external returns (uint256) {
        return _positionsCount;
    }

    function isBuildMode(uint256 positionId) external view returns (bool) {
        return _buildModes[positionId];
    }

    function stopBuild(uint256 positionId)
        external
        onlyFactory
        onlyBuildMode(positionId)
    {
        address alg = algorithms[positionId];
        require(alg != address(0), 'has no algorithm');

        delete _buildModes[positionId];

        emit NewPosition(
            owners[positionId],
            algorithms[positionId],
            positionId
        );
    }

    function getFeeSettings() external view returns (IFeeSettings) {
        return feeSettings;
    }

    function ownerOf(uint256 positionId)
        external
        view
        override
        returns (address)
    {
        return owners[positionId];
    }

    function getAssetReference(uint256 positionId, uint256 assetCode)
        external
        view
        returns (ItemRef memory)
    {
        if (assetCode == 1) return ownerAssets[positionId];
        else if (assetCode == 2) return outputAssets[positionId];
        else revert('unknown asset code');
    }

    function getAllPositionAssetReferences(uint256 positionId)
        external
        view
        returns (ItemRef memory position1, ItemRef memory position2)
    {
        return (ownerAssets[positionId], outputAssets[positionId]);
    }

    function getAsset(uint256 positionId, uint256 assetCode)
        external
        view
        returns (AssetData memory data)
    {
        return this.getAssetReference(positionId, assetCode).getData();
    }

    function createAsset(
        uint256 positionId,
        uint256 assetCode,
        address assetsController
    ) external onlyFactory returns (ItemRef memory) {
        ItemRef memory asset = ItemRef(assetsController, _createNewAssetId());
        _positionsByAssets[asset.id] = positionId;

        if (assetCode == 1) ownerAssets[positionId] = asset;
        else if (assetCode == 2) outputAssets[positionId] = asset;
        else revert('unknown asset code');

        return asset;
    }

    function setAlgorithm(uint256 positionId, address algorithm)
        external
        onlyFactory
        onlyBuildMode(positionId)
    {
        algorithms[positionId] = algorithm;
    }

    function getAlgorithm(uint256 positionId)
        external
        view
        override
        returns (address)
    {
        return algorithms[positionId];
    }

    function assetsCount() external view returns (uint256) {
        return _assetsCount;
    }

    function createNewAssetId() external onlyFactory returns (uint256) {
        return _createNewAssetId();
    }

    function _createNewAssetId() internal onlyFactory returns (uint256) {
        return ++_assetsCount;
    }

    function getAssetPositionId(uint256 assetId)
        external
        view
        returns (uint256)
    {
        return _positionsByAssets[assetId];
    }

    function beforeAssetTransfer(AssetTransferData calldata arg)
        external
        onlyFactory
    {
        uint256 positionId = arg.asset.getPositionId();
        IPositionAlgorithm alg = IPositionAlgorithm(algorithms[positionId]);
        if (address(alg) == address(0)) return;
        alg.beforeAssetTransfer(arg);
    }

    function afterAssetTransfer(AssetTransferData calldata arg)
        external
        payable
        onlyFactory
    {
        uint256 positionId = arg.asset.getPositionId();
        IPositionAlgorithm alg = IPositionAlgorithm(algorithms[positionId]);
        if (address(alg) == address(0)) return;
        alg.afterAssetTransfer{ value: msg.value }(arg);
    }

    function transferToAsset(
        uint256 positionId,
        uint256 assetCode,
        uint256 count,
        uint256[] calldata data
    ) external payable returns (uint256 ethSurplus) {
        ItemRef memory asset = this.getAssetReference(positionId, assetCode);
        ethSurplus = IAssetsController(asset.addr).transferToAsset{
            value: msg.value
        }(
            AssetTransferData(
                positionId,
                asset,
                assetCode,
                msg.sender,
                asset.addr,
                count,
                data
            )
        );
        if (ethSurplus > 0) {
            (bool surplusSent, ) = payable(msg.sender).call{
                value: ethSurplus
            }('');
            require(surplusSent, 'ethereum surplus is not sent');
        }
    }

    function transferToAssetFrom(
        address from,
        uint256 positionId,
        uint256 assetCode,
        uint256 count,
        uint256[] calldata data
    ) external payable onlyFactory returns (uint256 ethSurplus) {
        ItemRef memory asset = this.getAssetReference(positionId, assetCode);
        ethSurplus = IAssetsController(asset.addr).transferToAsset{
            value: msg.value
        }(
            AssetTransferData(
                positionId,
                asset,
                assetCode,
                from,
                asset.addr,
                count,
                data
            )
        );
        if (ethSurplus > 0) {
            (bool surplusSent, ) = msg.sender.call{ value: ethSurplus }('');
            require(surplusSent, 'ethereum surplus is not sent');
        }
    }

    function transferToAnotherAssetInternal(
        ItemRef calldata from,
        ItemRef calldata to,
        uint256 count
    ) external oplyPositionAlgorithm(from.getPositionId()) {
        require(
            from.assetTypeId() == to.assetTypeId(),
            'transfer from asset to must be same types'
        );
        if (to.assetTypeId() == 2) {
            uint256 lastBalance = IErc20Balance(to.contractAddr()).balanceOf(to.addr);
            from.withdraw(to.addr, count);
            to.addCount(IErc20Balance(to.contractAddr()).balanceOf(to.addr) - lastBalance);
        } else {
            from.withdraw(to.addr, count);
            to.addCount(count);
        }
    }

    function withdraw(
        uint256 positionId,
        uint256 assetCode,
        uint256 count
    ) external onlyPositionOwner(positionId) {
        _withdrawTo(positionId, assetCode, msg.sender, count);
    }

    function withdrawTo(
        uint256 positionId,
        uint256 assetCode,
        address to,
        uint256 count
    ) external {
        _withdrawTo(positionId, assetCode, to, count);
    }

    function _withdrawTo(
        uint256 positionId,
        uint256 assetCode,
        address to,
        uint256 count
    ) internal {
        address algAddr = this.getAlgorithm(positionId);
        ItemRef memory asset = this.getAssetReference(positionId, assetCode);
        if (algAddr != address(0)) {
            IPositionAlgorithm(algAddr).checkCanWithdraw(
                asset,
                assetCode,
                count
            );
        }
        asset.withdraw(to, count);
    }

    function withdrawInternal(
        ItemRef calldata asset,
        address to,
        uint256 count
    ) external oplyPositionAlgorithm(asset.getPositionId()) {
        asset.withdraw(to, count);
    }

    function count(ItemRef calldata asset) external view returns (uint256) {
        return asset.count();
    }

    function getCounts(uint256 positionId)
        external
        view
        returns (uint256, uint256)
    {
        return (
            this.getAssetReference(positionId, 1).count(),
            this.getAssetReference(positionId, 2).count()
        );
    }

    function positionLocked(uint256 positionId) external view returns (bool) {
        address algAddr = this.getAlgorithm(positionId);
        if (algAddr == address(0)) return false;
        return IPositionAlgorithm(algAddr).positionLocked(positionId);
    }
}

File 2 of 17 : HasFactories.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import '../ownable/Ownable.sol';
import './IHasFactories.sol';

contract HasFactories is Ownable, IHasFactories {
    mapping(address => bool) internal _factories; // factories

    modifier onlyFactory() {
        require(_isFactory(msg.sender), 'only for factories');
        _;
    }

    function isFactory(address addr) external view returns (bool) {
        return _isFactory(addr);
    }

    function _isFactory(address addr) internal view returns (bool) {
        if (addr == address(this)) return true;
        return _factories[addr];
    }

    function addFactory(address factory) external onlyOwner {
        _factories[factory] = true;
    }

    function removeFactory(address factory) external onlyOwner {
        _factories[factory] = false;
    }

    function setFactories(address[] calldata addresses, bool isFactory_)
        external
        onlyOwner
    {
        uint256 len = addresses.length;
        for (uint256 i = 0; i < len; ++i) {
            _factories[addresses[i]] = isFactory_;
        }
    }
}

File 3 of 17 : ItemRef.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

/// @dev reference to the item
struct ItemRef {
    address addr; // referenced contract address
    uint256 id; // id of the item
}

File 4 of 17 : IPositionAlgorithm.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import './IAssetListener.sol';

interface IPositionAlgorithm is IAssetListener {
    /// @dev if asset can not be withdraw - revert
    function checkCanWithdraw(
        ItemRef calldata asset,
        uint256 assetCode,
        uint256 count
    ) external view;

    /// @dev if true than position is locked and can not withdraw
    function positionLocked(uint256 positionId) external view returns (bool);

    /// @dev locks the position
    /// only position owner
    function lockPosition(uint256 positionId, uint256 lockSeconds) external;
}

File 5 of 17 : IPositionsController.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import 'contracts/lib/factories/ContractData.sol';
import 'contracts/fee/IFeeSettings.sol';
import './AssetData.sol';
import './ItemRef.sol';
import './IAssetListener.sol';
import '../lib/factories/IHasFactories.sol';

interface IPositionsController is IHasFactories, IAssetListener {
    /// @dev new position created
    event NewPosition(
        address indexed account,
        address indexed algorithmAddress,
        uint256 positionId
    );

    /// @dev returns fee settings
    function getFeeSettings() external view returns (IFeeSettings);

    /// @dev creates a position
    /// @return id of new position
    /// @param owner the owner of the position
    /// only factory, only build mode
    function createPosition(address owner) external returns (uint256);

    /// @dev returns position data
    function getPosition(uint256 positionId)
        external
        view
        returns (
            address algorithm,
            AssetData memory asset1,
            AssetData memory asset2
        );

    /// @dev returns total positions count
    function positionsCount() external returns (uint256);

    /// @dev returns the position owner
    function ownerOf(uint256 positionId) external view returns (address);

    /// @dev returns an asset by its code in position 1 or 2
    function getAsset(uint256 positionId, uint256 assetCode)
        external
        view
        returns (AssetData memory data);

    /// @dev returns position assets references
    function getAllPositionAssetReferences(uint256 positionId)
        external
        view
        returns (ItemRef memory position1, ItemRef memory position2);

    /// @dev returns asset reference by its code in position 1 or 2
    function getAssetReference(uint256 positionId, uint256 assetCode)
        external
        view
        returns (ItemRef memory);

    /// @dev returns position of tne specific asset id
    function getAssetPositionId(uint256 assetId)
        external
        view
        returns (uint256);

    /// @dev creates an asset to position, generates asset reference
    /// @param positionId position ID
    /// @param assetCode asset code 1 - owner asset 2 - output asset
    /// @param assetsController reference to asset
    /// only factories, only build mode
    function createAsset(
        uint256 positionId,
        uint256 assetCode,
        address assetsController
    ) external returns (ItemRef memory);

    /// @dev sets the position algorithm
    /// id of algorithm is id of the position
    /// only factory, only build mode
    function setAlgorithm(uint256 positionId, address algorithmController)
        external;

    /// @dev returns the position algorithm contract
    function getAlgorithm(uint256 positionId) external view returns (address);

    /// @dev if true, than position in build mode
    function isBuildMode(uint256 positionId) external view returns (bool);

    /// @dev stops the position build mode
    /// onlyFactories, onlyBuildMode
    function stopBuild(uint256 positionId) external;

    /// @dev returns total assets count
    function assetsCount() external view returns (uint256);

    /// @dev returns new asset id and increments assetsCount
    /// only factories
    function createNewAssetId() external returns (uint256);

    /// @dev transfers caller asset to asset
    function transferToAsset(
        uint256 positionId,
        uint256 assetCode,
        uint256 count,
        uint256[] calldata data
    ) external payable returns (uint256 ethSurplus);

    /// @dev transfers to asset from account
    /// @dev returns ethereum surplus sent back to the sender
    /// onlyFactory
    function transferToAssetFrom(
        address from,
        uint256 positionId,
        uint256 assetCode,
        uint256 count,
        uint256[] calldata data
    ) external payable returns (uint256 ethSurplus);

    /// @dev withdraw asset by its position and code (makes all checks)
    /// only position owner
    function withdraw(
        uint256 positionId,
        uint256 assetCode,
        uint256 count
    ) external;

    /// @dev withdraws asset to specific address
    /// only position owner
    function withdrawTo(
        uint256 positionId,
        uint256 assetCode,
        address to,
        uint256 count
    ) external;

    /// @dev internal withdraw asset for algorithms
    /// oplyPositionAlgorithm
    function withdrawInternal(
        ItemRef calldata asset,
        address to,
        uint256 count
    ) external;

    /// @dev transfers asset to another same type asset
    /// oplyPositionAlgorithm
    function transferToAnotherAssetInternal(
        ItemRef calldata from,
        ItemRef calldata to,
        uint256 count
    ) external;

    /// @dev returns the count of the asset
    function count(ItemRef calldata asset) external view returns (uint256);

    /// @dev returns all counts of the position
    /// usefull for get snapshot for same algotithms
    function getCounts(uint256 positionId)
        external
        view
        returns (uint256, uint256);

    /// @dev if returns true than position is locked
    function positionLocked(uint256 positionId) external view returns (bool);
}

File 6 of 17 : IFeeSettings.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

interface IFeeSettings {
    function feeAddress() external returns (address); // address to pay fee

    function feePercent() external returns (uint256); // fee in 1/decimals for deviding values

    function feeDecimals() external view returns(uint256); // fee decimals

    function feeEth() external returns (uint256); // fee value for not dividing deal points
}

File 7 of 17 : ItemRefAsAssetLibrary.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import 'contracts/position_trading/ItemRef.sol';
import 'contracts/position_trading/IAssetsController.sol';

/// @dev item reference as asset wrapper functions
library ItemRefAsAssetLibrary {
    function assetsController(ItemRef memory ref)
        internal
        pure
        returns (IAssetsController)
    {
        return IAssetsController(ref.addr);
    }

    function assetTypeId(ItemRef memory ref) internal pure returns (uint256) {
        return assetsController(ref).assetTypeId();
    }

    function count(ItemRef memory ref) internal view returns (uint256) {
        return assetsController(ref).count(ref.id);
    }

    function addCount(ItemRef memory ref, uint256 countToAdd) internal {
        assetsController(ref).addCount(ref.id, countToAdd);
    }

    function removeCount(ItemRef memory ref, uint256 countToRemove) internal {
        assetsController(ref).removeCount(ref.id, countToRemove);
    }

    function withdraw(
        ItemRef memory ref,
        address recepient,
        uint256 cnt
    ) internal {
        assetsController(ref).withdraw(ref.id, recepient, cnt);
    }

    function getPositionId(ItemRef memory ref) internal view returns (uint256) {
        return assetsController(ref).getPositionId(ref.id);
    }

    function clone(ItemRef memory ref, address owner)
        internal
        returns (ItemRef memory)
    {
        return assetsController(ref).clone(ref.id, owner);
    }

    function setNotifyListener(ItemRef memory ref, bool value) internal {
        assetsController(ref).setNotifyListener(ref.id, value);
    }

    function initialize(
        ItemRef memory ref,
        address from,
        AssetCreationData calldata data
    ) internal {
        assetsController(ref).initialize(from, ref.id, data);
    }

    function getData(ItemRef memory ref)
        internal
        view
        returns (AssetData memory data)
    {
        return assetsController(ref).getData(ref.id);
    }

    function getCode(ItemRef memory ref) internal view returns (uint256) {
        return assetsController(ref).getCode(ref.id);
    }

    function contractAddr(ItemRef memory ref)
        internal
        view
        returns (address)
    {
        return assetsController(ref).contractAddr(ref.id);
    }
}

File 8 of 17 : AssetTransferData.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;
import './ItemRef.sol';

struct AssetTransferData {
    uint256 positionId;
    ItemRef asset;
    uint256 assetCode;
    address from;
    address to;
    uint256 count;
    uint256[] data;
}

File 9 of 17 : Ownable.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import './IOwnable.sol';

contract Ownable is IOwnable {
    address _owner;

    constructor() {
        _owner = msg.sender;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender, 'caller is not the owner');
        _;
    }

    function owner() external virtual view returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) external override onlyOwner {
        _owner = newOwner;
    }
}

File 10 of 17 : IHasFactories.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import '../ownable/IOwnable.sol';

interface IHasFactories is IOwnable {
    /// @dev returns true, if addres is factory
    function isFactory(address addr) external view returns (bool);

    /// @dev mark address as factory (only owner)
    function addFactory(address factory) external;

    /// @dev mark address as not factory (only owner)
    function removeFactory(address factory) external;

    /// @dev mark addresses as factory or not (only owner)
    function setFactories(address[] calldata addresses, bool isFactory_)
        external;
}

File 11 of 17 : IOwnable.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

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

    function transferOwnership(address newOwner) external;
}

File 12 of 17 : IAssetListener.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import 'contracts/position_trading/PositionSnapshot.sol';
import 'contracts/position_trading/AssetTransferData.sol';
import './ItemRef.sol';

interface IAssetListener {
    function beforeAssetTransfer(AssetTransferData calldata arg) external;

    function afterAssetTransfer(AssetTransferData calldata arg)
        external
        payable;
}

File 13 of 17 : PositionSnapshot.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

// todo cut out
struct PositionSnapshot {
    uint256 owner;
    uint256 output;
    uint256 slippage;
}

File 14 of 17 : ContractData.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

/// @dev data is generated by factory of contract
struct ContractData {
    address factory; // factory
    address contractAddr; // contract
}

File 15 of 17 : AssetData.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

/// @dev read only struct, represents asset
struct AssetData {
    address addr; // the asset contract address
    uint256 id; // asset id or zero if asset is not exists
    uint256 assetTypeId; // 1-eth 2-erc20 3-erc721Item 4-Erc721Count
    uint256 positionId;
    uint256 positionAssetCode; // code of the asset - 1 or 2
    address owner;
    uint256 count; // current count of the asset
    address contractAddr; // contract, using in asset  or zero if ether
    uint256 value; // extended asset value (nft id for example)
}

File 16 of 17 : IAssetsController.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

import './AssetData.sol';
import 'contracts/position_trading/ItemRef.sol';
import 'contracts/position_trading/AssetCreationData.sol';
import 'contracts/position_trading/AssetData.sol';
import 'contracts/position_trading/AssetTransferData.sol';

interface IAssetsController {
    /// @dev initializes the asset by its data
    /// onlyBuildMode
    function initialize(
        address from,
        uint256 assetId,
        AssetCreationData calldata data
    ) external payable returns (uint256 ethSurplus);

    /// @dev algorithm-controller address
    function algorithm(uint256 assetId) external view returns (address);

    /// @dev positions controller
    function positionsController() external view returns (address);

    /// @dev returns the asset type code (also used to check asset interface support)
    /// @return uint256 1-eth 2-erc20 3-erc721Item 4-Erc721Count
    function assetTypeId() external pure returns (uint256);

    /// @dev returns the position id by asset id
    function getPositionId(uint256 assetId) external view returns (uint256);

    /// @dev the algorithm of the asset that controls it
    function getAlgorithm(uint256 assetId)
        external
        view
        returns (address algorithm);

    /// @dev returns the asset code 1 or 2
    function getCode(uint256 assetId) external view returns (uint256);

    /// @dev asset count
    function count(uint256 assetId) external view returns (uint256);

    /// @dev external value of the asset (nft token id for example)
    function value(uint256 assetId) external view returns (uint256);

    /// @dev the address of the contract that is wrapped in the asset
    function contractAddr(uint256 assetId) external view returns (address);

    /// @dev returns the full assets data
    function getData(uint256 assetId) external view returns (AssetData memory);

    /// @dev withdraw the asset
    /// @param recepient recepient of asset
    /// @param count count to withdraw
    /// onlyPositionsController or algorithm
    function withdraw(
        uint256 assetId,
        address recepient,
        uint256 count
    ) external;

    /// @dev add count to asset
    /// onlyPositionsController
    function addCount(uint256 assetId, uint256 count) external;

    /// @dev remove asset count
    /// onlyPositionsController
    function removeCount(uint256 assetId, uint256 count) external;

    /// @dev transfers to current asset from specific account
    /// @dev returns ethereum surplus sent back to the sender
    /// onlyPositionsController
    function transferToAsset(AssetTransferData calldata arg)
        external
        payable
        returns (uint256 ethSurplus);

    /// @dev creates a copy of the current asset, with 0 count and the specified owner
    /// @return uint256 new asset reference
    function clone(uint256 assetId, address owner)
        external
        returns (ItemRef memory);

    /// @dev owner of the asset
    function owner(uint256 assetId) external view returns (address);

    /// @dev if true, then asset notifies its observer (owner)
    function isNotifyListener(uint256 assetId) external view returns (bool);

    /// @dev enables or disables the observer notification mechanism
    /// only factories
    function setNotifyListener(uint256 assetId, bool value) external;
}

File 17 of 17 : AssetCreationData.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.17;

/// @dev asset creation data
struct AssetCreationData {
    /// @dev asset codes:
    /// 0 - asset is missing
    /// 1 - EthAsset
    /// 2 - Erc20Asset
    /// 3 - Erc721ItemAsset
    uint256 assetTypeCode;
    address contractAddress;
    /// @dev value for asset creation (count or tokenId)
    uint256 value;
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"feeSettings_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"algorithmAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"NewPosition","type":"event"},{"inputs":[{"internalType":"address","name":"factory","type":"address"}],"name":"addFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"asset","type":"tuple"},{"internalType":"uint256","name":"assetCode","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256[]","name":"data","type":"uint256[]"}],"internalType":"struct AssetTransferData","name":"arg","type":"tuple"}],"name":"afterAssetTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"algorithms","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"asset","type":"tuple"},{"internalType":"uint256","name":"assetCode","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256[]","name":"data","type":"uint256[]"}],"internalType":"struct AssetTransferData","name":"arg","type":"tuple"}],"name":"beforeAssetTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"asset","type":"tuple"}],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"assetCode","type":"uint256"},{"internalType":"address","name":"assetsController","type":"address"}],"name":"createAsset","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createNewAssetId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"createPosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getAlgorithm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getAllPositionAssetReferences","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"position1","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"position2","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"assetCode","type":"uint256"}],"name":"getAsset","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"assetTypeId","type":"uint256"},{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"positionAssetCode","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct AssetData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetId","type":"uint256"}],"name":"getAssetPositionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"assetCode","type":"uint256"}],"name":"getAssetReference","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeSettings","outputs":[{"internalType":"contract IFeeSettings","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getPosition","outputs":[{"internalType":"address","name":"algorithm","type":"address"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"assetTypeId","type":"uint256"},{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"positionAssetCode","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct AssetData","name":"asset1","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"assetTypeId","type":"uint256"},{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"positionAssetCode","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct AssetData","name":"asset2","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"isBuildMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputAssets","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerAssets","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"positionLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"}],"name":"removeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"address","name":"algorithm","type":"address"}],"name":"setAlgorithm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isFactory_","type":"bool"}],"name":"setFactories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"stopBuild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"from","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"to","type":"tuple"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"transferToAnotherAssetInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"assetCode","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256[]","name":"data","type":"uint256[]"}],"name":"transferToAsset","outputs":[{"internalType":"uint256","name":"ethSurplus","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"assetCode","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256[]","name":"data","type":"uint256[]"}],"name":"transferToAssetFrom","outputs":[{"internalType":"uint256","name":"ethSurplus","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"assetCode","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct ItemRef","name":"asset","type":"tuple"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"withdrawInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"assetCode","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162002b9f38038062002b9f833981016040819052620000349162000068565b60008054336001600160a01b031991821617909155600280549091166001600160a01b03929092169190911790556200009a565b6000602082840312156200007b57600080fd5b81516001600160a01b03811681146200009357600080fd5b9392505050565b612af580620000aa6000396000f3fe60806040526004361061021d5760003560e01c80637818d48c11610123578063bbc6d73c116100ab578063eb02c3011161006f578063eb02c3011461071d578063f2fde38b1461074c578063f7e0ebf61461076c578063fdb159261461078c578063ff1b2bb41461082457600080fd5b8063bbc6d73c14610685578063cd9df19014610698578063ce3ee62c146106ad578063d93b080c146106dd578063e1dcaf77146106fd57600080fd5b8063a41fe49f116100f2578063a41fe49f146105f4578063acde933614610614578063aeadb8e014610627578063b0f164981461063c578063bad5fdb11461067257600080fd5b80637818d48c146105615780638da5cb5b14610581578063999518fa1461059f5780639d0f5450146105d457600080fd5b806329ce1ec5116101a6578063498e516511610175578063498e5165146104885780634b37c73f146104b55780636352211e146104d557806364d4058e1461050b57806374c895151461054157600080fd5b806329ce1ec5146104155780632b38400e146104355780632d70fc2d1461045357806335cbf96d1461047357600080fd5b80630f04ba67116101ed5780630f04ba671461033857806310a8042f1461036857806319b3e509146103a8578063257d2f9f146103c857806325fd9b17146103f557600080fd5b80621e728a14610229578063025e7c271461026957806308a8ce1f146102b75780630e0d6382146102d957600080fd5b3661022457005b600080fd5b34801561023557600080fd5b506102566102443660046121b1565b6000908152600a602052604090205490565b6040519081526020015b60405180910390f35b34801561027557600080fd5b5061029f6102843660046121b1565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610260565b3480156102c357600080fd5b506102d76102d2366004612224565b610844565b005b3480156102e557600080fd5b506103196102f43660046121b1565b600760205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b039093168352602083019190915201610260565b34801561034457600080fd5b5061035861035336600461229b565b6108ee565b6040519015158152602001610260565b34801561037457600080fd5b506103196103833660046121b1565b600660205260009081526040902080546001909101546001600160a01b039091169082565b3480156103b457600080fd5b506102d76103c33660046122b8565b6108ff565b3480156103d457600080fd5b506103e86103e33660046122e8565b610a01565b6040516102609190612372565b34801561040157600080fd5b506102d76104103660046121b1565b610a7f565b34801561042157600080fd5b506102d761043036600461229b565b610c19565b34801561044157600080fd5b506002546001600160a01b031661029f565b34801561045f57600080fd5b506102d761046e366004612381565b610c6a565b34801561047f57600080fd5b50610256610c7c565b34801561049457600080fd5b506104a86104a33660046123c0565b610cb0565b60405161026091906123ee565b3480156104c157600080fd5b506102d76104d036600461229b565b610df6565b3480156104e157600080fd5b5061029f6104f03660046121b1565b6000908152600560205260409020546001600160a01b031690565b34801561051757600080fd5b5061029f6105263660046121b1565b6000908152600860205260409020546001600160a01b031690565b34801561054d57600080fd5b506102d761055c366004612426565b610e41565b34801561056d57600080fd5b506104a861057c3660046122e8565b611167565b34801561058d57600080fd5b506000546001600160a01b031661029f565b3480156105ab57600080fd5b506105bf6105ba3660046121b1565b6111f5565b60408051928352602083019190915201610260565b3480156105e057600080fd5b506103586105ef3660046121b1565b6112a2565b34801561060057600080fd5b506102d761060f366004612464565b611389565b6102d7610622366004612490565b6113fd565b34801561063357600080fd5b50600354610256565b34801561064857600080fd5b5061029f6106573660046121b1565b6008602052600090815260409020546001600160a01b031681565b6102566106803660046124cc565b6114c4565b61025661069336600461252d565b6116cf565b3480156106a457600080fd5b50600454610256565b3480156106b957600080fd5b506103586106c83660046121b1565b60009081526009602052604090205460ff1690565b3480156106e957600080fd5b506102d76106f8366004612490565b611900565b34801561070957600080fd5b506102566107183660046125a0565b6119c4565b34801561072957600080fd5b5061073d6107383660046121b1565b6119d8565b604051610260939291906125bc565b34801561075857600080fd5b506102d761076736600461229b565b611b18565b34801561077857600080fd5b5061025661078736600461229b565b611b64565b34801561079857600080fd5b506108166107a73660046121b1565b604080518082018252600080825260209182018190528251808401845281815282018190529283526006815281832060078252928290208251808401845284546001600160a01b0390811682526001958601548285015284518086019095528254168452930154908201529091565b6040516102609291906125e8565b34801561083057600080fd5b506102d761083f366004612622565b611bea565b6000546001600160a01b031633146108775760405162461bcd60e51b815260040161086e90612662565b60405180910390fd5b8160005b818110156108e757826001600087878581811061089a5761089a612699565b90506020020160208101906108af919061229b565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108e0816126c5565b905061087b565b5050505050565b60006108f982611cc8565b92915050565b61090833611cc8565b6109245760405162461bcd60e51b815260040161086e906126de565b60405163338fb98b60e21b8152600481018390528290309063ce3ee62c90602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610986919061270a565b6109d25760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c7920666f7220706f736974696f6e206275696c64206d6f646500000000604482015260640161086e565b5060009182526008602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b610a0961214a565b604051631e06352360e21b81526004810184905260248101839052610a78903090637818d48c906044016040805180830381865afa158015610a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a73919061279b565b611d01565b9392505050565b610a8833611cc8565b610aa45760405162461bcd60e51b815260040161086e906126de565b60405163338fb98b60e21b8152600481018290528190309063ce3ee62c90602401602060405180830381865afa158015610ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b06919061270a565b610b525760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c7920666f7220706f736974696f6e206275696c64206d6f646500000000604482015260640161086e565b6000828152600860205260409020546001600160a01b031680610baa5760405162461bcd60e51b815260206004820152601060248201526f686173206e6f20616c676f726974686d60801b604482015260640161086e565b6000838152600960209081526040808320805460ff19169055600882528083205460058352928190205490518681526001600160a01b0393841693909116917f5bd5312e98e4e3c59594cdb0e3925ba1351628a2bef5c905af091d5370a86b6f910160405180910390a3505050565b6000546001600160a01b03163314610c435760405162461bcd60e51b815260040161086e90612662565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b610c7684848484611d7e565b50505050565b6000610c8733611cc8565b610ca35760405162461bcd60e51b815260040161086e906126de565b610cab611ee5565b905090565b6040805180820190915260008082526020820152610ccd33611cc8565b610ce95760405162461bcd60e51b815260040161086e906126de565b60006040518060400160405280846001600160a01b03168152602001610d0d611ee5565b90526020808201516000908152600a9091526040902086905590506001849003610d6d576000858152600660209081526040909120825181546001600160a01b0319166001600160a01b0390911617815590820151600190910155610dee565b83600203610db1576000858152600760209081526040909120825181546001600160a01b0319166001600160a01b0390911617815590820151600190910155610dee565b60405162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e20617373657420636f646560701b604482015260640161086e565b949350505050565b6000546001600160a01b03163314610e205760405162461bcd60e51b815260040161086e90612662565b6001600160a01b03166000908152600160205260409020805460ff19169055565b610e58610e53368590038501856127d5565b611f25565b60405163326a02c760e11b815260048101829052339030906364d4058e90602401602060405180830381865afa158015610e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eba919061280f565b6001600160a01b031614610f105760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c7920666f7220706f736974696f6e20616c676f746974686d0000000000604482015260640161086e565b610f27610f22368590038501856127d5565b611fa1565b610f39610f22368790038701876127d5565b14610f985760405162461bcd60e51b815260206004820152602960248201527f7472616e736665722066726f6d20617373657420746f206d7573742062652073604482015268616d6520747970657360b81b606482015260840161086e565b610faa610f22368590038501856127d5565b600203611134576000610fca610fc5368690038601866127d5565b611fe8565b6001600160a01b03166370a08231610fe5602087018761229b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611029573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104d919061282c565b905061107661105f602086018661229b565b8461106f368990038901896127d5565b9190612064565b61112e8161108c610fc5368890038801886127d5565b6001600160a01b03166370a082316110a7602089018961229b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110f919061282c565b6111199190612845565b611128368790038701876127d5565b906120a9565b50610c76565b611154611144602085018561229b565b8361106f368890038801886127d5565b610c7682611128368690038601866127d5565b6040805180820190915260008082526020820152816001036111b85750600082815260066020908152604091829020825180840190935280546001600160a01b0316835260010154908201526108f9565b81600203610db15750600082815260076020908152604091829020825180840190935280546001600160a01b0316835260010154908201526108f9565b604051631e06352360e21b81526004810182905260016024820152600090819061126a903090637818d48c906044015b6040805180830381865afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611265919061279b565b61210f565b604051631e06352360e21b81526004810185905260026024820152611299903090637818d48c90604401611225565b91509150915091565b60405163326a02c760e11b815260048101829052600090819030906364d4058e90602401602060405180830381865afa1580156112e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611307919061280f565b90506001600160a01b0381166113205750600092915050565b6040516309d0f54560e41b8152600481018490526001600160a01b03821690639d0f545090602401602060405180830381865afa158015611365573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a78919061270a565b60008381526005602052604090205483906001600160a01b031633146113f15760405162461bcd60e51b815260206004820152601760248201527f6f6e6c7920666f7220706f736974696f6e206f776e6572000000000000000000604482015260640161086e565b610c7684843385611d7e565b61140633611cc8565b6114225760405162461bcd60e51b815260040161086e906126de565b6000611439610e53368490038401602085016127d5565b6000818152600860205260409020549091506001600160a01b03168061145e57505050565b60405163566f499b60e11b81526001600160a01b0382169063acde933690349061148c9087906004016128d3565b6000604051808303818588803b1580156114a557600080fd5b505af11580156114b9573d6000803e3d6000fd5b505050505050505b50565b604051631e06352360e21b8152600481018690526024810185905260009081903090637818d48c906044016040805180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f919061279b565b905080600001516001600160a01b0316637303d7d3346040518060e001604052808b81526020018581526020018a8152602001336001600160a01b0316815260200185600001516001600160a01b0316815260200189815260200188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050509152506040516001600160e01b031960e085901b1681526115e0919060040161297f565b60206040518083038185885af11580156115fe573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611623919061282c565b915081156116c557604051600090339084908381818185875af1925050503d806000811461166d576040519150601f19603f3d011682016040523d82523d6000602084013e611672565b606091505b50509050806116c35760405162461bcd60e51b815260206004820152601c60248201527f657468657265756d20737572706c7573206973206e6f742073656e7400000000604482015260640161086e565b505b5095945050505050565b60006116da33611cc8565b6116f65760405162461bcd60e51b815260040161086e906126de565b604051631e06352360e21b815260048101879052602481018690526000903090637818d48c906044016040805180830381865afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f919061279b565b905080600001516001600160a01b0316637303d7d3346040518060e001604052808b81526020018581526020018a81526020018c6001600160a01b0316815260200185600001516001600160a01b0316815260200189815260200188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050509152506040516001600160e01b031960e085901b168152611810919060040161297f565b60206040518083038185885af115801561182e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611853919061282c565b915081156118f557604051600090339084908381818185875af1925050503d806000811461189d576040519150601f19603f3d011682016040523d82523d6000602084013e6118a2565b606091505b50509050806118f35760405162461bcd60e51b815260206004820152601c60248201527f657468657265756d20737572706c7573206973206e6f742073656e7400000000604482015260640161086e565b505b509695505050505050565b61190933611cc8565b6119255760405162461bcd60e51b815260040161086e906126de565b600061193c610e53368490038401602085016127d5565b6000818152600860205260409020549091506001600160a01b03168061196157505050565b60405163364ec20360e21b81526001600160a01b0382169063d93b080c9061198d9086906004016128d3565b600060405180830381600087803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b50505050505050565b60006108f9611265368490038401846127d5565b60006119e261214a565b6119ea61214a565b600084815260086020526040808220549051631e06352360e21b815260048101879052600160248201526001600160a01b0390911694503090637818d48c906044016040805180830381865afa158015611a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6c919061279b565b80519091506001600160a01b031615611a8b57611a8881611d01565b92505b604051631e06352360e21b815260048101869052600260248201523090637818d48c906044016040805180830381865afa158015611acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af1919061279b565b80519091506001600160a01b031615611b1057611b0d81611d01565b91505b509193909250565b6000546001600160a01b03163314611b425760405162461bcd60e51b815260040161086e90612662565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611b6f33611cc8565b611b8b5760405162461bcd60e51b815260040161086e906126de565b600360008154611b9a906126c5565b909155505060038054600090815260056020908152604080832080546001600160a01b0319166001600160a01b0387161790558354835260099091529020805460ff19166001179055545b919050565b611bfc610e53368590038501856127d5565b60405163326a02c760e11b815260048101829052339030906364d4058e90602401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e919061280f565b6001600160a01b031614611cb45760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c7920666f7220706f736974696f6e20616c676f746974686d0000000000604482015260640161086e565b610c76838361106f368890038801886127d5565b6000306001600160a01b03831603611ce257506001919050565b506001600160a01b031660009081526001602052604090205460ff1690565b611d0961214a565b81516001600160a01b0316630178fe3f83602001516040518263ffffffff1660e01b8152600401611d3c91815260200190565b61012060405180830381865afa158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190612a31565b60405163326a02c760e11b81526004810185905260009030906364d4058e90602401602060405180830381865afa158015611dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de1919061280f565b604051631e06352360e21b815260048101879052602481018690529091506000903090637818d48c906044016040805180830381865afa158015611e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4d919061279b565b90506001600160a01b03821615611ed257604051630ada20e960e21b815281516001600160a01b039081166004830152602083015160248301526044820187905260648201859052831690632b6883a49060840160006040518083038186803b158015611eb957600080fd5b505afa158015611ecd573d6000803e3d6000fd5b505050505b611edd818585612064565b505050505050565b6000611ef033611cc8565b611f0c5760405162461bcd60e51b815260040161086e906126de565b600460008154611f1b906126c5565b9182905550905090565b6000611f2f825190565b6001600160a01b03166385d19a2583602001516040518263ffffffff1660e01b8152600401611f6091815260200190565b602060405180830381865afa158015611f7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f9919061282c565b6000611fab825190565b6001600160a01b0316630b4e99c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f7d573d6000803e3d6000fd5b6000611ff2825190565b6001600160a01b031663ffcc44dd83602001516040518263ffffffff1660e01b815260040161202391815260200190565b602060405180830381865afa158015612040573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f9919061280f565b82516020840151604051631cc6d2f960e31b815260048101919091526001600160a01b038481166024830152604482018490529091169063e63697c89060640161198d565b81516020830151604051633eec831760e11b81526004810191909152602481018390526001600160a01b0390911690637dd9062e90604401600060405180830381600087803b1580156120fb57600080fd5b505af1158015611edd573d6000803e3d6000fd5b6000612119825190565b6001600160a01b0316633b3546c883602001516040518263ffffffff1660e01b8152600401611f6091815260200190565b60405180610120016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001600081525090565b6000602082840312156121c357600080fd5b5035919050565b60008083601f8401126121dc57600080fd5b50813567ffffffffffffffff8111156121f457600080fd5b6020830191508360208260051b850101111561220f57600080fd5b9250929050565b80151581146114c157600080fd5b60008060006040848603121561223957600080fd5b833567ffffffffffffffff81111561225057600080fd5b61225c868287016121ca565b909450925050602084013561227081612216565b809150509250925092565b6001600160a01b03811681146114c157600080fd5b8035611be58161227b565b6000602082840312156122ad57600080fd5b8135610a788161227b565b600080604083850312156122cb57600080fd5b8235915060208301356122dd8161227b565b809150509250929050565b600080604083850312156122fb57600080fd5b50508035926020909101359150565b60018060a01b03808251168352602082015160208401526040820151604084015260608201516060840152608082015160808401528060a08301511660a084015260c082015160c08401528060e08301511660e0840152506101008082015181840152505050565b61012081016108f9828461230a565b6000806000806080858703121561239757600080fd5b843593506020850135925060408501356123b08161227b565b9396929550929360600135925050565b6000806000606084860312156123d557600080fd5b833592506020840135915060408401356122708161227b565b81516001600160a01b0316815260208083015190820152604081016108f9565b60006040828403121561242057600080fd5b50919050565b600080600060a0848603121561243b57600080fd5b612445858561240e565b9250612454856040860161240e565b9150608084013590509250925092565b60008060006060848603121561247957600080fd5b505081359360208301359350604090920135919050565b6000602082840312156124a257600080fd5b813567ffffffffffffffff8111156124b957600080fd5b82016101008185031215610a7857600080fd5b6000806000806000608086880312156124e457600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff81111561251057600080fd5b61251c888289016121ca565b969995985093965092949392505050565b60008060008060008060a0878903121561254657600080fd5b86356125518161227b565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff81111561258257600080fd5b61258e89828a016121ca565b979a9699509497509295939492505050565b6000604082840312156125b257600080fd5b610a78838361240e565b6001600160a01b038416815261026081016125da602083018561230a565b610dee61014083018461230a565b82516001600160a01b03168152602080840151908201526080810182516001600160a01b0316604083015260208301516060830152610a78565b60008060006080848603121561263757600080fd5b612641858561240e565b925060408401356126518161227b565b929592945050506060919091013590565b60208082526017908201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016126d7576126d76126af565b5060010190565b6020808252601290820152716f6e6c7920666f7220666163746f7269657360701b604082015260600190565b60006020828403121561271c57600080fd5b8151610a7881612216565b6040805190810167ffffffffffffffff8111828210171561275857634e487b7160e01b600052604160045260246000fd5b60405290565b604051610120810167ffffffffffffffff8111828210171561275857634e487b7160e01b600052604160045260246000fd5b8051611be58161227b565b6000604082840312156127ad57600080fd5b6127b5612727565b82516127c08161227b565b81526020928301519281019290925250919050565b6000604082840312156127e757600080fd5b6127ef612727565b82356127fa8161227b565b81526020928301359281019290925250919050565b60006020828403121561282157600080fd5b8151610a788161227b565b60006020828403121561283e57600080fd5b5051919050565b818103818111156108f9576108f96126af565b6000808335601e1984360301811261286f57600080fd5b830160208101925035905067ffffffffffffffff81111561288f57600080fd5b8060051b360382131561220f57600080fd5b81835260006001600160fb1b038311156128ba57600080fd5b8260051b80836020870137939093016020019392505050565b6020815281356020820152600060208301356128ee8161227b565b60018060a01b038116604084015250604083013560608301526060830135608083015261291d60808401612290565b6001600160a01b03811660a08401525061293960a08401612290565b6001600160a01b03811660c08401525060c083013560e083015261296060e0840184612858565b61010084810152612976610120850182846128a1565b95945050505050565b600060208083526101208301845182850152818501516129b5604086018280516001600160a01b03168252602090810151910152565b50604085015160808581019190915260608601516001600160a01b0390811660a080880191909152918701511660c0808701919091529086015160e0860152850151610100808601528051918290528201906000906101408601905b808310156118f55783518252928401926001929092019190840190612a11565b60006101208284031215612a4457600080fd5b612a4c61275e565b612a5583612790565b815260208301516020820152604083015160408201526060830151606082015260808301516080820152612a8b60a08401612790565b60a082015260c083015160c0820152612aa660e08401612790565b60e082015261010092830151928101929092525091905056fea2646970667358221220b41657f8bdc3a7b22b47e37ed89e67ef6e19f4cc69cf8c0ec70895d18066558364736f6c6343000811003300000000000000000000000037510211032c82e6ffe134768aaad360e8b9c71d

Deployed Bytecode

0x60806040526004361061021d5760003560e01c80637818d48c11610123578063bbc6d73c116100ab578063eb02c3011161006f578063eb02c3011461071d578063f2fde38b1461074c578063f7e0ebf61461076c578063fdb159261461078c578063ff1b2bb41461082457600080fd5b8063bbc6d73c14610685578063cd9df19014610698578063ce3ee62c146106ad578063d93b080c146106dd578063e1dcaf77146106fd57600080fd5b8063a41fe49f116100f2578063a41fe49f146105f4578063acde933614610614578063aeadb8e014610627578063b0f164981461063c578063bad5fdb11461067257600080fd5b80637818d48c146105615780638da5cb5b14610581578063999518fa1461059f5780639d0f5450146105d457600080fd5b806329ce1ec5116101a6578063498e516511610175578063498e5165146104885780634b37c73f146104b55780636352211e146104d557806364d4058e1461050b57806374c895151461054157600080fd5b806329ce1ec5146104155780632b38400e146104355780632d70fc2d1461045357806335cbf96d1461047357600080fd5b80630f04ba67116101ed5780630f04ba671461033857806310a8042f1461036857806319b3e509146103a8578063257d2f9f146103c857806325fd9b17146103f557600080fd5b80621e728a14610229578063025e7c271461026957806308a8ce1f146102b75780630e0d6382146102d957600080fd5b3661022457005b600080fd5b34801561023557600080fd5b506102566102443660046121b1565b6000908152600a602052604090205490565b6040519081526020015b60405180910390f35b34801561027557600080fd5b5061029f6102843660046121b1565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610260565b3480156102c357600080fd5b506102d76102d2366004612224565b610844565b005b3480156102e557600080fd5b506103196102f43660046121b1565b600760205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b039093168352602083019190915201610260565b34801561034457600080fd5b5061035861035336600461229b565b6108ee565b6040519015158152602001610260565b34801561037457600080fd5b506103196103833660046121b1565b600660205260009081526040902080546001909101546001600160a01b039091169082565b3480156103b457600080fd5b506102d76103c33660046122b8565b6108ff565b3480156103d457600080fd5b506103e86103e33660046122e8565b610a01565b6040516102609190612372565b34801561040157600080fd5b506102d76104103660046121b1565b610a7f565b34801561042157600080fd5b506102d761043036600461229b565b610c19565b34801561044157600080fd5b506002546001600160a01b031661029f565b34801561045f57600080fd5b506102d761046e366004612381565b610c6a565b34801561047f57600080fd5b50610256610c7c565b34801561049457600080fd5b506104a86104a33660046123c0565b610cb0565b60405161026091906123ee565b3480156104c157600080fd5b506102d76104d036600461229b565b610df6565b3480156104e157600080fd5b5061029f6104f03660046121b1565b6000908152600560205260409020546001600160a01b031690565b34801561051757600080fd5b5061029f6105263660046121b1565b6000908152600860205260409020546001600160a01b031690565b34801561054d57600080fd5b506102d761055c366004612426565b610e41565b34801561056d57600080fd5b506104a861057c3660046122e8565b611167565b34801561058d57600080fd5b506000546001600160a01b031661029f565b3480156105ab57600080fd5b506105bf6105ba3660046121b1565b6111f5565b60408051928352602083019190915201610260565b3480156105e057600080fd5b506103586105ef3660046121b1565b6112a2565b34801561060057600080fd5b506102d761060f366004612464565b611389565b6102d7610622366004612490565b6113fd565b34801561063357600080fd5b50600354610256565b34801561064857600080fd5b5061029f6106573660046121b1565b6008602052600090815260409020546001600160a01b031681565b6102566106803660046124cc565b6114c4565b61025661069336600461252d565b6116cf565b3480156106a457600080fd5b50600454610256565b3480156106b957600080fd5b506103586106c83660046121b1565b60009081526009602052604090205460ff1690565b3480156106e957600080fd5b506102d76106f8366004612490565b611900565b34801561070957600080fd5b506102566107183660046125a0565b6119c4565b34801561072957600080fd5b5061073d6107383660046121b1565b6119d8565b604051610260939291906125bc565b34801561075857600080fd5b506102d761076736600461229b565b611b18565b34801561077857600080fd5b5061025661078736600461229b565b611b64565b34801561079857600080fd5b506108166107a73660046121b1565b604080518082018252600080825260209182018190528251808401845281815282018190529283526006815281832060078252928290208251808401845284546001600160a01b0390811682526001958601548285015284518086019095528254168452930154908201529091565b6040516102609291906125e8565b34801561083057600080fd5b506102d761083f366004612622565b611bea565b6000546001600160a01b031633146108775760405162461bcd60e51b815260040161086e90612662565b60405180910390fd5b8160005b818110156108e757826001600087878581811061089a5761089a612699565b90506020020160208101906108af919061229b565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108e0816126c5565b905061087b565b5050505050565b60006108f982611cc8565b92915050565b61090833611cc8565b6109245760405162461bcd60e51b815260040161086e906126de565b60405163338fb98b60e21b8152600481018390528290309063ce3ee62c90602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610986919061270a565b6109d25760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c7920666f7220706f736974696f6e206275696c64206d6f646500000000604482015260640161086e565b5060009182526008602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b610a0961214a565b604051631e06352360e21b81526004810184905260248101839052610a78903090637818d48c906044016040805180830381865afa158015610a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a73919061279b565b611d01565b9392505050565b610a8833611cc8565b610aa45760405162461bcd60e51b815260040161086e906126de565b60405163338fb98b60e21b8152600481018290528190309063ce3ee62c90602401602060405180830381865afa158015610ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b06919061270a565b610b525760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c7920666f7220706f736974696f6e206275696c64206d6f646500000000604482015260640161086e565b6000828152600860205260409020546001600160a01b031680610baa5760405162461bcd60e51b815260206004820152601060248201526f686173206e6f20616c676f726974686d60801b604482015260640161086e565b6000838152600960209081526040808320805460ff19169055600882528083205460058352928190205490518681526001600160a01b0393841693909116917f5bd5312e98e4e3c59594cdb0e3925ba1351628a2bef5c905af091d5370a86b6f910160405180910390a3505050565b6000546001600160a01b03163314610c435760405162461bcd60e51b815260040161086e90612662565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b610c7684848484611d7e565b50505050565b6000610c8733611cc8565b610ca35760405162461bcd60e51b815260040161086e906126de565b610cab611ee5565b905090565b6040805180820190915260008082526020820152610ccd33611cc8565b610ce95760405162461bcd60e51b815260040161086e906126de565b60006040518060400160405280846001600160a01b03168152602001610d0d611ee5565b90526020808201516000908152600a9091526040902086905590506001849003610d6d576000858152600660209081526040909120825181546001600160a01b0319166001600160a01b0390911617815590820151600190910155610dee565b83600203610db1576000858152600760209081526040909120825181546001600160a01b0319166001600160a01b0390911617815590820151600190910155610dee565b60405162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e20617373657420636f646560701b604482015260640161086e565b949350505050565b6000546001600160a01b03163314610e205760405162461bcd60e51b815260040161086e90612662565b6001600160a01b03166000908152600160205260409020805460ff19169055565b610e58610e53368590038501856127d5565b611f25565b60405163326a02c760e11b815260048101829052339030906364d4058e90602401602060405180830381865afa158015610e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eba919061280f565b6001600160a01b031614610f105760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c7920666f7220706f736974696f6e20616c676f746974686d0000000000604482015260640161086e565b610f27610f22368590038501856127d5565b611fa1565b610f39610f22368790038701876127d5565b14610f985760405162461bcd60e51b815260206004820152602960248201527f7472616e736665722066726f6d20617373657420746f206d7573742062652073604482015268616d6520747970657360b81b606482015260840161086e565b610faa610f22368590038501856127d5565b600203611134576000610fca610fc5368690038601866127d5565b611fe8565b6001600160a01b03166370a08231610fe5602087018761229b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611029573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104d919061282c565b905061107661105f602086018661229b565b8461106f368990038901896127d5565b9190612064565b61112e8161108c610fc5368890038801886127d5565b6001600160a01b03166370a082316110a7602089018961229b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110f919061282c565b6111199190612845565b611128368790038701876127d5565b906120a9565b50610c76565b611154611144602085018561229b565b8361106f368890038801886127d5565b610c7682611128368690038601866127d5565b6040805180820190915260008082526020820152816001036111b85750600082815260066020908152604091829020825180840190935280546001600160a01b0316835260010154908201526108f9565b81600203610db15750600082815260076020908152604091829020825180840190935280546001600160a01b0316835260010154908201526108f9565b604051631e06352360e21b81526004810182905260016024820152600090819061126a903090637818d48c906044015b6040805180830381865afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611265919061279b565b61210f565b604051631e06352360e21b81526004810185905260026024820152611299903090637818d48c90604401611225565b91509150915091565b60405163326a02c760e11b815260048101829052600090819030906364d4058e90602401602060405180830381865afa1580156112e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611307919061280f565b90506001600160a01b0381166113205750600092915050565b6040516309d0f54560e41b8152600481018490526001600160a01b03821690639d0f545090602401602060405180830381865afa158015611365573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a78919061270a565b60008381526005602052604090205483906001600160a01b031633146113f15760405162461bcd60e51b815260206004820152601760248201527f6f6e6c7920666f7220706f736974696f6e206f776e6572000000000000000000604482015260640161086e565b610c7684843385611d7e565b61140633611cc8565b6114225760405162461bcd60e51b815260040161086e906126de565b6000611439610e53368490038401602085016127d5565b6000818152600860205260409020549091506001600160a01b03168061145e57505050565b60405163566f499b60e11b81526001600160a01b0382169063acde933690349061148c9087906004016128d3565b6000604051808303818588803b1580156114a557600080fd5b505af11580156114b9573d6000803e3d6000fd5b505050505050505b50565b604051631e06352360e21b8152600481018690526024810185905260009081903090637818d48c906044016040805180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f919061279b565b905080600001516001600160a01b0316637303d7d3346040518060e001604052808b81526020018581526020018a8152602001336001600160a01b0316815260200185600001516001600160a01b0316815260200189815260200188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050509152506040516001600160e01b031960e085901b1681526115e0919060040161297f565b60206040518083038185885af11580156115fe573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611623919061282c565b915081156116c557604051600090339084908381818185875af1925050503d806000811461166d576040519150601f19603f3d011682016040523d82523d6000602084013e611672565b606091505b50509050806116c35760405162461bcd60e51b815260206004820152601c60248201527f657468657265756d20737572706c7573206973206e6f742073656e7400000000604482015260640161086e565b505b5095945050505050565b60006116da33611cc8565b6116f65760405162461bcd60e51b815260040161086e906126de565b604051631e06352360e21b815260048101879052602481018690526000903090637818d48c906044016040805180830381865afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f919061279b565b905080600001516001600160a01b0316637303d7d3346040518060e001604052808b81526020018581526020018a81526020018c6001600160a01b0316815260200185600001516001600160a01b0316815260200189815260200188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050509152506040516001600160e01b031960e085901b168152611810919060040161297f565b60206040518083038185885af115801561182e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611853919061282c565b915081156118f557604051600090339084908381818185875af1925050503d806000811461189d576040519150601f19603f3d011682016040523d82523d6000602084013e6118a2565b606091505b50509050806118f35760405162461bcd60e51b815260206004820152601c60248201527f657468657265756d20737572706c7573206973206e6f742073656e7400000000604482015260640161086e565b505b509695505050505050565b61190933611cc8565b6119255760405162461bcd60e51b815260040161086e906126de565b600061193c610e53368490038401602085016127d5565b6000818152600860205260409020549091506001600160a01b03168061196157505050565b60405163364ec20360e21b81526001600160a01b0382169063d93b080c9061198d9086906004016128d3565b600060405180830381600087803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b50505050505050565b60006108f9611265368490038401846127d5565b60006119e261214a565b6119ea61214a565b600084815260086020526040808220549051631e06352360e21b815260048101879052600160248201526001600160a01b0390911694503090637818d48c906044016040805180830381865afa158015611a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6c919061279b565b80519091506001600160a01b031615611a8b57611a8881611d01565b92505b604051631e06352360e21b815260048101869052600260248201523090637818d48c906044016040805180830381865afa158015611acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af1919061279b565b80519091506001600160a01b031615611b1057611b0d81611d01565b91505b509193909250565b6000546001600160a01b03163314611b425760405162461bcd60e51b815260040161086e90612662565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611b6f33611cc8565b611b8b5760405162461bcd60e51b815260040161086e906126de565b600360008154611b9a906126c5565b909155505060038054600090815260056020908152604080832080546001600160a01b0319166001600160a01b0387161790558354835260099091529020805460ff19166001179055545b919050565b611bfc610e53368590038501856127d5565b60405163326a02c760e11b815260048101829052339030906364d4058e90602401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e919061280f565b6001600160a01b031614611cb45760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c7920666f7220706f736974696f6e20616c676f746974686d0000000000604482015260640161086e565b610c76838361106f368890038801886127d5565b6000306001600160a01b03831603611ce257506001919050565b506001600160a01b031660009081526001602052604090205460ff1690565b611d0961214a565b81516001600160a01b0316630178fe3f83602001516040518263ffffffff1660e01b8152600401611d3c91815260200190565b61012060405180830381865afa158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190612a31565b60405163326a02c760e11b81526004810185905260009030906364d4058e90602401602060405180830381865afa158015611dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de1919061280f565b604051631e06352360e21b815260048101879052602481018690529091506000903090637818d48c906044016040805180830381865afa158015611e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4d919061279b565b90506001600160a01b03821615611ed257604051630ada20e960e21b815281516001600160a01b039081166004830152602083015160248301526044820187905260648201859052831690632b6883a49060840160006040518083038186803b158015611eb957600080fd5b505afa158015611ecd573d6000803e3d6000fd5b505050505b611edd818585612064565b505050505050565b6000611ef033611cc8565b611f0c5760405162461bcd60e51b815260040161086e906126de565b600460008154611f1b906126c5565b9182905550905090565b6000611f2f825190565b6001600160a01b03166385d19a2583602001516040518263ffffffff1660e01b8152600401611f6091815260200190565b602060405180830381865afa158015611f7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f9919061282c565b6000611fab825190565b6001600160a01b0316630b4e99c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f7d573d6000803e3d6000fd5b6000611ff2825190565b6001600160a01b031663ffcc44dd83602001516040518263ffffffff1660e01b815260040161202391815260200190565b602060405180830381865afa158015612040573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f9919061280f565b82516020840151604051631cc6d2f960e31b815260048101919091526001600160a01b038481166024830152604482018490529091169063e63697c89060640161198d565b81516020830151604051633eec831760e11b81526004810191909152602481018390526001600160a01b0390911690637dd9062e90604401600060405180830381600087803b1580156120fb57600080fd5b505af1158015611edd573d6000803e3d6000fd5b6000612119825190565b6001600160a01b0316633b3546c883602001516040518263ffffffff1660e01b8152600401611f6091815260200190565b60405180610120016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001600081525090565b6000602082840312156121c357600080fd5b5035919050565b60008083601f8401126121dc57600080fd5b50813567ffffffffffffffff8111156121f457600080fd5b6020830191508360208260051b850101111561220f57600080fd5b9250929050565b80151581146114c157600080fd5b60008060006040848603121561223957600080fd5b833567ffffffffffffffff81111561225057600080fd5b61225c868287016121ca565b909450925050602084013561227081612216565b809150509250925092565b6001600160a01b03811681146114c157600080fd5b8035611be58161227b565b6000602082840312156122ad57600080fd5b8135610a788161227b565b600080604083850312156122cb57600080fd5b8235915060208301356122dd8161227b565b809150509250929050565b600080604083850312156122fb57600080fd5b50508035926020909101359150565b60018060a01b03808251168352602082015160208401526040820151604084015260608201516060840152608082015160808401528060a08301511660a084015260c082015160c08401528060e08301511660e0840152506101008082015181840152505050565b61012081016108f9828461230a565b6000806000806080858703121561239757600080fd5b843593506020850135925060408501356123b08161227b565b9396929550929360600135925050565b6000806000606084860312156123d557600080fd5b833592506020840135915060408401356122708161227b565b81516001600160a01b0316815260208083015190820152604081016108f9565b60006040828403121561242057600080fd5b50919050565b600080600060a0848603121561243b57600080fd5b612445858561240e565b9250612454856040860161240e565b9150608084013590509250925092565b60008060006060848603121561247957600080fd5b505081359360208301359350604090920135919050565b6000602082840312156124a257600080fd5b813567ffffffffffffffff8111156124b957600080fd5b82016101008185031215610a7857600080fd5b6000806000806000608086880312156124e457600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff81111561251057600080fd5b61251c888289016121ca565b969995985093965092949392505050565b60008060008060008060a0878903121561254657600080fd5b86356125518161227b565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff81111561258257600080fd5b61258e89828a016121ca565b979a9699509497509295939492505050565b6000604082840312156125b257600080fd5b610a78838361240e565b6001600160a01b038416815261026081016125da602083018561230a565b610dee61014083018461230a565b82516001600160a01b03168152602080840151908201526080810182516001600160a01b0316604083015260208301516060830152610a78565b60008060006080848603121561263757600080fd5b612641858561240e565b925060408401356126518161227b565b929592945050506060919091013590565b60208082526017908201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016126d7576126d76126af565b5060010190565b6020808252601290820152716f6e6c7920666f7220666163746f7269657360701b604082015260600190565b60006020828403121561271c57600080fd5b8151610a7881612216565b6040805190810167ffffffffffffffff8111828210171561275857634e487b7160e01b600052604160045260246000fd5b60405290565b604051610120810167ffffffffffffffff8111828210171561275857634e487b7160e01b600052604160045260246000fd5b8051611be58161227b565b6000604082840312156127ad57600080fd5b6127b5612727565b82516127c08161227b565b81526020928301519281019290925250919050565b6000604082840312156127e757600080fd5b6127ef612727565b82356127fa8161227b565b81526020928301359281019290925250919050565b60006020828403121561282157600080fd5b8151610a788161227b565b60006020828403121561283e57600080fd5b5051919050565b818103818111156108f9576108f96126af565b6000808335601e1984360301811261286f57600080fd5b830160208101925035905067ffffffffffffffff81111561288f57600080fd5b8060051b360382131561220f57600080fd5b81835260006001600160fb1b038311156128ba57600080fd5b8260051b80836020870137939093016020019392505050565b6020815281356020820152600060208301356128ee8161227b565b60018060a01b038116604084015250604083013560608301526060830135608083015261291d60808401612290565b6001600160a01b03811660a08401525061293960a08401612290565b6001600160a01b03811660c08401525060c083013560e083015261296060e0840184612858565b61010084810152612976610120850182846128a1565b95945050505050565b600060208083526101208301845182850152818501516129b5604086018280516001600160a01b03168252602090810151910152565b50604085015160808581019190915260608601516001600160a01b0390811660a080880191909152918701511660c0808701919091529086015160e0860152850151610100808601528051918290528201906000906101408601905b808310156118f55783518252928401926001929092019190840190612a11565b60006101208284031215612a4457600080fd5b612a4c61275e565b612a5583612790565b815260208301516020820152604083015160408201526060830151606082015260808301516080820152612a8b60a08401612790565b60a082015260c083015160c0820152612aa660e08401612790565b60e082015261010092830151928101929092525091905056fea2646970667358221220b41657f8bdc3a7b22b47e37ed89e67ef6e19f4cc69cf8c0ec70895d18066558364736f6c63430008110033

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

00000000000000000000000037510211032c82e6ffe134768aaad360e8b9c71d

-----Decoded View---------------
Arg [0] : feeSettings_ (address): 0x37510211032c82E6fFe134768AAad360e8B9C71D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000037510211032c82e6ffe134768aaad360e8b9c71d


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  ]
[ 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.