¿Cómo creo un crowdsale que solo acepte un token erc20 específico?

Supongamos que ha creado y emitido un token ERC20. Luego crea una venta colectiva y solo quiere aceptar el token que emitió, no Ethereum.

es posible?

Respuestas (2)

Si controla tanto el token como el crowdsale, se puede hacer fácilmente

contract Token {

    address officialCrowdsale;

    function investCrowdsale(uint256 _value, bytes _extraData) returns (bool success) {
        allowance[msg.sender][officialCrowdsale] = _value;     
        Crowdsale crowdsale = Crowdsale(officialCrowdsale);
        crowdsale.investFromToken(msg.sender, _value, _extraData);
        return true; 
    }

}

Y en tu crowdsale

contract Crowdsale {

    address officialToken;
    address depositToken;

    function investFromToken(address _from, uint256 _value ,bytes _extraData) returns (bool success) {
        if (msg.sender != officialToken) throw; // only accept transfer from the official token
        Token token = Token(_token);
        token.transferFrom(_from, depositToken, _value); // store tokens in deposit
        DoInvest(_value, _extraData); // Do the investment
        return true; 
    }

}

Si su token ya está implementado y es compatible con applyAndCall , puede hacer algo similar.

Ya creé el token usando el código del tutorial. ¿Cómo modificaría el código del tutorial de crowdsale para que acepte mi token? (También ya he creado la asociación de accionistas con mi token)
Agregue un enlace a su fuente de token a la pregunta si ya está implementado. No existe una solución genérica que funcione para todos los tokens.

Una alternativa de solución podría ser esta: en primer lugar, el usuario debe llamar a la approve()función de su token ERC-20, pasando como parámetros el contrato de crowdsale y la cantidad que quiere gastar en el crowdsale:

approve(crowdsaleAddress, amount)

luego, en su contrato de crowdsale, primero debe verificar el saldo del usuario y luego transferir el monto a su dirección de crowdsale.

Tu contrato de crowdsale:

    //interface to your Token
    contract YourToken{
        function transferFrom(address _from, address _to, uint _value) returns (bool success);
        function approve(address _spender, uint _value) returns (bool success);
        function balanceOf(address _owner) constant returns (uint balance);
    }


    contract Crowdsale {

        address owner;  
        mapping(address => uint256) balances;
        function Crowdsale(){
            owner = msg.sender;
        }

        function acceptOnlyMyToken(address _yourTokenAddress, uint256 amount){
            address user = msg.sender;
            YourToken token = YourToken(_yourTokenAddress);

            //get the user's balance
            uint256 userBalance = token.balanceOf(user);
            //check user's balance
            if(userBalance >= amount){      
                token.transferFrom(user, owner, amount);        

            }

        }

    }

Hice una pregunta similar: mejores prácticas para interactuar con otros contratos