crowdsale desplegado en testnet no puede recibir ether de otra cuenta de prueba

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. enlaceingrese la descripción de la imagen aquí

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í?

¿Es por la palabra clave de pago? Traté de agregar pagadero pero dice que la función interna no se puede pagar

Respuestas (2)

La internalpalabra 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 internala public.

Debe agregar sipayable planea enviar Ethereum con esta llamada de función.

Para solucionar esto, debe cambiar internala 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.

Gracias Alec, ahora entiendo el significado de la función de reserva. Eche un vistazo a mi contenido agregado, la función de respaldo está realmente definida pero aún no recibirá ether
@ZixuanZhang En ambas transacciones, el Gas Usedes 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.