typestar

El patrón de retiro en Solidity

Retira, no envíes: pon el saldo en cero antes de mandar.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

// Pull, don't push: zero the balance before sending anything.
contract StallPayouts {
    mapping(address => uint256) public owed;

    function credit(address vendor) external payable {
        owed[vendor] += msg.value;
    }

    function withdraw() external {
        uint256 amount = owed[msg.sender];
        require(amount > 0, "nothing owed");
        owed[msg.sender] = 0;  // effects before interaction
        (bool ok, ) = msg.sender.call{value: amount}("");
        require(ok, "send failed");
    }
}

Cómo funciona

  1. Los créditos se acumulan en owed; a nadie se le paga sin pedir.
  2. El saldo se anula antes del envío — efectos primero.
  3. call{value: amount}("") envía; el bool se verifica.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
19
Caracteres a escribir
505
Tokens
95
Ritmo de tres estrellas
55 tpm

Al ritmo de tres estrellas de 55 tokens por minuto, este intento toma unos 104 segundos.

Escribe este fragmento

Paso 3 de 3 en Ether y eventos; paso 13 de 28 en Fundamentos del lenguaje.

← Anterior Siguiente →