¿Cómo llamar a una función de un contrato inteligente implementado en ethereum desde otro contrato inteligente?

Tengo un contrato inteligente implementado en una dirección particular (por ejemplo, 0xABC). Este contrato es un contrato inteligente de token ERC20 (digamos, token ABC). Este contrato se implementó el **noviembre de 2017 .**

Ahora quiero tener otro contrato inteligente que pueda actuar como depósito en garantía, que pueda retener el token ABC hasta que se cumpla una condición específica. Este contrato aún no se ha implementado.

Entonces, ¿cómo el contrato de depósito en garantía puede aceptar el token ABC y liberar el token ABC al usuario válido después de que se cumpla la condición? Quiero llamar al método .transfer() del contrato de token ABC del contrato de depósito en garantía, para obtener y liberar fondos del depósito en garantía.

Nota: Ambos contratos inteligentes se implementan en direcciones diferentes, ya que se implementan en momentos diferentes.

Respuestas (2)

Algo como esto debería funcionar

contract Escrow {

    ERC20 token = ERC20(0xABCDEF....);

    event Deposit(address sender, uint amount);
    event Withdraw(address sender, uint amount);

    mapping (address => uint) deposits;

    // The user should approve the contract to retrieve tokens
    function deposit(uint amount) public {
        // Accept tokens in deposit
        token.transferFrom(msg.sender, amount);
        deposits[msg.sender] += amount;

        emit Deposit(msg.sender, amount);
    }

    function withdraw(uint amount) public {
        // Cannot withdraw more tokens than deposited
        require(deposits[msg.sender] >= amount);

        // Verify condition enable withdraw
        if (condition) {
            // Transfer tokens to sender
            deposits[msg.sender] -= amount;
            token.transfer(msg.sender, amount);

            emit Withdraw(msg.sender, amount);
        } else {
            revert();
        }
    }
}

El usuario debe aprobar su contrato para que pueda transferir tokens con transferFrom. En javascript es algo así como ERC20Token.approve(Escrow.addrss, amount, { from: "0xTokenOwnerAddress" }), y luego llamar al fideicomiso para hacer un depósito EscrowContract.deposit(amount, { from: "0xTokenOwnerAddress"}).

Esto puede hacerse. Sin embargo, si los usuarios envían los tokens al contrato de depósito en garantía mediante transferencia, el contrato de depósito en garantía no será notificado. debe usar applyAndCall en el contrato de token ERC20 (suponiendo que se haya implementado)

approveAndCallaprobará su contrato para mover tokens del usuario a su contrato y luego puede aplicar la lógica que necesita sobre cómo permitir que se retiren los tokens.

Para poder utilizar las funciones del contrato de token ERC20, debe crear una instancia de ERC20TokenContract dentro de su contrato.

Entonces puedes hacer:

ERC20TokenContract myInstance = ERC20TokenContract('contractAddress')

esto le permite hacer cosas como: ¿ myInstance.transfer(to,value)dónde transferestá una función para ERC20TokenContract?

Debe importar el contrato de token en su contrato de depósito en garantía. Aquí asumo que el nombre del contrato del token es ERC20TokenContract.

Para los detalles de la implementación, eche un vistazo a esta respuesta.

Tenga en cuenta que si su contrato ERC20 no implementa la aprobación y llamada, la única alternativa es pedir a los usuarios que primero envíen los tokens a la dirección de su contrato y luego ejecuten la función en su contrato que bloquea los tokens.

¿Cómo crear una instancia de mi Contrato token dentro del contrato de depósito en garantía? mediante el uso de abi de contrato de token o simplemente la dirección o algo más? por favor, ayúdenme porque esta es la única forma en que puedo usar el depósito en garantía. Si puede dar algún ejemplo, será muy útil. ¡Gracias!
Está en la respuesta. no ERC20TokenContract myInstance = ERC20TokenContract('contractAddress')necesita el ABI, pero debe copiar el contrato del token en el mismo archivo que su contrato de depósito en garantía o importarlo usando 'import filename.sol'. También puede crear una interfaz para el contrato de token, cualquiera de estas tres cosas funcionará.