Acceder a los fondos que se envían a la dirección del contrato inteligente

Si alguien crea un contrato inteligente (y es el propietario de ese contrato), ¿es posible que esa persona recopile ETH y otros tokens que se envían a la dirección del contrato inteligente?

Este es un superconjunto del posible duplicado, ya que accede a fondos como tokens, no solo ETH.

Respuestas (2)

Esto solo es posible si el creador de un contrato inteligente lo hace posible. Si un contrato no implementa ninguna función de retiro(), es posible que el propietario no pueda recuperar los fondos.

Esto es una característica, no un error. ¿Le gustaría que el creador del contrato inteligente ether delta retirara todo el ether y los tokens del contrato a su antojo? No.

Un contrato inteligente no tiene ningún propietario o mecanismo de retiro a menos que hayan sido codificados en el contrato. Esto le da a los contratos inteligentes el poder de no confiar: es posible usar contratos sin confiar en el propietario, al comprender cuidadosamente el código del contrato.

Retirar tokens ERC-20

Si es autor de un contrato inteligente y desea poder retirar tokens ERC-20, debe realizar 2 pasos.

Paso 1: Agregue esta interfaz (subconjunto de ERC-20) arriba de su contrato

contract Token {
    function transfer(address _to, uint _value) returns (bool success);
    function balanceOf(address _owner) constant returns (uint balance);
}

Paso 2: Aquí hay una función que puede agregar dentro de su contrato

function withdrawTokens(address tokenContract) external onlyOwner {
    Token tc = Token(tokenContract);

    tc.transfer(owner, tc.balanceOf(this));
}

Esto supone que se ha escrito y configurado correctamente como owner. Dado que su contrato puede recibir muchos tipos diferentes de tokens, debe hacerlo withdrawTokensde cada uno tokenContract. Si owneres otro contrato, también debe tener una withdrawTokensfunción para evitar que los tokens se atasquen en el ownercontrato.

Retirar éter

El código es más simple:

function withdrawEther() external onlyOwner {
    owner.transfer(this.balance);
}

Nuevamente, si owneres otro contrato, también debe tener una withdrawEtherfunción para evitar que ether se atasque en el ownercontrato.

Otra referencia: Cómo retirar Ether de un contrato

Gracias, entonces, si el contrato ya está vigente y no tiene esa función, ¿se atascaron los fondos? ¿Se puede actualizar, para que esto se pueda agregar?
@nikolaivkov Sí, los fondos se estancarán. Del mismo modo, un contrato tampoco se puede actualizar a menos que ya tenga un código que permita actualizarlo de alguna manera.