Análise de smart contracts
28.03.2024

Contratos inteligentes com a função AntiWhale

Continuamos a série de artigos dedicados à descrição de esquemas fraudulentos em contratos inteligentes. Hoje vamos analisar os contratos inteligentes com o mecanismo de limitação de tamanho de transferência AntiWhale.

Neste artigo, analisaremos em pormenor o que é o mecanismo AntiWhale, a sua diferença em relação ao mecanismo Cooldown e quando são utilizados em conjunto e quando são utilizados separadamente.

Mecanismo Cooldown

Atribuição:

O mecanismo Cooldown foi concebido para impor limites de tempo entre transacções consecutivas a partir do mesmo endereço. O seu objetivo é regular a frequência das transacções e evitar uma atividade excessiva de compra ou venda em curtos intervalos de tempo.

Realização:

Limites de tempo: Os mecanismos de Cooldown estabelecem períodos de espera entre transacções, muitas vezes com base no tempo decorrido desde a última transação de um determinado endereço. Os utilizadores devem aguardar que o período de espera expire antes de iniciarem uma nova transação.

Indicadores:

Comparação de carimbos de data/hora: Procura segmentos de código que comparem carimbos de data/hora de blocos ou utilizem funções relacionadas com o tempo. As variáveis de estado do tipo lastTransactionTimestamp podem ser usadas para rastrear a hora da última transação.

Mecanismo AntiWhale

Atribuição:

O principal objetivo do mecanismo AntiWhale é reduzir o impacto de grandes transacções a partir de um único endereço ou de um pequeno grupo de endereços, muitas vezes referidos como "baleias". Pretende evitar a concentração excessiva de tokens em mãos únicas e combater a possível manipulação ou desestabilização do mercado.

Realização:

Limites de dimensão das transacções: Os mecanismos AntiWhale estabelecem normalmente limites de dimensão ou de custo para as transacções individuais. As transacções que excedem um determinado limite resultam na imposição de restrições, como o cancelamento da transação, taxas elevadas ou outros mecanismos de redistribuição.

Indicadores:

Procura segmentos de código que verifiquem o tamanho ou o valor das transacções e essas variáveis de estado (como maxTransactionAmount ou whaleThreshold), pois podem indicar a presença do mecanismo AntiWhale. O AntiWhale afecta principalmente os utilizadores com grandes volumes de transacções e está centrado na concentração de tokens em grandes detentores.

Principais diferenças entre Cooldown e AntiWhale:

Parâmetros AntiWhale Cooldown
Parâmetros: Influência AntiWhale: Afecta principalmente os utilizadores com elevados volumes de transacções. Cooldown: Aplica-se a todos os utilizadores, independentemente do tamanho da transação.
Parâmetros: Dinâmica do mercado AntiWhale: Concentra-se na resolução de problemas de concentração. Cooldown: Destina-se a regular a frequência das transacções.
Parâmetros: Objectivos do projeto AntiWhale: O objetivo é distribuir tokens e garantir a estabilidade do mercado. Cooldown: O seu principal objetivo é garantir a estabilidade do mercado e impedir a rápida negociação.

Cenários de utilização:

  1. Minimizar a manipulação do mercado:
    Ambos os mecanismos podem ser utilizados em conjunto para resolver vários problemas de manipulação de mercado. O mecanismo AntiWhale ajuda a limitar o tamanho das grandes transacções, enquanto o mecanismo Cooldown impede que várias transacções ocorram rapidamente num curto período de tempo.

    Imagina que uma entidade possui uma parte significativa do fornecimento total de tokens. Sem o mecanismo AntiWhale, esta entidade poderia fazer grandes transacções que poderiam causar flutuações significativas de preços, levando à manipulação do mercado. Ao limitar o tamanho máximo ou a frequência das transacções num único endereço dentro de um determinado período de tempo, o mecanismo AntiWhale visa impedir que os grandes detentores tenham uma influência indevida no mercado.

  2. Garantir uma distribuição equitativa:
    No contexto de novos tokens ou vendas de tokens, evita que um pequeno número de participantes adquira uma parte desproporcional da oferta total. Estabelecer limites para a quantidade máxima que um endereço individual pode comprar durante uma venda de tokens ou durante um determinado período permite uma distribuição mais uniforme de tokens entre um maior número de participantes.

  3. Lidar com problemas de liquidez:
    Os elevados volumes de transação dos grandes detentores podem afetar a liquidez e perturbar o processo natural de descoberta de preços nas bolsas descentralizadas. Ao limitar a velocidade das transacções dos grandes detentores, o mecanismo AntiWhale ajuda a manter uma situação de liquidez mais estável.

  4. Estabilização dos preços:
    Impedir transacções rápidas e em grande escala pode ajudar a estabilizar os preços. Ao aplicar as restrições AntiWhale, o preço do token tem mais tempo para se adaptar às condições de mercado entre as transacções.

  5. Prevenção do front-running:
    O AntiWhale pode ser implementado para combater o front-running, em que os negociadores utilizam informações sensíveis ao tempo para executar transacções antes dos outros. O mecanismo AntiWhale pode reduzir a vantagem obtida pela execução rápida de transacções.

  6. Mitigação de ataques de empréstimo relâmpago e reentrada:
    O AntiWhale pode adicionar uma camada extra de defesa contra alguns ataques de empréstimo rápido e reentrada, limitando a velocidade de execução da transação.

cenários de utilização

Riscos potenciais para os detentores de fichas:

  1. Definir limites demasiado rígidos para o AntiWhale pode ser um problema para os utilizadores que necessitam de grandes transacções.

  2. A dependência excessiva do mecanismo AntiWhale pode promover inadvertidamente a centralização se for implementado sem ter em conta o ecossistema mais vasto.

Como é que podes determinar de forma independente se essas ameaças estão presentes nos contratos inteligentes?

Determinar se um contrato inteligente tem um mecanismo de restrição AntiWhale é uma tarefa importante, aqui tens algumas dicas para ajudar:

  1. Examina a documentação do contrato: começa por analisar a documentação e as especificações do contrato.

  2. Analisa as funções de transferência: examina as funções responsáveis pelas transferências de fichas (transfer, transferFrom, etc.). Procura operadores condicionais que imponham restrições às transacções.

  3. Verifica se há comparações de carimbos de data/hora: procura instâncias em que os carimbos de data/hora dos blocos são comparados no contrato.

  4. Verifica as variáveis de estado: examina as variáveis de estado que podem ser utilizadas para armazenar informações relacionadas com o AntiWhale.

  5. Procura funções ou modificadores relacionados com cálculos de tempo, como block.timestamp, block.number ou now.

  6. Procura os parâmetros que controlam o comportamento do AntiWhale: podem ser maxTransferAmount, maxTxLimit e semelhantes. Estes parâmetros são frequentemente definidos pelo proprietário do contrato ou através de mecanismos de gestão de transacções individuais.

  7. Examina os registos de eventos: verifica se existem eventos especiais nos registos de eventos. As implementações poderão registar informações relevantes quando uma transação é executada, fornecendo informações sobre o processo de arrefecimento.

  8. Analisar a lógica específica do utilizador: Se o contrato aplicar restrições aos utilizadores, verificar a lógica para determinar os limites de transferência individuais. Esta lógica pode incluir atributos do utilizador, saldo ou outros critérios.

  9. Mantém-te atualizado: Mantém-te atualizado com os últimos desenvolvimentos na nossa comunidade (canal Telegram) e com as melhores práticas para a deteção de fraudes (o nosso blogue e canal YouTube).

Boas notícias: o nosso Security Scanner encontra com sucesso (incluindo oculto), bem como calcula as restrições de transferência (AntiWhale) em 90% dos casos. Utiliza a nossa subscrição premium e protege os teus fundos contra ameaças.

Embora o mecanismo AntiWhale tenha sido concebido para evitar a manipulação do mercado e garantir a distribuição de tokens, os autores de fraudes podem utilizar as suas capacidades para defraudar os utilizadores. Abaixo estão alguns cenários possíveis e dicas para garantir investimentos em tokens com o mecanismo AntiWhale em vigor.

Exemplo 1: Limitações ao montante das transacções com um período de reflexão (Transaction Amount Limits with Cooldown)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    uint256 public cooldownTime = 1 days; // Cooldown time between transactions
    
    mapping(address => uint256) private lastTransactionTimestamp;
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        require(block.timestamp - lastTransactionTimestamp[msg.sender] >= cooldownTime, "Wait for cooldown period to end");
        ...
        lastTransactionTimestamp[msg.sender] = block.timestamp;
    }

Este exemplo limita o montante máximo que pode ser transferido por um endereço num determinado período de tempo.

Inclui um mecanismo de arrefecimento que proporciona um período de espera entre transacções no mesmo endereço. A matriz lastTransactionTimestamp mantém o registo do carimbo de data/hora da última transação para cada endereço.

Exemplo 2: Restrições de tradução dinâmica (Progressive Transaction Limits)


    uint256 public initialMaxTransactionAmount = 500000; // Initial maximum transaction amount
    uint256 public maxTransactionIncreaseRate = 20000; // Maximum increase rate per transaction
    uint256 public cooldownTime = 2 days; // Cooldown time between transactions
            
    mapping(address => uint256) private lastTransactionTimestamp;
            
    function transfer(address to, uint256 value) public {
        uint256 currentMaxTransactionAmount = initialMaxTransactionAmount + (maxTransactionIncreaseRate * (block.timestamp - lastTransactionTimestamp[msg.sender]) / cooldownTime);
        require(value <= currentMaxTransactionAmount, "Exceeded maximum transaction amount");
        ...
        lastTransactionTimestamp[msg.sender] = block.timestamp;
    }

Este exemplo utiliza um mecanismo dinâmico em que o montante máximo da transação aumenta gradualmente ao longo do tempo.

O parâmetro maxTransactionIncreaseRate controla a taxa de aumento do montante máximo da transação. A matriz lastTransactionTimestamp regista o carimbo de data/hora da última transação para cada endereço.

restrições de tradução dinâmica

Exemplo 3: Excepções na lista branca (Whitelist Exemption)


    address[] public whitelistedAddresses;
    mapping(address => bool) public isWhitelisted;
    
    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount || isWhitelisted[msg.sender], "Exceeded maximum transaction amount");
        ...
    }

Este exemplo utiliza exclusões para endereços específicos das restrições do AntiWhale utilizando a lista branca.

Os endereços no conjunto whitelistedAddresses são considerados isentos da restrição do montante máximo de transação. O conjunto isWhitelisted determina se um determinado endereço está na lista branca.

Exemplo 4: Limites de transacções escalonados (Tiered Transaction Limits)


    uint256[] public tieredLimits = [5000000, 2000000, 1000000]; // Tiered transaction limits for different address balances

    function transfer(address to, uint256 value) public {
        require(value <= getTransactionLimit(msg.sender), "Exceeded maximum transaction amount");
        ...
    }
    
    function getTransactionLimit(address user) internal view returns (uint256) {
        uint256 userBalance = balanceOf(user);
    
        if (userBalance < 10000) {
            return tieredLimits[0];
        } else if (userBalance < 50000) {
            return tieredLimits[1];
        } else {
            return tieredLimits[2];
        }
    }

Este exemplo implementa limites de transação escalonados com base no saldo do endereço do remetente. Os utilizadores com um saldo inferior têm um limite de transação superior e os utilizadores com um saldo superior têm um limite de transação inferior.

A função getTransactionLimit determina o limite de transação adequado com base no saldo do utilizador.

Exemplo 5: Taxas sobre grandes transacções (Tax on Large Transactions)


    uint256 public taxRate = 75; // 5% tax rate on transactions exceeding the limit
    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    
    function transfer(address to, uint256 value) public {
        if (value > maxTransactionAmount) {
            uint256 taxAmount = (value * taxRate) / 100;
            uint256 netTransferAmount = value - taxAmount;
    
            // Transfer logic here for the net transfer amount
            ...
        } else {
            // Transfer logic here for amounts within the limit
            ...
        }
    }

Neste exemplo, a taxa é cobrada nas transacções que excedem o montante máximo da transação.

A taxa de comissão (TaxRate) determina a percentagem do montante da transação. A comissão é deduzida e, em seguida, o valor líquido da transferência é processado.

Exemplo 6: Limites escalonados (Multi-Level Transaction Limits)


    uint256 public maxTransactionAmount1 = 500000; // Maximum transaction amount for tier 1 (500,000 tokens)
    uint256 public maxTransactionAmount2 = 200000; // Maximum transaction amount for tier 2 (200,000 tokens)
    
    function transfer(address to, uint256 value) public {
        if (value <= maxTransactionAmount1) {
            ...
        } else if (value <= maxTransactionAmount2) {
            ...
        } else {
            revert("Exceeded maximum transaction amount");
        }
    }

Este exemplo implementa vários níveis de limites de transação, em que são aplicados limites diferentes consoante o montante da transação.

Isto permite que os limites de transação sejam definidos em vários níveis de granularidade para diferentes volumes de tokens.

Exemplo 7: Limites de transacções dinâmicos em função do saldo (Dynamic Transaction Limits based on Token Balance)


    uint256 public maxTransactionPercentage = 5; // Maximum transaction percentage relative to total token supply
    
    function transfer(address to, uint256 value) public {
        uint256 maxTransactionAmount = (totalSupply() * maxTransactionPercentage) / 100;
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        ...
    }

Este exemplo calcula dinamicamente o montante máximo da transação como uma percentagem do fornecimento total. O parâmetro maxTransactionPercentage define a percentagem permitida para uma única transação.

limites de transacções dinâmicos

Exemplo 8: Limites dependentes do tempo (Time-Dependent Transaction Limits)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount (1 million tokens)
    uint256 public startTime = 1700000000; // Start time in Unix timestamp
    uint256 public endTime = 1800000000; // End time in Unix timestamp

    function transfer(address to, uint256 value) public {
        require(block.timestamp >= startTime && block.timestamp <= endTime, "Transaction not allowed at this time");
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        ...
    }

Neste exemplo, são aplicadas restrições de transação dependentes do tempo, permitindo transacções apenas dentro de um determinado período de tempo.

Os parâmetros startTime e endTime definem o período durante o qual as transacções são permitidas.

Exemplo 9: Tributação progressiva (Progressive Taxation)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount (1 million tokens)
    uint256 public taxRate = 2; // Initial tax rate in percentage
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
    
        uint256 taxAmount = (value * taxRate) / 100;
        uint256 netTransferAmount = value - taxAmount;
    
        // Transfer logic here for the net transfer amount
        ...
    }

Este exemplo apresenta um mecanismo de tributação progressiva em que é cobrado um imposto (taxa) sobre as transacções que excedam um montante máximo.

A taxa de imposto (taxa) pode ser ajustada ao longo do tempo ou com base em determinadas condições.

Exemplo 10: Limites de transacções com base nos saldos dos titulares (Weighted Transaction Limits based on Token Holders' Balances)


    uint256 public maxTotalTransactionAmount = 5000000; // Maximum total transaction amount for all token holders
    mapping(address => uint256) public userTransactionLimit; // Transaction limits based on individual token holder balances
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTotalTransactionAmount, "Exceeded maximum total transaction amount");
        require(value <= userTransactionLimit[msg.sender], "Exceeded individual transaction limit");
        ...
    }

Este exemplo implementa limites de transação com base no montante total de transacções e no saldo de detentores de tokens individuais.

A ligação userTransactionLimit permite-te definir limites personalizados com base nos saldos de endereços específicos.

 

Esperamos que estes exemplos te tenham ajudado a compreender melhor o mecanismo AntiWhale nos contratos inteligentes.

 

Uma vez que toda a informação na cadeia de blocos é aberta (desde que, obviamente, o código fonte do contrato seja verificado), munido deste conhecimento podes estudar independentemente os contratos inteligentes e identificar vários esquemas fraudulentos.

No entanto, nós já fizemos tudo isso por ti! Inscreve-te para uma subscrição premium e obtém acesso a filtros exclusivos sobre características de contratos inteligentes e novas análises. Aumenta as tuas hipóteses de investir com sucesso em tokens lucrativos.

Cumprimentos, equipa do Lotus Market.

All posts

Connect to a wallet

Metamask