Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 10 from a total of 10 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Redeem | 20712362 | 220 days ago | IN | 0 ETH | 0.00000021 | ||||
| Redeem | 4244145 | 601 days ago | IN | 0 ETH | 0.00000129 | ||||
| Redeem | 3869199 | 610 days ago | IN | 0 ETH | 0.00001377 | ||||
| Approve | 2674681 | 637 days ago | IN | 0 ETH | 0.00001051 | ||||
| Approve | 2674635 | 637 days ago | IN | 0 ETH | 0.00000978 | ||||
| Approve | 2674604 | 637 days ago | IN | 0 ETH | 0.00001033 | ||||
| Transfer | 1749328 | 659 days ago | IN | 0 ETH | 0.00002939 | ||||
| Deposit | 1103022 | 674 days ago | IN | 0 ETH | 0.00006126 | ||||
| Approve | 1102989 | 674 days ago | IN | 0 ETH | 0.00014813 | ||||
| Deposit | 1102978 | 674 days ago | IN | 0 ETH | 0.00007315 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 22487041 | 179 days ago | 0 ETH | |||||
| 22487041 | 179 days ago | 0 ETH | |||||
| 22487041 | 179 days ago | 0 ETH | |||||
| 22487041 | 179 days ago | 0 ETH | |||||
| 22487041 | 179 days ago | 0 ETH | |||||
| 22487041 | 179 days ago | 0 ETH | |||||
| 22419137 | 180 days ago | 0 ETH | |||||
| 22419137 | 180 days ago | 0 ETH | |||||
| 22419137 | 180 days ago | 0 ETH | |||||
| 22419137 | 180 days ago | 0 ETH | |||||
| 22419137 | 180 days ago | 0 ETH | |||||
| 22419137 | 180 days ago | 0 ETH | |||||
| 22092441 | 188 days ago | 0 ETH | |||||
| 22092441 | 188 days ago | 0 ETH | |||||
| 22092441 | 188 days ago | 0 ETH | |||||
| 22092441 | 188 days ago | 0 ETH | |||||
| 22088186 | 188 days ago | 0 ETH | |||||
| 22088186 | 188 days ago | 0 ETH | |||||
| 22088186 | 188 days ago | 0 ETH | |||||
| 22088186 | 188 days ago | 0 ETH | |||||
| 22088186 | 188 days ago | 0 ETH | |||||
| 22088186 | 188 days ago | 0 ETH | |||||
| 22085778 | 188 days ago | 0 ETH | |||||
| 22085778 | 188 days ago | 0 ETH | |||||
| 22085778 | 188 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ybUSDB
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 255 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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);
}
}{
"optimizer": {
"enabled": true,
"runs": 255
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$72,653.90
Net Worth in ETH
24.514752
Token Allocations
USDB
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BLAST | 100.00% | $1 | 72,436.5946 | $72,653.9 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.