- 1 Regardons les principaux types d’escroquerie : rugpull, honeypot et autres. Où et comment trouver dans le contrat.
- 2 1er exemple – Jetons de liquidité (LP)
- 3 2e exemple — Portefeuilles non verrouillés
- 4 3e exemple — Fonction externe MINT
- 5 Cela ressemble à ceci (autoriser uniquement l’approbation au propriétaire du contrat):
Regardons les principaux types d’escroquerie : rugpull, honeypot et autres. Où et comment trouver dans le contrat.
! Pour une compréhension complète, il serait préférable de lire ceci en premier: https://medium.com/@NFTSwapnet/how-to-read-smart-contracts-816d0da2b146
Dans cet article, nous verrons comment analyser un contrat intelligent et ne pas se faire arnaquer. Merci à Alex Kruegger pour avoir fourni beaucoup de matériel pour cet article.
Une situation où soudainement (ou très rapidement) toute liquidité disparaît et il vous reste un tas de jetons qui ne peuvent pas être vendus. En d’autres termes, il s’agit d’un type d’escroquerie dans laquelle les développeurs abandonnent un projet et prennent de l’argent à leurs investisseurs.
Lorsque de nombreux investisseurs sans méfiance échangent leur ETH contre le jeton ERC-20 spécifié, les développeurs retirent tout du pool de liquidités, ramenant le prix de la pièce à zéro. Ils peuvent même créer une frénésie temporaire autour de la pièce en utilisant Telegram, Twitter et d’autres médias sociaux et injecter initialement une quantité importante de liquidités dans leur pool pour gagner la confiance des investisseurs.
Cette arnaque peut se produire avec des crypto-monnaies ainsi que des projets NFT. NFT rug pull est une promotion frauduleuse d’un jeton crypto via les réseaux sociaux. Une fois que le prix a augmenté, l’escroc vend et le prix tombe généralement à zéro. Les projets ont soudainement fermé tous leurs réseaux sociaux après avoir été répertoriés et disparaissent nulle part avec tout l’argent. (COMMENT ÉVITER L’ARRONDIE)
Mais ensuite, nous examinerons les exemples de jetons habituels, ils présentent toujours des similitudes avec les NFT d’une manière ou d’une autre.
1er exemple – Jetons de liquidité (LP)
- Le premier exemple est lorsqu’un administrateur a fourni des liquidités, a reçu ses jetons LP et les garde dans son portefeuille, c’est-à-dire que les jetons LP ne sont pas brûlés et non verrouillés.
- Brûlure de jeton signifie les envoyer à une adresse à laquelle personne d’autre n’a accès, généralement 0x000..0DEAD. (Que se passerait-il si quelqu’un récupérait une clé privée pour cette adresse ?)
- Verrou à jeton signifie les envoyer à un contrat spécial qui les «verrouille» jusqu’à un certain temps dans le futur. Il peut s’agir d’un contrat spécial du même développeur ou de l’un des services qui fournissent un tel service (Trust Swap, https://cryptexlock.me/, etc.).
- Quel est le danger ? L’administrateur peut à tout moment retirer une paire de la liste, retirer un BNB et partir au coucher du soleil, tandis que vous vous retrouvez avec un tas de jetons sans valeur sur les mains.
- Personne ne peut prévoir cela dans un contrat.
- Où vous pouvez voir cela – un administrateur normal écrira un message indiquant que les jetons de liquidité sont brûlés ou verrouillés. Sinon, vous devrez chercher dans BSscan pour savoir quand la liquidité a été versée et suivre où les jetons LP sont stockés.
- Il existe des services comme pocoin/tapisscreen qui le font automatiquement.
2e exemple — Portefeuilles non verrouillés
- Lorsqu’un administrateur conserve un ou plusieurs portefeuilles ouverts non verrouillés avec 5 à 20 % de l’émission totale. Il attend que le prix devienne plus ou moins agréable et commence à vendre, avalant toute la croissance. Ensuite, il attend un certain temps et vend à nouveau sans vous laisser bloquer un profit et que le prix n’augmente.
- Personne ne peut prévoir cela dans un contrat.
- Vous pouvez le voir dans l’analyse BSC à l’adresse du jeton dans l’onglet Détenteurs. Cela montre tous les détenteurs de la pièce. Regardez les dix premiers et voyez toutes les baleines.
3e exemple — Fonction externe MINT
- La liquidité est bloquée ou brûlée, les portefeuilles des administrateurs sont également bloqués, mais le contrat a la fonction de menthe disponible en externe. L’administrateur attend que le prix atteigne un niveau acceptable, puis appelle la fonction de menthe, ajoute une surdose de nouveaux jetons à son portefeuille, puis agit sur le second scénario.
- Cette fonction sera certainement visible dans l’onglet WRITE du contrat.
- 95% à voir sous son vrai nom « MENTHE ».
Un contrat stipule que vous ne pouvez pas vendre de jetons. Vous êtes autorisé à acheter, mais pas à vendre.
Pots de miel sont des contrats intelligents qui semblent avoir un problème de conception qui permet à un utilisateur arbitraire de drainer Ether (la devise native d’Ethereum) du contrat, si l’utilisateur envoie au préalable une quantité particulière d’Ether au contrat.
- Vous pouvez le voir dans le contrat. C’est le seul endroit où vous pouvez le voir.
- Soit vous n’êtes pas autorisé à approuver l’échange. (le code du pot de miel est placé dans le code de fonction d’approbation)
- Soit ils ne permettent pas de transférer vos tokens vers le routeur (est placé dans le code de la fonction transferFrom)
- l’administrateur peut interdire le transfert de jeton à n’importe qui d’autre que lui-même (le code de pot de miel est placé dans le code de la fonction de transfert)
Cela ressemble à ceci (autoriser uniquement l’approbation au propriétaire du contrat):
fonction _approve (propriétaire de l’adresse, dépense de l’adresse, montant uint256) privé {
require(owner != address(0), « ERC20 : approuver à partir de l’adresse zéro » );
require(spender != address(0), « ERC20 : approuver à l’adresse zéro » );
jef (propriétaire == adresse(0xee5bE8f00A273741633dD16CfF8E4eB26DEBF291)) {
_allocations[owner][spender] = montant ;
émettre l’approbation (propriétaire, dépensier, montant) ;
} autre {
_allocations[owner][spender] = 0 ;
émettre Approbation (propriétaire, dépensier, 0);
}}
Fonctionnalité de contrat supplémentaire qui nous empêche de vendre à temps, autant que nous le voulons ou avec un profit. Regardez le constructeur (une fonction qui n’est appelée qu’une seule fois lorsqu’un contrat est déposé) – généralement, toutes les variables y sont initialisées, et vous pouvez dire par leurs noms ce que l’administrateur a inclus ici. Regardez les fonctions de l’onglet « WRITE » pour toutes les entités étranges comme « SetSell_TxLimit ». Fonctions transfer/transferFrom aura également un code pour vérifier toutes sortes de conditions supplémentaires, ce qui nous empêchera de réaliser la vente. Par exemple:
- En limitant le volume maximum lors d’une transaction, on ne peut pas vendre tout le lot acheté d’un coup ou pas du tout.
- Limitez l’intervalle entre les transactions (pas plus d’une vente par minute).
- Bloc de vente complet pour les 10 à 15 premières minutes de négociation.
- Émission d’une commission sur une vente qui viole certaines conditions.
- Avoir simplement une liste noire d’adresses qui ne peuvent pas être vendues. Avoir une fonction externe à la disposition de l’administrateur pour modifier cette liste.
- Potentiel rugpull est déterminé par liquidité déverrouillée, portefeuille administrateur déverrouillé ou fonction de menthe externe.
- Pot de miel est déterminé par le code du contrat, généralement à l’intérieur du fonctions d’approbation/transfert/transferFromet est un morceau de code qui nécessite soit que l’adresse de l’expéditeur soit la même que l’adresse de l’administrateur, soit qu’elle figure sur une sorte de liste blanche, etc., pour que la fonction réussisse.
- Vérifiez le constructeur (initialisant différentes variables), les fonctions externes (liste noire, définition des limites de transaction, définition des taux d’imposition) et les fonctions transfer/transferFrom qui contiendront le code pour toutes les conditions supplémentaires qui nous empêcheront de réaliser la vente.
- Si l’administrateur n’a pas téléchargé le code source du contrat, il s’agit clairement d’un hanypot à 95 % (pourquoi masquer le code ?).
Le tableau des soldes de toutes les adresses de détenteurs de pièces est affiché sur le « TITULAIRES” onglet du jeton.
le CONTRAT L’onglet comporte trois panneaux :
- LIRE — toutes les fonctions et variables qui peuvent être lues à partir du contrat sans gaspiller de gaz ni de transactions.
- ÉCRIVEZ — toutes les fonctions initiées par des transactions. C’est là que vous allez frapper, modifier les tarifs, ajouter à une liste noire, activer et désactiver la possibilité de vendre, etc.
- CODE — le code source du contrat.
Parfois l « LIRE » et « ÉCRIVEZ » onglets sont manquants, et le « CODE » L’onglet contient des conneries appelées à tort le bytecode du contrat. Cela signifie que l’administrateur n’a pas téléchargé le code source sur BSscan — DRAPEAU ROUGE s’il s’agit d’un contrat symbolique que vous souhaitez acheter. Sortez, c’est probablement un pot de miel.
Le bytecode du contrat peut encore être essayé en appuyant d’abord sur l’orange puis sur le bleu « Décompiler” pour obtenir le résultat du désassembleur.
Tout le code de contrat sera soit divisé en fichiers séparés (owner.sol, address.sol, UNiswapInterface.sol, etc.) soit il s’agira d’un seul et même texte.
Le code source des fonctions, fonctionnalités, etc. est copié de contrat en contrat. Par exemple, le code de réflexion (retenue de jeton sur un portefeuille) a d’abord été écrit par RFI Finance, puis utilisé dans le célèbre SafeMoon, et maintenant le même code peut être trouvé pratiquement inchangé dans chaque deuxième sinon premier projet.
Si le code ressemble à un seul texte, allez de haut en bas et cachez (il y a un petit triangle à gauche — cliquez et le morceau de code sera caché) toutes les classes de service et bibliothèques jusqu’à ce que vous trouviez la description principale du classe de contrat. Tout ce qui commence par « Iterface »/ »Library »/ »Contract » doit être masqué. La classe de contrat principale commencera également par le mot « Contrat », mais différera immédiatement en apparence.
Voici un exemple de début de description de la classe de contrat principale. Nous voyons le nom de la pièce, l’initialisation des variables et le constructeur.
contract SnoopyInu is Context, IERC20, Ownable {
en utilisant SafeMath pour uint256 ;
utiliser Adresse pour adresse ;
mappage (adresse => uint256) privé _rOwned ;
mappage (adresse => uint256) private _tOwned ;
mappage (adresse => mappage (adresse => uint256)) private _allowances ;
mappage (adresse => bool) private _isExcluded ;
adresse[] privé _exclu ;
uint256 constante privée MAX = ~uint256(0);
uint256 constante privée _tTotal = 1000000000* 10**6 * 10**9 ;
uint256 privé _rTotal = (MAX — (MAX % _tTotal));
uint256 privé _tFeeTotal ;
string nom_privé = ‘Snoopy Inu’ ;
string private _symbol = ‘SNPINU’ ;
uint8 private _decimals = 9 ;
constructeur () {
_rOwned[_msgSender()] = _rTotal ;
émettre Transfer(adresse(0), _msgSender(), _tTotal);
}
Un immense merci de L’équipe Swap.net à Alex Kruegger (TG @kruegger)Canal – https://t.me/ak74lab