Dos llamadas a funciones externas que no funcionan en combinación en nuestro contrato inteligente

Entonces tengo las siguientes funciones

comprar fichas

function buyTokens(address beneficiary) public payable {
    require(beneficiary != address(0));
    require(validPurchase());

    uint256 weiAmount = msg.value;

    uint256 tokens = weiAmount.mul(getRate());

    weiRaised = weiRaised.add(weiAmount);

    token.issue(address(vault), tokens);
    vault.deposit.value(msg.value)(beneficiary, tokens);

    emit TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);

    forwardFunds();
}

adelanteFondos

function forwardFunds() internal {
    wallet.transfer(msg.value);
}

depósito (en otro contrato inteligente)

function deposit(address supporter, uint256 tokensAmount) onlyOwner public payable{

    depositedETH[supporter] = depositedETH[supporter].add(msg.value);
    depositedToken[supporter] = depositedToken[supporter].add(tokensAmount);

    emit Deposit(supporter, msg.value, tokensAmount);
}

Entonces, buyTokens no funcionará a menos que comente YA SEA la llamada de depósito o la llamada de forwardFunds. Después de leer un poco, estaba pensando que tenía algo que ver con el gas.

Además, si llamo a la función de depósito pasando el valor como un parámetro en lugar de recibirlo a través del objeto msg en la otra función (sin usar la metodología .value()), funciona bien.

vault.deposit(beneficiary, tokens, msg.value)

¿Hay algún problema con el uso de una llamada .value() y también el reenvío a una función interna que usa .transfer()?

¡Gracias!

¡Hola! Dijiste > " buyTokensno funcionará", pero ¿de qué manera? Comparta amablemente qué mensaje le permite saber que hay un problema. Como una llamada con argumentos y lo que ves luego.

Respuestas (1)

Esto es reenviar el éter enviado al contrato de bóveda.

vault.deposit.value(msg.value)(beneficiary, tokens);

Y esto es reenviar el ether enviado al contrato de billetera.

wallet.transfer(msg.value);

Obviamente, no puede reenviar el mismo ether a dos contratos diferentes.

Creo que señaló el problema de intentar enviar una cantidad dos veces. Entonces, por curiosidad, si el contrato que contiene la función buyTokens tuviera un montón de éter almacenado, ¿sería capaz de ejecutarse? Ej: si alguien activa la función buyTokens, activa la función de depósito y envía un valor (utilizando el éter almacenado en el contrato), Y LUEGO realiza LA función de transferencia, enviando la misma cantidad (de sí mismo) a la billetera. Siempre que el contrato tuviera suficiente éter, ¿funcionaría? Esto es solo como un experimento mental. Obviamente no querré hacer eso.
Sí, si el contrato tiene fondos suficientes, la segunda transferencia tendrá éxito.