Skip to main content

$BT365 contract powers

An ABI scanner can report that the BT365 owner can change fees, disable sells or mint. The verified source and Base reads give a different result: fee setters exist but their constructor-set guards are false; transfers have no reachable tax, deflation or maximum-amount check; and the 52-function ABI has no mint. The evidence below identifies the verified contract and the block used for live reads.

Verification record

Sourcify reports exact creationMatch: "match" and runtimeMatch: "match" for Base chain 8453, 0x706E1963bA410A548673b46D694104391fB7dCA5. It was verified 2025-07-30 as contracts/BlockTrader365.sol:BlockTrader365, compiled with solc 0.8.17+commit.8df45f5f. The sources are BlockTrader365.sol, ReflectiveV3ERC20.sol, lib/LibCommon.sol and five stock OpenZeppelin files. The ABI contains 52 functions and 21 custom errors. Sourcify proxyResolution reports isProxy false, proxyType null, implementations [].

Deployment transaction 0xced360258ccd0427e99cdbae2d916d207595c72315bb9f7edcd768fb023f03cb was at Base block 27276125. Deployer 0xE409a2cF959093Cd5C2497D11b50bcD71d0f8368 is also the owner at Base block 51613843.

Owner-only functions

All twelve state-changing functions below carry OpenZeppelin onlyOwner in the verified source. Flag and owner reads are from Base block 51613843.

#FunctionGateRevertLive state at block 51613843
1setTaxConfig(address,uint256)configProps._isTaxableTokenIsNotTaxable() (0xc8a478a5)Dead: isTaxable()==false
2setDeflationConfig(uint256)configProps._isDeflationaryTokenIsNotDeflationary() (0xcd9e5298)Dead: isDeflationary()==false
3setReflectionConfig(uint256)configProps._isReflectiveTokenIsNotReflective() (0x800e34b0)Dead: isReflective()==false
4setMaxTokenAmountPerAddress(uint256)configProps._isMaxAmountOfTokensSetMaxTokenAmountNotAllowed() (0x6273340f)Dead: isMaxAmountOfTokensSet()==false
5setDocumentUri(string)configProps._isDocumentAllowedDocumentUriNotAllowed() (0x70a43fce)Dead: isDocumentUriAllowed()==false
6burn(uint256) (0x42966c68)configProps._isBurnableBurningNotEnabled() (0x6cb59139)Dead: isBurnable()==false
7excludeFromRewards(address)ReflectiveV3ERC20 base contract's immutable isReflective flagTokenIsNotReflective() (0x800e34b0)Dead
8includeInRewards(address)ReflectiveV3ERC20 base contract's immutable isReflective flagTokenIsNotReflective() (0x800e34b0)Dead
9excludeFromFeesAndLimits(address)No flag gateAlreadyExcludedFromFeesAndLimits() / ReachedMaxExclusionLimit()Callable but inert: tax, deflation and maximum-amount arithmetic are off
10includeInFeesAndLimits(address)No flag gateAlreadyIncludedInFeesAndLimits()Callable but inert for the same reason
11transferOwnership(address) (0xf2fde38b)NoneOpenZeppelin zero-address checkLive
12renounceOwnership() (0x715018a6)NoneLive

Eight functions are permanently disabled. Two exemption-list functions remain callable but have no active tax, deflation or maximum-amount rule to affect. Ownership transfer and renunciation remain live.

Why the flags cannot change

In verified BlockTrader365.sol, ERC20ConfigProps private configProps; is declared at line 39. Its only write is configProps = customConfigProps; inside the constructor at line 142. The other occurrences, at lines 182, 192, 198, 210, 216 and 222, are view returns of flag values. The struct is private storage, not a Solidity immutable struct; Solidity 0.8.17 cannot mark a struct immutable. There is no setter, and a child contract cannot access the private struct.

Separately, verified ReflectiveV3ERC20.sol declares bool private immutable isReflective; and assigns it once in its constructor at line 76. This flag is baked into deployed bytecode. Both mechanisms receive the same constructor argument, so the flags cannot disagree. The verified sources have no initialize, re-initializer or upgrade path.

Burn, mint and supply

The verified BlockTrader365.sol source makes burn(uint256) owner-only:

function burn(uint256 amount) external onlyOwner {
if (!isBurnable()) {
revert BurningNotEnabled();
}
_burn(msg.sender, amount);
}

burn(uint256) is external onlyOwner. Its own !isBurnable() guard rejects the call because _isBurnable is false. The _burn() override is a second, independent prohibition for reflective deployments: it reverts BurningNotEnabled() when isReflective is true; with the live isReflective()==false, it falls through to super._burn. Even if callable, burn(uint256) could only burn the caller's own balance. An owner eth_call of burn(1) at Base block 51613843 reverted with 0x6cb59139, the selector for BurningNotEnabled(). Both guards use that error, so the call proves failure; the source identifies burn()'s guard as the one reached in the live configuration.

No mint of any kind appears in the 52-function ABI. The only mint in the verified code is super._mint(tokenOwner, totalSupply_ * 10 ** decimalsToSet) in the ReflectiveV3ERC20 constructor. This was one issuance at deployment: total supply is fixed at 100,000,000.00000 BT365 (raw 10000000000000, 5 decimals) and can neither rise nor fall.

Scanner checks

These checks use the eight verified sources above; numeric reads are from Base block 51613843.

Scanner questionVerified-source or block-read result
Proxy or upgradeSourcify proxyResolution: isProxy false, proxyType null, implementations []; no upgrade path.
Pause, blacklist or freezeNo pause, no Pausable inheritance, and no blacklist or freeze. The only address-keyed exclusion/permission mappings are isFeesAndLimitsExcluded and _isRewardsExcluded; neither can impose a burden on a holder, and both are inert under the live flags.
Destruction or hidden executionNo selfdestruct, delegatecall, callcode or create2 across all eight sources. Four inline assembly blocks, all in LibCommon.sol, perform zero-address checks, an ETH send and revert bubbling; none manipulate storage.
Transfer helpersLibCommon.safeTransfer and safeTransferFrom exist, but BT365 never calls them.
Transfer restrictionstransfer and transferFrom are overridden, but all flags are false: tax and deflation amounts are zero, with no maximum-amount check. They reduce to plain OpenZeppelin ERC-20 transfers, with no reachable honeypot mechanics.
Live configurationtaxBPS()==0, deflationBPS()==0, tFeeBPS()==0, maxTokenAmountPerAddress()==0; taxAddress() is the owner.

Owner address class

At Base block 51613843, owner()==initialTokenOwner()==0xe409a2cf959093cd5c2497d11b50bcd71d0f8368. eth_getCode on this address returns 23 bytes: 0xef0100 followed by 0x63c0c19a282a1b52b07dd5a65b58948a07dae32b. This is an EIP-7702 delegation designator with delegate target 0x63c0c19a282a1b52b07dd5a65b58948a07dae32b. The owner role is held by an externally-owned account carrying an EIP-7702 delegation, not by a multisig or timelock contract. The delegate implementation's own authorization rules were not audited for this page.