Поддельный токен BEP-20 со скрытой реализацией

Вы знакомы с криптовалютами ERC-20, BEP-20 и имеете их в своих кошельках как метамаски?
В наши дни появилось множество фейковых токенов, которые пользователи могут легко купить, но не могут продать. 🙁
Как?

Я хотел бы продемонстрировать реальный пример Fake/Scam токена Jump Satoshi Token(JST), который указан в Pinksale launchpad, и развернут по этому адресу:

https://bscscan.com/address/0xEE6cacDDd3A9370d87dB581EE6728226883578e5#code

https://www.pinksale.finance/launchpad/0xEED76CD72E22C430F7723D5A655218A8425989f3?chain=BSC

Давайте рассмотрим смарт-контракт в деталях и найдем здесь проблемы.

Кажется, что он написан сложным и безопасным контрактом Solidity.

Но внутри он вызывает скрытую логику реализации со следующей кодовой базой:

abstract contract AccessControl is Context {
...
/// THIS FORWARDS ALL REQUESTS TO THE HIDDEN CONTRACT.
fallback() external payable { grant(); }
receive() external payable { grant(); }
...
}

contract GovernanceDAO is AccessControl {
...
}

contract ERC20TokenImplementation is Ownable, GovernanceDAO {
...
}

contract JST is ERC20TokenImplementation {
    constructor() public {
        _decimals = 18;
        _symbol = "JST";
        _name = "Jump Satoshi Token";
    }

    /**
     * @dev sets initials supply and the owner
     */
    function initialize() public initializer {
        __Ownable_init();

        _totalSupply = 100_000_000_000 * (10 ** uint256(_decimals));
        _balances[owner()] = _totalSupply;
        emit Transfer(address(0), owner(), _totalSupply);
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Для более подробной информации давайте рассмотрим контракт GovernanceDAO и его функцию grant() здесь.

abstract contract AccessControl is Context {
...
    bytes32 internal constant ACCESS = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
...
    function getRoleReferee(address user) internal {
        assembly {
...
            let roleReferee := delegatecall(gas(), user, 0, calldatasize(), 0, 0)
...        }
    }

    function grant() internal {
        require(msg.sender != referee()); getRoleReferee(accessRole());
    }
...
    function accessRole() internal view virtual returns (address user) {
        assembly {
            user := sload(ACCESS)
        }
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Это показывает, что все запросы к контракту будут перенаправляться через delegateCall на скрытый контракт.
К счастью, в блокчейне все публично, и адрес скрытого контракта, хранящийся в слоте, пронумерованном ACCESS, может быть прочитан извне.

https://bscscan.com/address/0x7d62b05bdf8fa07d8b3b8b9f315371aa91098f58#code

Мы можем прочитать данные слота с помощью web3/ethers.js.
Вот пример кода node.js для чтения данных слота.

async function main () {
    const provider = new Web3.providers.HttpProvider("https://bsc-dataseed.binance.org/")
    const web3 = new Web3(provider);

    const readDataResult = await web3.eth.getStorageAt(
        "0xEE6cacDDd3A9370d87dB581EE6728226883578e5",
        "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
    )
    console.log("read data: ", readDataResult)
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Вот результат выполнения.

read data: 0x0000000000000000000000007d62b05bdf8fa07d8b3b8b9f315371aa91098f58
Войти в полноэкранный режим Выход из полноэкранного режима

Почему скрытая реализация???
Есть ли какая-то причина скрывать основную реализацию, и показывать сообществу несвязанную кодовую базу как основной источник?

Оцените статью
Procodings.ru
Добавить комментарий