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!
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.
Utgarda
buyTokens
no 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.