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?
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.
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
DMC
ismael