本文档介绍了 EigenLayer 协议中的 StrategyManager 合约及其相关合约,包括 StrategyFactory、StrategyBase 以及一些具体策略的实现。StrategyManager 负责处理用户存款和取款的份额计算,并与 DelegationManager 协同完成提款流程。此外,还介绍了策略的部署、管理以及系统配置。
文件 | 备注 |
---|---|
StrategyManager.sol |
连接到核心的单例份额管理器 |
StrategyManagerStorage.sol |
状态变量 |
IStrategyManager.sol |
接口 |
StrategyFactory:
文件 | 备注 |
---|---|
StrategyFactory.sol |
允许为 ERC20 代币部署 StrategyBase |
StrategyBase.sol |
作为信标代理通过 StrategyFactory 部署 |
单个策略:
文件 | 备注 |
---|---|
StrategyBaseTVLLimits.sol |
StrategyFactory 之前的版本,为某些 LST 部署。每个实例使用透明代理模式 |
EigenStrategy.sol |
部署的一次性策略,用于支持 EIGEN/bEIGEN |
StrategyManager
的主要功能是处理各个质押者在将其支持的代币存入和提取到其相应的策略时的 存款份额 会计。请注意,StrategyManager
仅处理 存款份额。当在本文档中使用“份额”一词时,它特指 存款份额。有关其他份额类型的说明,请参见 份额会计 - 术语。
StrategyManager
负责 (i) 允许质押者将代币存入相应的策略,(ii) 允许 DelegationManager
在质押者排队进行提款时移除存款份额,以及 (iii) 允许 DelegationManager
通过将存款份额添加回质押者或通过相应的策略将存款份额作为代币提取来完成提款。
任何兼容 ERC20 的代币都可以通过从 StrategyFactory
部署 StrategyBase
实例来支持。在底层,StrategyFactory
使用信标代理模式,并且仅允许每个代币部署一次策略。已部署的策略会自动列入 StrategyManager
中存款的白名单。有关详细信息,请参见下面的 策略。
注意:对于 EIGEN/bEIGEN 代币,使用 EigenStrategy
合约而不是 StrategyBase
。此外,EIGEN/bEIGEN 代币在 StrategyFactory
中被列入黑名单,以防止为这些代币部署重复的策略。
注意:对于某些 LST 代币,使用 StrategyBaseTVLLimits
合约而不是 StrategyBase
。这些策略是在 StrategyFactory
允许任意 ERC20 策略之前部署的。与通过 StrategyFactory
部署的策略不同,这些 StrategyBaseTVLLimits
合约使用透明代理模式。对于所有意图和目的,这些实例的行为与从 StrategyFactory
部署的 StrategyBase
实例相同。这些实例的“TVL 限制”功能从未被使用。任何使用这些实例之一的代币都会在 StrategyFactory
中列入黑名单,以防止为这些代币部署重复的策略。
StrategyManager
的职责可以分为以下概念:
MAX_TOTAL_SHARES = 1e38 - 1
MAX_STAKER_STRATEGY_LIST_LENGTH = 32
StrategyManager
策略的最大数量。导致超出此数量的任何存款都将恢复。DEFAULT_BURN_ADDRESS = 0x00000000000000000000000000000000000E16E4
以下方法由质押者调用,因为他们 (i) 将 ERC20 代币存入策略以接收存款份额:
提款通过 DelegationManager
执行(请参阅 DelegationManager.md
)。
depositIntoStrategy
/**
* @notice 将 `amount` 的 `token` 存入指定的 `strategy`,并将份额记入调用者的帐户
* @param strategy 处理 `token` 的策略
* @param token 要从中转移 `amount` 的代币
* @param amount 要存入的代币数量
* @return depositShares 记入调用者的存款份额数量
* @dev 调用者必须事先批准此合约代表他们转移至少 `amount` 的 `token`。
*
* 警告:在存入不严格遵守 ERC20 标准的代币时,请格外小心。
* 与 ERC20 规范有显著差异的代币可能会导致该策略中的代币余额出现意外行为,
* 例如允许跨合约重入的 ERC-777 代币。
*/
function depositIntoStrategy(
IStrategy strategy,
IERC20 token,
uint256 amount
)
external
onlyWhenNotPaused(PAUSED_DEPOSITS)
nonReentrant
returns (uint256 depositShares)
允许质押者将一定 amount
的 token
存入指定的 strategy
,以换取该策略中的存款份额。底层的 strategy
必须列入存款白名单,这意味着它已通过 StrategyFactory
部署,或者是一个现有的 StrategyBaseTVLLimits/EigenStrategy
实例。token
参数应与策略支持的代币相对应。
收到的份额数量由 strategy
使用内部汇率计算,该汇率取决于先前存入的代币数量。
处理存款后,StrategyManager
将存款信息转发到 DelegationManager
,后者会更新质押者的存款比例因子,并将份额委托给质押者的 operator(如果适用)。有关详细信息,请参见 DelegationManager.increaseDelegatedShares
。
影响:
token.safeTransferFrom
:代表调用者将 amount
的 token
转移到 strategy
。StrategyManager
将新创建的存款份额授予质押者StrategyBase.deposit
DelegationManager.increaseDelegatedShares
要求:
PAUSED_DEPOSITS
StrategyManager
将至少 amount
的 token
转移到策略strategy
必须列入存款白名单。StrategyBaseTVLLimits.deposit
depositIntoStrategyWithSignature
/**
* @notice 将 `amount` 的 `token` 存入指定的 `strategy`,并将份额记入 `staker` 的帐户
* 注意:代币是从 `msg.sender` 转移的,而不是从 `staker` 转移的。此方法允许调用者使用
* 签名将其代币存入另一个质押者的余额。
* @param strategy 处理 `token` 的策略
* @param token 要从中转移 `amount` 的代币
* @param amount 要从调用者转移到策略的代币数量
* @param staker 存入的资产将记入的质押者
* @param expiry 签名过期的截止时间戳
* @param signature 来自 `staker` 的有效 ECDSA 或 EIP-1271 签名
* @return depositShares 分配给 `staker` 的存款份额数量
* @dev 调用者必须事先批准此合约代表他们转移至少 `amount` 的 `token`。
*
* 警告:在存入不严格遵守 ERC20 标准的代币时,请格外小心。
* 与 ERC20 规范有显著差异的代币可能会导致该策略中的代币余额出现意外行为,
* 例如允许跨合约重入的 ERC-777 代币。
*/
function depositIntoStrategyWithSignature(
IStrategy strategy,
IERC20 token,
uint256 amount,
address staker,
uint256 expiry,
bytes memory signature
)
external
onlyWhenNotPaused(PAUSED_DEPOSITS)
nonReentrant
returns (uint256 depositShares)
此方法的工作方式类似于 depositIntoStrategy()
,即将代币 从调用者 转移到 strategy
合约。与 depositIntoStrategy
不同,生成的存款份额将记入传入的 staker
地址,该地址必须签署此意图。
影响:请参见上面的 depositIntoStrategy
。此外:
要求:请参见上面的 depositIntoStrategy
。此外:
这些方法只能由 DelegationManager
调用,并且在处理取消委托和提款时使用:
StrategyManager.removeDepositShares
StrategyManager.addShares
StrategyManager.withdrawSharesAsTokens
有关如何使用这些方法的更多信息,请参见 DelegationManager.md
。
removeDepositShares
/// @notice DelegationManager 使用此方法,在进入提款队列时,从特定策略中移除 Staker 的份额
/// @dev 在与 EigenPodManager 通信时,strategy 必须是 beaconChainETH
function removeDepositShares(
address staker,
IStrategy strategy,
uint256 depositSharesToRemove
)
external
onlyDelegationManager
当质押者将提款排队(或取消委托,这也会将提款排队)时,DelegationManager
会调用此方法。在提款进入队列后,质押者的存款份额会被移除,并且在提款完成后,质押者可以选择重新获得份额,或者转换并将其作为代币接收(分别为 addShares
和 withdrawSharesAsTokens
)。
质押者的 strategy
的存款份额余额会减少移除的 depositSharesToRemove
。如果这导致质押者的份额余额为零,则该 strategy
会从质押者的策略列表中移除。
请注意,在提款队列中移除的存款份额数量可能不等于提款完成时记入的份额数量。如果发生削减,质押者可能会收到更少的份额。有关更多信息,请参见 DelegationManager.md
。
影响:
strategy
的质押者的存款份额余额减少给定的 depositSharesToRemove
strategy
会从质押者的策略列表中移除要求:
DelegationManager
depositSharesToRemove
参数不得为零strategy
,staker
必须至少有 depositSharesToRemove
的余额addShares
/// @notice DelegationManager 使用此方法,将一些已通过提款队列的份额授予 Staker
/// @dev 在与 EigenPodManager 通信时,strategy 必须是 beaconChainETH
/// @return existingDepositShares 质押者在添加任何份额之前拥有的份额
/// @return addedShares 添加到质押者余额的新份额
function addShares(
address staker,
IStrategy strategy,
uint256 shares
)
external
onlyDelegationManager
returns (uint256, uint256)
当排队的提款完成并且提款人指定他们希望将提款“作为份额”接收(而不是作为底层代币)时,DelegationManager
会调用此方法。
此方法将输入的存款份额记入质押者的帐户。在大多数情况下,输入的 shares
等于最初排队提款时移除的相同份额。但是,如果质押者的 operator 被削减,他们可能会收到更少的份额。有关更多信息,请参见 DelegationManager.md
。
注意,如果质押者在 MAX_STAKER_STRATEGY_LIST_LENGTH
个唯一策略中存有存款(并且输入的 strategy
不在其中),则此方法将恢复。质押者仍然可以选择“作为代币”完成提款(请参见 DelegationManager.completeQueuedWithdrawal
)。
影响:
strategy
的 staker's
存款份额余额增加 shares
strategy
会添加到 staker's
策略列表中Deposit
事件要求:
DelegationManager
staker
参数不得为零shares
参数不得为零staker
的 stakerStrategyList
的长度不得超过 MAX_STAKER_STRATEGY_LIST_LENGTH
withdrawSharesAsTokens
/// @notice DelegationManager 使用此方法将存款份额转换为代币并将其发送给质押者
/// @dev 在与 EigenPodManager 通信时,strategy 必须是 beaconChainETH
/// @dev 在与 EigenPodManager 通信时,不会验证代币
function withdrawSharesAsTokens(
address staker,
IStrategy strategy,
IERC20 token,
uint256 shares
)
external
onlyDelegationManager
当排队的提款完成并且提款人指定他们希望将提款作为份额的底层代币接收时,DelegationManager
会调用此方法。
此方法指示 strategy
将输入的存款份额转换为代币并将其发送给 staker
。在大多数情况下,输入的 shares
等于最初排队提款时移除的相同份额。但是,如果质押者的 operator 被削减,他们可能会收到更少的份额。有关更多信息,请参见 DelegationManager.md
。
影响:
要求:
DelegationManager
StrategyBase.withdraw
被削减的份额被标记为可燃烧或可重新分配。任何人都可以调用
clearBurnOrRedistributableShares
以将代币发送到 slash 的 SlashEscrow
合约。要清除的份额存储在 _burnOrRedistributableShares
中,这是一个嵌套的 EnumerableMap。operatorSet 和 slashId 用于索引到策略到份额的可枚举映射中。以下方法处理清除可燃烧或可重新分配的份额:
StrategyManager.increaseBurnOrRedistributableShares
StrategyManager.clearBurnOrRedistributableShares
StrategyManager.clearBurnOrRedistributableSharesByStrategy
StrategyManager.burnShares
- 遗留的 burnShares 函数increaseBurnOrRedistributableShares
/**
* @notice 增加给定策略的可燃烧/可重新分配份额的数量。当 operator 在 EigenLayer 中被削减时,DelegationManager 会调用此方法。
* @param operatorSet 要燃烧份额的 operator set。
* @param slashId 要燃烧份额的 slash id。
* @param strategy 要燃烧份额的策略。
* @param addedSharesToBurn 要燃烧的增加份额的数量。
* @dev 此函数仅在 operator 被削减时由 DelegationManager 调用。
*/
function increaseBurnOrRedistributableShares(
OperatorSet calldata operatorSet,
uint256 slashId,
IStrategy strategy,
uint256 addedSharesToBurn
) external onlyDelegationManager;
当 operator 被削减时,DelegationManager
会调用此方法,计算可削减的份额数量并将它们标记为可燃烧或可重新分配。
然后,任何人都可以将份额转换为代币,并通过 burnShares
触发燃烧。添加此异步方法是为了缓解削减时潜在的 DoS 攻击向量。
影响:
operatorSet
、slashId
和 strategy
设置 burnOrRedistributableShares
BurnOrRedistributableSharesIncreased
事件SlashEscrowFactory.initiateSlashEscrow
要求:
DelegationManager
调用operatorSet
和 slashId
的 burnOrRedistributableShares
必须不包含 strategy
clearBurnOrRedistributableShares
/**
* @notice 从存储中移除燃烧的份额,并将 slashId 的底层代币转账到 slash escrow。
* @param operatorSet 要燃烧份额的 operator set。
* @param slashId 要燃烧份额的 slash ID。
* @return 转移到每个策略的 slash escrow 的代币数量
*/
function clearBurnOrRedistributableShares(
OperatorSet calldata operatorSet,
uint256 slashId)
external returns (uint256[] memory);
/**
* @notice 从存储中移除单个策略的份额,并将 slashId 的底层代币转账到 slash escrow。
* @param operatorSet 要燃烧份额的 operator set。
* @param slashId 要燃烧份额的 slash ID。
* @param strategy 要燃烧份额的策略。
* @return 燃烧的份额数量。
*/
function clearBurnOrRedistributableSharesByStrategy(
OperatorSet calldata operatorSet,
uint256 slashId,
IStrategy strategy
) external returns (uint256);
任何人都可以调用此方法,将削减的份额转移到 slash 的 SlashEscrow
合约。此方法将给定 slashId
和 operatorSet
的 burnOrRedistributableShares
设置为 0。为了适应可以添加到 operatorSet 的无限数量的策略,用户还可以传入一个策略,以通过 clearBurnOrRedistributableSharesByStrategy
进行清除。可以通过调用 getBurnOrRedistributableShares(operatorSet, slashId)
检索尚未清除的策略。
影响:
strategy
上调用 withdraw
,提取份额并将相应数量的代币发送到 slash 的 slashEscrow
合约BurnOrRedistributableSharesDecreased
burnShares
注意:这是用于在再分配之前燃烧份额的遗留函数。它将在再分配升级后的某个时候被弃用。
/**
* @notice 通过调用策略以转移到默认的燃烧地址,来燃烧给定策略的遗留策略份额。
* @param strategy 要燃烧份额的策略。
* @dev 此函数将在再分配后的版本中被弃用
*/
function burnShares(
IStrategy strategy
) external;
任何人都可以调用此方法来燃烧先前由 DelegationManager
通过现已弃用的 increaseBurnableShares
添加的削减份额。此方法将策略的可燃烧份额重置为 0,并指示相应的 strategy
将份额转换为代币并将其转移到 DEFAULT_BURN_ADDRESS
,从而使其无法恢复。
如果该策略没有可燃烧的份额,则不会调用该 strategy
。
影响:
strategy
上调用 withdraw
,提取份额并将相应数量的代币发送到 DEFAULT_BURN_ADDRESS
概念:
方法:
StrategyBase.deposit
StrategyBase.withdraw
StrategyFactory.deployNewStrategy
StrategyFactory.blacklistTokens
StrategyFactory.whitelistStrategies
StrategyFactory.removeStrategiesFromWhitelist
StrategyBase
与 StrategyBaseTVLLimits
在引入 StrategyFactory
之前,策略是手动部署并在 StrategyManager
中列入白名单的。这些策略使用 StrategyBaseTVLLimits.sol
,并使用透明代理模式部署。随着 StrategyFactory
的引入,任何人都可以为任何 ERC20 创建可存款的策略(前提是它尚未部署策略)。StrategyFactory
部署信标代理,每个代理都指向 StrategyBase.sol
的单个实现。
虽然这是两个不同的合约,但 StrategyBaseTVLLimits
从 StrategyBase
继承了其所有基本功能,并且仅在它们之上实现了 "TVL 限制" 功能。简而言之,此附加功能在每次存款之前检查:
maxPerDeposit
maxTotalDeposits
但是,到目前为止,这些 "TVL 限制" 功能 从未 被使用过。自部署以来,上述两个变量的值都已设置为 type(uint).max
,并且没有计划更改这些值。实际上,StrategyBaseTVLLimits
的所有实例的行为都与 StrategyBase
的实例相同 - 唯一的例外是前者使用透明代理,后者使用信标代理。
StrategyBase.deposit
/**
* @notice 用于将代币存入此策略
* @param token 是要存入的 ERC20 代币
* @param amount 是要存入的代币数量
* @dev 此函数只能由 strategyManager 合约调用。它在 strategyManager 的 `depositIntoStrategy` 函数中调用,并且单个份额余额也记录在 strategyManager 中。
* @dev 请注意,假设已经将 `amount` 的 `token` 直接转移到此合约(如 StrategyManager 的存款函数中所执行的)。特别是,将此合约的 `underlyingToken` 设置为
* 基于手续费的转移代币将打破此合约 *接收* 的代币数量等于执行转移时输入的数量的假设(即,从存款人的余额转移的“输出”数量)。
* @dev 请注意,对 `token` 的任何验证都在 `_beforeDeposit` 中完成。如果需要,可以覆盖此设置。
* @return newShares 是按当前汇率发行的新份额数量。
*/
function deposit(
IERC20 token,
uint256 amount
)
external
onlyWhenNotPaused(PAUSED_DEPOSITS)
onlyStrategyManager
returns (uint256 newShares)
当质押者将 ERC20 代币存入策略时,StrategyManager
会调用此方法。在调用此方法时,代币已被转移到该策略。此方法的作用是 (i) 根据汇率计算代币代表的存款份额数量,以及 (ii) 将新的存款份额添加到策略记录的总份额中。
创建的新份额数量将返回给 StrategyManager
,以添加到质押者的策略份额余额中。
影响:
StrategyBaseTVLLimits.totalShares
以说明存款创建的新份额要求:
StrategyManager
PAUSED_DEPOSITS
token
必须与策略的 underlyingToken
匹配token
的 amount
必须代表至少 1 个存款人的新份额MAX_TOTAL_SHARES
StrategyBase.withdraw
/**
* @notice 用于将代币从此策略中提取到 `recipient` 的地址
* @param recipient 是接收提取资金的地址
* @param token 是要转移出去的 ERC20 代币
* @param amountShares 是要提取的份额数量
* @dev 此函数只能由 strategyManager 合约调用。它在 strategyManager 的其他函数中调用,并且单个份额余额也记录在 strategyManager 中。
* @dev 请注意,对 `token` 的任何验证都在 `_beforeWithdrawal` 中完成。如果需要,可以覆盖此设置。
* @return amountOut 是要转移出去的代币数量。
*/
function withdraw(
address recipient,
IERC20 token,
uint256 amountShares
)
external
onlyWhenNotPaused(PAUSED_WITHDRAWALS)
onlyStrategyManager
returns (uint256)
StrategyManager
调用此方法将一定数量的存款份额转换为代币,并将它们转移到 recipient
。通常,此方法作为提款完成流程的一部分调用(请参见 DelegationManager.completeQueuedWithdrawal
)。但是,此方法也可能在份额燃烧流程中调用(请参见 StrategyManager.burnShares
)。
此方法使用策略的汇率将存款份额转换回代币。降低策略的总份额以反映提款,然后再将代币转账到 recipient
。
影响:
StrategyBaseTVLLimits.totalShares
以说明正在提取的份额underlyingToken.safeTransfer
以将代币转账到 recipient
recipient
将收到的代币数量要求:
StrategyManager
PAUSED_WITHDRAWALS
token
必须与策略的 underlyingToken
匹配amountShares
不得超过策略中的 totalShares
amountShares
代表的代币不得超过策略的代币余额StrategyFactory.deployNewStrategy
/**
* @notice 使用信标代理为 ERC20 代币部署新的 StrategyBase 合约
* @dev 代币的策略合约必须尚不存在。
* @dev 对于非标准 ERC20 代币,特别是那些符合 ERC777 的“可重入”代币,需要极其谨慎。
*/
function deployNewStrategy(IERC20 token)
external
onlyWhenNotPaused(PAUSED_NEW_STRATEGIES)
returns (IStrategy newStrategy)
允许任何人部署新的 StrategyBase
实例,该实例支持使用提供的 token
进行存款/取款。在调用此方法时,StrategyFactory
会自动将新策略列入白名单,以便通过 StrategyManager
进行存款。
请注意,StrategyFactory
仅允许每个 token
部署 ONE 策略。一旦 token
具有通过此方法部署的关联策略,则不能再次使用 deployNewStrategy
为 token
部署策略。此外,deployNewStrategy
将拒绝任何放置在 StrategyFactory
黑名单上的 token
。添加此功能是为了防止部署在创建 StrategyFactory
之前 存在的策略。有关详细信息,请参见 StrategyFactory.blacklistTokens
。
注意:在为不严格符合 ERC20 标准的代币部署策略时要小心。应该支持类似于已经列入白名单的 LST 的重新抵押代币,但如果你的代币不符合 ERC20 规范,请 DYOR。 需要注意的具体事项包括(但不限于):奇异的重新抵押代币、支持可重入行为的代币(如 ERC-777)和其他非标准 ERC20 衍生品。 作用:
token
部署一个新的 BeaconProxy
,它引用当前的 StrategyBase
实现token
的 tokenStrategy
映射,防止为同一个 token 第二次部署 strategyStrategyManager.addStrategiesToDepositWhitelist
要求:
PAUSED_NEW_STRATEGIES
token
必须不在 StrategyFactory
中被列入黑名单StrategyFactory
必须没有被用于为 token
部署过 strategyStrategyManager.addStrategiesToDepositWhitelist
StrategyFactory.blacklistTokens
/**
* @notice 仅限所有者的函数,用于阻止为给定的 tokens 创建 strategies。
* @param tokens 要列入黑名单的 token 地址数组。
*/
function blacklistTokens(IERC20[] calldata tokens)
external
onlyOwner
允许所有者阻止通过 StrategyFactory.deployNewStrategy
为某些 tokens
部署 strategies。添加此方法是为了防止为已经通过其他方式部署/列入白名单的 tokens 部署 strategies。
请注意,一旦所有者将 tokens 添加到黑名单,它们就无法被删除。这是 StrategyFactory
的一个已知限制,如果需要,可以通过升级工厂来解决。
作用:
tokens
中的每个 token 添加到 isBlacklisted
映射要求:
token
必须尚未被列入黑名单StrategyFactory.whitelistStrategies
/**
* @notice 仅限所有者的函数,用于传递对 `StrategyManager.addStrategiesToDepositWhitelist` 的调用
*/
function whitelistStrategies(
IStrategy[] calldata strategiesToWhitelist
)
external
onlyOwner
允许所有者在 StrategyManager
中显式地将 strategies 列入白名单。此方法用作 StrategyManager.addStrategiesToDepositWhitelist
的传递,以防所有者需要将未通过 StrategyFactory
部署的 strategies 列入白名单。
作用:
StrategyManager.addStrategiesToDepositWhitelist
要求:
StrategyManager.addStrategiesToDepositWhitelist
StrategyFactory.removeStrategiesFromWhitelist
/**
* @notice 仅限所有者的函数,用于传递对 `StrategyManager.removeStrategiesFromDepositWhitelist` 的调用
*/
function removeStrategiesFromWhitelist(
IStrategy[] calldata strategiesToRemoveFromWhitelist
)
external
onlyOwner
允许所有者从 StrategyManager
strategy 白名单中删除 strategies。此方法用作 StrategyManager.removeStrategiesFromDepositWhitelist
的传递,以防所有者需要访问此方法。
作用:
StrategyManager.removeStrategiesFromDepositWhitelist
要求:
StrategyManager.removeStrategiesFromDepositWhitelist
Strategy Whitelister 角色有权允许/删除通过 StrategyManager
存入的 strategies。此角色由 StrategyFactory
担任(已在 Strategies 中完整记录)。以下方法涉及 Strategy Whitelister 角色及其在 StrategyManager
中的能力:
StrategyManager.setStrategyWhitelister
StrategyManager.addStrategiesToDepositWhitelist
StrategyManager.removeStrategiesFromDepositWhitelist
setStrategyWhitelister
/**
* @notice 仅限所有者的函数,用于更改 `strategyWhitelister` 地址。
* @param newStrategyWhitelister `strategyWhitelister` 的新地址。
*/
function setStrategyWhitelister(address newStrategyWhitelister) external onlyOwner
允许 owner
更新 Strategy Whitelister 地址。目前,Strategy Whitelister 角色由 StrategyFactory
担任。有关更多详细信息,请参见 Strategies。
作用:
StrategyManager.strategyWhitelister
要求:
owner
addStrategiesToDepositWhitelist
/**
* @notice 仅限所有者的函数,用于将提供的 Strategies 添加到 stakers 可以存入的 strategies“白名单”中
* @param strategiesToWhitelist 将被添加到 `strategyIsWhitelistedForDeposit` 映射中的 Strategies(如果它们尚未在其中)
*/
function addStrategiesToDepositWhitelist(
IStrategy[] calldata strategiesToWhitelist
)
external
onlyStrategyWhitelister
允许 Strategy Whitelister 将任意数量的 strategies 添加到 StrategyManager
白名单,并配置是否为每个 strategy 启用或禁用第三方转账。白名单上的 Strategies 有资格通过 depositIntoStrategy
进行存款。
作用:
StrategyManager.strategyIsWhitelistedForDeposit
要求:
strategyWhitelister
removeStrategiesFromDepositWhitelist
/**
* @notice 仅限所有者的函数,用于从 stakers 可以存入的 strategies“白名单”中删除提供的 Strategies
* @param strategiesToRemoveFromWhitelist 将从 `strategyIsWhitelistedForDeposit` 映射中删除的 Strategies(如果它们在其中)
*/
function removeStrategiesFromDepositWhitelist(
IStrategy[] calldata strategiesToRemoveFromWhitelist
)
external
onlyStrategyWhitelister
允许 Strategy Whitelister 从 StrategyManager
白名单中删除任意数量的 strategies。删除的 strategies 将不再有资格通过 depositIntoStrategy
进行存款。但是,只要 staker 有 shares 可以提取,仍然可以发起和完成先前列入白名单的 strategies 的提款。
作用:
StrategyManager.strategyIsWhitelistedForDeposit
中删除条目要求:
strategyWhitelister
- 原文链接: github.com/Layr-Labs/eig...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!