Smart Contract Documentation
This document contains documentation for the latest Velvet smart contracts, please don't hesitate to reach out for integration support.
Introduction
Velvet v4 protocol is a DeFi protocol enabling creation, management, and interaction with onchain portfolios. It allows portfolio managers to construct & manage bespoke portfolios across a diverse range of tokens & protocols and facilitate deposit/withdrawal process.
Key Features:
Portfolio Creation: Portfolio managers can deploy both custodial and non-custodial portfolios setting up parameters like management fees, performance fees, entry and exit fees, token whitelists, initial token supply, and transferability options. Safe (fka Gnosis Safe) standard is used for portfolio creation.
Deposit and Withdrawal: Depositors can supply multiple tokens into portfolios via single or batched transactions, with support for gasless approvals through Permit2. Withdrawals are flexible, allowing depositors to receive specific underlying assets or to repay associated debts, offering granular control over their portfolio positions.
Rebalancing: Managers have the tools to update the portfolio's asset composition and adjust token weights dynamically. This enables them to rebalance portfolios in response to market movements, maintain desired asset allocations, and optimize for performance or risk management. Rebalancing includes trading and allocation into DeFi pools generating additional yield (routed using Velvet solver network).
External Position Management: The protocol is also directly integrated with DeFi primitives such as Uniswap V3, Thena or similar. Portfolio managers can create and manage liquidity positions, adjust price ranges, and reinvest earned fees, enabling portfolios to participate in yield farming, liquidity provision, and other advanced DeFi strategies.
Debt Management: Portfolio managers can engage in borrowing and lending activities, utilizing tokens as collateral to borrow assets from lending protocols. They can manage collateralization ratios, perform flash loans for efficient debt repayment, and adjust portfolio leverage, allowing for sophisticated debt strategies within the portfolio.
Portfolio Management Configuration: Managers can propose and adjust various fees associated with the portfolio, including management, performance, entry, and exit fees. The protocol incorporates governance mechanisms such as time-locked proposals and the ability to cancel proposals, ensuring transparent and fair fee management.
Treasury and Whitelist Management: The platform allows updating of treasury addresses for fee accrual and supports robust user management via whitelisting. Portfolio managers can control depositor access to their portfolios, manage permissions, and tailor depositor communities.
Token Exclusion Handling: In scenarios where certain tokens need to be removed from a portfolioβsuch as due to liquidity issues or protocol changesβthe protocol provides mechanisms for portfolio managers to exclude tokens and for depositors to claim their proportionate share of them.
Velvet v4 supports advanced portfolio management, diverse DeFi strategies, and seamless interactions with other DeFi protocols. See detailed developer documentation below.
Velvet Core
The Velvet Core contracts facilitate the creation of new portfolios and provide core functionalities for portfolio management.
Create New Portfolio
createPortfolioNonCustodial
Creates a new non-custodial portfolio with specified parameters. This type of portfolio is managed directly by the asset manager without the use of a custodial wallet.
Copy
function createPortfolioNonCustodial(FunctionParameters.PortfolioCreationInitData memory initData) external;
Parameters:
initData
: A struct containing initialization data for the portfolio.
createPortfolioCustodial
Creates a new custodial portfolio managed by a Gnosis Safe, allowing for multi-signature control and enhanced security.
Copy
function createPortfolioCustodial(
FunctionParameters.PortfolioCreationInitData memory initData,
address[] memory _owners,
uint256 _threshold
) external;
Parameters:
initData
: Initialization data for the portfolio._owners
: Array of addresses that will own the Gnosis Safe._threshold
: The minimum number of owner signatures required for transactions.
PortfolioCreationInitData Struct
Defines the initial configuration parameters for creating a new portfolio.
Copy
struct PortfolioCreationInitData {
address _assetManagerTreasury;
address[] _whitelistedTokens;
uint256 _managementFee;
uint256 _performanceFee;
uint256 _entryFee;
uint256 _exitFee;
uint256 _initialPortfolioAmount;
uint256 _minPortfolioTokenHoldingAmount;
bool _public;
bool _transferable;
bool _transferableToPublic;
bool _whitelistTokens;
bool _externalPositionManagementWhitelisted;
string _name;
string _symbol;
}
Fields:
_assetManagerTreasury
: Address for fee accumulation._whitelistedTokens
: Tokens allowed in the portfolio._managementFee
: Annual management fee in basis points._performanceFee
: Fee on profits in basis points._entryFee
: One-time entry fee in basis points._exitFee
: Exit fee in basis points._initialPortfolioAmount
: Initial supply of portfolio tokens (>= 1e14)._minPortfolioTokenHoldingAmount
: Minimum holding amount (>= 1e14)._public
: Indicates if the fund is open to the public._transferable
: If tokens are transferable._transferableToPublic
: If tokens can be transferred to non-whitelisted addresses._whitelistTokens
: Restricts the fund to whitelisted tokens._externalPositionManagementWhitelisted
: Allows external position management._name
: Name of the portfolio token._symbol
: Symbol of the portfolio token.
Event Emission on Portfolio Creation
An event is emitted when a new portfolio is created, providing details about the portfolio.
Copy
event PortfolioInfo(
PortfoliolInfo portfolioData,
uint256 indexed portfolioId,
string _name,
string _symbol,
address indexed _owner,
address indexed _accessController,
bool isPublicPortfolio
);
Event Parameters:
portfolioData
: Struct with portfolio-related addresses.portfolioId
: Unique identifier for the portfolio._name
: Name of the portfolio token._symbol
: Symbol of the portfolio token._owner
: Address of the portfolio owner._accessController
: Access controller address.isPublicPortfolio
: Indicates if the portfolio is public.
PortfoliolInfo Struct
Contains addresses of various contracts associated with the portfolio.
Copy
struct PortfoliolInfo {
address portfolio;
address tokenExclusionManager;
address rebalancing;
address owner;
address borrowManager;
address assetManagementConfig;
address feeModule;
address vaultAddress;
address gnosisModule;
}
Fields:
portfolio
: Portfolio contract address.tokenExclusionManager
: Manages token exclusions.rebalancing
: Rebalancing contract address.owner
: Owner's address.borrowManager
: Manages borrowing operations.assetManagementConfig
: Asset management configuration.feeModule
: Fee module address.vaultAddress
: Vault contract address.gnosisModule
: Gnosis Safe module address.
Initialize Tokens
initTokens
Initializes the vault with a set of tokens, setting up the initial assets managed by the portfolio.
Copy
function initToken(address[] calldata _tokens) external;
Parameters:
_tokens
: An array of token addresses to include in the vault.
Deposit
Users can deposit tokens into the portfolio, either directly or on behalf of another user, using multi-token deposit functions.
multiTokenDeposit
Allows users to deposit multiple tokens into the portfolio in a single transaction. Supports gasless approvals through Permit2.
Copy
function multiTokenDeposit(
uint256[] calldata depositAmounts,
uint256 _minMintAmount,
IAllowanceTransfer.PermitBatch calldata _permit,
bytes calldata _signature
) external;
Parameters:
depositAmounts
: Amounts for each token being deposited._minMintAmount
: Minimum portfolio tokens expected to receive._permit
: Batch permit data for token allowance._signature
: Signature for the permit batch.
PermitBatch Struct
Used for gasless token approvals.
Copy
struct PermitBatch {
PermitDetails[] details;
address spender;
uint256 sigDeadline;
}
Fields:
details
: Array ofPermitDetails
structs.spender
: Address authorized to spend tokens.sigDeadline
: Signature validity deadline.
multiTokenDepositFor
Allows depositing tokens on behalf of another user.
Copy
function multiTokenDepositFor(
address _depositFor,
uint256[] calldata depositAmounts,
uint256 _minMintAmount
) external;
Parameters:
_depositFor
: Address of the user for whom the deposit is made.depositAmounts
: Amounts for each token being deposited._minMintAmount
: Minimum portfolio tokens expected to receive.
DepositBatch
The DepositBatch
contract enables users to batch multiple token swaps and deposit operations, facilitating complex deposit scenarios.
deposit
Allows depositing tokens after performing necessary swaps and transfers, especially when dealing with tokens not directly accepted by the portfolio.
Copy
function deposit(FunctionParameters.BatchHandler memory data) external;
BatchHandler Struct
Copy
struct BatchHandler {
uint256 _minMintAmount;
uint256 _depositAmount;
address _target;
address _depositToken;
bytes[] _callData;
}
Fields:
_minMintAmount
: Minimum portfolio tokens expected._depositAmount
: Amount of tokens to swap._target
: Portfolio contract address._depositToken
: Initial token address to swap from._callData
: Encoded data for swap operations.
multiTokenSwapETHAndTransfer
Performs swaps for ETH deposits and transfers tokens to the portfolio.
Copy
function multiTokenSwapETHAndTransfer(FunctionParameters.BatchHandler memory data) external;
DepositBatchExternalPositions
Extends DepositBatch
functionalities to handle deposits into portfolios with external positions like Uniswap V3 or Thena.
deposit
Facilitates deposits involving external positions, handling swaps and liquidity operations.
Copy
function deposit(
FunctionParameters.BatchHandler memory data,
FunctionParameters.ExternalPositionDepositParams memory _params
) external;
ExternalPositionDepositParams Struct
Copy
struct ExternalPositionDepositParams {
address[] _positionWrappers;
address[] _swapTokens;
uint256[] _positionWrapperIndex;
uint256[] _portfolioTokenIndex;
uint256[] _index0;
uint256[] _index1;
uint256[] _amount0Min;
uint256[] _amount1Min;
bool[] _isExternalPosition;
address[] _tokenIn;
address[] _tokenOut;
uint256[] _amountIn;
}
Fields:
_positionWrappers
: External position wrapper addresses._swapTokens
: Tokens involved in swaps or liquidity._positionWrapperIndex
: Indices linking wrappers to portfolio tokens._portfolioTokenIndex
: Indices for tokens in the portfolio._index0
,_index1
: Indices for liquidity pairs._amount0Min
,_amount1Min
: Minimum amounts to prevent slippage._isExternalPosition
: Flags indicating external positions._tokenIn
,_tokenOut
: Tokens for swap operations._amountIn
: Amounts for swaps.
Withdrawal
Users can withdraw portfolio tokens, receiving underlying assets or swapping them into desired tokens.
multiTokenWithdrawal
Allows withdrawing portfolio tokens and optionally repaying debts.
Copy
function multiTokenWithdrawal(
uint256 _portfolioTokenAmount,
FunctionParameters.withdrawRepayParams calldata repayData
) external;
Parameters:
_portfolioTokenAmount
: Amount of portfolio tokens to withdraw.repayData
: Parameters for debt repayment during withdrawal.
withdrawRepayParams Struct
Copy
struct withdrawRepayParams {
address _factory;
address _token0;
address _token1;
address _flashLoanToken;
address _solverHandler;
uint256 _bufferUnit;
uint256[] _flashLoanAmount;
bytes[] firstSwapData;
bytes[] secondSwapData;
}
Fields:
_factory
: Thena factory contract address._token0
,_token1
: Tokens involved in swaps._flashLoanToken
: Token for flash loan._solverHandler
: Contract handling swaps._bufferUnit
: Buffer for safety margins._flashLoanAmount
: Amounts for flash loans.firstSwapData
,secondSwapData
: Encoded swap data.
multiTokenWithdrawalFor
Allows approved users to withdraw on behalf of others.
Copy
function multiTokenWithdrawalFor(
address _withdrawFor,
address _tokenReceiver,
uint256 _portfolioTokenAmount,
FunctionParameters.withdrawRepayParams calldata repayData
) external;
Parameters:
_withdrawFor
: Address of the user whose tokens are withdrawn._tokenReceiver
: Recipient of withdrawn tokens._portfolioTokenAmount
: Amount to withdraw.repayData
: Debt repayment parameters.
WithdrawalBatch
Facilitates batch withdrawals involving swaps and complex operations.
withdraw
Withdraws portfolio tokens and executes swaps to obtain desired output tokens.
Copy
function withdraw(
address _target,
address _tokenToWithdraw,
uint256 _portfolioTokenAmount,
uint256 _expectedOutputAmount,
FunctionParameters.withdrawRepayParams calldata repayData,
bytes[] memory _callData
) external;
Parameters:
_target
: Portfolio contract address._tokenToWithdraw
: Token to receive after withdrawal._portfolioTokenAmount
: Amount to withdraw._expectedOutputAmount
: Minimum expected output.repayData
: Debt repayment parameters._callData
: Encoded swap operations.
WithdrawalBatchExternalPositions
Handles withdrawals from portfolios with external positions.
withdraw
Manages withdrawals involving external positions and swaps.
Copy
function withdraw(
address[] memory _swapTokens,
address _target,
address _tokenToWithdraw,
uint256 _portfolioTokenAmount,
bytes[] memory _callData,
FunctionParameters.withdrawRepayParams calldata repayData,
FunctionParameters.ExternalPositionWithdrawParams memory _params
) external;
Parameters:
_swapTokens
: Tokens involved in swaps._target
: Portfolio contract address._tokenToWithdraw
: Token to receive._portfolioTokenAmount
: Amount to withdraw._callData
: Encoded swap data.repayData
: Debt repayment parameters._params
: External position withdrawal parameters.
ExternalPositionWithdrawParams Struct
Copy
struct ExternalPositionWithdrawParams {
address[] _positionWrappers;
uint256[] _amountsMin0;
uint256[] _amountsMin1;
address[] _tokenIn;
address[] _tokenOut;
uint256[] _amountIn;
}
Fields:
_positionWrappers
: External position wrappers._amountsMin0
,_amountsMin1
: Minimum amounts to prevent slippage._tokenIn
,_tokenOut
: Tokens for swaps._amountIn
: Amounts for swaps.
Rebalancing
Note: Functions in this section can only be called by asset managers.
Asset managers can rebalance the portfolio by updating the token list and adjusting token weights.
updateTokens
Updates the portfolio's token list and adjusts weights based on provided rebalance data.
Copy
function updateTokens(FunctionParameters.RebalanceIntent calldata rebalanceData) external;
RebalanceIntent Struct
Copy
struct RebalanceIntent {
address[] _newTokens;
address[] _sellTokens;
uint256[] _sellAmounts;
address _handler;
bytes _callData;
}
Fields:
_newTokens
: Tokens to add to the portfolio._sellTokens
: Tokens to sell during rebalancing._sellAmounts
: Amounts of tokens to sell._handler
: Address of the handler executing swaps._callData
: Encoded data for rebalancing operations.
updateWeights
Adjusts the weights of existing tokens without changing the token list.
Copy
function updateWeights(
address[] calldata _sellTokens,
uint256[] calldata _sellAmounts,
address _handler,
bytes memory _callData
) external;
Parameters:
_sellTokens
: Tokens to sell._sellAmounts
: Amounts to sell._handler
: Swap handler address._callData
: Encoded swap data.
enableCollateralTokens
Enables specified tokens as collateral in a lending protocol.
Copy
function enableCollateralTokens(address[] memory _tokens, address _controller) external;
Parameters:
_tokens
: Tokens to enable as collateral._controller
: Lending protocol controller address.
disableCollateralTokens
Disables specified tokens as collateral.
Copy
function disableCollateralTokens(address[] memory _tokens, address _controller) external;
borrow
Executes a borrow operation using designated collateral.
Copy
function borrow(
address _pool,
address[] memory _tokens,
address _tokenToBorrow,
address _controller,
uint256 _amountToBorrow
) external;
Parameters:
_pool
: Lending pool address._tokens
: Collateral tokens._tokenToBorrow
: Token to borrow._controller
: Lending protocol controller._amountToBorrow
: Amount to borrow.
repay
Repays debt using a flash loan and rebalances the portfolio.
Copy
function repay(
address _controller,
FunctionParameters.RepayParams calldata repayData
) external;
Parameters:
_controller
: Controller managing the repayment.repayData
: Parameters for the repayment process.
RepayParams Struct
Refer to the repayData
struct in the Withdrawal section for details.
directDebtRepayment
Repays debt directly by transferring debt tokens.
Copy
function directDebtRepayment(
address _debtToken,
address _protocolToken,
uint256 _repayAmount
) external;
removePortfolioToken
Removes a token from the portfolio.
Copy
function removePortfolioToken(address _token) external;
removePortfolioTokenPartially
Removes a portion of a token from the portfolio.
Copy
function removePortfolioTokenPartially(address _token, uint256 _percentage) external;
removeNonPortfolioToken
Removes a non-portfolio token.
Copy
function removeNonPortfolioToken(address _token) external;
removeNonPortfolioTokenPartially
Removes a portion of a non-portfolio token.
Copy
function removeNonPortfolioTokenPartially(address _token, uint256 _percentage) external;
Token Exclusion Manager
Manages the exclusion and removal of tokens from the portfolio due to reasons like lack of liquidity.
claimRemovedTokens
Allows users to claim their share of tokens that have been removed from the portfolio.
Copy
function claimRemovedTokens(address user, uint256 startId, uint256 endId) external;
claimTokenAtId
Claims a specific removed token by its ID.
Copy
function claimTokenAtId(address user, uint256 id) external;
Position Manager
Provides functionalities to manage liquidity positions in Uniswap V3 or Thena.
Setup: Enable the Uniswap V3 Manager in AssetManagementConfig
.
Copy
const config = await portfolio.assetManagementConfig();
assetManagementConfig = AssetManagementConfig.attach(config);
await assetManagementConfig.enableUniSwapV3Manager();
createNewWrapperPositionAndDeposit
Creates a new liquidity position and makes an initial deposit.
Copy
function createNewWrapperPositionAndDeposit(
address _dustReceiver,
address _token0,
address _token1,
string memory _name,
string memory _symbol,
WrapperFunctionParameters.PositionMintParamsThena memory params
) external;
Parameters:
_dustReceiver
: Address for leftover tokens._token0
,_token1
: Tokens in the liquidity pair._name
,_symbol
: Name and symbol for the wrapper token.params
: Parameters for minting the position.
PositionMintParamsThena Struct
Copy
struct PositionMintParamsThena {
uint256 _amount0Desired;
uint256 _amount1Desired;
uint256 _amount0Min;
uint256 _amount1Min;
int24 _tickLower;
int24 _tickUpper;
}
Fields:
_amount0Desired
,_amount1Desired
: Desired token amounts._amount0Min
,_amount1Min
: Minimum amounts to prevent slippage._tickLower
,_tickUpper
: Price range ticks.
initializePositionAndDeposit
Initializes an existing position and makes a deposit.
Copy
function initializePositionAndDeposit(
address _dustReceiver,
IPositionWrapper _positionWrapper,
WrapperFunctionParameters.InitialMintParams memory params
) external;
createNewWrapperPosition
Creates a new wrapper position without an initial deposit.
Copy
function createNewWrapperPosition(
address _token0,
address _token1,
string memory _name,
string memory _symbol,
int24 _tickLower,
int24 _tickUpper
) public;
increaseLiquidity
Increases liquidity in an existing position.
Copy
function increaseLiquidity(WrapperFunctionParameters.WrapperDepositParams memory _params) external;
WrapperDepositParams Struct
Copy
struct WrapperDepositParams {
address _dustReceiver;
IPositionWrapper _positionWrapper;
uint256 _amount0Desired;
uint256 _amount1Desired;
uint256 _amount0Min;
uint256 _amount1Min;
address _tokenIn;
address _tokenOut;
uint256 _amountIn;
}
decreaseLiquidity
Decreases liquidity and burns wrapper tokens.
Copy
function decreaseLiquidity(
IPositionWrapper _positionWrapper,
uint256 _withdrawalAmount,
uint256 _amount0Min,
uint256 _amount1Min,
address tokenIn,
address tokenOut,
uint256 amountIn
) external;
updateRange
Updates the price range and fee tier of an existing position.
Copy
function updateRange(
IPositionWrapper _positionWrapper,
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 _underlyingAmountOut0,
uint256 _underlyingAmountOut1,
int24 _tickLower,
int24 _tickUpper
) external;
Note: Asset managers need to calculate swap parameters to maintain optimal ratios during liquidity adjustments. This involves determining collected fees, desired ratios, and required swaps to align with the new price range.
Portfolio Data
The portfolio contracts provide functions to access and manage the tokens within the vault, as well as information about the portfolio tokens themselves.
getTokens
Copy
function getTokens() external view returns (address[] memory);
Retrieves the current list of token addresses held in the vault.
Returns:
address[] memory
: An array containing the addresses of the tokens in the vault.
totalSupply
Copy
function totalSupply() external view returns (uint256);
Returns the total supply of the portfolio tokens in circulation.
Returns:
uint256
: The total number of portfolio tokens minted.
balanceOf
Copy
function balanceOf(address account) external view returns (uint256);
Provides the balance of portfolio tokens held by a specific user.
Parameters:
account
: The address of the user whose balance is being queried.
Returns:
uint256
: The number of portfolio tokens owned by the specified user.
Asset Management Configuration
Note: All functions in AssetManagementConfig
can only be called by asset managers.
The AssetManagementConfig
contract allows asset managers to configure various aspects of the portfolio, including external positions, fees, portfolio settings, treasury management, and user whitelist management.
External Position Management
enableUniSwapV3Manager
Enables the Uniswap V3 wrapper, allowing the portfolio to interact with Uniswap V3 positions. This is essential for portfolios that include external liquidity positions.
Copy
function enableUniSwapV3Manager() external;
Fee Management
The following functions allow asset managers to propose and update management, performance, entry, and exit fees. Each fee change involves a proposal followed by a waiting period before the update can be finalized.
proposeNewManagementFee
Starts the process of updating the management fee by proposing a new fee. A waiting period begins during which the proposed fee can be reviewed.
Copy
function proposeNewManagementFee(uint256 _newManagementFee) external;
Parameters:
_newManagementFee
: The proposed new management fee, expressed in basis points (e.g., 100 = 1%).
Note: The updateManagementFee
function can be called 28 days after the proposal. The management fee cannot exceed the maxManagementFee
set in the protocol configuration.
deleteProposedManagementFee
Cancels the proposed management fee, resetting the proposal and stopping the update process.
Copy
function deleteProposedManagementFee() external;
updateManagementFee
Finalizes the management fee update after the waiting period has elapsed, applying the previously proposed fee.
Copy
function updateManagementFee() external;
proposeNewPerformanceFee
Proposes a new performance fee, initiating a waiting period before the fee can be updated.
Copy
function proposeNewPerformanceFee(uint256 _newPerformanceFee) external;
Parameters:
_newPerformanceFee
: The proposed new performance fee, expressed in basis points.
deleteProposedPerformanceFee
Cancels the proposed performance fee, resetting the proposal.
Copy
function deleteProposedPerformanceFee() external;
updatePerformanceFee
Updates the performance fee to the previously proposed value after the waiting period has passed.
Copy
function updatePerformanceFee() external;
proposeNewEntryAndExitFee
Proposes new entry and exit fees, starting a timer before the changes can be finalized.
Copy
function proposeNewEntryAndExitFee(uint256 _newEntryFee, uint256 _newExitFee) external;
Parameters:
_newEntryFee
: The proposed new entry fee, in basis points._newExitFee
: The proposed new exit fee, in basis points.
deleteProposedEntryAndExitFee
Cancels the proposed entry and exit fees, resetting the proposal.
Copy
function deleteProposedEntryAndExitFee() external;
updateEntryAndExitFee
Finalizes the entry and exit fee updates after the waiting period.
Copy
function updateEntryAndExitFee() external;
Portfolio Settings
updateTransferability
Updates the transferability settings of the portfolio token, determining whether tokens can be transferred and whether transfers to the public are allowed.
Copy
function updateTransferability(bool _transferable, bool _publicTransfer) external;
Parameters:
_transferable
: Enables or disables the ability to transfer portfolio tokens._publicTransfer
: Allows or disallows transferring portfolio tokens to the public (non-whitelisted addresses).
convertPrivateFundToPublic
Converts a private portfolio to a public one, allowing broader access to investors.
Copy
function convertPrivateFundToPublic() external;
updateMinPortfolioTokenHoldingAmount
Sets the minimum amount of portfolio tokens that must be held or transacted, enforcing investment thresholds.
Copy
function updateMinPortfolioTokenHoldingAmount(uint256 _minPortfolioTokenHoldingAmount) external;
Parameters:
_minPortfolioTokenHoldingAmount
: The new minimum portfolio token amount required for transactions.
updateInitialPortfolioAmount
Updates the initial amount of the portfolio, setting a new starting value for the portfolio tokens.
Copy
function updateInitialPortfolioAmount(uint256 _newAmount) external;
Parameters:
_newAmount
: The new initial portfolio amount.
Treasury Management
updateAssetManagerTreasury
Changes the address where asset management fees are accumulated.
Copy
function updateAssetManagerTreasury(address _newAssetManagerTreasury) external;
Parameters:
_newAssetManagerTreasury
: The new treasury address for asset management fees.
User Whitelist Management
whitelistUser
Adds users to the whitelist, allowing them to deposit into the portfolio.
Copy
function whitelistUser(address[] calldata users) external;
Parameters:
users
: An array of user addresses to be whitelisted.
removeWhitelistedUser
Removes users from the whitelist, revoking their ability to deposit.
Copy
function removeWhitelistedUser(address[] calldata users) external;
Parameters:
users
: An array of user addresses to be removed from the whitelist.
Last updated