ETH Price: $2,963.68 (-0.73%)

Contract

0xCD732d21c1B23A3f84Bb386E9759b5b6A1BcBe39
 
Transaction Hash
Block
From
To
Redeem207123622025-06-18 8:15:39220 days ago1750234539IN
0xCD732d21...6A1BcBe39
0 ETH0.000000210.00115067
Redeem42441452024-06-02 3:15:05601 days ago1717298105IN
0xCD732d21...6A1BcBe39
0 ETH0.000001290.009
Redeem38691992024-05-24 10:56:53610 days ago1716548213IN
0xCD732d21...6A1BcBe39
0 ETH0.000013770.0113
Approve26746812024-04-26 19:19:37637 days ago1714159177IN
0xCD732d21...6A1BcBe39
0 ETH0.000010510.00100028
Approve26746352024-04-26 19:18:05637 days ago1714159085IN
0xCD732d21...6A1BcBe39
0 ETH0.000009780.00100028
Approve26746042024-04-26 19:17:03637 days ago1714159023IN
0xCD732d21...6A1BcBe39
0 ETH0.000010330.00100028
Transfer17493282024-04-05 9:14:31659 days ago1712308471IN
0xCD732d21...6A1BcBe39
0 ETH0.000029390.0012
Deposit11030222024-03-21 10:10:59674 days ago1711015859IN
0xCD732d21...6A1BcBe39
0 ETH0.000061260.0011
Approve11029892024-03-21 10:09:53674 days ago1711015793IN
0xCD732d21...6A1BcBe39
0 ETH0.000148131.50000026
Deposit11029782024-03-21 10:09:31674 days ago1711015771IN
0xCD732d21...6A1BcBe39
0 ETH0.000073150.0011

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
224870412025-07-29 10:11:37179 days ago1753783897
0xCD732d21...6A1BcBe39
0 ETH
224870412025-07-29 10:11:37179 days ago1753783897
0xCD732d21...6A1BcBe39
0 ETH
224870412025-07-29 10:11:37179 days ago1753783897
0xCD732d21...6A1BcBe39
0 ETH
224870412025-07-29 10:11:37179 days ago1753783897
0xCD732d21...6A1BcBe39
0 ETH
224870412025-07-29 10:11:37179 days ago1753783897
0xCD732d21...6A1BcBe39
0 ETH
224870412025-07-29 10:11:37179 days ago1753783897
0xCD732d21...6A1BcBe39
0 ETH
224191372025-07-27 20:28:09180 days ago1753648089
0xCD732d21...6A1BcBe39
0 ETH
224191372025-07-27 20:28:09180 days ago1753648089
0xCD732d21...6A1BcBe39
0 ETH
224191372025-07-27 20:28:09180 days ago1753648089
0xCD732d21...6A1BcBe39
0 ETH
224191372025-07-27 20:28:09180 days ago1753648089
0xCD732d21...6A1BcBe39
0 ETH
224191372025-07-27 20:28:09180 days ago1753648089
0xCD732d21...6A1BcBe39
0 ETH
224191372025-07-27 20:28:09180 days ago1753648089
0xCD732d21...6A1BcBe39
0 ETH
220924412025-07-20 6:58:17188 days ago1752994697
0xCD732d21...6A1BcBe39
0 ETH
220924412025-07-20 6:58:17188 days ago1752994697
0xCD732d21...6A1BcBe39
0 ETH
220924412025-07-20 6:58:17188 days ago1752994697
0xCD732d21...6A1BcBe39
0 ETH
220924412025-07-20 6:58:17188 days ago1752994697
0xCD732d21...6A1BcBe39
0 ETH
220881862025-07-20 4:36:27188 days ago1752986187
0xCD732d21...6A1BcBe39
0 ETH
220881862025-07-20 4:36:27188 days ago1752986187
0xCD732d21...6A1BcBe39
0 ETH
220881862025-07-20 4:36:27188 days ago1752986187
0xCD732d21...6A1BcBe39
0 ETH
220881862025-07-20 4:36:27188 days ago1752986187
0xCD732d21...6A1BcBe39
0 ETH
220881862025-07-20 4:36:27188 days ago1752986187
0xCD732d21...6A1BcBe39
0 ETH
220881862025-07-20 4:36:27188 days ago1752986187
0xCD732d21...6A1BcBe39
0 ETH
220857782025-07-20 3:16:11188 days ago1752981371
0xCD732d21...6A1BcBe39
0 ETH
220857782025-07-20 3:16:11188 days ago1752981371
0xCD732d21...6A1BcBe39
0 ETH
220857782025-07-20 3:16:11188 days ago1752981371
0xCD732d21...6A1BcBe39
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ybUSDB

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 255 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

// Contracts
import {YieldInbox} from "src/YieldInbox.sol";

// Libraries
import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";
import {SafeTransferLib} from "lib/solmate/src/utils/SafeTransferLib.sol";
import {FixedPointMathLib} from "lib/solmate/src/utils/FixedPointMathLib.sol";

// Interfaces
import {IBlast} from "src/interfaces/IBlast.sol";
import {IBlastPoints} from "src/interfaces/IBlastPoints.sol";
import {IERC20Rebasing, YieldMode} from "src/interfaces/IERC20Rebasing.sol";

contract ybUSDB is ERC20 {
  using SafeTransferLib for address;
  using SafeTransferLib for IERC20Rebasing;
  using FixedPointMathLib for uint256;

  // Errors
  error ZeroAssets();
  error ZeroShares();

  // Configs
  address public dev;
  IBlastPoints public immutable blastPoints;
  IERC20Rebasing public immutable asset;
  YieldInbox public immutable yieldInbox;

  // States
  uint256 internal _totalAssets;

  // Events
  event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);
  event Withdraw(
    address indexed caller, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
  );

  constructor(IERC20Rebasing _usdb, IBlast _blast, IBlastPoints _blastPoints, address _blastPointsOperator)
    ERC20("ybUSDB", "ybUSDB", 18)
  {
    // Effect
    dev = msg.sender;
    blastPoints = _blastPoints;
    asset = _usdb;
    yieldInbox = new YieldInbox();

    // Config before deposit dead shares
    asset.configure(YieldMode.CLAIMABLE);
    _blast.configureClaimableGas();
    _blast.configureGovernor(msg.sender);
    _blastPoints.configurePointsOperator(_blastPointsOperator);

    deposit(0.1 ether, address(0));
  }

  /// @notice Claim all pending yield and update _totalAssets.
  function claimAllYield() public {
    uint256 _claimable = asset.getClaimableAmount(address(this));
    if (_claimable == 0) return;

    _claimable = asset.claim(address(yieldInbox), _claimable);
    yieldInbox.crawlBack(asset, address(this), _claimable);
    _totalAssets += _claimable;
  }

  /// @notice Deposit USDB to mint ybUSDB.
  /// @dev This function follows ERC-4626 standard.
  /// @param _assets The amount of USDB to deposit.
  /// @param _receiver The receiver of ybUSDB.
  function deposit(uint256 _assets, address _receiver) public returns (uint256 _shares) {
    // Claim all pending yield
    claimAllYield();

    // Check for rounding error.
    if ((_shares = previewDeposit(_assets)) == 0) revert ZeroShares();

    // Transfer from depositor
    asset.safeTransferFrom(msg.sender, address(this), _assets);

    // Effect
    // Update totalAssets
    _totalAssets += _assets;
    // Mint ybUSDB
    _mint(_receiver, _shares);

    // Log
    emit Deposit(msg.sender, _receiver, _assets, _shares);
  }

  /// @notice Mint ybUSDB by specifying the amount of ybUSDB to mint.
  /// @param _shares The amount of ybUSDB to mint.
  /// @param _receiver The receiver of ybUSDB.
  function mint(uint256 _shares, address _receiver) external returns (uint256 _assets) {
    // Claim all pending yield
    claimAllYield();

    _assets = previewMint(_shares);

    // Transfer from depositor
    asset.safeTransferFrom(msg.sender, address(this), _assets);

    // Effect
    // Update totalAssets
    _totalAssets += _assets;
    // Mint ybUSDB
    _mint(_receiver, _shares);

    // Log
    emit Deposit(msg.sender, _receiver, _assets, _shares);
  }

  /// @notice Redeem ybUSDB to USDB by specifying the amount of ybUSDB to redeem.
  /// @dev This function follows ERC-4626 standard.
  /// @param _shares The amount of ybUSDB to redeem.
  /// @param _receiver The receiver of the assets.
  /// @param _owner The owner of the ybUSDB.
  function redeem(uint256 _shares, address _receiver, address _owner) public returns (uint256 _assets) {
    // Claim all pending yield
    claimAllYield();

    if (msg.sender != _owner) {
      // If msg.sender is not the owner, then check allowance
      uint256 _allowed = allowance[_owner][msg.sender];
      if (_allowed != type(uint256).max) {
        // If not unlimited allowance, then decrease allowance.
        // This should be reverted if the allowance is not enough.
        allowance[_owner][msg.sender] = _allowed - _shares;
      }
    }

    // Check for rounding error.
    if ((_assets = previewRedeem(_shares)) == 0) revert ZeroAssets();

    // Effect
    _burn(_owner, _shares);
    _totalAssets -= _assets;

    // Interaction
    // Transfer assets out
    asset.safeTransfer(_receiver, _assets);

    emit Withdraw(msg.sender, _receiver, _owner, _assets, _shares);
  }

  /// @notice Withdraw USDB by specifying the amount of assets that user wishes to receive.
  /// @dev This function follows ERC-4626 standard.
  /// @param _assets The amount of assets that user wishes to receive.
  /// @param _receiver The receiver of the assets.
  /// @param _owner The owner of the ybUSDB.
  function withdraw(uint256 _assets, address _receiver, address _owner) public returns (uint256 _shares) {
    // Claim all pending yield
    claimAllYield();

    _shares = previewWithdraw(_assets);

    if (msg.sender != _owner) {
      // If msg.sender is not the owner, then check allowance
      uint256 _allowed = allowance[_owner][msg.sender];
      if (_allowed != type(uint256).max) {
        // If not unlimited allowance, then decrease allowance.
        // This should be reverted if the allowance is not enough.
        allowance[_owner][msg.sender] = _allowed - _shares;
      }
    }

    // Effect
    _burn(_owner, _shares);
    _totalAssets -= _assets;

    // Interaction
    // Transfer assets out
    asset.safeTransfer(_receiver, _assets);

    emit Withdraw(msg.sender, _receiver, _owner, _assets, _shares);
  }

  /// @notice Return the total assets managed by this contract.
  /// @dev Unclaimed yield is included.
  function totalAssets() public view returns (uint256) {
    return _totalAssets + asset.getClaimableAmount(address(this));
  }

  /// @notice Preview the amount of ybUSDB to mint by specifying the amount of assets to deposit.
  /// @param _assets The amount of assets to deposit.
  function previewDeposit(uint256 _assets) public view returns (uint256 _shares) {
    return convertToShares(_assets);
  }

  /// @notice Preview the amount of assets to receive by specifying the amount of ybUSDB to redeem.
  /// @param _shares The amount of ybUSDB to redeem.
  function previewRedeem(uint256 _shares) public view returns (uint256 _assets) {
    return convertToAssets(_shares);
  }

  /// @notice Preview the amount of USDB needed to mint by specifying the amount of ybUSDB.
  /// @param _shares The amount of ybUSDB to mint.
  function previewMint(uint256 _shares) public view returns (uint256 _assets) {
    // SLOAD
    uint256 _totalSupply = totalSupply;
    return _totalSupply == 0 ? _shares : _shares.mulDivUp(totalAssets(), _totalSupply);
  }

  /// @notice Preview the amount of ybUSDB needed by specifying the amount of USDB wishes to receive.
  /// @param _assets The amount of USDB wishes to receive.
  function previewWithdraw(uint256 _assets) public view returns (uint256 _shares) {
    // SLOAD
    uint256 _totalSupply = totalSupply;
    return _totalSupply == 0 ? _assets : _assets.mulDivUp(_totalSupply, totalAssets());
  }

  /// @notice Convert the amount of assets to ybUSDB.
  /// @param _assets The amount of assets to convert.
  function convertToShares(uint256 _assets) public view returns (uint256 _shares) {
    // SLOAD
    uint256 _totalSupply = totalSupply;
    return _totalSupply == 0 ? _assets : _assets.mulDivDown(_totalSupply, totalAssets());
  }

  /// @notice Convert the amount of ybUSDB to assets.
  /// @param _shares The amount of ybUSDB to convert.
  function convertToAssets(uint256 _shares) public view returns (uint256 _assets) {
    // SLOAD
    uint256 _totalSupply = totalSupply;
    return _totalSupply == 0 ? _shares : _shares.mulDivDown(totalAssets(), _totalSupply);
  }

  /// @notice Return the amount of assets that can be deposited to ybUSDB.
  function maxDeposit(address) external pure returns (uint256) {
    return type(uint256).max;
  }

  /// @notice Return the amount of ybUSDB that can be minted.
  function maxMint(address) external pure returns (uint256) {
    return type(uint256).max;
  }

  /// @notice Return the amount of USDB that can be withdrawn from ybUSDB.
  /// @param _owner The owner of the ybUSDB.
  function maxWithdraw(address _owner) external view returns (uint256) {
    return convertToAssets(balanceOf[_owner]);
  }

  /// @notice Return the amount of ybUSDB that can be redeemed.
  /// @param _owner The owner of the ybUSDB.
  function maxRedeem(address _owner) external view returns (uint256) {
    return balanceOf[_owner];
  }

  function setDev(address _dev) external {
    require(msg.sender == dev, "FORBIDDEN");
    dev = _dev;
  }

  function setPointsOperator(address _pointsOperator) external {
    require(msg.sender == dev, "FORBIDDEN");
    blastPoints.configurePointsOperator(_pointsOperator);
  }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

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

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }

    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }

    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }

    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
    }

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // Divide x * y by the denominator.
            z := div(mul(x, y), denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // If x * y modulo the denominator is strictly greater than 0,
            // 1 is added to round up the division of x * y by the denominator.
            z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
        }
    }

    function rpow(
        uint256 x,
        uint256 n,
        uint256 scalar
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := scalar
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store scalar in z for now.
                    z := scalar
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, scalar)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, scalar)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, scalar)
                    }
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            let y := x // We start y at x, which will help us make our initial estimate.

            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // We check y >= 2^(k + 8) but shift right by k bits
            // each branch to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }

            // Goal was to get z*z*y within a small factor of x. More iterations could
            // get y in a tighter range. Currently, we will have y in [256, 256*2^16).
            // We ensured y >= 256 so that the relative difference between y and y+1 is small.
            // That's not possible if x < 256 but we can just verify those cases exhaustively.

            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.

            // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
            // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.

            // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
            // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.

            // There is no overflow risk here since y < 2^136 after the first branch above.
            z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
            // If you don't care whether the floor or ceil square root is returned, you can remove this statement.
            z := sub(z, lt(div(x, z), z))
        }
    }

    function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Mod x by y. Note this will return
            // 0 instead of reverting if y is zero.
            z := mod(x, y)
        }
    }

    function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            // Divide x by y. Note this will return
            // 0 instead of reverting if y is zero.
            r := div(x, y)
        }
    }

    function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Add 1 to x * y if x % y > 0. Note this will
            // return 0 instead of reverting if y is zero.
            z := add(gt(mod(x, y), 0), div(x, y))
        }
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

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

enum YieldMode {
  AUTOMATIC,
  VOID,
  CLAIMABLE
}

enum GasMode {
  VOID,
  CLAIMABLE
}

interface IBlast {
  function configureClaimableYield() external;
  function claimAllYield(address contractAddress, address receipientOfYield) external returns (uint256);
  function readClaimableYield(address contractAddress) external view returns (uint256);
  function configureGovernor(address governorAddress) external;
  function configureClaimableGas() external;
  function claimAllGas(address contractAddress, address receipientOfGas) external returns (uint256);
  function readGasParams(address contractAddress)
    external
    view
    returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}

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

interface IBlastPoints {
  function configurePointsOperator(address operator) external;
}

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

import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";

enum YieldMode {
  AUTOMATIC,
  VOID,
  CLAIMABLE
}

abstract contract IERC20Rebasing is ERC20 {
  function configure(YieldMode) external virtual returns (uint256);
  function claim(address recipient, uint256 amount) external virtual returns (uint256);
  function getClaimableAmount(address account) external view virtual returns (uint256);
}

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

import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";
import {SafeTransferLib} from "lib/solmate/src/utils/SafeTransferLib.sol";

contract YieldInbox {
  using SafeTransferLib for ERC20;

  // Config
  address public immutable controller;

  constructor() {
    controller = msg.sender;
  }

  function crawlBack(ERC20 _token, address _to, uint256 _amount) external {
    require(msg.sender == controller, "!auth");
    _token.safeTransfer(_to, _amount);
  }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20Rebasing","name":"_usdb","type":"address"},{"internalType":"contract IBlast","name":"_blast","type":"address"},{"internalType":"contract IBlastPoints","name":"_blastPoints","type":"address"},{"internalType":"address","name":"_blastPointsOperator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ZeroAssets","type":"error"},{"inputs":[],"name":"ZeroShares","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blastPoints","outputs":[{"internalType":"contract IBlastPoints","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dev","type":"address"}],"name":"setDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pointsOperator","type":"address"}],"name":"setPointsOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldInbox","outputs":[{"internalType":"contract YieldInbox","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6101406040523480156200001257600080fd5b50604051620026a3380380620026a38339810160408190526200003591620007c0565b6040805180820182526006808252653cb12aa9a22160d11b60208084018290528451808601909552918452908301529060126000620000758482620008cd565b506001620000848382620008cd565b5060ff81166080524660a0526200009a620002a6565b60c0525050600680546001600160a01b03191633179055506001600160a01b0382811660e052841661010052604051620000d49062000799565b604051809103906000f080158015620000f1573d6000803e3d6000fd5b506001600160a01b039081166101205261010051604051631a33757d60e01b8152911690631a33757d906200012c9060029060040162000999565b6020604051808303816000875af11580156200014c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001729190620009c2565b50826001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620001af57600080fd5b505af1158015620001c4573d6000803e3d6000fd5b5050604051631d70c8d360e31b81523360048201526001600160a01b038616925063eb8646989150602401600060405180830381600087803b1580156200020a57600080fd5b505af11580156200021f573d6000803e3d6000fd5b50506040516336b91f2b60e01b81526001600160a01b038481166004830152851692506336b91f2b9150602401600060405180830381600087803b1580156200026757600080fd5b505af11580156200027c573d6000803e3d6000fd5b505050506200029b67016345785d8a000060006200034260201b60201c565b505050505062000a7c565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620002da9190620009dc565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006200034e6200040a565b620003598362000597565b9050806000036200037d57604051639811e0c760e01b815260040160405180910390fd5b6101005162000398906001600160a01b0316333086620005aa565b8260076000828254620003ac919062000a5a565b90915550620003be9050828262000654565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a392915050565b6101005160405163e12f3a6160e01b81523060048201526000916001600160a01b03169063e12f3a6190602401602060405180830381865afa15801562000455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047b9190620009c2565b905080600003620004895750565b6101005161012051604051635569f64b60e11b81526001600160a01b0391821660048201526024810184905291169063aad3ec96906044016020604051808303816000875af1158015620004e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005079190620009c2565b6101205161010051604051632112fd2560e11b81526001600160a01b039182166004820152306024820152604481018490529293501690634225fa4a90606401600060405180830381600087803b1580156200056257600080fd5b505af115801562000577573d6000803e3d6000fd5b5050505080600760008282546200058f919062000a5a565b909155505050565b6000620005a482620006c1565b92915050565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af13d15601f3d11600160005114161716915050806200064d5760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000604482015260640160405180910390fd5b5050505050565b806002600082825462000668919062000a5a565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6002546000908015620006ec57620006e681620006dd620006f5565b8591906200077a565b620006ee565b825b9392505050565b6101005160405163e12f3a6160e01b81523060048201526000916001600160a01b03169063e12f3a6190602401602060405180830381865afa15801562000740573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007669190620009c2565b60075462000775919062000a5a565b905090565b60008260001904841183021582026200079257600080fd5b5091020490565b61025c806200244783390190565b6001600160a01b0381168114620007bd57600080fd5b50565b60008060008060808587031215620007d757600080fd5b8451620007e481620007a7565b6020860151909450620007f781620007a7565b60408601519093506200080a81620007a7565b60608601519092506200081d81620007a7565b939692955090935050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200085357607f821691505b6020821081036200087457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008c857600081815260208120601f850160051c81016020861015620008a35750805b601f850160051c820191505b81811015620008c457828155600101620008af565b5050505b505050565b81516001600160401b03811115620008e957620008e962000828565b6200090181620008fa84546200083e565b846200087a565b602080601f831160018114620009395760008415620009205750858301515b600019600386901b1c1916600185901b178555620008c4565b600085815260208120601f198616915b828110156200096a5788860151825594840194600190910190840162000949565b5085821015620009895787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020810160038310620009bc57634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215620009d557600080fd5b5051919050565b6000808354620009ec816200083e565b6001828116801562000a07576001811462000a1d5762000a4e565b60ff198416875282151583028701945062000a4e565b8760005260208060002060005b8581101562000a455781548a82015290840190820162000a2a565b50505082870194505b50929695505050505050565b80820180821115620005a457634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e051610100516101205161192e62000b19600039600081816103fe0152818161090f01526109fa0152600081816102e60152818161054b015281816108780152818161093e015281816109c201528181610b8901528181610c4201528181610e250152610f720152600081816104250152610adc0152600061083e0152600061080e015260006102a5015261192e6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806391cca3db1161011a578063ba087652116100ad578063d477f05f1161007c578063d477f05f146104a6578063d505accf146104b9578063d905777e146104cc578063dd62ed3e146104f5578063ef8b30f71461052057600080fd5b8063ba0876521461046d578063c63d75b614610320578063c6e6f59214610480578063ce96cb771461049357600080fd5b8063b17789eb116100e9578063b17789eb146103f9578063b2bd6b5014610420578063b3d7f6b914610447578063b460af941461045a57600080fd5b806391cca3db146103b857806394bf804d146103cb57806395d89b41146103de578063a9059cbb146103e657600080fd5b80633644e5151161019d57806344048e3d1161016c57806344048e3d1461033f5780634cdad506146103525780636e553f651461036557806370a08231146103785780637ecebe001461039857600080fd5b80633644e515146102d957806338d52e0f146102e1578063402d267d14610320578063409a33ce1461033557600080fd5b80630a28a477116101d95780630a28a4771461027157806318160ddd1461028457806323b872dd1461028d578063313ce567146102a057600080fd5b806301e1d1141461020b57806306fdde031461022657806307a2d13a1461023b578063095ea7b31461024e575b600080fd5b610213610533565b6040519081526020015b60405180910390f35b61022e6105d0565b60405161021d91906115c1565b61021361024936600461160f565b61065e565b61026161025c366004611644565b61068b565b604051901515815260200161021d565b61021361027f36600461160f565b6106f8565b61021360025481565b61026161029b36600461166e565b610718565b6102c77f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161021d565b61021361080a565b6103087f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021d565b61021361032e3660046116aa565b5060001990565b61033d610860565b005b61033d61034d3660046116aa565b610a72565b61021361036036600461160f565b610b3b565b6102136103733660046116c5565b610b46565b6102136103863660046116aa565b60036020526000908152604090205481565b6102136103a63660046116aa565b60056020526000908152604090205481565b600654610308906001600160a01b031681565b6102136103d93660046116c5565b610c20565b61022e610ccf565b6102616103f4366004611644565b610cdc565b6103087f000000000000000000000000000000000000000000000000000000000000000081565b6103087f000000000000000000000000000000000000000000000000000000000000000081565b61021361045536600461160f565b610d54565b6102136104683660046116f1565b610d73565b61021361047b3660046116f1565b610e9f565b61021361048e36600461160f565b610fe1565b6102136104a13660046116aa565b611001565b61033d6104b43660046116aa565b611023565b61033d6104c736600461172d565b611098565b6102136104da3660046116aa565b6001600160a01b031660009081526003602052604090205490565b6102136105033660046117a0565b600460209081526000928352604080842090915290825290205481565b61021361052e36600461160f565b6112dc565b60405163e12f3a6160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e12f3a6190602401602060405180830381865afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be91906117ca565b6007546105cb91906117f9565b905090565b600080546105dd9061180c565b80601f01602080910402602001604051908101604052809291908181526020018280546106099061180c565b80156106565780601f1061062b57610100808354040283529160200191610656565b820191906000526020600020905b81548152906001019060200180831161063957829003601f168201915b505050505081565b60025460009080156106825761067d610675610533565b8490836112e7565b610684565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106e69086815260200190565b60405180910390a35060015b92915050565b60025460009080156106825761067d81610710610533565b859190611305565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146107745761074f8382611846565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b0385166000908152600360205260408120805485929061079c908490611846565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906107f79087815260200190565b60405180910390a3506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461083b576105cb61132b565b507f000000000000000000000000000000000000000000000000000000000000000090565b60405163e12f3a6160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e12f3a6190602401602060405180830381865afa1580156108c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108eb91906117ca565b9050806000036108f85750565b604051635569f64b60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063aad3ec96906044016020604051808303816000875af1158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab91906117ca565b604051632112fd2560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152604482018390529192507f000000000000000000000000000000000000000000000000000000000000000090911690634225fa4a90606401600060405180830381600087803b158015610a4057600080fd5b505af1158015610a54573d6000803e3d6000fd5b505050508060076000828254610a6a91906117f9565b909155505050565b6006546001600160a01b03163314610abd5760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b60448201526064015b60405180910390fd5b6040516336b91f2b60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906336b91f2b90602401600060405180830381600087803b158015610b2057600080fd5b505af1158015610b34573d6000803e3d6000fd5b5050505050565b60006106f28261065e565b6000610b50610860565b610b59836112dc565b905080600003610b7c57604051639811e0c760e01b815260040160405180910390fd5b610bb16001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330866113c5565b8260076000828254610bc391906117f9565b90915550610bd39050828261145a565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b6000610c2a610860565b610c3383610d54565b9050610c6a6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846113c5565b8060076000828254610c7c91906117f9565b90915550610c8c9050828461145a565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610c12565b600180546105dd9061180c565b33600090815260036020526040812080548391908390610cfd908490611846565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906106e69086815260200190565b60025460009080156106825761067d610d6b610533565b849083611305565b6000610d7d610860565b610d86846106f8565b9050336001600160a01b03831614610df6576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610df457610dcf8282611846565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610e0082826114c6565b8360076000828254610e129190611846565b90915550610e4c90506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016848661153a565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db91015b60405180910390a49392505050565b6000610ea9610860565b336001600160a01b03831614610f17576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610f1557610ef08582611846565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610f2084610b3b565b905080600003610f4357604051630cb65c7760e21b815260040160405180910390fd5b610f4d82856114c6565b8060076000828254610f5f9190611846565b90915550610f9990506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016848361153a565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db9101610e90565b60025460009080156106825761067d81610ff9610533565b8591906112e7565b6001600160a01b0381166000908152600360205260408120546106f29061065e565b6006546001600160a01b031633146110695760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b6044820152606401610ab4565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b428410156110e85760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610ab4565b600060016110f461080a565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611200573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906112365750876001600160a01b0316816001600160a01b0316145b6112735760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610ab4565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60006106f282610fe1565b60008260001904841183021582026112fe57600080fd5b5091020490565b600082600019048411830215820261131c57600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405161135d9190611859565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610b345760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610ab4565b806002600082825461146c91906117f9565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906114ee908490611846565b90915550506002805482900390556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016114ba565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806115bb5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610ab4565b50505050565b600060208083528351808285015260005b818110156115ee578581018301518582016040015282016115d2565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561162157600080fd5b5035919050565b80356001600160a01b038116811461163f57600080fd5b919050565b6000806040838503121561165757600080fd5b61166083611628565b946020939093013593505050565b60008060006060848603121561168357600080fd5b61168c84611628565b925061169a60208501611628565b9150604084013590509250925092565b6000602082840312156116bc57600080fd5b61068482611628565b600080604083850312156116d857600080fd5b823591506116e860208401611628565b90509250929050565b60008060006060848603121561170657600080fd5b8335925061171660208501611628565b915061172460408501611628565b90509250925092565b600080600080600080600060e0888a03121561174857600080fd5b61175188611628565b965061175f60208901611628565b95506040880135945060608801359350608088013560ff8116811461178357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156117b357600080fd5b6117bc83611628565b91506116e860208401611628565b6000602082840312156117dc57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106f2576106f26117e3565b600181811c9082168061182057607f821691505b60208210810361184057634e487b7160e01b600052602260045260246000fd5b50919050565b818103818111156106f2576106f26117e3565b600080835481600182811c91508083168061187557607f831692505b6020808410820361189457634e487b7160e01b86526022600452602486fd5b8180156118a857600181146118bd576118ea565b60ff19861689528415158502890196506118ea565b60008a81526020902060005b868110156118e25781548b8201529085019083016118c9565b505084890196505b50949897505050505050505056fea2646970667358221220ad3d5513e66f2a380446d7b4d204870e422f1d23f27e959e3b559e7475bf9aed64736f6c6343000813003360a060405234801561001057600080fd5b50336080526080516102276100356000396000818160550152609e01526102276000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634225fa4a1461003b578063f77c479114610050575b600080fd5b61004e6100493660046101b0565b610093565b005b6100777f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100f85760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064015b60405180910390fd5b61010c6001600160a01b0384168383610111565b505050565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806101925760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016100ef565b50505050565b6001600160a01b03811681146101ad57600080fd5b50565b6000806000606084860312156101c557600080fd5b83356101d081610198565b925060208401356101e081610198565b92959294505050604091909101359056fea26469706673582212202915a015443f1ad769860a3963d2b9a0a97d2459740e48e17e49da28d566e1eb64736f6c63430008130033000000000000000000000000430000000000000000000000000000000000000300000000000000000000000043000000000000000000000000000000000000020000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800000000000000000000000000c4d6713e4223b66708dd0167aacf756d2d314192

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c806391cca3db1161011a578063ba087652116100ad578063d477f05f1161007c578063d477f05f146104a6578063d505accf146104b9578063d905777e146104cc578063dd62ed3e146104f5578063ef8b30f71461052057600080fd5b8063ba0876521461046d578063c63d75b614610320578063c6e6f59214610480578063ce96cb771461049357600080fd5b8063b17789eb116100e9578063b17789eb146103f9578063b2bd6b5014610420578063b3d7f6b914610447578063b460af941461045a57600080fd5b806391cca3db146103b857806394bf804d146103cb57806395d89b41146103de578063a9059cbb146103e657600080fd5b80633644e5151161019d57806344048e3d1161016c57806344048e3d1461033f5780634cdad506146103525780636e553f651461036557806370a08231146103785780637ecebe001461039857600080fd5b80633644e515146102d957806338d52e0f146102e1578063402d267d14610320578063409a33ce1461033557600080fd5b80630a28a477116101d95780630a28a4771461027157806318160ddd1461028457806323b872dd1461028d578063313ce567146102a057600080fd5b806301e1d1141461020b57806306fdde031461022657806307a2d13a1461023b578063095ea7b31461024e575b600080fd5b610213610533565b6040519081526020015b60405180910390f35b61022e6105d0565b60405161021d91906115c1565b61021361024936600461160f565b61065e565b61026161025c366004611644565b61068b565b604051901515815260200161021d565b61021361027f36600461160f565b6106f8565b61021360025481565b61026161029b36600461166e565b610718565b6102c77f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161021d565b61021361080a565b6103087f000000000000000000000000430000000000000000000000000000000000000381565b6040516001600160a01b03909116815260200161021d565b61021361032e3660046116aa565b5060001990565b61033d610860565b005b61033d61034d3660046116aa565b610a72565b61021361036036600461160f565b610b3b565b6102136103733660046116c5565b610b46565b6102136103863660046116aa565b60036020526000908152604090205481565b6102136103a63660046116aa565b60056020526000908152604090205481565b600654610308906001600160a01b031681565b6102136103d93660046116c5565b610c20565b61022e610ccf565b6102616103f4366004611644565b610cdc565b6103087f00000000000000000000000033567577768b459fa75eeb4cba7e86591adaa87a81565b6103087f0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b61021361045536600461160f565b610d54565b6102136104683660046116f1565b610d73565b61021361047b3660046116f1565b610e9f565b61021361048e36600461160f565b610fe1565b6102136104a13660046116aa565b611001565b61033d6104b43660046116aa565b611023565b61033d6104c736600461172d565b611098565b6102136104da3660046116aa565b6001600160a01b031660009081526003602052604090205490565b6102136105033660046117a0565b600460209081526000928352604080842090915290825290205481565b61021361052e36600461160f565b6112dc565b60405163e12f3a6160e01b81523060048201526000907f00000000000000000000000043000000000000000000000000000000000000036001600160a01b03169063e12f3a6190602401602060405180830381865afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be91906117ca565b6007546105cb91906117f9565b905090565b600080546105dd9061180c565b80601f01602080910402602001604051908101604052809291908181526020018280546106099061180c565b80156106565780601f1061062b57610100808354040283529160200191610656565b820191906000526020600020905b81548152906001019060200180831161063957829003601f168201915b505050505081565b60025460009080156106825761067d610675610533565b8490836112e7565b610684565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106e69086815260200190565b60405180910390a35060015b92915050565b60025460009080156106825761067d81610710610533565b859190611305565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146107745761074f8382611846565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b0385166000908152600360205260408120805485929061079c908490611846565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906107f79087815260200190565b60405180910390a3506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000013e31461461083b576105cb61132b565b507f0afd0d3e740de0dd99e27728191f7ce880bb4cd8d3136e02c1c138ebe568542f90565b60405163e12f3a6160e01b81523060048201526000907f00000000000000000000000043000000000000000000000000000000000000036001600160a01b03169063e12f3a6190602401602060405180830381865afa1580156108c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108eb91906117ca565b9050806000036108f85750565b604051635569f64b60e11b81526001600160a01b037f00000000000000000000000033567577768b459fa75eeb4cba7e86591adaa87a81166004830152602482018390527f0000000000000000000000004300000000000000000000000000000000000003169063aad3ec96906044016020604051808303816000875af1158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab91906117ca565b604051632112fd2560e11b81526001600160a01b037f000000000000000000000000430000000000000000000000000000000000000381166004830152306024830152604482018390529192507f00000000000000000000000033567577768b459fa75eeb4cba7e86591adaa87a90911690634225fa4a90606401600060405180830381600087803b158015610a4057600080fd5b505af1158015610a54573d6000803e3d6000fd5b505050508060076000828254610a6a91906117f9565b909155505050565b6006546001600160a01b03163314610abd5760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b60448201526064015b60405180910390fd5b6040516336b91f2b60e01b81526001600160a01b0382811660048301527f0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd80016906336b91f2b90602401600060405180830381600087803b158015610b2057600080fd5b505af1158015610b34573d6000803e3d6000fd5b5050505050565b60006106f28261065e565b6000610b50610860565b610b59836112dc565b905080600003610b7c57604051639811e0c760e01b815260040160405180910390fd5b610bb16001600160a01b037f0000000000000000000000004300000000000000000000000000000000000003163330866113c5565b8260076000828254610bc391906117f9565b90915550610bd39050828261145a565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b6000610c2a610860565b610c3383610d54565b9050610c6a6001600160a01b037f0000000000000000000000004300000000000000000000000000000000000003163330846113c5565b8060076000828254610c7c91906117f9565b90915550610c8c9050828461145a565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610c12565b600180546105dd9061180c565b33600090815260036020526040812080548391908390610cfd908490611846565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906106e69086815260200190565b60025460009080156106825761067d610d6b610533565b849083611305565b6000610d7d610860565b610d86846106f8565b9050336001600160a01b03831614610df6576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610df457610dcf8282611846565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610e0082826114c6565b8360076000828254610e129190611846565b90915550610e4c90506001600160a01b037f000000000000000000000000430000000000000000000000000000000000000316848661153a565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db91015b60405180910390a49392505050565b6000610ea9610860565b336001600160a01b03831614610f17576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610f1557610ef08582611846565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610f2084610b3b565b905080600003610f4357604051630cb65c7760e21b815260040160405180910390fd5b610f4d82856114c6565b8060076000828254610f5f9190611846565b90915550610f9990506001600160a01b037f000000000000000000000000430000000000000000000000000000000000000316848361153a565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db9101610e90565b60025460009080156106825761067d81610ff9610533565b8591906112e7565b6001600160a01b0381166000908152600360205260408120546106f29061065e565b6006546001600160a01b031633146110695760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b6044820152606401610ab4565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b428410156110e85760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610ab4565b600060016110f461080a565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611200573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906112365750876001600160a01b0316816001600160a01b0316145b6112735760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610ab4565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60006106f282610fe1565b60008260001904841183021582026112fe57600080fd5b5091020490565b600082600019048411830215820261131c57600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405161135d9190611859565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610b345760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610ab4565b806002600082825461146c91906117f9565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906114ee908490611846565b90915550506002805482900390556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016114ba565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806115bb5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610ab4565b50505050565b600060208083528351808285015260005b818110156115ee578581018301518582016040015282016115d2565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561162157600080fd5b5035919050565b80356001600160a01b038116811461163f57600080fd5b919050565b6000806040838503121561165757600080fd5b61166083611628565b946020939093013593505050565b60008060006060848603121561168357600080fd5b61168c84611628565b925061169a60208501611628565b9150604084013590509250925092565b6000602082840312156116bc57600080fd5b61068482611628565b600080604083850312156116d857600080fd5b823591506116e860208401611628565b90509250929050565b60008060006060848603121561170657600080fd5b8335925061171660208501611628565b915061172460408501611628565b90509250925092565b600080600080600080600060e0888a03121561174857600080fd5b61175188611628565b965061175f60208901611628565b95506040880135945060608801359350608088013560ff8116811461178357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156117b357600080fd5b6117bc83611628565b91506116e860208401611628565b6000602082840312156117dc57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106f2576106f26117e3565b600181811c9082168061182057607f821691505b60208210810361184057634e487b7160e01b600052602260045260246000fd5b50919050565b818103818111156106f2576106f26117e3565b600080835481600182811c91508083168061187557607f831692505b6020808410820361189457634e487b7160e01b86526022600452602486fd5b8180156118a857600181146118bd576118ea565b60ff19861689528415158502890196506118ea565b60008a81526020902060005b868110156118e25781548b8201529085019083016118c9565b505084890196505b50949897505050505050505056fea2646970667358221220ad3d5513e66f2a380446d7b4d204870e422f1d23f27e959e3b559e7475bf9aed64736f6c63430008130033

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

000000000000000000000000430000000000000000000000000000000000000300000000000000000000000043000000000000000000000000000000000000020000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800000000000000000000000000c4d6713e4223b66708dd0167aacf756d2d314192

-----Decoded View---------------
Arg [0] : _usdb (address): 0x4300000000000000000000000000000000000003
Arg [1] : _blast (address): 0x4300000000000000000000000000000000000002
Arg [2] : _blastPoints (address): 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800
Arg [3] : _blastPointsOperator (address): 0xC4D6713E4223B66708DD0167aAcf756D2D314192

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004300000000000000000000000000000000000003
Arg [1] : 0000000000000000000000004300000000000000000000000000000000000002
Arg [2] : 0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800
Arg [3] : 000000000000000000000000c4d6713e4223b66708dd0167aacf756d2d314192


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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