Logo:
Name: Atropa
Ticker Symbol: ATROPA
Network: Pulsechain
Contract Address: 0xCc78A0acDF847A2C1714D2A925bB4477df5d48a6
Purpose: Unknown.
Project URL: NIL
Project social media: NIL
Contract Source Code: Link
REVIEWED BY: Elmyre
This is a complete review of the Atropa smart contract project based on the available byte code in https://scan.pulsechain.com/address/0xCc78A0acDF847A2C1714D2A925bB4477df5d48a6/contracts#address-tabs.
Since the source code is not available the provided review may not be 100% accurate! Decompiled Solidity code may not always have the exact same functionality as the original source code, especially if the original code contained certain optimizations or if it was written in a way that relies on specific low-level behaviours of the Ethereum Virtual Machine (EVM). Decompilation is a reverse engineering process that attempts to recreate higher-level code from compiled bytecode.
Based on the decompiled version provided in the https://atropacode.anvil.app/, the original code seems to be a simple token contract that inherited from the open zeppelin’s:
The decompiled code doesn’t appear have any additional functionality beyond what is typically found in OpenZeppelin’s ERC20.sol, Ownable.sol, and ERC20Burnable.sol contracts, having simply the core functionality of these contracts with functions of similar names and purposes.
To confirm this fact, I used a boiler plate contract based on the Atropa’s tokens initial total supply and deployed it in a test environment using Remix (https://remix.ethereum.org/). The source code used was simply:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import “@openzeppelin/contracts/token/ERC20/ERC20.sol”;
import “@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol”;
import “@openzeppelin/contracts/access/Ownable.sol”;
contract Atropa is ERC20, ERC20Burnable, Ownable {
constructor() ERC20(“Atropa”, “ATROPA”) {
_mint(msg.sender, 1111111111 * 10 ** decimals());
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
The compiled runtime code generated was as follows:
608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102a6578063a457c2d7146102c4578063a9059cbb146102f4578063dd62ed3e14610324578063f2fde38b146103545761010b565b806370a0823114610232578063715018a61461026257806379cc67901461026c5780638da5cb5b146102885761010b565b8063313ce567116100de578063313ce567146101ac57806339509351146101ca57806340c10f19146101fa57806342966c68146102165761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b610118610370565b6040516101259190611178565b60405180910390f35b61014860048036038101906101439190611233565b610402565b604051610155919061128e565b60405180910390f35b610166610425565b60405161017391906112b8565b60405180910390f35b610196600480360381019061019191906112d3565b61042f565b6040516101a3919061128e565b60405180910390f35b6101b461045e565b6040516101c19190611342565b60405180910390f35b6101e460048036038101906101df9190611233565b610467565b6040516101f1919061128e565b60405180910390f35b610214600480360381019061020f9190611233565b61049e565b005b610230600480360381019061022b919061135d565b6104b4565b005b61024c6004803603810190610247919061138a565b6104c8565b60405161025991906112b8565b60405180910390f35b61026a610510565b005b61028660048036038101906102819190611233565b610524565b005b610290610544565b60405161029d91906113c6565b60405180910390f35b6102ae61056e565b6040516102bb9190611178565b60405180910390f35b6102de60048036038101906102d99190611233565b610600565b6040516102eb919061128e565b60405180910390f35b61030e60048036038101906103099190611233565b610677565b60405161031b919061128e565b60405180910390f35b61033e600480360381019061033991906113e1565b61069a565b60405161034b91906112b8565b60405180910390f35b61036e6004803603810190610369919061138a565b610721565b005b60606003805461037f90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546103ab90611450565b80156103f85780601f106103cd576101008083540402835291602001916103f8565b820191906000526020600020905b8154815290600101906020018083116103db57829003601f168201915b5050505050905090565b60008061040d6107a4565b905061041a8185856107ac565b600191505092915050565b6000600254905090565b60008061043a6107a4565b9050610447858285610975565b610452858585610a01565b60019150509392505050565b60006012905090565b6000806104726107a4565b9050610493818585610484858961069a565b61048e91906114b0565b6107ac565b600191505092915050565b6104a6610c77565b6104b08282610cf5565b5050565b6104c56104bf6107a4565b82610e4b565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610518610c77565b6105226000611018565b565b610536826105306107a4565b83610975565b6105408282610e4b565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461057d90611450565b80601f01602080910402602001604051908101604052809291908181526020018280546105a990611450565b80156105f65780601f106105cb576101008083540402835291602001916105f6565b820191906000526020600020905b8154815290600101906020018083116105d957829003601f168201915b5050505050905090565b60008061060b6107a4565b90506000610619828661069a565b90508381101561065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590611556565b60405180910390fd5b61066b82868684036107ac565b60019250505092915050565b6000806106826107a4565b905061068f818585610a01565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610729610c77565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f906115e8565b60405180910390fd5b6107a181611018565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361081b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108129061167a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361088a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108819061170c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161096891906112b8565b60405180910390a3505050565b6000610981848461069a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109fb57818110156109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490611778565b60405180910390fd5b6109fa84848484036107ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679061180a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad69061189c565b60405180910390fd5b610aea8383836110de565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b679061192e565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c5e91906112b8565b60405180910390a3610c718484846110e3565b50505050565b610c7f6107a4565b73ffffffffffffffffffffffffffffffffffffffff16610c9d610544565b73ffffffffffffffffffffffffffffffffffffffff1614610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea9061199a565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90611a06565b60405180910390fd5b610d70600083836110de565b8060026000828254610d8291906114b0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e3391906112b8565b60405180910390a3610e47600083836110e3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190611a98565b60405180910390fd5b610ec6826000836110de565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390611b2a565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fff91906112b8565b60405180910390a3611013836000846110e3565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611122578082015181840152602081019050611107565b60008484015250505050565b6000601f19601f8301169050919050565b600061114a826110e8565b61115481856110f3565b9350611164818560208601611104565b61116d8161112e565b840191505092915050565b60006020820190508181036000830152611192818461113f565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ca8261119f565b9050919050565b6111da816111bf565b81146111e557600080fd5b50565b6000813590506111f7816111d1565b92915050565b6000819050919050565b611210816111fd565b811461121b57600080fd5b50565b60008135905061122d81611207565b92915050565b6000806040838503121561124a5761124961119a565b5b6000611258858286016111e8565b92505060206112698582860161121e565b9150509250929050565b60008115159050919050565b61128881611273565b82525050565b60006020820190506112a3600083018461127f565b92915050565b6112b2816111fd565b82525050565b60006020820190506112cd60008301846112a9565b92915050565b6000806000606084860312156112ec576112eb61119a565b5b60006112fa868287016111e8565b935050602061130b868287016111e8565b925050604061131c8682870161121e565b9150509250925092565b600060ff82169050919050565b61133c81611326565b82525050565b60006020820190506113576000830184611333565b92915050565b6000602082840312156113735761137261119a565b5b60006113818482850161121e565b91505092915050565b6000602082840312156113a05761139f61119a565b5b60006113ae848285016111e8565b91505092915050565b6113c0816111bf565b82525050565b60006020820190506113db60008301846113b7565b92915050565b600080604083850312156113f8576113f761119a565b5b6000611406858286016111e8565b9250506020611417858286016111e8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061146857607f821691505b60208210810361147b5761147a611421565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114bb826111fd565b91506114c6836111fd565b92508282019050808211156114de576114dd611481565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006115406025836110f3565b915061154b826114e4565b604082019050919050565b6000602082019050818103600083015261156f81611533565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006115d26026836110f3565b91506115dd82611576565b604082019050919050565b60006020820190508181036000830152611601816115c5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006116646024836110f3565b915061166f82611608565b604082019050919050565b6000602082019050818103600083015261169381611657565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006116f66022836110f3565b91506117018261169a565b604082019050919050565b60006020820190508181036000830152611725816116e9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611762601d836110f3565b915061176d8261172c565b602082019050919050565b6000602082019050818103600083015261179181611755565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006117f46025836110f3565b91506117ff82611798565b604082019050919050565b60006020820190508181036000830152611823816117e7565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006118866023836110f3565b91506118918261182a565b604082019050919050565b600060208201905081810360008301526118b581611879565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006119186026836110f3565b9150611923826118bc565b604082019050919050565b600060208201905081810360008301526119478161190b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006119846020836110f3565b915061198f8261194e565b602082019050919050565b600060208201905081810360008301526119b381611977565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006119f0601f836110f3565b91506119fb826119ba565b602082019050919050565b60006020820190508181036000830152611a1f816119e3565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000611a826021836110f3565b9150611a8d82611a26565b604082019050919050565b60006020820190508181036000830152611ab181611a75565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000611b146022836110f3565b9150611b1f82611ab8565b604082019050919050565b60006020820190508181036000830152611b4381611b07565b905091905056fea2646970667358221220f242a06dd9430ccbcc129a020b4f43f43f1a836baae66764ede98c2bd8d6547d64736f6c63430008120033
By feeding this byte code to the same decompiler used to decompile the Atropa’s byte code (https://library.dedaub.com/decompile) the result was the following:
// Decompiled by library.dedaub.com
// 2023.08.20 23:17 UTC
// Compiled using the solidity compiler version 0.8.18
// Data structures and variables inferred from the use of storage instructions
mapping (uint256 => uint256) _balanceOf; // STORAGE[0x0]
mapping (uint256 => mapping (uint256 => uint256)) _allowance; // STORAGE[0x1]
uint256 _totalSupply; // STORAGE[0x2]
uint256[] array_3; // STORAGE[0x3]
uint256[] array_4; // STORAGE[0x4]
uint256 _owner; // STORAGE[0x5] bytes 0 to 19
// Events
Approval(address, address, uint256);
Transfer(address, address, uint256);
OwnershipTransferred(address, address);
function name() public payable {
v0 = 0x370();
v1 = new bytes[](v0.length);
v2 = v3 = 0;
while (v2 < v0.length) {
v1[v2] = v0[v2];
v2 = v2 + 32;
}
v1[v0.length] = 0;
return v1;
}
function approve(address varg0, uint256 varg1) public payable {
require(4 + (msg.data.length – 4) – 4 >= 64);
require(varg0 == varg0);
require(varg1 == varg1);
0x7ac(varg1, varg0, msg.sender);
return bool(1);
}
function 0x1450(uint256 varg0) private {
v0 = v1 = varg0 >> 1;
if (!(varg0 & 0x1)) {
v0 = v2 = v1 & 0x7f;
}
require((varg0 & 0x1) – (v0 < 32), Panic(34)); // access to incorrectly encoded storage byte array
return v0;
}
function _SafeAdd(uint256 varg0, uint256 varg1) private {
require(varg0 <= varg0 + varg1, Panic(17)); // arithmetic overflow or underflow
return varg0 + varg1;
}
function totalSupply() public payable {
return _totalSupply;
}
function transferFrom(address varg0, address varg1, uint256 varg2) public payable {
require(4 + (msg.data.length – 4) – 4 >= 96);
require(varg0 == varg0);
require(varg1 == varg1);
require(varg2 == varg2);
0x975(varg2, msg.sender, varg0);
0xa01(varg2, varg1, varg0);
return bool(1);
}
function decimals() public payable {
return uint8(18);
}
function () public payable {
revert();
}
function increaseAllowance(address varg0, uint256 varg1) public payable {
require(4 + (msg.data.length – 4) – 4 >= 64);
require(varg0 == varg0);
require(varg1 == varg1);
v0 = _SafeAdd(_allowance[msg.sender][varg0], varg1);
0x7ac(v0, varg0, msg.sender);
return bool(1);
}
function mint(address varg0, uint256 varg1) public payable {
require(4 + (msg.data.length – 4) – 4 >= 64);
require(varg0 == varg0);
require(varg1 == varg1);
0xc77();
require(varg0 – address(0x0), Error(‘ERC20: mint to the zero address’));
v0 = _SafeAdd(_totalSupply, varg1);
_totalSupply = v0;
_balanceOf[varg0] = _balanceOf[varg0] + varg1;
emit Transfer(address(0x0), varg0, varg1);
}
function burn(uint256 varg0) public payable {
require(4 + (msg.data.length – 4) – 4 >= 32);
require(varg0 == varg0);
0xe4b(varg0, msg.sender);
}
function balanceOf(address varg0) public payable {
require(4 + (msg.data.length – 4) – 4 >= 32);
require(varg0 == varg0);
return _balanceOf[varg0];
}
function renounceOwnership() public payable {
0xc77();
_owner = 0;
emit OwnershipTransferred(_owner, address(0x0));
}
function burnFrom(address varg0, uint256 varg1) public payable {
require(4 + (msg.data.length – 4) – 4 >= 64);
require(varg0 == varg0);
require(varg1 == varg1);
0x975(varg1, msg.sender, varg0);
0xe4b(varg1, varg0);
}
function owner() public payable {
return _owner;
}
function symbol() public payable {
v0 = 0x56e();
v1 = new bytes[](v0.length);
v2 = v3 = 0;
while (v2 < v0.length) {
v1[v2] = v0[v2];
v2 = v2 + 32;
}
v1[v0.length] = 0;
return v1;
}
function decreaseAllowance(address varg0, uint256 varg1) public payable {
require(4 + (msg.data.length – 4) – 4 >= 64);
require(varg0 == varg0);
require(varg1 == varg1);
require(_allowance[msg.sender][varg0] >= varg1, Error(‘ERC20: decreased allowance below zero’));
0x7ac(_allowance[msg.sender][varg0] – varg1, varg0, msg.sender);
return bool(1);
}
function transfer(address varg0, uint256 varg1) public payable {
require(4 + (msg.data.length – 4) – 4 >= 64);
require(varg0 == varg0);
require(varg1 == varg1);
0xa01(varg1, varg0, msg.sender);
return bool(1);
}
function allowance(address varg0, address varg1) public payable {
require(4 + (msg.data.length – 4) – 4 >= 64);
require(varg0 == varg0);
require(varg1 == varg1);
return _allowance[varg0][varg1];
}
function transferOwnership(address varg0) public payable {
require(4 + (msg.data.length – 4) – 4 >= 32);
require(varg0 == varg0);
0xc77();
require(varg0 – address(0x0), Error(‘Ownable: new owner is the zero address’));
_owner = varg0;
emit OwnershipTransferred(_owner, varg0);
}
function 0x370() private {
v0 = 0x1450(array_3.length);
v1 = new bytes[](v0);
v2 = v3 = v1.data;
v4 = 0x1450(array_3.length);
if (!v4) {
return v1;
} else if (31 < v4) {
v5 = v6 = array_3.data;
do {
MEM[v2] = STORAGE[v5];
v5 += 1;
v2 += 32;
} while (v3 + v4 <= v2);
return v1;
} else {
MEM[v3] = array_3.length >> 8 << 8;
return v1;
}
}
function 0x56e() private {
v0 = 0x1450(array_4.length);
v1 = new bytes[](v0);
v2 = v3 = v1.data;
v4 = 0x1450(array_4.length);
if (!v4) {
return v1;
} else if (31 < v4) {
v5 = v6 = array_4.data;
do {
MEM[v2] = STORAGE[v5];
v5 += 1;
v2 += 32;
} while (v3 + v4 <= v2);
return v1;
} else {
MEM[v3] = array_4.length >> 8 << 8;
return v1;
}
}
function 0x7ac(uint256 varg0, address varg1, address varg2) private {
require(varg2 – address(0x0), Error(‘ERC20: approve from the zero address’));
require(varg1 – address(0x0), Error(‘ERC20: approve to the zero address’));
_allowance[varg2][varg1] = varg0;
emit Approval(varg2, varg1, varg0);
return ;
}
function 0x975(uint256 varg0, uint256 varg1, uint256 varg2) private {
v0 = _allowance[address(varg2)][address(varg1)];
if (v0 != uint256.max) {
require(v0 >= varg0, Error(‘ERC20: insufficient allowance’));
0x7ac(v0 – varg0, varg1, varg2);
}
return ;
}
function 0xa01(uint256 varg0, uint256 varg1, uint256 varg2) private {
require(address(varg2) – address(0x0), Error(‘ERC20: transfer from the zero address’));
require(address(varg1) – address(0x0), Error(‘ERC20: transfer to the zero address’));
require(_balanceOf[address(varg2)] >= varg0, Error(‘ERC20: transfer amount exceeds balance’));
_balanceOf[address(varg2)] = _balanceOf[address(varg2)] – varg0;
_balanceOf[address(varg1)] = _balanceOf[address(varg1)] + varg0;
emit Transfer(address(varg2), address(varg1), varg0);
return ;
}
function 0xc77() private {
require(_owner == msg.sender, Error(‘Ownable: caller is not the owner’));
return ;
}
function 0xe4b(uint256 varg0, uint256 varg1) private {
require(address(varg1) – address(0x0), Error(‘ERC20: burn from the zero address’));
require(_balanceOf[address(varg1)] >= varg0, Error(‘ERC20: burn amount exceeds balance’));
_balanceOf[address(varg1)] = _balanceOf[address(varg1)] – varg0;
_totalSupply = _totalSupply – varg0;
emit Transfer(address(varg1), address(0x0), varg0);
return ;
}
// Note: The function selector is not present in the original solidity code.
// However, we display it for the sake of completeness.
function __function_selector__(bytes4 function_selector) public payable {
MEM[64] = 128;
require(!msg.value);
if (msg.data.length < 4) {
();
} else if (0x70a08231 > function_selector >> 224) {
if (0x313ce567 > function_selector >> 224) {
if (0x6fdde03 == function_selector >> 224) {
name();
} else if (0x95ea7b3 == function_selector >> 224) {
approve(address,uint256);
} else if (0x18160ddd == function_selector >> 224) {
totalSupply();
} else {
require(0x23b872dd == function_selector >> 224);
transferFrom(address,address,uint256);
}
} else if (0x313ce567 == function_selector >> 224) {
decimals();
} else if (0x39509351 == function_selector >> 224) {
increaseAllowance(address,uint256);
} else if (0x40c10f19 == function_selector >> 224) {
mint(address,uint256);
} else {
require(0x42966c68 == function_selector >> 224);
burn(uint256);
}
} else if (0x95d89b41 > function_selector >> 224) {
if (0x70a08231 == function_selector >> 224) {
balanceOf(address);
} else if (0x715018a6 == function_selector >> 224) {
renounceOwnership();
} else if (0x79cc6790 == function_selector >> 224) {
burnFrom(address,uint256);
} else {
require(0x8da5cb5b == function_selector >> 224);
owner();
}
} else if (0x95d89b41 == function_selector >> 224) {
symbol();
} else if (0xa457c2d7 == function_selector >> 224) {
decreaseAllowance(address,uint256);
} else if (0xa9059cbb == function_selector >> 224) {
transfer(address,uint256);
} else if (0xdd62ed3e == function_selector >> 224) {
allowance(address,address);
} else {
require(0xf2fde38b == function_selector >> 224);
transferOwnership(address);
}
}
One needs to simply compare the two to understand that they are basically the same!
The Atropa smart contract is a simple boilerplate Ownable, Burnable, ERC20 token contract with no extra functionality built in that anyone could build using the open zeppelin’s wizard (https://docs.openzeppelin.com/contracts/4.x/wizard).
Based on the decompiled code for Atropa, the following are the permissions that only the owner has:
This functions check if the caller (msg.sender) is the contract owner using: require(_owner == msg.sender, Error(‘Ownable: caller is not the owner’)).
Unless the owner renounces ownership of the contract, the owner can freely mint new tokens and subsequently increase the supply indefinitely, making it a RUG RISK!