Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 97 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 19562483 | 370 days ago | IN | 0 ETH | 0.0016955 | ||||
Redeem | 19429434 | 389 days ago | IN | 0 ETH | 0.00367976 | ||||
Redeem | 19429431 | 389 days ago | IN | 0 ETH | 0.00405404 | ||||
Redeem | 19429418 | 389 days ago | IN | 0 ETH | 0.00362279 | ||||
Redeem | 19429411 | 389 days ago | IN | 0 ETH | 0.00339692 | ||||
Redeem | 19211741 | 419 days ago | IN | 0 ETH | 0.00104433 | ||||
Swap Exact Asset... | 19211599 | 419 days ago | IN | 0 ETH | 0.00043627 | ||||
Redeem | 19210204 | 419 days ago | IN | 0 ETH | 0.00180345 | ||||
Redeem | 19209407 | 419 days ago | IN | 0 ETH | 0.00112635 | ||||
Redeem | 19204772 | 420 days ago | IN | 0 ETH | 0.00165934 | ||||
Redeem | 19204295 | 420 days ago | IN | 0 ETH | 0.0016768 | ||||
Redeem | 19201066 | 421 days ago | IN | 0 ETH | 0.00158181 | ||||
Redeem | 19196090 | 421 days ago | IN | 0 ETH | 0.00186447 | ||||
Redeem | 19194916 | 422 days ago | IN | 0 ETH | 0.00209769 | ||||
Redeem | 19193906 | 422 days ago | IN | 0 ETH | 0.00238705 | ||||
Redeem | 19190854 | 422 days ago | IN | 0 ETH | 0.00493451 | ||||
Redeem | 19189584 | 422 days ago | IN | 0 ETH | 0.00299288 | ||||
Redeem | 19188450 | 422 days ago | IN | 0 ETH | 0.00267914 | ||||
Redeem | 19185951 | 423 days ago | IN | 0 ETH | 0.00402024 | ||||
Redeem | 19185588 | 423 days ago | IN | 0 ETH | 0.00421768 | ||||
Redeem | 19185517 | 423 days ago | IN | 0 ETH | 0.003358 | ||||
Redeem | 19185498 | 423 days ago | IN | 0 ETH | 0.00372958 | ||||
Redeem | 19185496 | 423 days ago | IN | 0 ETH | 0.00371058 | ||||
Redeem | 19185372 | 423 days ago | IN | 0 ETH | 0.00347557 | ||||
Redeem | 19185365 | 423 days ago | IN | 0 ETH | 0.00351301 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
0x6101483d | 19123495 | 432 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Minimal Proxy Contract for 0x81a89a3c934b688f93368b07d1210c7d669e27bc
Contract Name:
LiquidityBootstrapPool
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 1000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity =0.8.21;import "weighted-math-lib/WeightedMathLib.sol";import "solady/src/utils/SafeTransferLib.sol";import "solady/src/utils/MerkleProofLib.sol";import "solady/src/utils/LibString.sol";import "solady/src/utils/Clone.sol";import { ISablierV2LockupLinear } from "v2-core/src/interfaces/ISablierV2LockupLinear.sol";import { Broker, LockupLinear } from "v2-core/src/types/DataTypes.sol";import { ud60x18 } from "v2-core/src/types/Math.sol";import { IERC20 } from "v2-core/src/types/Tokens.sol";import "openzeppelin-contracts/contracts/security/ReentrancyGuard.sol";import "src/utils/LiquidityBootstrapLib.sol";import "src/utils/Pausable.sol";import "./Treasury.sol";contract LiquidityBootstrapPool is Pausable, Clone, ReentrancyGuard {/// -----------------------------------------------------------------------/// Dependencies/// -----------------------------------------------------------------------
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity ^0.8.21;import "solady/src/utils/FixedPointMathLib.sol";import "solady/src/utils/SafeCastLib.sol";library WeightedMathLib {/// -----------------------------------------------------------------------/// Dependencies/// -----------------------------------------------------------------------using SafeCastLib for *;using FixedPointMathLib for *;/// -----------------------------------------------------------------------/// Errors/// -----------------------------------------------------------------------/// @dev Thrown when `amountIn` exceeds `MAX_PERCENTAGE_IN`, which is imposed by balancer.error AmountInTooLarge();/// @dev Thrown when `amountOut` exceeds `MAX_PERCENTAGE_OUT`, which is imposed by balancer.error AmountOutTooLarge();/// -----------------------------------------------------------------------
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.4;/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values./// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)////// @dev Note:/// - For ETH transfers, please use `forceSafeTransferETH` for DoS protection./// - For ERC20s, this implementation won't check that a token has code,/// responsibility is delegated to the caller.library SafeTransferLib {/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CUSTOM ERRORS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The ETH transfer has failed.error ETHTransferFailed();/// @dev The ERC20 `transferFrom` has failed.error TransferFromFailed();/// @dev The ERC20 `transfer` has failed.error TransferFailed();/// @dev The ERC20 `approve` has failed.
12345678910111213141516171819202122232425// SPDX-License-Identifier: MITpragma solidity ^0.8.4;/// @notice Gas optimized verification of proof of inclusion for a leaf in a Merkle tree./// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)library MerkleProofLib {/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* MERKLE PROOF VERIFICATION OPERATIONS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf)internalpurereturns (bool isValid){/// @solidity memory-safe-assemblyassembly {if mload(proof) {// Initialize `offset` to the offset of `proof` elements in memory.let offset := add(proof, 0x20)// Left shift by 5 is equivalent to multiplying by 0x20.let end := add(offset, shl(5, mload(proof)))
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.4;/// @notice Library for converting numbers into strings and other string operations./// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)library LibString {/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CUSTOM ERRORS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The `length` of the output is too small to contain all the hex digits.error HexLengthInsufficient();/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CONSTANTS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The constant returned when the `search` is not found in the string.uint256 internal constant NOT_FOUND = type(uint256).max;/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* DECIMAL OPERATIONS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev Returns the base 10 decimal representation of `value`.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.4;/// @notice Class with helper read functions for clone with immutable args./// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Clone.sol)/// @author Adapted from clones with immutable args by zefram.eth, Saw-mon & Natalie/// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)abstract contract Clone {/// @dev Reads all of the immutable args.function _getArgBytes() internal pure returns (bytes memory arg) {uint256 offset = _getImmutableArgsOffset();/// @solidity memory-safe-assemblyassembly {arg := mload(0x40)let length := sub(calldatasize(), add(2, offset)) // 2 bytes are used for the length.mstore(arg, length) // Store the length.calldatacopy(add(arg, 0x20), offset, length)let o := add(add(arg, 0x20), length)mstore(o, 0) // Zeroize the slot after the bytes.mstore(0x40, add(o, 0x20)) // Allocate the memory.}}/// @dev Reads an immutable arg with type bytes.function _getArgBytes(uint256 argOffset, uint256 length)internal
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity >=0.8.19;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { Lockup, LockupLinear } from "../types/DataTypes.sol";import { ISablierV2Lockup } from "./ISablierV2Lockup.sol";/// @title ISablierV2LockupLinear/// @notice Creates and manages lockup streams with a linear streaming function.interface ISablierV2LockupLinear is ISablierV2Lockup {/*//////////////////////////////////////////////////////////////////////////EVENTS//////////////////////////////////////////////////////////////////////////*//// @notice Emitted when a stream is created./// @param streamId The id of the newly created stream./// @param funder The address which funded the stream./// @param sender The address streaming the assets, with the ability to cancel the stream./// @param recipient The address receiving the assets./// @param amounts Struct containing (i) the deposit amount, (ii) the protocol fee amount, and (iii) the/// broker fee amount, all denoted in units of the asset's decimals./// @param asset The contract address of the ERC-20 asset used for streaming./// @param cancelable Boolean indicating whether the stream will be cancelable or not./// @param range Struct containing (i) the stream's start time, (ii) cliff time, and (iii) end time, all as Unix/// timestamps.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity >=0.8.19;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { UD2x18 } from "@prb/math/src/UD2x18.sol";import { UD60x18 } from "@prb/math/src/UD60x18.sol";// DataTypes.sol//// This file defines all structs used in V2 Core, most of which are organized under three namespaces://// - Lockup// - LockupDynamic// - LockupLinear//// You will notice that some structs contain "slot" annotations - they are used to indicate the// storage layout of the struct. It is more gas efficient to group small data types together so// that they fit in a single 32-byte slot./// @notice Struct encapsulating the broker parameters passed to the create functions. Both can be set to zero./// @param account The address receiving the broker's fee./// @param fee The broker's percentage fee from the total amount, denoted as a fixed-point number where 1e18 is 100%.struct Broker {address account;UD60x18 fee;}
123456789101112// SPDX-License-Identifier: GPL-3.0-or-later// solhint-disable no-unused-importpragma solidity >=0.8.19;// Math.sol//// This file re-exports all PRBMath types used in V2 Core. It is provided for convenience so// that users don't have to install PRBMath separately.import { SD59x18, sd, sd59x18 } from "@prb/math/src/SD59x18.sol";import { UD2x18, ud2x18 } from "@prb/math/src/UD2x18.sol";import { UD60x18, ud, ud60x18 } from "@prb/math/src/UD60x18.sol";
1234567891011// SPDX-License-Identifier: GPL-3.0-or-later// solhint-disable no-unused-importpragma solidity >=0.8.19;// Tokens.sol//// This file re-exports all token interfaces used in V2 Core. It is provided for convenience so// that users don't have to install OpenZeppelin separately.import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol";import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)pragma solidity ^0.8.0;/*** @dev Contract module that helps prevent reentrant calls to a function.** Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier* available, which can be applied to functions to make sure there are no nested* (reentrant) calls to them.** Note that because there is a single `nonReentrant` guard, functions marked as* `nonReentrant` may not call one another. This can be worked around by making* those functions `private`, and then adding `external` `nonReentrant` entry* points to them.** TIP: If you would like to learn more about reentrancy and alternative ways* to protect against it, check out our blog post* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].*/abstract contract ReentrancyGuard {// Booleans are more expensive than uint256 or any type that takes up a full// word because each write operation emits an extra SLOAD to first read the// slot's contents, replace the bits taken up by the boolean, and then write// back. This is the compiler's defense against contract upgrades and
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity =0.8.21;import "weighted-math-lib/WeightedMathLib.sol";import "solady/src/tokens/ERC20.sol";struct Pool {address asset;address share;uint256 assets;uint256 shares;uint256 virtualAssets;uint256 virtualShares;uint256 weightStart;uint256 weightEnd;uint256 saleStart;uint256 saleEnd;uint256 totalPurchased;uint256 maxSharePrice;}library LiquidityBootstrapLib {/// -----------------------------------------------------------------------/// Dependencies/// -----------------------------------------------------------------------
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity =0.8.21;abstract contract Pausable {/// -----------------------------------------------------------------------/// Events/// -----------------------------------------------------------------------event Paused(bool);/// -----------------------------------------------------------------------/// Custom Errors/// -----------------------------------------------------------------------error EnforcedPause();/// -----------------------------------------------------------------------/// Mutable Storage/// -----------------------------------------------------------------------bool public paused;/// -----------------------------------------------------------------------/// Modifiers/// -----------------------------------------------------------------------
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity =0.8.21;import "solady/src/auth/Ownable.sol";import "solady/src/utils/SafeTransferLib.sol";import "weighted-math-lib/WeightedMathLib.sol";contract Treasury is Ownable {/// -----------------------------------------------------------------------/// Dependencies/// -----------------------------------------------------------------------using FixedPointMathLib for *;using SafeTransferLib for address;/// -----------------------------------------------------------------------/// Events/// -----------------------------------------------------------------------/// @dev Emitted when the fee recipient is updated./// @param recipient The new fee recipient address./// @param percentage The new fee recipient percentage.event FeeRecipientUpdated(address recipient, uint256 percentage);/// -----------------------------------------------------------------------
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.4;/// @notice Arithmetic library with operations for fixed-point numbers./// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/FixedPointMathLib.sol)/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)library FixedPointMathLib {/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CUSTOM ERRORS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The operation failed, as the output exceeds the maximum value of uint256.error ExpOverflow();/// @dev The operation failed, as the output exceeds the maximum value of uint256.error FactorialOverflow();/// @dev The operation failed, due to an overflow.error RPowOverflow();/// @dev The operation failed, due to an multiplication overflow.error MulWadFailed();/// @dev The operation failed, either due to a/// multiplication overflow, or a division by a zero.error DivWadFailed();
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.4;/// @notice Safe integer casting library that reverts on overflow./// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeCastLib.sol)/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeCast.sol)library SafeCastLib {/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CUSTOM ERRORS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/error Overflow();/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* UNSIGNED INTEGER SAFE CASTING OPERATIONS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/function toUint8(uint256 x) internal pure returns (uint8) {if (x >= 1 << 8) _revertOverflow();return uint8(x);}function toUint16(uint256 x) internal pure returns (uint16) {if (x >= 1 << 16) _revertOverflow();return uint16(x);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC20 standard as defined in the EIP.*/interface IERC20 {/*** @dev Emitted when `value` tokens are moved from one account (`from`) to* another (`to`).** Note that `value` may be zero.*/event Transfer(address indexed from, address indexed to, uint256 value);/*** @dev Emitted when the allowance of a `spender` for an `owner` is set by* a call to {approve}. `value` is the new allowance.*/event Approval(address indexed owner, address indexed spender, uint256 value);/*** @dev Returns the amount of tokens in existence.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity >=0.8.19;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { IERC721Metadata } from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";import { Lockup } from "../types/DataTypes.sol";import { ISablierV2Base } from "./ISablierV2Base.sol";import { ISablierV2NFTDescriptor } from "./ISablierV2NFTDescriptor.sol";/// @title ISablierV2Lockup/// @notice Common logic between all Sablier V2 lockup streaming contracts.interface ISablierV2Lockup isISablierV2Base, // 1 inherited componentIERC721Metadata // 2 inherited components{/*//////////////////////////////////////////////////////////////////////////EVENTS//////////////////////////////////////////////////////////////////////////*//// @notice Emitted when a stream is canceled./// @param streamId The id of the stream./// @param sender The address of the stream's sender./// @param recipient The address of the stream's recipient./// @param senderAmount The amount of assets refunded to the stream's sender, denoted in units of the asset's/// decimals.
12345678910111213141516171819202122232425// SPDX-License-Identifier: MITpragma solidity >=0.8.19;/*██████╗ ██████╗ ██████╗ ███╗ ███╗ █████╗ ████████╗██╗ ██╗██╔══██╗██╔══██╗██╔══██╗████╗ ████║██╔══██╗╚══██╔══╝██║ ██║██████╔╝██████╔╝██████╔╝██╔████╔██║███████║ ██║ ███████║██╔═══╝ ██╔══██╗██╔══██╗██║╚██╔╝██║██╔══██║ ██║ ██╔══██║██║ ██║ ██║██████╔╝██║ ╚═╝ ██║██║ ██║ ██║ ██║ ██║╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝██╗ ██╗██████╗ ██████╗ ██╗ ██╗ ██╗ █████╗██║ ██║██╔══██╗╚════██╗╚██╗██╔╝███║██╔══██╗██║ ██║██║ ██║ █████╔╝ ╚███╔╝ ╚██║╚█████╔╝██║ ██║██║ ██║██╔═══╝ ██╔██╗ ██║██╔══██╗╚██████╔╝██████╔╝███████╗██╔╝ ██╗ ██║╚█████╔╝╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚════╝*/import "./ud2x18/Casting.sol";import "./ud2x18/Constants.sol";import "./ud2x18/Errors.sol";import "./ud2x18/ValueType.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;/*██████╗ ██████╗ ██████╗ ███╗ ███╗ █████╗ ████████╗██╗ ██╗██╔══██╗██╔══██╗██╔══██╗████╗ ████║██╔══██╗╚══██╔══╝██║ ██║██████╔╝██████╔╝██████╔╝██╔████╔██║███████║ ██║ ███████║██╔═══╝ ██╔══██╗██╔══██╗██║╚██╔╝██║██╔══██║ ██║ ██╔══██║██║ ██║ ██║██████╔╝██║ ╚═╝ ██║██║ ██║ ██║ ██║ ██║╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝██╗ ██╗██████╗ ██████╗ ██████╗ ██╗ ██╗ ██╗ █████╗██║ ██║██╔══██╗██╔════╝ ██╔═████╗╚██╗██╔╝███║██╔══██╗██║ ██║██║ ██║███████╗ ██║██╔██║ ╚███╔╝ ╚██║╚█████╔╝██║ ██║██║ ██║██╔═══██╗████╔╝██║ ██╔██╗ ██║██╔══██╗╚██████╔╝██████╔╝╚██████╔╝╚██████╔╝██╔╝ ██╗ ██║╚█████╔╝╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚════╝*/import "./ud60x18/Casting.sol";import "./ud60x18/Constants.sol";import "./ud60x18/Conversions.sol";import "./ud60x18/Errors.sol";import "./ud60x18/Helpers.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;/*██████╗ ██████╗ ██████╗ ███╗ ███╗ █████╗ ████████╗██╗ ██╗██╔══██╗██╔══██╗██╔══██╗████╗ ████║██╔══██╗╚══██╔══╝██║ ██║██████╔╝██████╔╝██████╔╝██╔████╔██║███████║ ██║ ███████║██╔═══╝ ██╔══██╗██╔══██╗██║╚██╔╝██║██╔══██║ ██║ ██╔══██║██║ ██║ ██║██████╔╝██║ ╚═╝ ██║██║ ██║ ██║ ██║ ██║╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝███████╗██████╗ ███████╗ █████╗ ██╗ ██╗ ██╗ █████╗██╔════╝██╔══██╗██╔════╝██╔══██╗╚██╗██╔╝███║██╔══██╗███████╗██║ ██║███████╗╚██████║ ╚███╔╝ ╚██║╚█████╔╝╚════██║██║ ██║╚════██║ ╚═══██║ ██╔██╗ ██║██╔══██╗███████║██████╔╝███████║ █████╔╝██╔╝ ██╗ ██║╚█████╔╝╚══════╝╚═════╝ ╚══════╝ ╚════╝ ╚═╝ ╚═╝ ╚═╝ ╚════╝*/import "./sd59x18/Casting.sol";import "./sd59x18/Constants.sol";import "./sd59x18/Conversions.sol";import "./sd59x18/Errors.sol";import "./sd59x18/Helpers.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)pragma solidity ^0.8.0;import "../../utils/introspection/IERC165.sol";/*** @dev Required interface of an ERC721 compliant contract.*/interface IERC721 is IERC165 {/*** @dev Emitted when `tokenId` token is transferred from `from` to `to`.*/event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.*/event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.*/event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.4;/// @notice Simple ERC20 + EIP-2612 implementation./// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)////// @dev Note:/// - The ERC20 standard allows minting and transferring to and from the zero address,/// minting and transferring zero tokens, as well as self-approvals./// For performance, this implementation WILL NOT revert for such actions./// Please add any checks with overrides if desired./// - The `permit` function uses the ecrecover precompile (0x1).////// If you are overriding:/// - NEVER violate the ERC20 invariant:/// the total sum of all balances must be equal to `totalSupply()`./// - Check that the overridden function is actually used in the function you want to/// change the behavior of. Much of the code has been manually inlined for performance.abstract contract ERC20 {/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CUSTOM ERRORS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The total supply has overflowed.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.4;/// @notice Simple single owner authorization mixin./// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)////// @dev Note:/// This implementation does NOT auto-initialize the owner to `msg.sender`./// You MUST call the `_initializeOwner` in the constructor / initializer.////// While the ownable portion follows/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,/// the nomenclature for the 2-step ownership handover may be unique to this codebase.abstract contract Ownable {/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CUSTOM ERRORS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The caller is not authorized to call the function.error Unauthorized();/// @dev The `newOwner` cannot be the zero address.error NewOwnerIsZeroAddress();/// @dev The `pendingOwner` does not have a valid handover request.error NoHandoverRequest();
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)pragma solidity ^0.8.0;import "../IERC721.sol";/*** @title ERC-721 Non-Fungible Token Standard, optional metadata extension* @dev See https://eips.ethereum.org/EIPS/eip-721*/interface IERC721Metadata is IERC721 {/*** @dev Returns the token collection name.*/function name() external view returns (string memory);/*** @dev Returns the token collection symbol.*/function symbol() external view returns (string memory);/*** @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.*/function tokenURI(uint256 tokenId) external view returns (string memory);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity >=0.8.19;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { UD60x18 } from "@prb/math/src/UD60x18.sol";import { IAdminable } from "./IAdminable.sol";import { ISablierV2Comptroller } from "./ISablierV2Comptroller.sol";/// @title ISablierV2Base/// @notice Base logic for all Sablier V2 streaming contracts.interface ISablierV2Base is IAdminable {/*//////////////////////////////////////////////////////////////////////////EVENTS//////////////////////////////////////////////////////////////////////////*//// @notice Emitted when the admin claims all protocol revenues accrued for a particular ERC-20 asset./// @param admin The address of the contract admin./// @param asset The contract address of the ERC-20 asset the protocol revenues have been claimed for./// @param protocolRevenues The amount of protocol revenues claimed, denoted in units of the asset's decimals.event ClaimProtocolRevenues(address indexed admin, IERC20 indexed asset, uint128 protocolRevenues);/// @notice Emitted when the admin sets a new comptroller contract./// @param admin The address of the contract admin./// @param oldComptroller The address of the old comptroller contract./// @param newComptroller The address of the new comptroller contract.
12345678910111213141516// SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity >=0.8.19;import { IERC721Metadata } from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";/// @title ISablierV2NFTDescriptor/// @notice This contract generates the URI describing the Sablier V2 stream NFTs./// @dev Inspired by Uniswap V3 Positions NFTs.interface ISablierV2NFTDescriptor {/// @notice Produces the URI describing a particular stream NFT./// @dev This is a data URI with the JSON contents directly inlined./// @param sablier The address of the Sablier contract the stream was created in./// @param streamId The id of the stream for which to produce a description./// @return uri The URI of the ERC721-compliant metadata.function tokenURI(IERC721Metadata sablier, uint256 streamId) external view returns (string memory uri);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "../Common.sol" as Common;import "./Errors.sol" as Errors;import { uMAX_SD1x18 } from "../sd1x18/Constants.sol";import { SD1x18 } from "../sd1x18/ValueType.sol";import { SD59x18 } from "../sd59x18/ValueType.sol";import { UD2x18 } from "../ud2x18/ValueType.sol";import { UD60x18 } from "../ud60x18/ValueType.sol";import { UD2x18 } from "./ValueType.sol";/// @notice Casts a UD2x18 number into SD1x18./// - x must be less than or equal to `uMAX_SD1x18`.function intoSD1x18(UD2x18 x) pure returns (SD1x18 result) {uint64 xUint = UD2x18.unwrap(x);if (xUint > uint64(uMAX_SD1x18)) {revert Errors.PRBMath_UD2x18_IntoSD1x18_Overflow(x);}result = SD1x18.wrap(int64(xUint));}/// @notice Casts a UD2x18 number into SD59x18./// @dev There is no overflow check because the domain of UD2x18 is a subset of SD59x18.function intoSD59x18(UD2x18 x) pure returns (SD59x18 result) {result = SD59x18.wrap(int256(uint256(UD2x18.unwrap(x))));
123456789101112131415161718// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { UD2x18 } from "./ValueType.sol";/// @dev Euler's number as a UD2x18 number.UD2x18 constant E = UD2x18.wrap(2_718281828459045235);/// @dev The maximum value a UD2x18 number can have.uint64 constant uMAX_UD2x18 = 18_446744073709551615;UD2x18 constant MAX_UD2x18 = UD2x18.wrap(uMAX_UD2x18);/// @dev PI as a UD2x18 number.UD2x18 constant PI = UD2x18.wrap(3_141592653589793238);/// @dev The unit number, which gives the decimal precision of UD2x18.uint256 constant uUNIT = 1e18;UD2x18 constant UNIT = UD2x18.wrap(1e18);
12345678910// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { UD2x18 } from "./ValueType.sol";/// @notice Thrown when trying to cast a UD2x18 number that doesn't fit in SD1x18.error PRBMath_UD2x18_IntoSD1x18_Overflow(UD2x18 x);/// @notice Thrown when trying to cast a UD2x18 number that doesn't fit in uint40.error PRBMath_UD2x18_IntoUint40_Overflow(UD2x18 x);
123456789101112131415161718192021222324// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "./Casting.sol" as Casting;/// @notice The unsigned 2.18-decimal fixed-point number representation, which can have up to 2 digits and up to 18/// decimals. The values of this are bound by the minimum and the maximum values permitted by the underlying Solidity/// type uint64. This is useful when end users want to use uint64 to save gas, e.g. with tight variable packing in contract/// storage.type UD2x18 is uint64;/*//////////////////////////////////////////////////////////////////////////CASTING//////////////////////////////////////////////////////////////////////////*/using {Casting.intoSD1x18,Casting.intoSD59x18,Casting.intoUD60x18,Casting.intoUint256,Casting.intoUint128,Casting.intoUint40,Casting.unwrap} for UD2x18 global;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "./Errors.sol" as CastingErrors;import { MAX_UINT128, MAX_UINT40 } from "../Common.sol";import { uMAX_SD1x18 } from "../sd1x18/Constants.sol";import { SD1x18 } from "../sd1x18/ValueType.sol";import { uMAX_SD59x18 } from "../sd59x18/Constants.sol";import { SD59x18 } from "../sd59x18/ValueType.sol";import { uMAX_UD2x18 } from "../ud2x18/Constants.sol";import { UD2x18 } from "../ud2x18/ValueType.sol";import { UD60x18 } from "./ValueType.sol";/// @notice Casts a UD60x18 number into SD1x18./// @dev Requirements:/// - x must be less than or equal to `uMAX_SD1x18`.function intoSD1x18(UD60x18 x) pure returns (SD1x18 result) {uint256 xUint = UD60x18.unwrap(x);if (xUint > uint256(int256(uMAX_SD1x18))) {revert CastingErrors.PRBMath_UD60x18_IntoSD1x18_Overflow(x);}result = SD1x18.wrap(int64(uint64(xUint)));}/// @notice Casts a UD60x18 number into UD2x18./// @dev Requirements:
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { UD60x18 } from "./ValueType.sol";// NOTICE: the "u" prefix stands for "unwrapped"./// @dev Euler's number as a UD60x18 number.UD60x18 constant E = UD60x18.wrap(2_718281828459045235);/// @dev The maximum input permitted in {exp}.uint256 constant uEXP_MAX_INPUT = 133_084258667509499440;UD60x18 constant EXP_MAX_INPUT = UD60x18.wrap(uEXP_MAX_INPUT);/// @dev The maximum input permitted in {exp2}.uint256 constant uEXP2_MAX_INPUT = 192e18 - 1;UD60x18 constant EXP2_MAX_INPUT = UD60x18.wrap(uEXP2_MAX_INPUT);/// @dev Half the UNIT number.uint256 constant uHALF_UNIT = 0.5e18;UD60x18 constant HALF_UNIT = UD60x18.wrap(uHALF_UNIT);/// @dev $log_2(10)$ as a UD60x18 number.uint256 constant uLOG2_10 = 3_321928094887362347;UD60x18 constant LOG2_10 = UD60x18.wrap(uLOG2_10);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { uMAX_UD60x18, uUNIT } from "./Constants.sol";import { PRBMath_UD60x18_Convert_Overflow } from "./Errors.sol";import { UD60x18 } from "./ValueType.sol";/// @notice Converts a UD60x18 number to a simple integer by dividing it by `UNIT`./// @dev The result is rounded toward zero./// @param x The UD60x18 number to convert./// @return result The same number in basic integer form.function convert(UD60x18 x) pure returns (uint256 result) {result = UD60x18.unwrap(x) / uUNIT;}/// @notice Converts a simple integer to UD60x18 by multiplying it by `UNIT`.////// @dev Requirements:/// - x must be less than or equal to `MAX_UD60x18 / UNIT`.////// @param x The basic integer to convert./// @param result The same number converted to UD60x18.function convert(uint256 x) pure returns (UD60x18 result) {if (x > uMAX_UD60x18 / uUNIT) {revert PRBMath_UD60x18_Convert_Overflow(x);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { UD60x18 } from "./ValueType.sol";/// @notice Thrown when ceiling a number overflows UD60x18.error PRBMath_UD60x18_Ceil_Overflow(UD60x18 x);/// @notice Thrown when converting a basic integer to the fixed-point format overflows UD60x18.error PRBMath_UD60x18_Convert_Overflow(uint256 x);/// @notice Thrown when taking the natural exponent of a base greater than 133_084258667509499441.error PRBMath_UD60x18_Exp_InputTooBig(UD60x18 x);/// @notice Thrown when taking the binary exponent of a base greater than 192e18.error PRBMath_UD60x18_Exp2_InputTooBig(UD60x18 x);/// @notice Thrown when taking the geometric mean of two numbers and multiplying them overflows UD60x18.error PRBMath_UD60x18_Gm_Overflow(UD60x18 x, UD60x18 y);/// @notice Thrown when trying to cast a UD60x18 number that doesn't fit in SD1x18.error PRBMath_UD60x18_IntoSD1x18_Overflow(UD60x18 x);/// @notice Thrown when trying to cast a UD60x18 number that doesn't fit in SD59x18.error PRBMath_UD60x18_IntoSD59x18_Overflow(UD60x18 x);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { wrap } from "./Casting.sol";import { UD60x18 } from "./ValueType.sol";/// @notice Implements the checked addition operation (+) in the UD60x18 type.function add(UD60x18 x, UD60x18 y) pure returns (UD60x18 result) {result = wrap(x.unwrap() + y.unwrap());}/// @notice Implements the AND (&) bitwise operation in the UD60x18 type.function and(UD60x18 x, uint256 bits) pure returns (UD60x18 result) {result = wrap(x.unwrap() & bits);}/// @notice Implements the AND (&) bitwise operation in the UD60x18 type.function and2(UD60x18 x, UD60x18 y) pure returns (UD60x18 result) {result = wrap(x.unwrap() & y.unwrap());}/// @notice Implements the equal operation (==) in the UD60x18 type.function eq(UD60x18 x, UD60x18 y) pure returns (bool result) {result = x.unwrap() == y.unwrap();}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "../Common.sol" as Common;import "./Errors.sol" as Errors;import { wrap } from "./Casting.sol";import {uEXP_MAX_INPUT,uEXP2_MAX_INPUT,uHALF_UNIT,uLOG2_10,uLOG2_E,uMAX_UD60x18,uMAX_WHOLE_UD60x18,UNIT,uUNIT,uUNIT_SQUARED,ZERO} from "./Constants.sol";import { UD60x18 } from "./ValueType.sol";/*//////////////////////////////////////////////////////////////////////////MATHEMATICAL FUNCTIONS//////////////////////////////////////////////////////////////////////////*//// @notice Calculates the arithmetic average of x and y using the following formula:
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "./Casting.sol" as Casting;import "./Helpers.sol" as Helpers;import "./Math.sol" as Math;/// @notice The unsigned 60.18-decimal fixed-point number representation, which can have up to 60 digits and up to 18/// decimals. The values of this are bound by the minimum and the maximum values permitted by the Solidity type uint256./// @dev The value type is defined here so it can be imported in all other files.type UD60x18 is uint256;/*//////////////////////////////////////////////////////////////////////////CASTING//////////////////////////////////////////////////////////////////////////*/using {Casting.intoSD1x18,Casting.intoUD2x18,Casting.intoSD59x18,Casting.intoUint128,Casting.intoUint256,Casting.intoUint40,Casting.unwrap} for UD60x18 global;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "./Errors.sol" as CastingErrors;import { MAX_UINT128, MAX_UINT40 } from "../Common.sol";import { uMAX_SD1x18, uMIN_SD1x18 } from "../sd1x18/Constants.sol";import { SD1x18 } from "../sd1x18/ValueType.sol";import { uMAX_UD2x18 } from "../ud2x18/Constants.sol";import { UD2x18 } from "../ud2x18/ValueType.sol";import { UD60x18 } from "../ud60x18/ValueType.sol";import { SD59x18 } from "./ValueType.sol";/// @notice Casts an SD59x18 number into int256./// @dev This is basically a functional alias for {unwrap}.function intoInt256(SD59x18 x) pure returns (int256 result) {result = SD59x18.unwrap(x);}/// @notice Casts an SD59x18 number into SD1x18./// @dev Requirements:/// - x must be greater than or equal to `uMIN_SD1x18`./// - x must be less than or equal to `uMAX_SD1x18`.function intoSD1x18(SD59x18 x) pure returns (SD1x18 result) {int256 xInt = SD59x18.unwrap(x);if (xInt < uMIN_SD1x18) {revert CastingErrors.PRBMath_SD59x18_IntoSD1x18_Underflow(x);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { SD59x18 } from "./ValueType.sol";// NOTICE: the "u" prefix stands for "unwrapped"./// @dev Euler's number as an SD59x18 number.SD59x18 constant E = SD59x18.wrap(2_718281828459045235);/// @dev The maximum input permitted in {exp}.int256 constant uEXP_MAX_INPUT = 133_084258667509499440;SD59x18 constant EXP_MAX_INPUT = SD59x18.wrap(uEXP_MAX_INPUT);/// @dev The maximum input permitted in {exp2}.int256 constant uEXP2_MAX_INPUT = 192e18 - 1;SD59x18 constant EXP2_MAX_INPUT = SD59x18.wrap(uEXP2_MAX_INPUT);/// @dev Half the UNIT number.int256 constant uHALF_UNIT = 0.5e18;SD59x18 constant HALF_UNIT = SD59x18.wrap(uHALF_UNIT);/// @dev $log_2(10)$ as an SD59x18 number.int256 constant uLOG2_10 = 3_321928094887362347;SD59x18 constant LOG2_10 = SD59x18.wrap(uLOG2_10);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { uMAX_SD59x18, uMIN_SD59x18, uUNIT } from "./Constants.sol";import { PRBMath_SD59x18_Convert_Overflow, PRBMath_SD59x18_Convert_Underflow } from "./Errors.sol";import { SD59x18 } from "./ValueType.sol";/// @notice Converts a simple integer to SD59x18 by multiplying it by `UNIT`.////// @dev Requirements:/// - x must be greater than or equal to `MIN_SD59x18 / UNIT`./// - x must be less than or equal to `MAX_SD59x18 / UNIT`.////// @param x The basic integer to convert./// @param result The same number converted to SD59x18.function convert(int256 x) pure returns (SD59x18 result) {if (x < uMIN_SD59x18 / uUNIT) {revert PRBMath_SD59x18_Convert_Underflow(x);}if (x > uMAX_SD59x18 / uUNIT) {revert PRBMath_SD59x18_Convert_Overflow(x);}unchecked {result = SD59x18.wrap(x * uUNIT);}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { SD59x18 } from "./ValueType.sol";/// @notice Thrown when taking the absolute value of `MIN_SD59x18`.error PRBMath_SD59x18_Abs_MinSD59x18();/// @notice Thrown when ceiling a number overflows SD59x18.error PRBMath_SD59x18_Ceil_Overflow(SD59x18 x);/// @notice Thrown when converting a basic integer to the fixed-point format overflows SD59x18.error PRBMath_SD59x18_Convert_Overflow(int256 x);/// @notice Thrown when converting a basic integer to the fixed-point format underflows SD59x18.error PRBMath_SD59x18_Convert_Underflow(int256 x);/// @notice Thrown when dividing two numbers and one of them is `MIN_SD59x18`.error PRBMath_SD59x18_Div_InputTooSmall();/// @notice Thrown when dividing two numbers and one of the intermediary unsigned results overflows SD59x18.error PRBMath_SD59x18_Div_Overflow(SD59x18 x, SD59x18 y);/// @notice Thrown when taking the natural exponent of a base greater than 133_084258667509499441.error PRBMath_SD59x18_Exp_InputTooBig(SD59x18 x);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { wrap } from "./Casting.sol";import { SD59x18 } from "./ValueType.sol";/// @notice Implements the checked addition operation (+) in the SD59x18 type.function add(SD59x18 x, SD59x18 y) pure returns (SD59x18 result) {return wrap(x.unwrap() + y.unwrap());}/// @notice Implements the AND (&) bitwise operation in the SD59x18 type.function and(SD59x18 x, int256 bits) pure returns (SD59x18 result) {return wrap(x.unwrap() & bits);}/// @notice Implements the AND (&) bitwise operation in the SD59x18 type.function and2(SD59x18 x, SD59x18 y) pure returns (SD59x18 result) {return wrap(x.unwrap() & y.unwrap());}/// @notice Implements the equal (=) operation in the SD59x18 type.function eq(SD59x18 x, SD59x18 y) pure returns (bool result) {result = x.unwrap() == y.unwrap();}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "../Common.sol" as Common;import "./Errors.sol" as Errors;import {uEXP_MAX_INPUT,uEXP2_MAX_INPUT,uHALF_UNIT,uLOG2_10,uLOG2_E,uMAX_SD59x18,uMAX_WHOLE_SD59x18,uMIN_SD59x18,uMIN_WHOLE_SD59x18,UNIT,uUNIT,uUNIT_SQUARED,ZERO} from "./Constants.sol";import { wrap } from "./Helpers.sol";import { SD59x18 } from "./ValueType.sol";/// @notice Calculates the absolute value of x.////// @dev Requirements:
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "./Casting.sol" as Casting;import "./Helpers.sol" as Helpers;import "./Math.sol" as Math;/// @notice The signed 59.18-decimal fixed-point number representation, which can have up to 59 digits and up to 18/// decimals. The values of this are bound by the minimum and the maximum values permitted by the underlying Solidity/// type int256.type SD59x18 is int256;/*//////////////////////////////////////////////////////////////////////////CASTING//////////////////////////////////////////////////////////////////////////*/using {Casting.intoInt256,Casting.intoSD1x18,Casting.intoUD2x18,Casting.intoUD60x18,Casting.intoUint256,Casting.intoUint128,Casting.intoUint40,Casting.unwrap} for SD59x18 global;
12345678910111213141516171819202122232425// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[EIP].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity >=0.8.19;/// @title IAdminable/// @notice Contract module that provides a basic access control mechanism, with an admin that can be/// granted exclusive access to specific functions. The inheriting contract must set the initial admin/// in the constructor.interface IAdminable {/*//////////////////////////////////////////////////////////////////////////EVENTS//////////////////////////////////////////////////////////////////////////*//// @notice Emitted when the admin is transferred./// @param oldAdmin The address of the old admin./// @param newAdmin The address of the new admin.event TransferAdmin(address indexed oldAdmin, address indexed newAdmin);/*//////////////////////////////////////////////////////////////////////////CONSTANT FUNCTIONS//////////////////////////////////////////////////////////////////////////*//// @notice The address of the admin account or contract.function admin() external view returns (address);/*//////////////////////////////////////////////////////////////////////////NON-CONSTANT FUNCTIONS
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity >=0.8.19;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { UD60x18 } from "@prb/math/src/UD60x18.sol";import { IAdminable } from "./IAdminable.sol";/// @title ISablierV2Controller/// @notice This contract is in charge of the Sablier V2 protocol configuration, handling such values as the/// protocol fees.interface ISablierV2Comptroller is IAdminable {/*//////////////////////////////////////////////////////////////////////////EVENTS//////////////////////////////////////////////////////////////////////////*//// @notice Emitted when the admin sets a new flash fee./// @param admin The address of the contract admin./// @param oldFlashFee The old flash fee, denoted as a fixed-point number./// @param newFlashFee The new flash fee, denoted as a fixed-point number.event SetFlashFee(address indexed admin, UD60x18 oldFlashFee, UD60x18 newFlashFee);/// @notice Emitted when the admin sets a new protocol fee for the provided ERC-20 asset./// @param admin The address of the contract admin./// @param asset The contract address of the ERC-20 asset the new protocol fee has been set for./// @param oldProtocolFee The old protocol fee, denoted as a fixed-point number.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;// Common.sol//// Common mathematical functions needed by both SD59x18 and UD60x18. Note that these global functions do not// always operate with SD59x18 and UD60x18 numbers./*//////////////////////////////////////////////////////////////////////////CUSTOM ERRORS//////////////////////////////////////////////////////////////////////////*//// @notice Thrown when the resultant value in {mulDiv} overflows uint256.error PRBMath_MulDiv_Overflow(uint256 x, uint256 y, uint256 denominator);/// @notice Thrown when the resultant value in {mulDiv18} overflows uint256.error PRBMath_MulDiv18_Overflow(uint256 x, uint256 y);/// @notice Thrown when one of the inputs passed to {mulDivSigned} is `type(int256).min`.error PRBMath_MulDivSigned_InputTooSmall();/// @notice Thrown when the resultant value in {mulDivSigned} overflows int256.error PRBMath_MulDivSigned_Overflow(int256 x, int256 y);/*//////////////////////////////////////////////////////////////////////////CONSTANTS
12345678910111213141516171819202122// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { SD1x18 } from "./ValueType.sol";/// @dev Euler's number as an SD1x18 number.SD1x18 constant E = SD1x18.wrap(2_718281828459045235);/// @dev The maximum value an SD1x18 number can have.int64 constant uMAX_SD1x18 = 9_223372036854775807;SD1x18 constant MAX_SD1x18 = SD1x18.wrap(uMAX_SD1x18);/// @dev The maximum value an SD1x18 number can have.int64 constant uMIN_SD1x18 = -9_223372036854775808;SD1x18 constant MIN_SD1x18 = SD1x18.wrap(uMIN_SD1x18);/// @dev PI as an SD1x18 number.SD1x18 constant PI = SD1x18.wrap(3_141592653589793238);/// @dev The unit number, which gives the decimal precision of SD1x18.SD1x18 constant UNIT = SD1x18.wrap(1e18);int256 constant uUNIT = 1e18;
123456789101112131415161718192021222324// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "./Casting.sol" as Casting;/// @notice The signed 1.18-decimal fixed-point number representation, which can have up to 1 digit and up to 18/// decimals. The values of this are bound by the minimum and the maximum values permitted by the underlying Solidity/// type int64. This is useful when end users want to use int64 to save gas, e.g. with tight variable packing in contract/// storage.type SD1x18 is int64;/*//////////////////////////////////////////////////////////////////////////CASTING//////////////////////////////////////////////////////////////////////////*/using {Casting.intoSD59x18,Casting.intoUD2x18,Casting.intoUD60x18,Casting.intoUint256,Casting.intoUint128,Casting.intoUint40,Casting.unwrap} for SD1x18 global;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import "../Common.sol" as Common;import "./Errors.sol" as CastingErrors;import { SD59x18 } from "../sd59x18/ValueType.sol";import { UD2x18 } from "../ud2x18/ValueType.sol";import { UD60x18 } from "../ud60x18/ValueType.sol";import { SD1x18 } from "./ValueType.sol";/// @notice Casts an SD1x18 number into SD59x18./// @dev There is no overflow check because the domain of SD1x18 is a subset of SD59x18.function intoSD59x18(SD1x18 x) pure returns (SD59x18 result) {result = SD59x18.wrap(int256(SD1x18.unwrap(x)));}/// @notice Casts an SD1x18 number into UD2x18./// - x must be positive.function intoUD2x18(SD1x18 x) pure returns (UD2x18 result) {int64 xInt = SD1x18.unwrap(x);if (xInt < 0) {revert CastingErrors.PRBMath_SD1x18_ToUD2x18_Underflow(x);}result = UD2x18.wrap(uint64(xInt));}
12345678910111213141516171819202122// SPDX-License-Identifier: MITpragma solidity >=0.8.19;import { SD1x18 } from "./ValueType.sol";/// @notice Thrown when trying to cast a SD1x18 number that doesn't fit in UD2x18.error PRBMath_SD1x18_ToUD2x18_Underflow(SD1x18 x);/// @notice Thrown when trying to cast a SD1x18 number that doesn't fit in UD60x18.error PRBMath_SD1x18_ToUD60x18_Underflow(SD1x18 x);/// @notice Thrown when trying to cast a SD1x18 number that doesn't fit in uint128.error PRBMath_SD1x18_ToUint128_Underflow(SD1x18 x);/// @notice Thrown when trying to cast a SD1x18 number that doesn't fit in uint256.error PRBMath_SD1x18_ToUint256_Underflow(SD1x18 x);/// @notice Thrown when trying to cast a SD1x18 number that doesn't fit in uint40.error PRBMath_SD1x18_ToUint40_Overflow(SD1x18 x);/// @notice Thrown when trying to cast a SD1x18 number that doesn't fit in uint40.error PRBMath_SD1x18_ToUint40_Underflow(SD1x18 x);
1234567891011121314151617181920212223242526{"remappings": ["@openzeppelin/contracts/=lib/v2-core/lib/openzeppelin-contracts/contracts/","@prb/math/=lib/v2-core/lib/prb-math/","@prb/test/=lib/v2-core/lib/prb-test/src/","ds-test/=lib/solady/lib/ds-test/src/","erc4626-tests/=lib/v2-core/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","murky/=lib/murky/","openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/","openzeppelin/=lib/v2-core/lib/openzeppelin-contracts/contracts/","prb-math/=lib/v2-core/lib/prb-math/src/","prb-test/=lib/v2-core/lib/prb-test/src/","solady/=lib/solady/","solarray/=lib/v2-core/lib/solarray/src/","solplot/=lib/weighted-math-lib/lib/solplot/src/","v2-core/=lib/v2-core/","weighted-math-lib/=lib/weighted-math-lib/src/","lib/forge-std:ds-test/=lib/weighted-math-lib/lib/forge-std/lib/ds-test/src/","lib/solady:ds-test/=lib/weighted-math-lib/lib/solady/lib/ds-test/src/","lib/solady:forge-std/=lib/weighted-math-lib/lib/solady/test/utils/forge-std/"],"optimizer": {"enabled": true,"runs": 1000},
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_sablier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountInTooLarge","type":"error"},{"inputs":[],"name":"AmountOutTooLarge","type":"error"},{"inputs":[],"name":"AssetsInExceeded","type":"error"},{"inputs":[],"name":"CallerDisallowed","type":"error"},{"inputs":[],"name":"ClosingDisallowed","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"RedeemingDisallowed","type":"error"},{"inputs":[],"name":"SellingDisallowed","type":"error"},{"inputs":[],"name":"SharesOutExceeded","type":"error"},{"inputs":[],"name":"SlippageExceeded","type":"error"},{"inputs":[],"name":"TradingDisallowed","type":"error"},{"inputs":[],"name":"WhitelistProof","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapFeesAsset","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapFeesShare","type":"uint256"}],"name":"Close","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"streamID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"Sell","type":"event"},{"inputs":[],"name":"SABLIER","outputs":[{"internalType":"contract ISablierV2LockupLinear","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"args","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"share","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"virtualAssets","type":"uint256"},{"internalType":"uint256","name":"virtualShares","type":"uint256"},{"internalType":"uint256","name":"weightStart","type":"uint256"},{"internalType":"uint256","name":"weightEnd","type":"uint256"},{"internalType":"uint256","name":"saleStart","type":"uint256"},{"internalType":"uint256","name":"saleEnd","type":"uint256"},{"internalType":"uint256","name":"totalPurchased","type":"uint256"},{"internalType":"uint256","name":"maxSharePrice","type":"uint256"}],"internalType":"struct Pool","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxSharePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxTotalAssetsIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxTotalSharesOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platform","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"name":"previewAssetsIn","outputs":[{"internalType":"uint256","name":"assetsIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesIn","type":"uint256"}],"name":"previewAssetsOut","outputs":[{"internalType":"uint256","name":"assetsOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetsOut","type":"uint256"}],"name":"previewSharesIn","outputs":[{"internalType":"uint256","name":"sharesIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetsIn","type":"uint256"}],"name":"previewSharesOut","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchasedShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"referred","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"redeemedShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referredAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referrerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"reservesAndWeights","outputs":[{"internalType":"uint256","name":"assetReserve","type":"uint256"},{"internalType":"uint256","name":"shareReserve","type":"uint256"},{"internalType":"uint256","name":"assetWeight","type":"uint256"},{"internalType":"uint256","name":"shareWeight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"saleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"sellingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"},{"internalType":"uint256","name":"maxAssetsIn","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"swapAssetsForExactShares","outputs":[{"internalType":"uint256","name":"assetsIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"},{"internalType":"uint256","name":"maxAssetsIn","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"swapAssetsForExactShares","outputs":[{"internalType":"uint256","name":"assetsIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"},{"internalType":"uint256","name":"maxAssetsIn","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swapAssetsForExactShares","outputs":[{"internalType":"uint256","name":"assetsIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetsIn","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"swapExactAssetsForShares","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetsIn","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swapExactAssetsForShares","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetsIn","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"swapExactAssetsForShares","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesIn","type":"uint256"},{"internalType":"uint256","name":"minAssetsOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"swapExactSharesForAssets","outputs":[{"internalType":"uint256","name":"assetsOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesIn","type":"uint256"},{"internalType":"uint256","name":"minAssetsOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"swapExactSharesForAssets","outputs":[{"internalType":"uint256","name":"assetsOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetsOut","type":"uint256"},{"internalType":"uint256","name":"maxSharesIn","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"swapSharesForExactAssets","outputs":[{"internalType":"uint256","name":"sharesIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetsOut","type":"uint256"},{"internalType":"uint256","name":"maxSharesIn","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"swapSharesForExactAssets","outputs":[{"internalType":"uint256","name":"sharesIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSwapFeesAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSwapFeesShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestCliff","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"vestEnd","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"vestShares","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"virtualAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"virtualShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"weightEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"weightStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.