Recientemente se han dado varios casos de proyectos similares donde el desarrollador ha tirado de la manta y se ha largado con todo el dinero. No sólo nuestro contrato está libre de las funciones que les permitieron hacer eso, sino que te vamos a enseñar cómo comprobarlo tú mismo, en nuestro contrato o cualquier otro.
Hemos encontrado algunos contratos que no tienen método de vaciado del pool, pero en los que la comisión total para el desarrollador es del 40% (20% en depósitos, 20% en reintegros), así que no se están llevando todo tu dinero, no... sólo casi la mitad :/
function devFee(uint256 amount) public pure returns(uint256){
return SafeMath.div(SafeMath.mul(amount,20),100);
}
Parece ser que estos rateros no tenían suficiente con vaciar el pool y ahora han reemplazado el código en algunas de sus webs para robar el saldo de tu cartera MetaMask. Antes de confirmar ninguna transacción siempre deberías comprobar que la estás enviando al contrato correcto, es decir, MetaMask te indica que se trata de una "CONTRACT INTERACTION" y que la dirección a la derecha de la flecha es la dirección del contrato que ya has comprobado como te indicamos más abajo. Y comprueba siempre que el total de la transacción es realmente el que te esperabas:
Si ves algo como esto:
es decir, una transacción "SENT ETHER" o el destinatario no es el contrato que has comprobado, rechaza la transacción o podrías perder todo el dinero que tanto trabajo te ha costado ganar.
Primero, necesitas encontrar el contrato en BscScan. La mayoría de los proyectos publican un enlace. El nuestro es éste y también lo puedes encontrar al comienzo y final de nuestras páginas. Pero no te fíes sólo de eso.
Hay unas cuantas cosas adicionales que puedes comprobar:
A) Asegúrate de que el balance en el contrato:
es el mismo que en la página:
B) Comprueba que las transacciones en el contrato son del tipo que serían de esperar en este tipo de juegos:
C) Haz un depósito muy pequeño de prueba. Ve a la "Contract Interaction" que acabas de hacer, en MetaMask y haz click para ver los detalles. Ahora haz click en la flecha para "Ver en https://bscscan.com/" y asegúrate de que te lleva al mismo contrato que has estado mirando antes.
Lo primero que debes saber es que el hecho de que un contrato esté verificado en BSCScan sólo significa que el código binario que se ejecuta en la blockchain se corresponde con el publicado en BSCScan. No indica que haya pasado ninguna auditoría ni es garantía de que no tenga fallos o funciones trampa.
Una ver que estés seguro de que estás en el contrato correcto, ve a la pestaña "Contract":
para ver el código fuente:
Éste es el enlace directo para ver el nuestro.
Ahora comprueba que el código no tenga funciones sospechosas. Las dos cosas principales a mirar son:
A) Funciones que estén limitadas al dueño del contrato o cualquier otra dirección fija. Éstas suelen tener de una de las siguientes dos formas:
1. Un require
directamente en el cuerpo de la función, como en:
function balanceAlgorithm(uint percentage) public {
require(msg.sender == ceoAddress);
. . .
. . .
}
2. Un modifier
definido en alguna parte del código:
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
que se aplica luego a la función:
function withdraw() onlyOwner public {
address myAddress = this;
uint256 etherBalance = myAddress.balance;
owner.transfer(etherBalance);
}
B) Sospecha de cualquier llamada a transfer
con el dueño u otra dirección fija como
destinatario, como la línea owner.transfer(etherBalance);
en la función
withdraw()
de arriba, que transfiere todo el balance del contrato al dueño del
contrato.
En la mayoría de juegos de este tipo sólo deberías ver transfer
's en las funciones de
depósito y reintegro (normalmente llamadas sellEggs()
and buyEggs()
, pero
no tendría por qué ser siempre así:
payable(ceoAddress).transfer(fee2);
payable(ceoAddress2).transfer(fee2);
payable(msg.sender).transfer(SafeMath.sub(eggValue, fee));
Las dos primeras pagan la comisión a/los desarrollador/es. La tercera es la que paga al usuario sus BNB
cuando hace un reintegro.
Si tienes cualquier pregunta contáctanos en nuestro Twitter o Telegram.
function balanceAlgorithm(uint percentage) public {
require(msg.sender == ceoAddress);
require(percentage > 0);
require(sellEggs1> 0);
uint256 myBalance = calculatePercentage(sellEggs1, percentage);
sellEggs1 = sellEggs1 - myBalance;
ceoAddress.transfer(myBalance);
}
function withdraw() onlyOwner public {
address myAddress = this;
uint256 etherBalance = myAddress.balance;
owner.transfer(etherBalance);
}
function deposit(uint amount) public onlyCEO {
address _owner = (msg.sender);
_owner.transfer(amount);
}
function depositEggs() onlyOwner public {
address myAddress = this;
uint256 etherBalance = myAddress.balance;
owner.transfer(etherBalance);
}