WithdrawalQueueERC721
Una cola FIFO para solicitudes de retiro de stETH
y una implementación de NFT unstETH
que representa la posición en la cola.
El acceso a los métodos de palanca está restringido mediante la funcionalidad del contrato AccessControlEnumerable y una serie de roles granulares.
¿Qué es WithdrawalQueueERC721?
Este contrato es un punto de entrada principal para intercambiar stETH
por ether subyacente directamente a través del protocolo Lido.
Es responsable de:
- gestionar una cola de solicitudes de retiro
- comprometer la finalización de la solicitud de retiro como parte del informe del AccountingOracle
- almacenar
stETH
antes y ether después de la finalización - transferir ether reservado al usuario al reclamar
Además, el contrato es un NFT unstETH
ERC-721 con extensión de metadatos que representa el derecho a reclamar el ether subyacente una vez que se finalice la solicitud.
Este NFT se acuña al solicitarlo y se quema al reclamarlo. Se utiliza ERC-4906 para actualizar los metadatos tan pronto como cambia el estado de finalización de la solicitud.
Solicitud
Para solicitar un retiro, se debe aprobar la cantidad de stETH
o wstETH
a este contrato o firmar el Permiso ERC-2612 y luego llamar al método requestWithdrawals*
apropiado.
La cantidad mínima para una solicitud es de 100 wei
, y la máxima es de 1000 eth
. Cantidades mayores deben dividirse en varias solicitudes, lo que nos permite evitar congestionar la cola con una solicitud demasiado grande.
Durante esta llamada, la solicitud se coloca en la cola y se acuña el NFT unstETH
relacionado. La siguiente estructura representa la solicitud:
struct WithdrawalRequestStatus {
uint256 amountOfStETH;
uint256 amountOfShares;
address owner;
uint256 timestamp;
bool isFinalized;
bool isClaimed;
}
donde
amountOfStETH
— la cantidad de tokensstETH
transferidos al contrato al solicitaramountOfShares
— la cantidad de participaciones subyacentes correspondientes a los tokensstETH
transferidos. Consulta el capítulo de rebalanceo de Lido para aprender sobre la mecánica de las participacionesowner
— la dirección del propietario de esta solicitud. El propietario también es titular del NFTunstETH
y puede transferir la propiedad y reclamar el ether subyacente una vez finalizadotimestamp
— la hora de creación de la solicitudisFinalized
— estado de finalización de la solicitud; las solicitudes finalizadas están disponibles para reclamarisClaimed
— estado de reclamación de la solicitud. Una vez reclamada, el NFT se quema y la solicitud no está disponible para reclamar nuevamente
La cantidad de ether que se retirará está limitada por el número de tokens stETH
transferidos a este contrato en el momento de la solicitud. Por lo tanto, el usuario no recibirá las recompensas por el período de tiempo en que sus tokens permanezcan en la cola.
Finalización
Después de presentar una solicitud de retiro, solo se puede reclamar una vez que se produzca la finalización.
El informe del Accounting Oracle finaliza un lote de solicitudes de retiro,
eligiendo el _maxShareRate
y el tamaño del lote teniendo en cuenta los siguientes factores:
- Si hay suficiente ether para cumplir con la solicitud. El ether puede obtenerse del buffer de Lido, que se llena con la participación de nuevos usuarios, retiros parciales y totales de la cadena Beacon, propinas del protocolo y recompensas MEV. Los retiros tienen prioridad sobre los depósitos, por lo que el ether no puede depositarse en la cadena Beacon si algunas solicitudes de retiro pueden ser cumplidas.
- Si ha pasado suficiente tiempo desde que se colocó la solicitud de retiro en la cola (bloqueo de tiempo)
- Si ha habido alguna pérdida masiva para el protocolo en el lado de la cadena Beacon desde que se presentó la solicitud de retiro. Esto puede llevar a la finalización a una tasa inferior a 1:1 si la pérdida es lo suficientemente alta como para no ser cubierta con las recompensas diarias (nunca ha sucedido antes)
En resumen, los titulares de tokens no reciben recompensas pero aún así asumen riesgos durante el retiro. Las recompensas adquiridas
desde que el stETH
se bloqueó en el WithdrawalQueue se queman al finalizar, distribuyéndolas efectivamente entre los otros titulares de tokens.
Entonces, la finalización establece el valor final de la solicitud, bloquea el ether en el balance de este contrato, quema el stETH
subyacente y la cola puede verse así en un momento arbitrario:
Reclamo
Cuando la solicitud está finalizada, puede ser reclamada por el propietario actual, transfiriendo la cantidad reservada de ether a la dirección del destinatario y quemando el NFT de retiro.
Para ver si la solicitud es reclamable, se puede obtener su estado usando getWithdrawalStatus()
o suscribirse al evento WithdrawalsFinalized(uint256 from, uint256 to, ...)
, que se emite una vez que el lote de solicitudes
con ids en el rango (from, to]
es finalizado.
Estándares
El contrato implementa los siguientes estándares de Ethereum:
- ERC-721: Estándar de Token No Fungible
- ERC-165: Detección de Interfaz Estándar
- ERC-4906: Extensión de Actualización de Metadatos de EIP-721
Métodos relacionados con ERC-721
name()
Devuelve el nombre de la colección de tokens.
function name() view returns (string memory)
symbol()
Devuelve el símbolo de la colección de tokens.
function symbol() view returns (string memory)
tokenURI()
Devuelve el Identificador de Recurso Uniforme (URI) para el token _requestId
. Devuelve una cadena vacía si no se ha establecido un URI base ni una dirección NFTDescriptor
.
function tokenURI(uint256 _requestId) view returns (string memory)
balanceOf()
Devuelve el número de tokens en la cuenta de _owner
.
function balanceOf(address _owner) view returns (uint256 balance)
Revierte si _owner
es una dirección cero
ownerOf()
Devuelve el propietario del token _requestId
.
function ownerOf(uint256 _requestId) view returns (address owner)
Requisitos: - La solicitud _requestId
debe existir. - La solicitud _requestId
no debe estar reclamada.
approve()
Da permiso a _to
para transferir el token _requestId
a otra cuenta. La aprobación se elimina cuando el token se transfiere.
Emite un evento Approval
.
function approve(address _to, uint256 _requestId)
Requisitos: - El llamante debe poseer el token o ser un operador aprobado. - _requestId
debe existir. - _to
no debe ser el propietario.
getApproved()
Devuelve la cuenta aprobada para el token _requestId
.
function getApproved(uint256 _requestId) view returns (address)
Revierte si no existe _requestId
.
setApprovalForAll()
Aprueba o elimina a _operator
como operador para el llamante. Los operadores pueden llamar a transferFrom
o safeTransferFrom
para cualquier token propiedad del llamante.
Emite un evento ApprovalForAll
.
function setApprovalForAll(address _operator, bool _approved)
Revierte si msg.sender
es igual a _operator
.
isApprovedForAll()
Devuelve true
si el _operator
está autorizado para gestionar todos los activos de _owner
.
function isApprovedForAll(address _owner, address _operator) view returns (bool)
safeTransferFrom()
Transfiere de forma segura el token _requestId
de _from
a _to
, verificando primero que los destinatarios del contrato sean conscientes del
protocolo ERC721 para evitar que los tokens queden bloqueados para siempre.
Si se utiliza una versión con el parámetro _data
, se pasa a IERC721Receiver.onERC721Received()
del contrato inteligente de destino como argumento.
Emite un evento Transfer
.
function safeTransferFrom(address _from, address _to, uint256 _requestId)
function safeTransferFrom(address _from, address _to, uint256 _requestId, bytes memory _data)
Requisitos:
_from
no puede ser la dirección cero._to
no puede ser la dirección cero.- El token
_requestId
debe existir y ser propiedad de_from
. - Si el llamante no es
_from
, debe tener permiso para mover este token medianteapprove()
osetApprovalForAll()
. - Si
_to
se refiere a un contrato inteligente, debe implementar la interfazIERC721Receiver
.
transferFrom()
Transfiere el token _requestId
de _from
a _to
.
Emite un evento Transfer
.
ADVERTENCIA: El uso de este método no es recomendable, use safeTransferFrom()
siempre que sea posible.
function transferFrom(address _from, address _to, uint256 _requestId)
Requisitos:
_from
no puede ser la dirección cero._to
no puede ser la dirección cero.- El token
_requestId
debe ser propiedad de_from
. - Si el llamante no es
_from
, debe tener aprobación para mover este token medianteapprove()
osetApprovalForAll()
.
getBaseUri()
Devuelve el URI base para calcular el URI del token. Si está establecido, el URI resultante para cada token será la concatenación del URI base y el _requestId
.
function getBaseURI() view returns (string memory)
getNFTDescriptorAddress()
Devuelve la dirección del contrato NFTDescriptor
responsable de la generación del URI del token.
function getNFTDescriptorAddress() view returns (address)
Métodos relacionados con ERC-165
supportsInterface()
Devuelve true
si este contrato implementa la interfaz definida por interfaceId
. Consulte el ERC-165 para obtener más información sobre
cómo se crean estos ids.
function supportsInterface(bytes4 interfaceId) view returns (bool)
Este contrato devuelve true
para IERC721
, IERC721Metadata
, IERC4906
, IAccessControlEnumerable
, IAccessControl
y IERC165
en sí mismo.
Métodos relacionados con la cola
requestWithdrawals()
Solicita en lote las cantidades _amounts
de stETH
para retiro a la dirección _owner
. Para cada solicitud, la cantidad respectiva de stETH
se transfiere a esta dirección del contrato, y se acuña un NFT unstETH
a la dirección _owner
.
function requestWithdrawals(uint256[] _amounts, address _owner) returns (uint256[] requestIds)
Devuelve la matriz de ids para cada solicitud creada. Emite eventos WithdrawalRequested
y Transfer
.
Requisitos:
- Los retiros no deben estar pausados.
- El saldo de
stETH
demsg.sender
debe ser mayor o igual a la suma de todos los_amounts
. - Debe haber aprobación de
msg.sender
a esta dirección del contrato para la transferencia total de tokensstETH
. - Cada cantidad en
_amounts
debe ser mayor o igual aMIN_STETH_WITHDRAWAL_AMOUNT
y menor o igual aMAX_STETH_WITHDRAWAL_AMOUNT
.
requestWithdrawalsWstETH()
Solicita en lote las cantidades _amounts
de wstETH
para retiro a la dirección _owner
. Para cada solicitud, la cantidad respectiva de wstETH
se transfiere a esta dirección del contrato, se convierte en stETH
, y se acuña un NFT unstETH
a la dirección _owner
.
function requestWithdrawalsWstETH(uint256[] _amounts, address _owner) returns (uint256[] requestIds)
Devuelve la matriz de ids para cada solicitud creada. Emite eventos WithdrawalRequested
y Transfer
.
Requisitos:
- Los retiros no deben estar pausados.
- El saldo de
wstETH
demsg.sender
debe ser mayor o igual a la suma de todos los_amounts
. - Debe haber aprobación de
msg.sender
a esta dirección del contrato para la transferencia total de tokenswstETH
. - Cada cantidad en
_amounts
debe tenergetPooledEthByShares(amount)
siendo mayor queMIN_STETH_WITHDRAWAL_AMOUNT
y menor queMAX_STETH_WITHDRAWAL_AMOUNT
.
requestWithdrawalsWithPermit()
Solicita en lote las cantidades _amounts
de stETH
para retiro a la dirección _owner
. Para cada solicitud,
la cantidad respectiva de stETH
se transfiere a esta dirección del contrato,
y se acuña un NFT unstETH
a la dirección _owner
. Se utiliza el permiso de ERC-2612
para aprobar la transferencia de tokens.
function requestWithdrawalsWithPermit(
uint256[] _amounts,
address _owner,
PermitInput _permit
) returns (uint256[] requestIds)
donde _permit
es la estructura de permiso firmada ERC-2612 definida como:
struct PermitInput {
uint256 value;
uint256 deadline;
uint8 v;
bytes32 r;
bytes32 s;
}
Devuelve la matriz de ids para cada solicitud creada. Emite eventos WithdrawalRequested
y Transfer
.
Requisitos:
- Los retiros no deben estar pausados.
- El saldo de
stETH
demsg.sender
debe ser mayor o igual a la suma de todos los_amounts
. - El permiso debe tener una firma válida, un
value
mayor que la suma de todos los_amounts
y que no haya expirado eldeadline
. - Cada cantidad en
_amounts
debe ser mayor o igual aMIN_STETH_WITHDRAWAL_AMOUNT
y menor o igual aMAX_STETH_WITHDRAWAL_AMOUNT
.
requestWithdrawalsWstETHWithPermit()
Solicita en lote las cantidades _amounts
de wstETH
para retiro a la dirección _owner
. Para cada solicitud, la cantidad respectiva de wstETH
se transfiere a esta dirección del contrato, se convierte en stETH
, y se acuña un NFT unstETH
a la dirección _owner
. Se utiliza el permiso de ERC-2612
para aprobar la transferencia de tokens.
function requestWithdrawalsWstETHWithPermit(
uint256[] _amounts,
address _owner,
PermitInput _permit
) returns (uint256[] requestIds)
donde _permit
es la estructura de permiso firmada ERC-2612 definida como:
struct PermitInput {
uint256 value;
uint256 deadline;
uint8 v;
bytes32 r;
bytes32 s;
}
Devuelve la matriz de ids para cada solicitud creada. Emite eventos WithdrawalRequested
y Transfer
.
Requisitos:
- Los retiros no deben estar pausados.
- El saldo de
wstETH
demsg.sender
debe ser mayor o igual a la suma de todos los_amounts
. - El permiso debe tener una firma válida, un
value
mayor que la suma de todos los_amounts
y que no haya expirado eldeadline
. - Cada cantidad en
_amounts
debe tenergetPooledEthByShares(amount)
siendo mayor queMIN_STETH_WITHDRAWAL_AMOUNT
y menor queMAX_STETH_WITHDRAWAL_AMOUNT
.
getWithdrawalRequests()
Devuelve todas las solicitudes de retiro que pertenecen a la dirección _owner
.
function getWithdrawalRequests(address _owner) view returns (uint256[] requestsIds)
Esta operación copiará todo el almacenamiento en la memoria, lo que puede ser bastante costoso. Este método está diseñado para ser usado principalmente por los accesores de vista que se consultan sin tarifas de gas. Los desarrolladores deben tener en cuenta que esta función tiene un costo ilimitado, y usarla como parte de una función que cambia el estado puede hacer que la función no se pueda llamar si el conjunto crece hasta el punto en que copiarlo a la memoria consume demasiado gas para caber en un bloque.
getWithdrawalStatus()
Devuelve statuses
para las solicitudes con ids en _requestIds
.
function getWithdrawalStatus(uint256[] _requestIds)
view
returns (WithdrawalRequestStatus[] statuses)
Devuelve una matriz de estructuras WithdrawalRequestStatus
, definidas como:
struct WithdrawalRequestStatus {
uint256 amountOfStETH;
uint256 amountOfShares;
address owner;
uint256 timestamp;
bool isFinalized;
bool isClaimed;
}
donde
amountOfStETH
— el número de tokensstETH
transferidos al contrato al momento de la solicitud.amountOfShares
— el número de acciones subyacentes correspondientes a los tokensstETH
transferidos. Consulte el capítulo de rebalanceo de Lido para obtener información sobre la mecánica de las acciones.owner
— la dirección del propietario de esta solicitud. El propietario también es titular del NFTunstETH
y puede transferir la propiedad y reclamar el ether subyacente una vez finalizado.timestamp
— la hora de creación de la solicitud.isFinalized
— estado de finalización de la solicitud; las solicitudes finalizadas están disponibles para ser reclamadas.isClaimed
— estado de reclamación de la solicitud. Una vez reclamado, el NFT se quema y la solicitud no está disponible para ser reclamada nuevamente.
getClaimableEther()
Devuelve las cantidades de ether disponibles para reclamar para cada id de solicitud proporcionado.
function getClaimableEther(uint256[] _requestIds, uint256[] _hints)
view
returns (uint256[] claimableEthValues)
donde
_requestIds
— la matriz de ids de solicitud para verificar el ether reclamable._hints
— pista de punto de control para cada id de solicitud. Se puede obtener llamando afindCheckpointHints()
.
Devuelve la matriz de cantidades de ether disponibles para reclamar para cada id de solicitud. La cantidad es igual a 0 si la solicitud no está finalizada o ya ha sido reclamada.
claimWithdrawalsTo()
Reclama un lote de solicitudes de retiro si están finalizadas, enviando ether a la dirección _recipient
.
function claimWithdrawalsTo(uint256[] _requestIds, uint256[] _hints, address _recipient)
donde
_requestIds
— la matriz de ids de solicitud para verificar el ether reclamable._hints
— pista de punto de control para cada id de solicitud. Se puede obtener llamando afindCheckpointHints()
._recipient
— la dirección del destinatario para el ether reclamado.
Emite un lote de eventos Transfer
a la dirección cero y eventos WithdrawalClaimed
.
Requisitos:
- Todos los
_requestIds
deben existir, estar finalizados y no reclamados. - Todas las
_hints
deben ser válidas para las solicitudes respectivas. msg.sender
debe ser el propietario de todas las solicitudes._recipient
no debe ser cero.
claimWithdrawals()
Reclama un lote de solicitudes de retiro si están finalizadas, enviando ether a la dirección msg.sender
.
function claimWithdrawals(uint256[] _requestIds, uint256[] _hints)
donde
_requestIds
— la matriz de ids de solicitud para verificar el ether reclamable._hints
— pista de punto de control para cada id de solicitud. Se puede obtener llamando afindCheckpointHints()
.
Emite un lote de eventos Transfer
a la dirección cero y eventos WithdrawalClaimed
.
Requisitos:
- Todos los
_requestIds
deben existir, estar finalizados y no reclamados. - Todas las
_hints
deben ser válidas para las solicitudes respectivas. msg.sender
debe ser el propietario de todas las solicitudes.
claimWithdrawal()
Reclama la solicitud de retiro _requestId
, enviando ether a la dirección msg.sender
.
function claimWithdrawal(uint256 _requestId)
Emite un evento Transfer
a la dirección cero y un evento WithdrawalClaimed
.
Requisitos:
msg.sender
debe ser el propietario de la solicitud_requestId
.- La solicitud
_requestId
debe existir, estar finalizada y no reclamada.
findCheckpointHints()
Devuelve una matriz de pistas para los _requestIds
dados, buscando entre los puntos de control con índices en el rango [_firstIndex, _lastIndex]
.
function findCheckpointHints(uint256[] _requestIds, uint256 _firstIndex, uint256 _lastIndex)
view
returns (uint256[] hintIds)
Requisitos:
- La matriz de ids de solicitud debe estar ordenada.
_firstIndex
debe ser mayor que 0, porque la lista de puntos de control es una matriz basada en 1._lastIndex
debe ser menor o igual agetLastCheckpointIndex()
.
isBunkerModeActive()
Devuelve true
si el modo bunker está activo.
function isBunkerModeActive() view returns (bool)
bunkerModeSinceTimestamp()
Devuelve la marca de tiempo de la última activación del modo bunker, si está activo ahora y BUNKER_MODE_DISABLED_TIMESTAMP
si el modo bunker está desactivado (es decir, el protocolo está en modo turbo).
function bunkerModeSinceTimestamp() view returns (uint256)
getLastRequestId()
Devuelve el id de la última solicitud en la cola.
function getLastRequestId() view returns (uint256)
Las solicitudes se indexan desde 1
, por lo que devuelve 0
si no hay solicitudes en la cola.
getLastFinalizedRequestId()
Devuelve el id de la última solicitud finalizada en la cola.
function getLastFinalizedRequestId() view returns (uint256)
Las solicitudes se indexan desde 1
, por lo que devuelve 0
si no hay solicitudes finalizadas en la cola.
getLockedEtherAmount()
Devuelve la cantidad de ether en el balance bloqueada para retiro y disponible para reclamar.
function getLockedEtherAmount() view returns (uint256)
getLastCheckpointIndex()
Devuelve la longitud de la matriz de puntos de control. Último valor posible para la pista.
function getLastCheckpointIndex() view returns (uint256)
Los puntos de control se indexan desde 1
, por lo que devuelve 0
si aún no hay puntos de control.
unfinalizedRequestNumber()
Devuelve el número de solicitudes no finalizadas en la cola.
function unfinalizedRequestNumber() view returns (uint256)
unfinalizedStETH()
Devuelve la cantidad de stETH
en la cola que aún no se ha finalizado.
function unfinalizedStETH() view returns (uint256)
calculateFinalizationBatches()
Vista para uso fuera de la cadena por el demonio del oráculo que calcula cuántas solicitudes se pueden finalizar dentro del presupuesto dado, período de tiempo y límites de tasa de acciones. Las solicitudes devueltas se dividen en lotes. Todas las solicitudes que pertenecen a un lote deben tener su tasa de participación por encima o por debajo (o igual) al _maxShareRate
. A continuación, puede ver un ejemplo de cómo 14 solicitudes con diferentes tasas de participación se dividirán en cinco lotes por este método:
^ share rate
|
| • •
| • • • • •
|----------------------•------ _maxShareRate
| • • • • •
| •
+-------------------------------> requestId
| 1 | 2 |3| 4 | 5 | batch number
function calculateFinalizationBatches(
uint256 _maxShareRate,
uint256 _maxTimestamp,
uint256 _maxRequestsPerCall,
BatchesCalculationState _state
) external view returns (BatchesCalculationState)
donde
-
_maxShareRate
— la tasa de participación máxima (ETH por participación) que se utilizará para la finalización (precisión de 1e27) -
_maxTimestamp
— la marca de tiempo máxima de la solicitud que se puede finalizar -
_maxRequestsPerCall
— el número máximo de solicitudes que se puede procesar por iteración -
_state
— el estado actual del cálculo, representado con una estructuraBatchesCalculationState
:struct BatchesCalculationState {
uint256 remainingEthBudget;
bool finished;
uint256[MAX_BATCHES_LENGTH] batches;
uint256 batchesLength;
}remainingEthBudget
— la cantidad actual restante de ether. Debe establecerse en todo el presupuesto de la finalización en la primera llamada.finished
— la bandera que se establece entrue
si se iteran todas las solicitudes.batches
— la matriz resultante de lotes, cada uno representado por el id de la última solicitud en el lote.batchesLength
— la longitud de la parte llena de la matrizbatches
.
Devuelve el estado actual del cálculo de lotes de finalización.
Este método está diseñado para uso iterativo bajo límites de gas. Por lo tanto, en el caso de que el número de retiros sea demasiado grande para iterar en una sola llamada, se puede usar este método repetidamente, pasando el valor de retorno como argumento para la próxima llamada mientras devuelva finished
igual a false
.
prefinalize()
Verifica los lotes de finalización y calcula la cantidad de ether necesaria para bloquear y la cantidad de participaciones a quemar.
Diseñado para usar durante el informe del oráculo para encontrar la cantidad de ether que se debe enviar junto con la llamada finalize()
.
function prefinalize(uint256[] _batches, uint256 _maxShareRate)
view
returns (uint256 ethToLock, uint256 sharesToBurn)
donde
_batches
— lotes de finalización calculados fuera de la cadena utilizandocalculateFinalizationBatches()
._maxShareRate
— tasa de participación máxima (ETH por participación) para la finalización de solicitudes (precisión de 1e27).
Devuelve
ethToLock
— la cantidad de ether a enviar con el métodofinalize()
.sharesToBurn
— el número de participaciones a quemar para coincidir con esta llamada de finalización.
Métodos protegidos
Roles
- FINALIZE_ROLE — rol para finalizar solicitudes de retiro en la cola.
- PAUSE_ROLE — rol para pausar el retiro en el protocolo.
- RESUME_ROLE — rol para reanudar el retiro después de haber sido pausado.
- ORACLE_ROLE — rol para proporcionar los datos relacionados con el oráculo necesarios, como la última marca de tiempo del informe y si el protocolo está en modo bunker.
- MANAGE_TOKEN_URI_ROLE — rol para establecer los parámetros para construir el URI del token: el URI base
o la dirección de
NFTDescriptor
.
finalize()
Finaliza solicitudes desde la última finalizada hasta _lastRequestIdToBeFinalized
utilizando _maxShareRate
como tasa de participación base para stETH
y pasando junto con algo de ether como msg.value
.
La cantidad de ether a enviar debe precalcularse con el método prefinalize()
.
Emite un evento BatchMetadataUpdate
y un evento WithdrawalsFinalized
.
function finalize(uint256 _lastRequestIdToBeFinalized, uint256 _maxShareRate) payable
donde
_lastRequestIdToBeFinalized
— el último id de solicitud a finalizar._maxShareRate
— la tasa de participación máxima (ETH por participación) para la finalización de solicitudes (precisión de 1e27).
Requisitos:
- los retiros no deben estar pausados.
msg.sender
debe tener asignado el rolFINALIZE_ROLE
._lastRequestIdToBeFinalized
debe ser un id de solicitud no finalizada existente.msg.value
debe ser menor o igual a la suma destETH
no finalizada hasta_lastRequestIdToBeFinalized
.
pauseFor()
Pausa la colocación de solicitudes de retiro y la finalización durante una _duration
particular. Reclamar solicitudes finalizadas seguirá estando disponible.
Emite un evento Paused
.
function pauseFor(uint256 _duration) onlyRole(PAUSE_ROLE)
donde
_duration
— duración de la pausa en segundos (usarPAUSE_INFINITELY
para ilimitado).
Requisitos:
msg.sender
debe tener asignado el rolPAUSE_ROLE
._duration
no debe ser cero.- el contrato no debe estar ya pausado.
pauseUntil()
Pausa la colocación de solicitudes de retiro y la finalización hasta la marca de tiempo _pauseUntilInclusive
.
Reclamar solicitudes finalizadas seguirá estando disponible.
Emite un evento Paused
.
function pauseUntil(uint256 _pauseUntilInclusive) onlyRole(PAUSE_ROLE)
donde
_pauseUntilInclusive
— la marca de tiempoblock.timestamp
hasta la cual pausar (inclusive).
Requisitos:
msg.sender
debe tener asignado el rolPAUSE_ROLE
._pauseUntilInclusive
no debe estar en el pasado.- el contrato no debe estar ya pausado.
resume()
Resumes withdrawal requests placement and finalization. The contract is deployed in a paused state and should be resumed explicitly.
Emits a Resumed
event.
function resume()
Requirements:
msg.sender
must have aRESUME_ROLE
assigned- the contract must not be already resumed
onOracleReport()
Updates bunker mode state and last report timestamp.
Emits a BunkerModeEnabled
or a BunkerModeDisabled
event.
function onOracleReport(
bool _isBunkerModeNow,
uint256 _bunkerStartTimestamp,
uint256 _currentReportTimestamp
)
where
_isBunkerModeNow
— is bunker mode reported by the oracle_bunkerStartTimestamp
— timestamp of the bunker mode activation_currentReportTimestamp
— timestamp of the current report ref slot
Requirements:
msg.sender
must have anORACLE_ROLE
assigned- all timestamps must be in the past
setBaseUri()
Sets the Base URI for computing token URI.
If the NFTDescriptor
address isn't set, the baseURI
would be used for generating the ERC-721
token URI.
Otherwise, the NFTDescriptor
address would be used as a first-priority method.
Emits a BaseURISet
event
function setBaseURI(string _baseURI) external onlyRole(MANAGE_TOKEN_URI_ROLE)
where
_baseURI
— the base URI to derive the token URI from. Should not end on/
Reverts if msg.sender
has no MANAGE_TOKEN_URI_ROLE
assigned.
setNFTDescriptorAddress()
Sets the address of the NFTDescriptor
contract responsible for token URI generation.
If the NFTDescriptor
address isn't set, the baseURI
would be used for generating the ERC-721
token URI.
Otherwise, the NFTDescriptor
address would be used as a first-priority method.
Emits a NftDescriptorAddressSet
event.
function setNFTDescriptorAddress(address _nftDescriptorAddress) onlyRole(MANAGE_TOKEN_URI_ROLE)
where
_nftDescriptorAddress
— is the address ofNFTDescriptor
contract, which must support theINFTDescriptor
interface:
interface INFTDescriptor {
function constructTokenURI(uint256 _requestId) external view returns (string memory)
}
Reverts if msg.sender
has no MANAGE_TOKEN_URI_ROLE
assigned.