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
stETHantes 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 tokensstETHtransferidos al contrato al solicitaramountOfShares— la cantidad de participaciones subyacentes correspondientes a los tokensstETHtransferidos. 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 NFTunstETHy 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:
_fromno puede ser la dirección cero._tono puede ser la dirección cero.- El token
_requestIddebe existir y ser propiedad de_from. - Si el llamante no es
_from, debe tener permiso para mover este token medianteapprove()osetApprovalForAll(). - Si
_tose 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:
_fromno puede ser la dirección cero._tono puede ser la dirección cero.- El token
_requestIddebe 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
stETHdemsg.senderdebe ser mayor o igual a la suma de todos los_amounts. - Debe haber aprobación de
msg.sendera esta dirección del contrato para la transferencia total de tokensstETH. - Cada cantidad en
_amountsdebe ser mayor o igual aMIN_STETH_WITHDRAWAL_AMOUNTy 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
wstETHdemsg.senderdebe ser mayor o igual a la suma de todos los_amounts. - Debe haber aprobación de
msg.sendera esta dirección del contrato para la transferencia total de tokenswstETH. - Cada cantidad en
_amountsdebe tenergetPooledEthByShares(amount)siendo mayor queMIN_STETH_WITHDRAWAL_AMOUNTy 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
stETHdemsg.senderdebe ser mayor o igual a la suma de todos los_amounts. - El permiso debe tener una firma válida, un
valuemayor que la suma de todos los_amountsy que no haya expirado eldeadline. - Cada cantidad en
_amountsdebe ser mayor o igual aMIN_STETH_WITHDRAWAL_AMOUNTy 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
wstETHdemsg.senderdebe ser mayor o igual a la suma de todos los_amounts. - El permiso debe tener una firma válida, un
valuemayor que la suma de todos los_amountsy que no haya expirado eldeadline. - Cada cantidad en
_amountsdebe tenergetPooledEthByShares(amount)siendo mayor queMIN_STETH_WITHDRAWAL_AMOUNTy 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 tokensstETHtransferidos al contrato al momento de la solicitud.amountOfShares— el número de acciones subyacentes correspondientes a los tokensstETHtransferidos. 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 NFTunstETHy 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
_requestIdsdeben existir, estar finalizados y no reclamados. - Todas las
_hintsdeben ser válidas para las solicitudes respectivas. msg.senderdebe ser el propietario de todas las solicitudes._recipientno 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
_requestIdsdeben existir, estar finalizados y no reclamados. - Todas las
_hintsdeben ser válidas para las solicitudes respectivas. msg.senderdebe 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.senderdebe ser el propietario de la solicitud_requestId.- La solicitud
_requestIddebe 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.
_firstIndexdebe ser mayor que 0, porque la lista de puntos de control es una matriz basada en 1._lastIndexdebe 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 entruesi 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.senderdebe tener asignado el rolFINALIZE_ROLE._lastRequestIdToBeFinalizeddebe ser un id de solicitud no finalizada existente.msg.valuedebe ser menor o igual a la suma destETHno 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_INFINITELYpara ilimitado).
Requisitos:
msg.senderdebe tener asignado el rolPAUSE_ROLE._durationno 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.timestamphasta la cual pausar (inclusive).
Requisitos:
msg.senderdebe tener asignado el rolPAUSE_ROLE._pauseUntilInclusiveno 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.sendermust have aRESUME_ROLEassigned- 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.sendermust have anORACLE_ROLEassigned- 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 ofNFTDescriptorcontract, which must support theINFTDescriptorinterface:
interface INFTDescriptor {
function constructTokenURI(uint256 _requestId) external view returns (string memory)
}
Reverts if msg.sender has no MANAGE_TOKEN_URI_ROLE assigned.