Implementé un contrato inteligente para crowdsale que tiene una función de receiveETH():
function receiveETH(address beneficiary) internal {
uint coinToSend = bonus(msg.value.mul(COIN_PER_ETHER).div(1 ether)); // Compute the number to send
Backer backer = backers[beneficiary];
coin.transfer(beneficiary, coinToSend); // Transfer right now
backer.coinSent = backer.coinSent.add(coinToSend);
backer.weiReceived = backer.weiReceived.add(msg.value); // Update the total wei collected during the crowdfunding for this backer
etherReceived = etherReceived.add(msg.value); // Update the total wei collected during the crowdfunding
coinSentToEther = coinSentToEther.add(coinToSend);
// Send events
LogCoinsEmited(msg.sender ,coinToSend);
LogReceivedETH(beneficiary, etherReceived);
}
este contrato lo he implementado en testnet, pero no pudo recibir ether. Por ejemplo, uso algunas cuentas de prueba para enviar ether a esa dirección de contrato inteligente implementada, cada vez que dice éxito en etherscan y se deduce el costo de Tx, mientras que el ether no se transfiere con éxito y la cantidad de ether del contrato inteligente permanece en 0. enlace
Me pregunto qué está mal aquí. ¿El contrato de crowdsale tiene una función que se activa cada vez que ingresa una nueva transferencia?
PD: acabo de darme cuenta de que tengo definida la función alternativa:
function() stopInEmergency respectTimeFrame payable {
receiveETH(msg.sender);
}
se ve perfecto para mí, pero aún así mi contrato no recibe éter cuando trato de enviarlo. ¿Qué más está mal aquí?
La internal
palabra clave significa que su función solo puede llamarse desde el contrato o los contratos que se derivan de él. No se puede llamar públicamente.
Si desea que esta función se pueda llamar desde fuera del contrato, debe cambiar internal
a public
.
Debe agregar sipayable
planea enviar Ethereum con esta llamada de función.
Para solucionar esto, debe cambiar internal
a public payable
, lo que debería hacer que esta función se pueda llamar públicamente y también permitir que se envíe Ethereum junto con la transacción.
¿El contrato de crowdsale tiene una función que se activa cada vez que ingresa una nueva transferencia?
Para transferir Ethereum, sí. Esta sería la función de reserva . Sin embargo, solo 2300 de gas está disponible. No hay ninguna función que se llame en la transferencia de tokens ERC20 actualmente.
Gas Used
es tanto como el Gas Limit
. Esto sugiere que algo está causando un error o arrojando porque cuando hay un error, todo el gas se consume inmediatamente. Verifique que nada esté causando un error y que su límite de gas sea lo suficientemente alto.Resolví el problema yo mismo, fue porque no transfirí la propiedad de mi contrato de token a mi contrato de venta colectiva.
domo algunos