Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x14094949152EDDBFcd073717200DA82fEd8dC960
Balance 0 ETH
Nonce 1
Code Size 2582 bytes
Last Active
Indexed Transactions 5 (10,617,98210,619,423)
Gas Used (indexed) 336,818
External Etherscan · Sourcify

Contract Bytecode

2582 bytes
0x6080604052600436106101815760003560e01c80637866c6c1116100d1578063995363d31161008a578063dd62ed3e11610064578063dd62ed3e14610547578063f2fde38b14610582578063fbd9574d146105b5578063fe0563421461060157610181565b8063995363d3146104f35780639b3a54d114610508578063d84d2a471461053257610181565b80637866c6c11461043d578063797bf3851461048a578063894ca3081461049f5780638da5cb5b146104b457806395d89b41146104c957806396c7871b146104de57610181565b80632515aacd1161013e5780634780eac1116101185780634780eac11461038f57806370a08231146103c0578063736ee3d3146103f3578063776d1a011461040857610181565b80632515aacd146102f2578063313ce5671461034f578063330691ac1461037a57610181565b806306fdde03146101ed5780630c4925fd1461027757806318160ddd1461029e5780631d0806ae146102b35780631f68f20a146102c857806320f6d07c146102dd575b601c5460408051602036601f81018290048202830182019093528282526001600160a01b039093169260609260009181908401838280828437600092018290525084519495509384935091505060208401855af43d604051816000823e8280156101e9578282f35b8282fd5b3480156101f957600080fd5b5061020261062b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023c578181015183820152602001610224565b50505050905090810190601f1680156102695780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028357600080fd5b5061028c6106b6565b60408051918252519081900360200190f35b3480156102aa57600080fd5b5061028c6106bc565b3480156102bf57600080fd5b5061028c6106c2565b3480156102d457600080fd5b5061028c6106c8565b3480156102e957600080fd5b5061028c6106ce565b3480156102fe57600080fd5b5061031c6004803603602081101561031557600080fd5b50356106d4565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561035b57600080fd5b50610364610709565b6040805160ff9092168252519081900360200190f35b34801561038657600080fd5b5061028c610712565b34801561039b57600080fd5b506103a4610718565b604080516001600160a01b039092168252519081900360200190f35b3480156103cc57600080fd5b5061028c600480360360208110156103e357600080fd5b50356001600160a01b0316610727565b3480156103ff57600080fd5b506103a4610742565b34801561041457600080fd5b5061043b6004803603602081101561042b57600080fd5b50356001600160a01b0316610756565b005b34801561044957600080fd5b506104676004803603602081101561046057600080fd5b5035610779565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561049657600080fd5b506103a46107ae565b3480156104ab57600080fd5b506103a46107bd565b3480156104c057600080fd5b506103a46107cc565b3480156104d557600080fd5b506102026107db565b3480156104ea57600080fd5b506103a4610836565b3480156104ff57600080fd5b506103a4610845565b34801561051457600080fd5b5061028c6004803603602081101561052b57600080fd5b5035610859565b34801561053e57600080fd5b5061028c610877565b34801561055357600080fd5b5061028c6004803603604081101561056a57600080fd5b506001600160a01b038135811691602001351661087d565b34801561058e57600080fd5b5061043b600480360360208110156105a557600080fd5b50356001600160a01b03166108a8565b3480156105c157600080fd5b506105e8600480360360208110156105d857600080fd5b50356001600160a01b03166108c8565b6040805192835290151560208301528051918290030190f35b34801561060d57600080fd5b5061028c6004803603602081101561062457600080fd5b50356108e4565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156106ae5780601f10610683576101008083540402835291602001916106ae565b820191906000526020600020905b81548152906001019060200180831161069157829003601f168201915b505050505081565b60135481565b601b5490565b60185481565b600b5481565b60155481565b600f60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b60045460ff1681565b600c5481565b6007546001600160a01b031681565b6001600160a01b031660009081526019602052604090205490565b600a5461010090046001600160a01b031681565b6001546001600160a01b0316331461076d57600080fd5b610776816108f6565b50565b6011818154811061078657fe5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b6008546001600160a01b031681565b6005546001600160a01b031681565b6001546001600160a01b031681565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106ae5780601f10610683576101008083540402835291602001916106ae565b6006546001600160a01b031681565b60045461010090046001600160a01b031681565b6010818154811061086657fe5b600091825260209091200154905081565b600d5481565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b6001546001600160a01b031633146108bf57600080fd5b61077681610975565b6012602052600090815260409020805460019091015460ff1682565b600e6020526000908152604090205481565b6108ff816109e4565b6109535760408051600160e51b62461bcd02815260206004820152601560248201527f746172676574206e6f74206120636f6e74726163740000000000000000000000604482015290519081900360640190fd5b601c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661098857600080fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b3b15159056fea165627a7a723058208c31930370b9c7e30822ed6d45e4affdd3e7c4a5a7fe620cfb6ef4c9d0ca6db00029

Verified Source Code Partial Match

Compiler: v0.5.8+commit.23d335f2 EVM: petersburg Optimization: Yes (200 runs)
LoanToken.sol 390 lines
/**
 * Copyright 2017-2019, bZeroX, LLC. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0.
 */
 
pragma solidity 0.5.8;


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address _who) public view returns (uint256);
  function transfer(address _to, uint256 _value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

contract WETHInterface is ERC20 {
    function deposit() external payable;
    function withdraw(uint256 wad) external;
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Integer division of two numbers, rounding up and truncating the quotient
  */
  function divCeil(uint256 _a, uint256 _b) internal pure returns (uint256) {
    if (_a == 0) {
      return 0;
    }

    return ((_a - 1) / _b) + 1;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

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

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {

  /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs.
  /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056
  uint256 internal constant REENTRANCY_GUARD_FREE = 1;

  /// @dev Constant for locked guard state
  uint256 internal constant REENTRANCY_GUARD_LOCKED = 2;

  /**
   * @dev We use a single lock for the whole contract.
   */
  uint256 internal reentrancyLock = REENTRANCY_GUARD_FREE;

  /**
   * @dev Prevents a contract from calling itself, directly or indirectly.
   * If you mark a function `nonReentrant`, you should also
   * mark it `external`. Calling one `nonReentrant` function from
   * another is not supported. Instead, you can implement a
   * `private` function doing the actual work, and an `external`
   * wrapper marked as `nonReentrant`.
   */
  modifier nonReentrant() {
    require(reentrancyLock == REENTRANCY_GUARD_FREE, "nonReentrant");
    reentrancyLock = REENTRANCY_GUARD_LOCKED;
    _;
    reentrancyLock = REENTRANCY_GUARD_FREE;
  }

}

contract LoanTokenization is ReentrancyGuard, Ownable {

    uint256 internal constant MAX_UINT = 2**256 - 1;

    string public name;
    string public symbol;
    uint8 public decimals;

    address public bZxContract;
    address public bZxVault;
    address public bZxOracle;
    address public wethContract;

    address public loanTokenAddress;

    // price of token at last user checkpoint
    mapping (address => uint256) internal checkpointPrices_;
}

contract LoanTokenStorage is LoanTokenization {

    struct ListIndex {
        uint256 index;
        bool isSet;
    }

    struct LoanData {
        bytes32 loanOrderHash;
        uint256 leverageAmount;
        uint256 initialMarginAmount;
        uint256 maintenanceMarginAmount;
        uint256 maxDurationUnixTimestampSec;
        uint256 index;
    }

    struct TokenReserves {
        address lender;
        uint256 amount;
    }

    event Borrow(
        address indexed borrower,
        uint256 borrowAmount,
        uint256 interestRate,
        address collateralTokenAddress,
        address tradeTokenToFillAddress,
        bool withdrawOnOpen
    );

    event Claim(
        address indexed claimant,
        uint256 tokenAmount,
        uint256 assetAmount,
        uint256 remainingTokenAmount,
        uint256 price
    );

    bool internal isInitialized_ = false;

    address public tokenizedRegistry;

    uint256 public baseRate = 1000000000000000000; // 1.0%
    uint256 public rateMultiplier = 39000000000000000000; // 39%

    // "fee percentage retained by the oracle" = SafeMath.sub(10**20, spreadMultiplier);
    uint256 public spreadMultiplier;

    mapping (uint256 => bytes32) public loanOrderHashes; // mapping of levergeAmount to loanOrderHash
    mapping (bytes32 => LoanData) public loanOrderData; // mapping of loanOrderHash to LoanOrder
    uint256[] public leverageList;

    TokenReserves[] public burntTokenReserveList; // array of TokenReserves
    mapping (address => ListIndex) public burntTokenReserveListIndex; // mapping of lender address to ListIndex objects
    uint256 public burntTokenReserved; // total outstanding burnt token amount
    address internal nextOwedLender_;

    uint256 public totalAssetBorrow = 0; // current amount of loan token amount tied up in loans

    uint256 internal checkpointSupply_;

    uint256 internal lastSettleTime_;

    uint256 public initialPrice;
}

contract AdvancedTokenStorage is LoanTokenStorage {
    using SafeMath for uint256;

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 value
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Mint(
        address indexed minter,
        uint256 tokenAmount,
        uint256 assetAmount,
        uint256 price
    );
    event Burn(
        address indexed burner,
        uint256 tokenAmount,
        uint256 assetAmount,
        uint256 price
    );

    mapping(address => uint256) internal balances;
    mapping (address => mapping (address => uint256)) internal allowed;
    uint256 internal totalSupply_;

    function totalSupply()
        public
        view
        returns (uint256)
    {
        return totalSupply_;
    }

    function balanceOf(
        address _owner)
        public
        view
        returns (uint256)
    {
        return balances[_owner];
    }

    function allowance(
        address _owner,
        address _spender)
        public
        view
        returns (uint256)
    {
        return allowed[_owner][_spender];
    }
}

contract LoanToken is AdvancedTokenStorage {

    address internal target_;

    constructor(
        address _newTarget)
        public
    {
        _setTarget(_newTarget);
    }

    function()
        external
        payable
    {
        address target = target_;
        bytes memory data = msg.data;
        assembly {
            let result := delegatecall(gas, target, add(data, 0x20), mload(data), 0, 0)
            let size := returndatasize
            let ptr := mload(0x40)
            returndatacopy(ptr, 0, size)
            switch result
            case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }

    function setTarget(
        address _newTarget)
        public
        onlyOwner
    {
        _setTarget(_newTarget);
    }

    function _setTarget(
        address _newTarget)
        internal
    {
        require(_isContract(_newTarget), "target not a contract");
        target_ = _newTarget;
    }

    function _isContract(
        address addr)
        internal
        view
        returns (bool)
    {
        uint256 size;
        assembly { size := extcodesize(addr) }
        return size > 0;
    }
}

Read Contract

allowance 0xdd62ed3e → uint256
bZxContract 0x995363d3 → address
bZxOracle 0x96c7871b → address
bZxVault 0x894ca308 → address
balanceOf 0x70a08231 → uint256
baseRate 0x1f68f20a → uint256
burntTokenReserveList 0x7866c6c1 → address, uint256
burntTokenReserveListIndex 0xfbd9574d → uint256, bool
burntTokenReserved 0x0c4925fd → uint256
decimals 0x313ce567 → uint8
initialPrice 0x1d0806ae → uint256
leverageList 0x9b3a54d1 → uint256
loanOrderData 0x2515aacd → bytes32, uint256, uint256, uint256, uint256, uint256
loanOrderHashes 0xfe056342 → bytes32
loanTokenAddress 0x797bf385 → address
name 0x06fdde03 → string
owner 0x8da5cb5b → address
rateMultiplier 0x330691ac → uint256
spreadMultiplier 0xd84d2a47 → uint256
symbol 0x95d89b41 → string
tokenizedRegistry 0x736ee3d3 → address
totalAssetBorrow 0x20f6d07c → uint256
totalSupply 0x18160ddd → uint256
wethContract 0x4780eac1 → address

Write Contract 2 functions

These functions modify contract state and require a wallet transaction to execute.

setTarget 0x776d1a01
address _newTarget
transferOwnership 0xf2fde38b
address _newOwner

Top Interactions

Recent Transactions

CSV
|
Hash Method Block Age From/To Value Txn Fee Type
0xc2cf2419...aa0ef5 burn 10,619,423 IN 0x05701555...af68 0 ETH 0.00539291 ETH Legacy
0x4364de27...b76014 burn 10,619,364 IN 0x05701555...af68 0 ETH 0.00588462 ETH Legacy
0x5485fd77...da5774 approve 10,617,999 IN 0x5269389A...3425 0 ETH 0.00239170 ETH Legacy
0x3093133f...301020 approve 10,617,991 IN 0x21F1D0dA...D00E 0 ETH 0.00182894 ETH Legacy
0x5a48cc3a...dadfd3 approve 10,617,982 IN 0x96693870...22b0 0 ETH 0.00262618 ETH Legacy