Pular para o conteúdo principal
Change page

Padrão de Cofre Tokenizado Assíncrono ERC-7540

Introdução

O ERC-7540 estende o Padrão de Cofre Tokenizado ERC-4626 adicionando suporte para fluxos assíncronos de depósito e resgate. Ele introduz um padrão de solicitar-e-reivindicar (request-then-claim): os usuários primeiro enviam uma solicitação (bloqueando seus ativos ou cotas) e, em seguida, reivindicam o resultado após o cofre tê-lo processado.

Isso é necessário quando um cofre não pode realizar a liquidação instantaneamente em uma única transação, por exemplo:

  • Protocolos de ativos do mundo real (RWA), como tesourarias tokenizadas, crédito privado e outros ativos com ciclos de liquidação T+1 ou T+2
  • Empréstimo subcolateralizado onde as avaliações de crédito ocorrem offchain
  • Estratégias de cofre cross-chain onde as pontes (bridges) introduzem atrasos
  • Tokens de staking líquido (LST) com períodos de desvinculação (unbonding)

Os cofres podem escolher ser assíncronos apenas em depósitos, apenas em resgates ou em ambos. Essa flexibilidade permite que os desenvolvedores de cofres adicionem fluxos assíncronos apenas onde a estratégia subjacente exigir, mantendo o outro lado síncrono.

Pré-requisitos

Para entender melhor esta página, recomendamos que você leia primeiro sobre padrões de token, ERC-20 e ERC-4626.

ERC-4626 vs ERC-7540

No ERC-4626, um depósito é liquidado atomicamente: o investidor envia ativos e recebe cotas de volta em uma única transação.

ERC-4626 synchronous deposit flow

O ERC-7540 divide isso em duas etapas. O investidor primeiro chama requestDeposit() para bloquear ativos e, em seguida, aguarda o gerente do cofre processar a solicitação. Uma vez atendida, o investidor chama deposit() para reivindicar suas cotas. As taxas de câmbio são determinadas no momento do atendimento, não no momento da solicitação.

ERC-7540 asynchronous deposit flow

O fluxo de resgate funciona da mesma maneira: requestRedeem() bloqueia as cotas e, uma vez atendido, o investidor chama redeem() para reivindicar os ativos.

Funções e Recursos do ERC-7540

O ERC-7540 herda a interface completa do ERC-4626, mas reaproveita deposit/mint/withdraw/redeem como funções de reivindicação. As novas funções requestDeposit e requestRedeem lidam com a etapa inicial de solicitação.

Cada solicitação passa por três estados: pendente (enviada, aguardando processamento), reivindicável (atendida e precificada) e reivindicada (o investidor coletou suas cotas ou ativos).

Request lifecycle: Pending, Claimable, Claimed

Fluxo de solicitação de depósito

requestDeposit

function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId)

Transfere assets de owner para o cofre e envia uma solicitação de depósito. O endereço controller recebe o controle da solicitação. Retorna um requestId identificando o lote da solicitação.

pendingDepositRequest

function pendingDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)

Retorna a quantidade de assets em uma solicitação de depósito pendente (ainda não reivindicável) para o controller e requestId fornecidos.

claimableDepositRequest

function claimableDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)

Retorna a quantidade de assets em uma solicitação de depósito reivindicável (atendida, mas ainda não reivindicada) para o controller e requestId fornecidos.

Reivindicando depósitos

Uma vez que uma solicitação de depósito se torna reivindicável, o usuário chama a função padrão do ERC-4626 deposit ou mint para reivindicar suas cotas. No ERC-7540, essas funções não transferem mais ativos (isso já aconteceu no momento da solicitação). Elas apenas cunham cotas para o recebedor.

Fluxo de solicitação de resgate

requestRedeem

function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId)

Bloqueia shares de owner e envia uma solicitação de resgate. O endereço controller recebe o controle da solicitação.

pendingRedeemRequest

function pendingRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)

Retorna a quantidade de shares em uma solicitação de resgate pendente para o controller e requestId fornecidos.

claimableRedeemRequest

function claimableRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)

Retorna a quantidade de shares em uma solicitação de resgate reivindicável para o controller e requestId fornecidos.

Reivindicando resgates

Uma vez que uma solicitação de resgate se torna reivindicável, o usuário chama a função padrão do ERC-4626 redeem ou withdraw para reivindicar seus ativos.

Gerenciamento de operador

O ERC-7540 inclui um padrão de operador (do ERC-6909 (abre em uma nova aba)) que permite que terceiros gerenciem solicitações em nome de um usuário.

setOperator

function setOperator(address operator, bool approved) external returns (bool)

Aprova ou revoga operator para agir em nome de msg.sender para solicitações de depósito/resgate e reivindicações.

isOperator

function isOperator(address controller, address operator) external view returns (bool)

Retorna se operator está aprovado para agir em nome de controller.

IDs de Solicitação

Os IDs de solicitação diferenciam entre diferentes lotes de solicitações. Todas as solicitações que compartilham o mesmo requestId são fungíveis: elas transitam entre estados juntas e recebem a mesma taxa de câmbio.

Quando um cofre retorna requestId = 0 para todas as solicitações, apenas o endereço controller diferencia o estado da solicitação. Múltiplas solicitações do mesmo controlador são agregadas.

Eventos

Evento DepositRequest

DEVE ser emitido quando uma solicitação de depósito é enviada via requestDeposit.

event DepositRequest(
    address indexed controller,
    address indexed owner,
    uint256 indexed requestId,
    address sender,
    uint256 assets
)

Evento RedeemRequest

DEVE ser emitido quando uma solicitação de resgate é enviada via requestRedeem.

event RedeemRequest(
    address indexed controller,
    address indexed owner,
    uint256 indexed requestId,
    address sender,
    uint256 shares
)

Evento OperatorSet

DEVE ser emitido quando um operador é aprovado ou revogado via setOperator.

event OperatorSet(
    address indexed controller,
    address indexed operator,
    bool approved
)

Funções de visualização (Preview)

As funções de visualização (preview) devem reverter apenas para os fluxos que são assíncronos, porque a taxa de câmbio não é conhecida até que a solicitação seja atendida. Em um cofre de depósito assíncrono, previewDeposit e previewMint DEVEM reverter, enquanto previewRedeem e previewWithdraw continuam funcionando como no ERC-4626 (e vice-versa para um cofre de resgate assíncrono). Esta é uma diferença comportamental fundamental em relação ao ERC-4626.

Leitura adicional