ETH Price: $2,693.82 (-6.56%)
Gas: 1.6 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Factories155617512022-09-18 16:54:59870 days ago1663520099IN
0x272671CB...b9de0Bf9e
0 ETH0.003706922.91562881

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
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 10 : PositionsController.sol
pragma solidity ^0.8.17;
import '../lib/factories/HasFactories.sol';
//import '../lib/factories/ContractData.sol';
import 'contracts/interfaces/position_trading/IPositionAlgorithm.sol';
import 'contracts/interfaces/position_trading/IPositionsController.sol';
import 'contracts/fee/IFeeSettings.sol';

contract PositionsController is
    HasFactories,
    IPositionsController,
    IAssetListener
{
    IFeeSettings feeSettings;
    uint256 public totalPositions; // total positions created
    mapping(uint256 => address) public owners; // position owners
    mapping(uint256 => ContractData) public ownerAssets; // owner's asset (what is offered)
    mapping(uint256 => ContractData) public outputAssets; // output asset (what they want in return), may be absent, in case of locks
    mapping(uint256 => ContractData) public algorithms; // algorithm for processing the input and output asset
    mapping(uint256 => bool) public editingLocks; // locks on editing positions
    mapping(address => mapping(uint256 => uint256)) _ownedPositions; // indexed from position 0 for each account
    mapping(uint256 => uint256) _ownedPositionsIndex; // mapping from position ID to index in owner list
    mapping(address => uint256) _positionCountsByAccounts; // counts of positions by account
    mapping(address => uint256) _positionsByAssets; // asset positions

    event NewPosition(address indexed account, uint256 indexed positionId);
    event SetPositionAlgorithm(uint256 indexed positionId, ContractData data);
    event TransferPositionOwnership(
        uint256 indexed positionId,
        address lastOwner,
        address newOwner
    );

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

    modifier positionUnLocked(uint256 positionId) {
        require(!editingLocks[positionId], 'position editing is locked');
        ContractData memory data = algorithms[positionId];
        if (data.contractAddr != address(0)) {
            require(
                !IPositionAlgorithm(data.contractAddr).isPositionLocked(
                    positionId
                ),
                'position algogithm is not allowed to edit position'
            );
        }
        _;
    }

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

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

    function positionOfOwnerByIndex(address account, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < _positionCountsByAccounts[account],
            'account positions index out of bounds'
        );
        return _ownedPositions[account][index];
    }

    function _addPositionToOwnerEnumeration(address to, uint256 positionId)
        private
    {
        uint256 length = _positionCountsByAccounts[to];
        _ownedPositions[to][length] = positionId;
        _ownedPositionsIndex[positionId] = length;
    }

    function _removePositionFromOwnerEnumeration(
        address from,
        uint256 positionId
    ) private {
        uint256 lastPositionIndex = _positionCountsByAccounts[from] - 1;
        uint256 positionIndex = _ownedPositionsIndex[positionId];

        // When the position to delete is the last posiiton, the swap operation is unnecessary
        if (positionIndex != lastPositionIndex) {
            uint256 lastPositionId = _ownedPositions[from][lastPositionIndex];

            _ownedPositions[from][positionIndex] = lastPositionId; // Move the last position to the slot of the to-delete token
            _ownedPositionsIndex[lastPositionId] = positionIndex; // Update the moved position's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedPositionsIndex[positionId];
        delete _ownedPositions[from][lastPositionIndex];
    }

    function transferPositionOwnership(uint256 positionId, address newOwner)
        external
        onlyPositionOwner(positionId)
    {
        _removePositionFromOwnerEnumeration(msg.sender, positionId);
        _addPositionToOwnerEnumeration(newOwner, positionId);
        --_positionCountsByAccounts[msg.sender];
        ++_positionCountsByAccounts[newOwner];
        owners[positionId] = newOwner;
        emit TransferPositionOwnership(positionId, msg.sender, newOwner);
    }

    function ownedPositionsCount(address account)
        external
        view
        override
        returns (uint256)
    {
        return _positionCountsByAccounts[account];
    }

    function getAssetPositionId(address assetAddress)
        external
        view
        virtual
        override
        returns (uint256)
    {
        return _positionsByAssets[assetAddress];
    }

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

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

    function createPosition() external override {
        ++totalPositions;
        owners[totalPositions] = msg.sender;
        _addPositionToOwnerEnumeration(msg.sender, totalPositions);
        _positionCountsByAccounts[msg.sender]++;
        emit NewPosition(msg.sender, totalPositions);
    }

    function setAsset(
        uint256 positionId,
        uint256 assetCode,
        ContractData calldata data
    ) external override onlyFactory positionUnLocked(positionId) {
        if (assetCode == 1) {
            delete _positionsByAssets[ownerAssets[positionId].contractAddr];
            ownerAssets[positionId] = data;
        } else if (assetCode == 2) {
            delete _positionsByAssets[outputAssets[positionId].contractAddr];
            outputAssets[positionId] = data;
        } else revert('unknown asset code');
        _positionsByAssets[data.contractAddr] = positionId;
        trySetAssetOwnershipToAlgorithm(positionId, data);
    }

    function trySetAssetOwnershipToAlgorithm(
        uint256 positionId,
        ContractData calldata assetData
    ) internal {
        if (algorithms[positionId].contractAddr != address(0))
            IOwnable(assetData.contractAddr).transferOwnership(
                algorithms[positionId].contractAddr
            );
    }

    function setAlgorithm(uint256 positionId, ContractData calldata algData)
        external
        override
        onlyFactory
        positionUnLocked(positionId)
    {
        // if there is already an algorithm, then transfer the asset ownership to the current controller or to a new algorithm
        // owner's asset
        if (ownerAssets[positionId].contractAddr != address(0)) {
            if (algorithms[positionId].contractAddr != address(0)) {
                IPositionAlgorithm(algorithms[positionId].contractAddr)
                    .transferAssetOwnerShipTo(
                        ownerAssets[positionId].contractAddr,
                        algData.contractAddr != address(0)
                            ? algData.contractAddr
                            : address(this)
                    );
            } else {
                IOwnable(ownerAssets[positionId].contractAddr)
                    .transferOwnership(algData.contractAddr);
            }
        }
        // output asset
        if (outputAssets[positionId].contractAddr != address(0)) {
            if (algorithms[positionId].contractAddr != address(0)) {
                IPositionAlgorithm(algorithms[positionId].contractAddr)
                    .transferAssetOwnerShipTo(
                        outputAssets[positionId].contractAddr,
                        algData.contractAddr != address(0)
                            ? algData.contractAddr
                            : address(this)
                    );
            } else {
                IOwnable(outputAssets[positionId].contractAddr)
                    .transferOwnership(algData.contractAddr);
            }
        }

        // set a new algorithm
        algorithms[positionId] = algData;

        emit SetPositionAlgorithm(positionId, algData);
    }

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

    function disableEdit(uint256 positionId)
        external
        override
        onlyPositionOwner(positionId)
        positionUnLocked(positionId)
    {
        editingLocks[positionId] = false;
    }

    function beforeAssetTransfer(
        address asset,
        address from,
        address to,
        uint256 amount,
        uint256[] memory data
    ) external pure override {
        revert('has no algorithm');
    }

    function afterAssetTransfer(
        address asset,
        address from,
        address to,
        uint256 amount,
        uint256[] memory data
    ) external pure override {
        revert('has no algorithm');
    }
}

File 2 of 10 : HasFactories.sol
pragma solidity ^0.8.17;
import '../ownable/Ownable.sol';

abstract contract HasFactories is Ownable {
    mapping(address => bool) factories; // factories

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

    function addFactory(address factory) public onlyOwner {
        factories[factory] = true;
    }

    function removeFactory(address factory) public onlyOwner {
        factories[factory] = false;
    }

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

File 3 of 10 : IPositionAlgorithm.sol
pragma solidity ^0.8.17;
import 'contracts/interfaces/assets/IAssetListener.sol';

interface IPositionAlgorithm is IAssetListener {
    /// @dev if true, the algorithm locks position editing
    function isPositionLocked(uint256 positionId) external view returns (bool);

    /// @dev transfers ownership of the asset to the specified address
    function transferAssetOwnerShipTo(address asset, address newOwner) external;
}

File 4 of 10 : IPositionsController.sol
pragma solidity ^0.8.17;
import 'contracts/lib/factories/ContractData.sol';
import 'contracts/fee/IFeeSettings.sol';

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

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

    /// @dev changes position owner
    function transferPositionOwnership(uint256 positionId, address newOwner)
        external;

    /// @dev returns the position of the asset to its address
    function getAssetPositionId(address assetAddress)
        external
        view
        returns (uint256);

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

    /// @dev creates a position
    function createPosition() external;

    /// @dev sets an asset to position
    /// @param positionId position ID
    /// @param assetCode asset code 1 - owner asset 2 - output asset
    /// @param data asset contract data
    function setAsset(
        uint256 positionId,
        uint256 assetCode,
        ContractData calldata data
    ) external;

    /// @dev sets the position algorithm
    function setAlgorithm(uint256 positionId, ContractData calldata data)
        external;

    /// @dev returns the position algorithm
    function getAlgorithm(uint256 positionId)
        external
        view
        returns (ContractData memory data);

    /// @dev disables position editing
    function disableEdit(uint256 positionId) external;

    /// @dev returns position from the account's list of positions
    function positionOfOwnerByIndex(address account, uint256 index)
        external
        view
        returns (uint256);

    /// @dev returns the number of positions the account owns
    function ownedPositionsCount(address account)
        external
        view
        returns (uint256);
}

File 5 of 10 : IFeeSettings.sol
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 6 of 10 : Ownable.sol
pragma solidity ^0.8.17;
import 'contracts/interfaces/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 override returns (address) {
        return _owner;
    }

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

File 7 of 10 : IOwnable.sol
pragma solidity ^0.8.17;
interface IOwnable {
    function owner() external returns (address);

    function transferOwnership(address newOwner) external;
}

File 8 of 10 : IAssetListener.sol
pragma solidity ^0.8.17;
import 'contracts/position_trading/PositionSnapshot.sol';

interface IAssetListener {
    function beforeAssetTransfer(
        address asset,
        address from,
        address to,
        uint256 amount,
        uint256[] memory data
    ) external;

    function afterAssetTransfer(
        address asset,
        address from,
        address to,
        uint256 amount,
        uint256[] memory data
    ) external;
}

File 9 of 10 : PositionSnapshot.sol
pragma solidity ^0.8.17;
// todo cut out
struct PositionSnapshot {
    uint256 owner;
    uint256 output;
    uint256 slippage;
}

File 10 of 10 : ContractData.sol
pragma solidity ^0.8.17;
/// @dev data is generated by factory of contract
struct ContractData {
    address factory; // factory
    address contractAddr; // contract
}

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":"uint256","name":"positionId","type":"uint256"}],"name":"NewPosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"positionId","type":"uint256"},{"components":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"contractAddr","type":"address"}],"indexed":false,"internalType":"struct ContractData","name":"data","type":"tuple"}],"name":"SetPositionAlgorithm","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"positionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"lastOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferPositionOwnership","type":"event"},{"inputs":[{"internalType":"address","name":"factory","type":"address"}],"name":"addFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"data","type":"uint256[]"}],"name":"afterAssetTransfer","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"algorithms","outputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"contractAddr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"data","type":"uint256[]"}],"name":"beforeAssetTransfer","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"createPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"disableEdit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"editingLocks","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getAlgorithm","outputs":[{"components":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"contractAddr","type":"address"}],"internalType":"struct ContractData","name":"data","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":"factory","type":"address"},{"internalType":"address","name":"contractAddr","type":"address"}],"internalType":"struct ContractData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"getAssetPositionId","outputs":[{"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":"","type":"uint256"}],"name":"outputAssets","outputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"contractAddr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ownedPositionsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerAssets","outputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"contractAddr","type":"address"}],"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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"positionOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"}],"name":"removeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"components":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"contractAddr","type":"address"}],"internalType":"struct ContractData","name":"algData","type":"tuple"}],"name":"setAlgorithm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"assetCode","type":"uint256"},{"components":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"contractAddr","type":"address"}],"internalType":"struct ContractData","name":"data","type":"tuple"}],"name":"setAsset","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":[],"name":"totalPositions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferPositionOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5060405161196838038061196883398101604081905261002f91610062565b60008054336001600160a01b031991821617909155600280549091166001600160a01b0392909216919091179055610092565b60006020828403121561007457600080fd5b81516001600160a01b038116811461008b57600080fd5b9392505050565b6118c7806100a16000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80634b37c73f116100de5780639e6f300111610097578063bcfe0c5311610071578063bcfe0c531461045b578063f2fde38b1461046e578063f485e89114610481578063fda1fa5f146104b457600080fd5b80639e6f300114610414578063b0f1649814610427578063b4e4b1a21461033f57600080fd5b80634b37c73f146103525780636352211e1461036557806364d4058e1461038e5780638da5cb5b146103e85780639ab89f48146103f95780639cdbfbc11461040157600080fd5b8063264dd24c11610130578063264dd24c146102cc57806329ce1ec5146102f55780632b38400e146103085780633be9df4d146103195780633ebf3a6d1461032c5780634268660a1461033f57600080fd5b8063025e7c271461017857806308a8ce1f146101be5780630e0d6382146101d357806310a8042f1461022757806311ef94a01461025b578063257d2f9f14610292575b600080fd5b6101a16101863660046113ba565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d16101cc3660046113e4565b6104bd565b005b6102076101e13660046113ba565b600660205260009081526040902080546001909101546001600160a01b03918216911682565b604080516001600160a01b039384168152929091166020830152016101b5565b6102076102353660046113ba565b600560205260009081526040902080546001909101546001600160a01b03918216911682565b61028461026936600461147f565b6001600160a01b03166000908152600c602052604090205490565b6040519081526020016101b5565b6102a56102a03660046114a3565b610567565b6040805182516001600160a01b0390811682526020938401511692810192909252016101b5565b6102846102da36600461147f565b6001600160a01b03166000908152600b602052604090205490565b6101d161030336600461147f565b610642565b6002546001600160a01b03166101a1565b6101d16103273660046114dd565b610693565b6101d161033a366004611513565b6108a8565b6101d161034d366004611559565b6109d2565b6101d161036036600461147f565b610a0d565b6101a16103733660046113ba565b6000908152600460205260409020546001600160a01b031690565b6102a561039c3660046113ba565b604080518082019091526000808252602082015250600090815260076020908152604091829020825180840190935280546001600160a01b039081168452600190910154169082015290565b6000546001600160a01b03166101a1565b6101d1610a58565b61028461040f36600461165b565b610aec565b6101d16104223660046113ba565b610b8a565b6102076104353660046113ba565b600760205260009081526040902080546001909101546001600160a01b03918216911682565b6101d1610469366004611687565b610cff565b6101d161047c36600461147f565b6111e4565b6104a461048f3660046113ba565b60086020526000908152604090205460ff1681565b60405190151581526020016101b5565b61028460035481565b6000546001600160a01b031633146104f05760405162461bcd60e51b81526004016104e7906116b4565b60405180910390fd5b8160005b81811015610560578260016000878785818110610513576105136116eb565b9050602002016020810190610528919061147f565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561055981611717565b90506104f4565b5050505050565b6040805180820190915260008082526020820152816001036105bd5750600082815260056020908152604091829020825180840190935280546001600160a01b039081168452600190910154169082015261063c565b816002036105ff5750600082815260066020908152604091829020825180840190935280546001600160a01b039081168452600190910154169082015261063c565b60405162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e20617373657420636f646560701b60448201526064016104e7565b92915050565b6000546001600160a01b0316331461066c5760405162461bcd60e51b81526004016104e7906116b4565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b3360009081526001602052604090205460ff166106e75760405162461bcd60e51b81526020600482015260126024820152716f6e6c7920666f7220666163746f7269657360701b60448201526064016104e7565b600083815260086020526040902054839060ff16156107185760405162461bcd60e51b81526004016104e790611730565b600081815260076020908152604091829020825180840190935280546001600160a01b03908116845260019091015416908201819052156107df57602081015160405163f3ec358160e01b8152600481018490526001600160a01b039091169063f3ec358190602401602060405180830381865afa15801561079e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c29190611767565b156107df5760405162461bcd60e51b81526004016104e790611784565b8360010361082b57600085815260056020818152604080842060018101546001600160a01b03168552600c83529084208490559288905252839061082382826117f6565b90505061086f565b836002036105ff57600085815260066020818152604080842060018101546001600160a01b03168552600c83529084208490559288905252839061082382826117f6565b84600c6000610884604087016020880161147f565b6001600160a01b031681526020810191909152604001600020556105608584611230565b60008281526004602052604090205482906001600160a01b0316331461090a5760405162461bcd60e51b815260206004820152601760248201527637b7363c903337b9103837b9b4ba34b7b71037bbb732b960491b60448201526064016104e7565b61091433846112d3565b61091e828461137e565b336000908152600b60205260408120805490919061093b9061182c565b909155506001600160a01b0382166000908152600b60205260408120805490919061096590611717565b9091555060008381526004602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915582513381529182015284917f1a4a83da0a65d7e56d279b0b618914bc4ef6f4153bce22e58a1d0d941267d512910160405180910390a2505050565b60405162461bcd60e51b815260206004820152601060248201526f686173206e6f20616c676f726974686d60801b60448201526064016104e7565b6000546001600160a01b03163314610a375760405162461bcd60e51b81526004016104e7906116b4565b6001600160a01b03166000908152600160205260409020805460ff19169055565b600360008154610a6790611717565b9091555060038054600090815260046020526040902080546001600160a01b031916339081179091559054610a9c919061137e565b336000908152600b60205260408120805491610ab783611717565b909155505060035460405133907fd4c1b45f1ec09667398d1c934903dcd7200052bb709fc1c29089fab30717b30290600090a3565b6001600160a01b0382166000908152600b60205260408120548210610b615760405162461bcd60e51b815260206004820152602560248201527f6163636f756e7420706f736974696f6e7320696e646578206f7574206f6620626044820152646f756e647360d81b60648201526084016104e7565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b60008181526004602052604090205481906001600160a01b03163314610bec5760405162461bcd60e51b815260206004820152601760248201527637b7363c903337b9103837b9b4ba34b7b71037bbb732b960491b60448201526064016104e7565b600082815260086020526040902054829060ff1615610c1d5760405162461bcd60e51b81526004016104e790611730565b600081815260076020908152604091829020825180840190935280546001600160a01b0390811684526001909101541690820181905215610ce457602081015160405163f3ec358160e01b8152600481018490526001600160a01b039091169063f3ec358190602401602060405180830381865afa158015610ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc79190611767565b15610ce45760405162461bcd60e51b81526004016104e790611784565b5050506000908152600860205260409020805460ff19169055565b3360009081526001602052604090205460ff16610d535760405162461bcd60e51b81526020600482015260126024820152716f6e6c7920666f7220666163746f7269657360701b60448201526064016104e7565b600082815260086020526040902054829060ff1615610d845760405162461bcd60e51b81526004016104e790611730565b600081815260076020908152604091829020825180840190935280546001600160a01b0390811684526001909101541690820181905215610e4b57602081015160405163f3ec358160e01b8152600481018490526001600160a01b039091169063f3ec358190602401602060405180830381865afa158015610e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2e9190611767565b15610e4b5760405162461bcd60e51b81526004016104e790611784565b6000848152600560205260409020600101546001600160a01b031615610fea576000848152600760205260409020600101546001600160a01b031615610f5c57600084815260076020908152604080832060019081015460058452828520909101546001600160a01b039182169463cc6a7e2b949190921692610ed39190890190890161147f565b6001600160a01b031603610ee75730610ef7565b610ef7604087016020880161147f565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b158015610f3f57600080fd5b505af1158015610f53573d6000803e3d6000fd5b50505050610fea565b600084815260056020908152604091829020600101546001600160a01b03169163f2fde38b91610f9091870190870161147f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b505050505b6000848152600660205260409020600101546001600160a01b031615611189576000848152600760205260409020600101546001600160a01b0316156110fb57600084815260076020908152604080832060019081015460068452828520909101546001600160a01b039182169463cc6a7e2b9491909216926110729190890190890161147f565b6001600160a01b0316036110865730611096565b611096604087016020880161147f565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b1580156110de57600080fd5b505af11580156110f2573d6000803e3d6000fd5b50505050611189565b600084815260066020908152604091829020600101546001600160a01b03169163f2fde38b9161112f91870190870161147f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561117057600080fd5b505af1158015611184573d6000803e3d6000fd5b505050505b600084815260076020526040902083906111a382826117f6565b905050837f2130f7bfb7023f9ac15124ce386b28bdea72cdf64f45545327afe8801b9caa32846040516111d69190611843565b60405180910390a250505050565b6000546001600160a01b0316331461120e5760405162461bcd60e51b81526004016104e7906116b4565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600760205260409020600101546001600160a01b0316156112cf57611260604082016020830161147f565b6000838152600760205260409081902060010154905163f2fde38b60e01b81526001600160a01b03918216600482015291169063f2fde38b90602401600060405180830381600087803b1580156112b657600080fd5b505af11580156112ca573d6000803e3d6000fd5b505050505b5050565b6001600160a01b0382166000908152600b60205260408120546112f89060019061187e565b6000838152600a602052604090205490915080821461134b576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b6001600160a01b039091166000908152600b6020908152604080832054600983528184208185528352818420859055938352600a909152902055565b6000602082840312156113cc57600080fd5b5035919050565b80151581146113e157600080fd5b50565b6000806000604084860312156113f957600080fd5b833567ffffffffffffffff8082111561141157600080fd5b818601915086601f83011261142557600080fd5b81358181111561143457600080fd5b8760208260051b850101111561144957600080fd5b6020928301955093505084013561145f816113d3565b809150509250925092565b6001600160a01b03811681146113e157600080fd5b60006020828403121561149157600080fd5b813561149c8161146a565b9392505050565b600080604083850312156114b657600080fd5b50508035926020909101359150565b6000604082840312156114d757600080fd5b50919050565b6000806000608084860312156114f257600080fd5b833592506020840135915061150a85604086016114c5565b90509250925092565b6000806040838503121561152657600080fd5b8235915060208301356115388161146a565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080600060a0868803121561157157600080fd5b853561157c8161146a565b945060208681013561158d8161146a565b9450604087013561159d8161146a565b935060608701359250608087013567ffffffffffffffff808211156115c157600080fd5b818901915089601f8301126115d557600080fd5b8135818111156115e7576115e7611543565b8060051b604051601f19603f8301168101818110858211171561160c5761160c611543565b60405291825284820192508381018501918c83111561162a57600080fd5b938501935b828510156116485784358452938501939285019261162f565b8096505050505050509295509295909350565b6000806040838503121561166e57600080fd5b82356116798161146a565b946020939093013593505050565b6000806060838503121561169a57600080fd5b823591506116ab84602085016114c5565b90509250929050565b60208082526017908201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161172957611729611701565b5060010190565b6020808252601a908201527f706f736974696f6e2065646974696e67206973206c6f636b6564000000000000604082015260600190565b60006020828403121561177957600080fd5b815161149c816113d3565b60208082526032908201527f706f736974696f6e20616c676f676974686d206973206e6f7420616c6c6f776560408201527132103a379032b234ba103837b9b4ba34b7b760711b606082015260800190565b80546001600160a01b0319166001600160a01b0392909216919091179055565b81356118018161146a565b61180b81836117d6565b50602082013561181a8161146a565b61182781600184016117d6565b505050565b60008161183b5761183b611701565b506000190190565b6040810182356118528161146a565b6001600160a01b03908116835260208401359061186e8261146a565b8082166020850152505092915050565b8181038181111561063c5761063c61170156fea26469706673582212204ea3b0d8b608133f4de600c3ec30274b66533542a6231b7816e05b367af701fc64736f6c634300081100330000000000000000000000004097836d3cae060fb8a54cfe3d74f91d46d5cc5c

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80634b37c73f116100de5780639e6f300111610097578063bcfe0c5311610071578063bcfe0c531461045b578063f2fde38b1461046e578063f485e89114610481578063fda1fa5f146104b457600080fd5b80639e6f300114610414578063b0f1649814610427578063b4e4b1a21461033f57600080fd5b80634b37c73f146103525780636352211e1461036557806364d4058e1461038e5780638da5cb5b146103e85780639ab89f48146103f95780639cdbfbc11461040157600080fd5b8063264dd24c11610130578063264dd24c146102cc57806329ce1ec5146102f55780632b38400e146103085780633be9df4d146103195780633ebf3a6d1461032c5780634268660a1461033f57600080fd5b8063025e7c271461017857806308a8ce1f146101be5780630e0d6382146101d357806310a8042f1461022757806311ef94a01461025b578063257d2f9f14610292575b600080fd5b6101a16101863660046113ba565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d16101cc3660046113e4565b6104bd565b005b6102076101e13660046113ba565b600660205260009081526040902080546001909101546001600160a01b03918216911682565b604080516001600160a01b039384168152929091166020830152016101b5565b6102076102353660046113ba565b600560205260009081526040902080546001909101546001600160a01b03918216911682565b61028461026936600461147f565b6001600160a01b03166000908152600c602052604090205490565b6040519081526020016101b5565b6102a56102a03660046114a3565b610567565b6040805182516001600160a01b0390811682526020938401511692810192909252016101b5565b6102846102da36600461147f565b6001600160a01b03166000908152600b602052604090205490565b6101d161030336600461147f565b610642565b6002546001600160a01b03166101a1565b6101d16103273660046114dd565b610693565b6101d161033a366004611513565b6108a8565b6101d161034d366004611559565b6109d2565b6101d161036036600461147f565b610a0d565b6101a16103733660046113ba565b6000908152600460205260409020546001600160a01b031690565b6102a561039c3660046113ba565b604080518082019091526000808252602082015250600090815260076020908152604091829020825180840190935280546001600160a01b039081168452600190910154169082015290565b6000546001600160a01b03166101a1565b6101d1610a58565b61028461040f36600461165b565b610aec565b6101d16104223660046113ba565b610b8a565b6102076104353660046113ba565b600760205260009081526040902080546001909101546001600160a01b03918216911682565b6101d1610469366004611687565b610cff565b6101d161047c36600461147f565b6111e4565b6104a461048f3660046113ba565b60086020526000908152604090205460ff1681565b60405190151581526020016101b5565b61028460035481565b6000546001600160a01b031633146104f05760405162461bcd60e51b81526004016104e7906116b4565b60405180910390fd5b8160005b81811015610560578260016000878785818110610513576105136116eb565b9050602002016020810190610528919061147f565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561055981611717565b90506104f4565b5050505050565b6040805180820190915260008082526020820152816001036105bd5750600082815260056020908152604091829020825180840190935280546001600160a01b039081168452600190910154169082015261063c565b816002036105ff5750600082815260066020908152604091829020825180840190935280546001600160a01b039081168452600190910154169082015261063c565b60405162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e20617373657420636f646560701b60448201526064016104e7565b92915050565b6000546001600160a01b0316331461066c5760405162461bcd60e51b81526004016104e7906116b4565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b3360009081526001602052604090205460ff166106e75760405162461bcd60e51b81526020600482015260126024820152716f6e6c7920666f7220666163746f7269657360701b60448201526064016104e7565b600083815260086020526040902054839060ff16156107185760405162461bcd60e51b81526004016104e790611730565b600081815260076020908152604091829020825180840190935280546001600160a01b03908116845260019091015416908201819052156107df57602081015160405163f3ec358160e01b8152600481018490526001600160a01b039091169063f3ec358190602401602060405180830381865afa15801561079e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c29190611767565b156107df5760405162461bcd60e51b81526004016104e790611784565b8360010361082b57600085815260056020818152604080842060018101546001600160a01b03168552600c83529084208490559288905252839061082382826117f6565b90505061086f565b836002036105ff57600085815260066020818152604080842060018101546001600160a01b03168552600c83529084208490559288905252839061082382826117f6565b84600c6000610884604087016020880161147f565b6001600160a01b031681526020810191909152604001600020556105608584611230565b60008281526004602052604090205482906001600160a01b0316331461090a5760405162461bcd60e51b815260206004820152601760248201527637b7363c903337b9103837b9b4ba34b7b71037bbb732b960491b60448201526064016104e7565b61091433846112d3565b61091e828461137e565b336000908152600b60205260408120805490919061093b9061182c565b909155506001600160a01b0382166000908152600b60205260408120805490919061096590611717565b9091555060008381526004602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915582513381529182015284917f1a4a83da0a65d7e56d279b0b618914bc4ef6f4153bce22e58a1d0d941267d512910160405180910390a2505050565b60405162461bcd60e51b815260206004820152601060248201526f686173206e6f20616c676f726974686d60801b60448201526064016104e7565b6000546001600160a01b03163314610a375760405162461bcd60e51b81526004016104e7906116b4565b6001600160a01b03166000908152600160205260409020805460ff19169055565b600360008154610a6790611717565b9091555060038054600090815260046020526040902080546001600160a01b031916339081179091559054610a9c919061137e565b336000908152600b60205260408120805491610ab783611717565b909155505060035460405133907fd4c1b45f1ec09667398d1c934903dcd7200052bb709fc1c29089fab30717b30290600090a3565b6001600160a01b0382166000908152600b60205260408120548210610b615760405162461bcd60e51b815260206004820152602560248201527f6163636f756e7420706f736974696f6e7320696e646578206f7574206f6620626044820152646f756e647360d81b60648201526084016104e7565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b60008181526004602052604090205481906001600160a01b03163314610bec5760405162461bcd60e51b815260206004820152601760248201527637b7363c903337b9103837b9b4ba34b7b71037bbb732b960491b60448201526064016104e7565b600082815260086020526040902054829060ff1615610c1d5760405162461bcd60e51b81526004016104e790611730565b600081815260076020908152604091829020825180840190935280546001600160a01b0390811684526001909101541690820181905215610ce457602081015160405163f3ec358160e01b8152600481018490526001600160a01b039091169063f3ec358190602401602060405180830381865afa158015610ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc79190611767565b15610ce45760405162461bcd60e51b81526004016104e790611784565b5050506000908152600860205260409020805460ff19169055565b3360009081526001602052604090205460ff16610d535760405162461bcd60e51b81526020600482015260126024820152716f6e6c7920666f7220666163746f7269657360701b60448201526064016104e7565b600082815260086020526040902054829060ff1615610d845760405162461bcd60e51b81526004016104e790611730565b600081815260076020908152604091829020825180840190935280546001600160a01b0390811684526001909101541690820181905215610e4b57602081015160405163f3ec358160e01b8152600481018490526001600160a01b039091169063f3ec358190602401602060405180830381865afa158015610e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2e9190611767565b15610e4b5760405162461bcd60e51b81526004016104e790611784565b6000848152600560205260409020600101546001600160a01b031615610fea576000848152600760205260409020600101546001600160a01b031615610f5c57600084815260076020908152604080832060019081015460058452828520909101546001600160a01b039182169463cc6a7e2b949190921692610ed39190890190890161147f565b6001600160a01b031603610ee75730610ef7565b610ef7604087016020880161147f565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b158015610f3f57600080fd5b505af1158015610f53573d6000803e3d6000fd5b50505050610fea565b600084815260056020908152604091829020600101546001600160a01b03169163f2fde38b91610f9091870190870161147f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b505050505b6000848152600660205260409020600101546001600160a01b031615611189576000848152600760205260409020600101546001600160a01b0316156110fb57600084815260076020908152604080832060019081015460068452828520909101546001600160a01b039182169463cc6a7e2b9491909216926110729190890190890161147f565b6001600160a01b0316036110865730611096565b611096604087016020880161147f565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b1580156110de57600080fd5b505af11580156110f2573d6000803e3d6000fd5b50505050611189565b600084815260066020908152604091829020600101546001600160a01b03169163f2fde38b9161112f91870190870161147f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561117057600080fd5b505af1158015611184573d6000803e3d6000fd5b505050505b600084815260076020526040902083906111a382826117f6565b905050837f2130f7bfb7023f9ac15124ce386b28bdea72cdf64f45545327afe8801b9caa32846040516111d69190611843565b60405180910390a250505050565b6000546001600160a01b0316331461120e5760405162461bcd60e51b81526004016104e7906116b4565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600760205260409020600101546001600160a01b0316156112cf57611260604082016020830161147f565b6000838152600760205260409081902060010154905163f2fde38b60e01b81526001600160a01b03918216600482015291169063f2fde38b90602401600060405180830381600087803b1580156112b657600080fd5b505af11580156112ca573d6000803e3d6000fd5b505050505b5050565b6001600160a01b0382166000908152600b60205260408120546112f89060019061187e565b6000838152600a602052604090205490915080821461134b576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b6001600160a01b039091166000908152600b6020908152604080832054600983528184208185528352818420859055938352600a909152902055565b6000602082840312156113cc57600080fd5b5035919050565b80151581146113e157600080fd5b50565b6000806000604084860312156113f957600080fd5b833567ffffffffffffffff8082111561141157600080fd5b818601915086601f83011261142557600080fd5b81358181111561143457600080fd5b8760208260051b850101111561144957600080fd5b6020928301955093505084013561145f816113d3565b809150509250925092565b6001600160a01b03811681146113e157600080fd5b60006020828403121561149157600080fd5b813561149c8161146a565b9392505050565b600080604083850312156114b657600080fd5b50508035926020909101359150565b6000604082840312156114d757600080fd5b50919050565b6000806000608084860312156114f257600080fd5b833592506020840135915061150a85604086016114c5565b90509250925092565b6000806040838503121561152657600080fd5b8235915060208301356115388161146a565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080600060a0868803121561157157600080fd5b853561157c8161146a565b945060208681013561158d8161146a565b9450604087013561159d8161146a565b935060608701359250608087013567ffffffffffffffff808211156115c157600080fd5b818901915089601f8301126115d557600080fd5b8135818111156115e7576115e7611543565b8060051b604051601f19603f8301168101818110858211171561160c5761160c611543565b60405291825284820192508381018501918c83111561162a57600080fd5b938501935b828510156116485784358452938501939285019261162f565b8096505050505050509295509295909350565b6000806040838503121561166e57600080fd5b82356116798161146a565b946020939093013593505050565b6000806060838503121561169a57600080fd5b823591506116ab84602085016114c5565b90509250929050565b60208082526017908201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161172957611729611701565b5060010190565b6020808252601a908201527f706f736974696f6e2065646974696e67206973206c6f636b6564000000000000604082015260600190565b60006020828403121561177957600080fd5b815161149c816113d3565b60208082526032908201527f706f736974696f6e20616c676f676974686d206973206e6f7420616c6c6f776560408201527132103a379032b234ba103837b9b4ba34b7b760711b606082015260800190565b80546001600160a01b0319166001600160a01b0392909216919091179055565b81356118018161146a565b61180b81836117d6565b50602082013561181a8161146a565b61182781600184016117d6565b505050565b60008161183b5761183b611701565b506000190190565b6040810182356118528161146a565b6001600160a01b03908116835260208401359061186e8261146a565b8082166020850152505092915050565b8181038181111561063c5761063c61170156fea26469706673582212204ea3b0d8b608133f4de600c3ec30274b66533542a6231b7816e05b367af701fc64736f6c63430008110033

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

0000000000000000000000004097836d3cae060fb8a54cfe3d74f91d46d5cc5c

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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004097836d3cae060fb8a54cfe3d74f91d46d5cc5c


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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