Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
5 addresses found via BlockscanLatest 25 from a total of 32 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Multicall | 17241943 | 17 days 7 hrs ago | IN | 0.02620984 ETH | 0.0158813 | ||||
Create Vesting | 17240246 | 17 days 13 hrs ago | IN | 0 ETH | 0.02248205 | ||||
Multicall | 17228909 | 19 days 3 hrs ago | IN | 0 ETH | 0.01446086 | ||||
Create Vesting | 17171761 | 27 days 4 hrs ago | IN | 0 ETH | 0.01044941 | ||||
Create Vesting | 17114850 | 35 days 4 hrs ago | IN | 0 ETH | 0.00763567 | ||||
Create Vesting | 17114813 | 35 days 4 hrs ago | IN | 0 ETH | 0.00878737 | ||||
Multicall | 17114750 | 35 days 4 hrs ago | IN | 0 ETH | 0.00934488 | ||||
Multicall | 16906608 | 64 days 16 hrs ago | IN | 0 ETH | 0.0043674 | ||||
Create Vesting | 16158157 | 169 days 11 hrs ago | IN | 0 ETH | 0.00362221 | ||||
Create Vesting | 16083102 | 179 days 22 hrs ago | IN | 0 ETH | 0.00282537 | ||||
Create Vesting | 16083093 | 179 days 22 hrs ago | IN | 0 ETH | 0.0027625 | ||||
Create Vesting | 16083089 | 179 days 23 hrs ago | IN | 0 ETH | 0.0028702 | ||||
Create Vesting | 16083081 | 179 days 23 hrs ago | IN | 0 ETH | 0.00279359 | ||||
Create Vesting | 16083075 | 179 days 23 hrs ago | IN | 0 ETH | 0.00291758 | ||||
Create Vesting | 16083068 | 179 days 23 hrs ago | IN | 0 ETH | 0.00267258 | ||||
Create Vesting | 16083034 | 179 days 23 hrs ago | IN | 0 ETH | 0.00278337 | ||||
Create Vesting | 16083024 | 179 days 23 hrs ago | IN | 0 ETH | 0.00278044 | ||||
Create Vesting | 16083015 | 179 days 23 hrs ago | IN | 0 ETH | 0.00281437 | ||||
Create Vesting | 16083004 | 179 days 23 hrs ago | IN | 0 ETH | 0.00294697 | ||||
Create Vesting | 16082997 | 179 days 23 hrs ago | IN | 0 ETH | 0.00272793 | ||||
Create Vesting | 16082985 | 179 days 23 hrs ago | IN | 0 ETH | 0.00281247 | ||||
Create Vesting | 16082976 | 179 days 23 hrs ago | IN | 0 ETH | 0.00270063 | ||||
Create Vesting | 16082958 | 179 days 23 hrs ago | IN | 0 ETH | 0.00288628 | ||||
Create Vesting | 16082938 | 179 days 23 hrs ago | IN | 0 ETH | 0.00275435 | ||||
Create Vesting | 16082922 | 179 days 23 hrs ago | IN | 0 ETH | 0.00289819 |
Latest 1 internal transaction
Advanced mode:
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
17241943 | 17 days 7 hrs ago | 0.02620984 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
FuroVestingRouter
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.10; import './interfaces/IFuroVesting.sol'; contract FuroVestingRouter is Multicall { IBentoBoxMinimal public immutable bentoBox; IFuroVesting public immutable furoVesting; address public immutable wETH; // custom errors error InsufficientShares(); constructor( IBentoBoxMinimal _bentoBox, IFuroVesting _furoVesting, address _wETH ) { bentoBox = _bentoBox; furoVesting = _furoVesting; wETH = _wETH; _bentoBox.setMasterContractApproval(address(this), address(_furoVesting), true, 0, bytes32(0), bytes32(0)); _bentoBox.registerProtocol(); } function setBentoBoxApproval( address user, bool approved, uint8 v, bytes32 r, bytes32 s ) external payable { bentoBox.setMasterContractApproval(user, address(this), approved, v, r, s); } function createVesting(IFuroVesting.VestParams memory vestParams, uint256 minShare) external payable returns ( uint256 depositedShares, uint256 vestId, uint128 stepShares, uint128 cliffShares ) { depositedShares = _depositToken( address(vestParams.token), msg.sender, address(this), vestParams.amount, vestParams.fromBentoBox ); if (depositedShares < minShare) revert InsufficientShares(); if (address(vestParams.token) == address(0)) { vestParams.token = IERC20(wETH); } vestParams.fromBentoBox = true; (depositedShares, vestId, stepShares, cliffShares) = furoVesting.createVesting(vestParams); furoVesting.updateOwner(vestId, msg.sender); } function _depositToken( address token, address from, address to, uint256 amount, bool fromBentoBox ) internal returns (uint256 depositedShares) { if (fromBentoBox) { depositedShares = bentoBox.toShare(token, amount, false); bentoBox.transfer(token, from, to, depositedShares); } else { (, depositedShares) = bentoBox.deposit{value: token == address(0) ? amount : 0}(token, from, to, amount, 0); } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.10; import "./ITasker.sol"; import "./IERC20.sol"; import "./ITokenURIFetcher.sol"; import "./IBentoBoxMinimal.sol"; import "../utils/Multicall.sol"; import "../utils/BoringOwnable.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@rari-capital/solmate/src/tokens/ERC721.sol"; interface IFuroVesting { function setBentoBoxApproval( address user, bool approved, uint8 v, bytes32 r, bytes32 s ) external payable; function createVesting(VestParams calldata vestParams) external payable returns ( uint256 depositedShares, uint256 vestId, uint128 stepShares, uint128 cliffShares ); function withdraw( uint256 vestId, bytes memory taskData, bool toBentoBox ) external; function stopVesting(uint256 vestId, bool toBentoBox) external; function vestBalance(uint256 vestId) external view returns (uint256); function updateOwner(uint256 vestId, address newOwner) external; struct VestParams { IERC20 token; address recipient; uint32 start; uint32 cliffDuration; uint32 stepDuration; uint32 steps; uint128 stepPercentage; uint128 amount; bool fromBentoBox; } struct Vest { address owner; IERC20 token; uint32 start; uint32 cliffDuration; uint32 stepDuration; uint32 steps; uint128 cliffShares; uint128 stepShares; uint128 claimed; } event CreateVesting( uint256 indexed vestId, IERC20 token, address indexed owner, address indexed recipient, uint32 start, uint32 cliffDuration, uint32 stepDuration, uint32 steps, uint128 cliffShares, uint128 stepShares, bool fromBentoBox ); event Withdraw( uint256 indexed vestId, IERC20 indexed token, uint256 indexed amount, bool toBentoBox ); event CancelVesting( uint256 indexed vestId, uint256 indexed ownerAmount, uint256 indexed recipientAmount, IERC20 token, bool toBentoBox ); event LogUpdateOwner(uint256 indexed vestId, address indexed newOwner); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.10; interface ITasker { function onTaskReceived( bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); /// @notice EIP 2612 function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.10; interface ITokenURIFetcher { function fetchTokenURIData(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.10; /// @notice Minimal BentoBox vault interface. /// @dev `token` is aliased as `address` from `IERC20` for simplicity. interface IBentoBoxMinimal { /// @notice Balance per ERC-20 token per account in shares. function balanceOf(address, address) external view returns (uint256); /// @dev Helper function to represent an `amount` of `token` in shares. /// @param token The ERC-20 token. /// @param amount The `token` amount. /// @param roundUp If the result `share` should be rounded up. /// @return share The token amount represented in shares. function toShare( address token, uint256 amount, bool roundUp ) external view returns (uint256 share); /// @dev Helper function to represent shares back into the `token` amount. /// @param token The ERC-20 token. /// @param share The amount of shares. /// @param roundUp If the result should be rounded up. /// @return amount The share amount back into native representation. function toAmount( address token, uint256 share, bool roundUp ) external view returns (uint256 amount); /// @notice Registers this contract so that users can approve it for BentoBox. function registerProtocol() external; /// @notice Deposit an amount of `token` represented in either `amount` or `share`. /// @param token_ The ERC-20 token to deposit. /// @param from which account to pull the tokens. /// @param to which account to push the tokens. /// @param amount Token amount in native representation to deposit. /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`. /// @return amountOut The amount deposited. /// @return shareOut The deposited amount represented in shares. function deposit( address token_, address from, address to, uint256 amount, uint256 share ) external payable returns (uint256 amountOut, uint256 shareOut); /// @notice Withdraws an amount of `token` from a user account. /// @param token_ The ERC-20 token to withdraw. /// @param from which user to pull the tokens. /// @param to which user to push the tokens. /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied. /// @param share Like above, but `share` takes precedence over `amount`. function withdraw( address token_, address from, address to, uint256 amount, uint256 share ) external returns (uint256 amountOut, uint256 shareOut); /// @notice Transfer shares from a user account to another one. /// @param token The ERC-20 token to transfer. /// @param from which user to pull the tokens. /// @param to which user to push the tokens. /// @param share The amount of `token` in shares. function transfer( address token, address from, address to, uint256 share ) external; function setMasterContractApproval( address user, address masterContract, bool approved, uint8 v, bytes32 r, bytes32 s ) external; }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.8.10; /// @title Multicall /// @notice Enables calling multiple methods in a single call to the contract abstract contract Multicall { function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall( data[i] ); if (!success) { // Next 5 lines from https://ethereum.stackexchange.com/a/83577 if (result.length < 68) revert(); assembly { result := add(result, 0x04) } revert(abi.decode(result, (string))); } results[i] = result; } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12; // Audit on 5-Jan-2021 by Keno and BoringCrypto // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol // Edited by BoringCrypto contract BoringOwnableData { address public owner; address public pendingOwner; } contract BoringOwnable is BoringOwnableData { event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /// @notice `owner` defaults to msg.sender on construction. constructor() { owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. /// Can only be invoked by the current `owner`. /// @param newOwner Address of the new owner. /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`. /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise. function transferOwnership( address newOwner, bool direct, bool renounce ) public onlyOwner { if (direct) { // Checks require( newOwner != address(0) || renounce, "Ownable: zero address" ); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } /// @notice Needs to be called by `pendingOwner` to claim ownership. function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require( msg.sender == _pendingOwner, "Ownable: caller != pending owner" ); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } /// @notice Only allows the `owner` to execute the function. modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`. // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`. // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a // good first aproximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 1; } // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) /// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC. abstract contract ERC721 { /*/////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*/////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*/////////////////////////////////////////////////////////////// ERC721 STORAGE //////////////////////////////////////////////////////////////*/ mapping(address => uint256) public balanceOf; mapping(uint256 => address) public ownerOf; mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*/////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*/////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { balanceOf[from]--; balanceOf[to]++; } ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes memory data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*/////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*/////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { balanceOf[to]++; } ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = ownerOf[id]; require(ownerOf[id] != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { balanceOf[owner]--; } delete ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*/////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) interface ERC721TokenReceiver { function onERC721Received( address operator, address from, uint256 id, bytes calldata data ) external returns (bytes4); }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IBentoBoxMinimal","name":"_bentoBox","type":"address"},{"internalType":"contract IFuroVesting","name":"_furoVesting","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientShares","type":"error"},{"inputs":[],"name":"bentoBox","outputs":[{"internalType":"contract IBentoBoxMinimal","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint32","name":"start","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"stepDuration","type":"uint32"},{"internalType":"uint32","name":"steps","type":"uint32"},{"internalType":"uint128","name":"stepPercentage","type":"uint128"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"bool","name":"fromBentoBox","type":"bool"}],"internalType":"struct IFuroVesting.VestParams","name":"vestParams","type":"tuple"},{"internalType":"uint256","name":"minShare","type":"uint256"}],"name":"createVesting","outputs":[{"internalType":"uint256","name":"depositedShares","type":"uint256"},{"internalType":"uint256","name":"vestId","type":"uint256"},{"internalType":"uint128","name":"stepShares","type":"uint128"},{"internalType":"uint128","name":"cliffShares","type":"uint128"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"furoVesting","outputs":[{"internalType":"contract IFuroVesting","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"setBentoBoxApproval","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b50604051620011d9380380620011d983398101604081905262000034916200013e565b6001600160a01b03838116608081905283821660a081905291831660c05260405163c0a47c9360e01b81523060048201526024810192909252600160448301526000606483018190526084830181905260a48301529063c0a47c939060c401600060405180830381600087803b158015620000ae57600080fd5b505af1158015620000c3573d6000803e3d6000fd5b50505050826001600160a01b031663aee4d1b26040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200010357600080fd5b505af115801562000118573d6000803e3d6000fd5b5050505050505062000192565b6001600160a01b03811681146200013b57600080fd5b50565b6000806000606084860312156200015457600080fd5b8351620001618162000125565b6020850151909350620001748162000125565b6040850151909250620001878162000125565b809150509250925092565b60805160a05160c051610fe7620001f26000396000818161018e015261025101526000818160cc015281816102b9015261037001526000818161013a015281816104540152818161068d0152818161075701526107d10152610fe76000f3fe6080604052600436106100655760003560e01c80636b2ace87116100435780636b2ace8714610128578063ac9650d81461015c578063f24286211461017c57600080fd5b8063061251b11461006a57806314b70579146100ba578063489bb0b214610113575b600080fd5b61007d61007836600461099c565b6101b0565b6040805194855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080015b60405180910390f35b3480156100c657600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b1565b610126610121366004610a6a565b6103ea565b005b34801561013457600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b61016f61016a366004610ac9565b6104b7565b6040516100b19190610bb8565b34801561018857600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806101e2866000015133308960e001516fffffffffffffffffffffffffffffffff168a6101000151610632565b93508484101561021e576040517f3999656700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff166102745773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686525b60016101008701526040517fe9d163c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e9d163c9906102ee908990600401610c38565b6080604051808303816000875af115801561030d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103319190610d39565b6040517f7192711f00000000000000000000000000000000000000000000000000000000815260048101849052336024820152939750919550935091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690637192711f90604401600060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b5050505092959194509250565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b15801561049857600080fd5b505af11580156104ac573d6000803e3d6000fd5b505050505050505050565b60608167ffffffffffffffff8111156104d2576104d26108c1565b60405190808252806020026020018201604052801561050557816020015b60608152602001906001900390816104f05790505b50905060005b8281101561062b576000803086868581811061052957610529610d84565b905060200281019061053b9190610db3565b604051610549929190610e1f565b600060405180830381855af49150503d8060008114610584576040519150601f19603f3d011682016040523d82523d6000602084013e610589565b606091505b5091509150816105f8576044815110156105a257600080fd5b600481019050808060200190518101906105bc9190610e2f565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ef9190610efa565b60405180910390fd5b8084848151811061060b5761060b610d84565b60200260200101819052505050808061062390610f14565b91505061050b565b5092915050565b600081156107ba576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa1580156106d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f89190610f74565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b15801561079d57600080fd5b505af11580156107b1573d6000803e3d6000fd5b505050506108b8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c90881615610807576000610809565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af115801561088f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108b49190610f8d565b9150505b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610120810167ffffffffffffffff81118282101715610914576109146108c1565b60405290565b73ffffffffffffffffffffffffffffffffffffffff8116811461093c57600080fd5b50565b803561094a8161091a565b919050565b803563ffffffff8116811461094a57600080fd5b6fffffffffffffffffffffffffffffffff8116811461093c57600080fd5b803561094a81610963565b8035801515811461094a57600080fd5b6000808284036101408112156109b157600080fd5b610120808212156109c157600080fd5b6109c96108f0565b91506109d48561093f565b82526109e26020860161093f565b60208301526109f36040860161094f565b6040830152610a046060860161094f565b6060830152610a156080860161094f565b6080830152610a2660a0860161094f565b60a0830152610a3760c08601610981565b60c0830152610a4860e08601610981565b60e0830152610100610a5b81870161098c565b90830152909593013593505050565b600080600080600060a08688031215610a8257600080fd5b8535610a8d8161091a565b9450610a9b6020870161098c565b9350604086013560ff81168114610ab157600080fd5b94979396509394606081013594506080013592915050565b60008060208385031215610adc57600080fd5b823567ffffffffffffffff80821115610af457600080fd5b818501915085601f830112610b0857600080fd5b813581811115610b1757600080fd5b8660208260051b8501011115610b2c57600080fd5b60209290920196919550909350505050565b60005b83811015610b59578181015183820152602001610b41565b83811115610b68576000848401525b50505050565b60008151808452610b86816020860160208601610b3e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610c2b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610c19858351610b6e565b94509285019290850190600101610bdf565b5092979650505050505050565b815173ffffffffffffffffffffffffffffffffffffffff168152602080830151610120830191610c7f9084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151610c97604084018263ffffffff169052565b506060830151610caf606084018263ffffffff169052565b506080830151610cc7608084018263ffffffff169052565b5060a0830151610cdf60a084018263ffffffff169052565b5060c0830151610d0360c08401826fffffffffffffffffffffffffffffffff169052565b5060e0830151610d2760e08401826fffffffffffffffffffffffffffffffff169052565b50610100928301511515919092015290565b60008060008060808587031215610d4f57600080fd5b84519350602085015192506040850151610d6881610963565b6060860151909250610d7981610963565b939692955090935050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610de857600080fd5b83018035915067ffffffffffffffff821115610e0357600080fd5b602001915036819003821315610e1857600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215610e4157600080fd5b815167ffffffffffffffff80821115610e5957600080fd5b818401915084601f830112610e6d57600080fd5b815181811115610e7f57610e7f6108c1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ec557610ec56108c1565b81604052828152876020848701011115610ede57600080fd5b610eef836020830160208801610b3e565b979650505050505050565b602081526000610f0d6020830184610b6e565b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610f6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b600060208284031215610f8657600080fd5b5051919050565b60008060408385031215610fa057600080fd5b50508051602090910151909290915056fea2646970667358221220b35050061df25b03f8fdeb533b497c50985b7bd9058e344c24685a1368d63a1d64736f6c634300080a0033000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439660000000000000000000000000689640d190b10765f09310fcfe9c670ede4e25b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd6439660000000000000000000000000689640d190b10765f09310fcfe9c670ede4e25b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _bentoBox (address): 0xF5BCE5077908a1b7370B9ae04AdC565EBd643966
Arg [1] : _furoVesting (address): 0x0689640d190b10765f09310fCfE9C670eDe4E25B
Arg [2] : _wETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966
Arg [1] : 0000000000000000000000000689640d190b10765f09310fcfe9c670ede4e25b
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.