MUMUBIT TOKEN security record

BNB Chain, Ethereum, Polygon (POS)mumubit.comXGitHub

As of 27 Oct 2026, MUMUBIT TOKEN has 4 audit reports by 1 security firm on Trustblock; the latest is by CertiK, dated 12 Mar 2025. Those reports list no open critical findings.

Critical findings
No open critical findings
Across the 4 reports, 5 critical findings were reported. Each is marked fixed by the firm that reported it. See the findings
Open the latest report
Your label, live
Get the label for your site

Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.

Audits4

Newest first

AuditSecurity firmDateScopeCritical findingsReport
MetacraftSecurity firm: CertiKDate: Scope: Repository at commit dac85faNo open critical findingsOpen · skynet.certik.com
mumubitSecurity firm: CertiKDate: Scope: Not recorded (see the report)No open critical findingsOpen · skynet.certik.com
Metacraft.Security firm: CertiKDate: Scope: Repository at commit 1393423No open critical findingsOpen · skynet.certik.com
Metacraft.Security firm: CertiKDate: Scope: Files named in the report5 critical findings, fixedOpen · skynet.certik.com

Findings145

Statuses are the security firm’s own, from each report.

SeverityOpenAcknowledgedFixed
Critical005
High1114
Medium2615
Low24077
HighCentralization Related RisksMetacraft · CertiK · 12 Mar 2025Open

In the contract `MCTPStake`, the role `owner` has authority over the following functions. - `pause()`: Used to pause the contract. - `unpause()`: Used to unpause the contract. - `setWithDuration()`: Used to change the status of `withDuration`. - `setWithdrawAddress()`: Used to create a pending transaction for setting `withdrawAddress`. - `addOwner()`: Used to create a pending transaction for adding a new `validOwner`. - `removeOwner()`: Used to create a pending transaction for removing a existed `validOwner`. In the contract `MCTPStake`, the role `owners` (`validOwner`) has authority over the following functions. - `signTransaction()`: Used to sign/execute the pending transactions of modifying the `withdrawAddress`. - `signUserAdd()`: Used to sign/execute the pending transactions of adding a new `validOwner`. - `signUserDel()`: Used to sign/execute the pending transactions of removing a new `validOwner`. In the contract `MCTPStake`, the role `withdrawAddress` has authority over the following function. - `withdrawFunds()`: Used to withdraw the specified itemToken in the `MCTPStake` contract, but it has a protection to ensure that the remaining token balance should equal or more than the total stake amount of users. Any compromise to the `owner` account or `withdrawAddress` account may allow the hacker to take advantage of this authority, change the status of `withDuration`, pause/unpause the staking operation and withdraw the tokens for reward in the contract. --- In the contract `MetaCraftVNode` the role `owner` has authority over the functions shown in the list below. - `addOwner()`: Initiates a pending transaction to add a new `validOwner`. - `removeOwner()`: Initiates a pending transaction to remove an existing `validOwner`. - `setParameters()`: Initiates a pending transaction to change critical operational parameters, including locking and halting the contract's functionalities. - `setSalesAddress()`: Initiates a pending transaction to update the `feeAddress`. Any compromise to the `owner` account may allow the hacker to take advantage of this authority and initialize a pending transaction. The role `_validOwners` has authority over the functions shown in the list below. - `signSetTransaction()`: Used to sign pending transactions initiated by the `owner`. - `executeSetTransaction()`: Executes pending transactions once the required signatures are collected. Any compromise to the `_validOwners` account may allow the hacker to take advantage of this authority and disrupt the normal execution of critical pending transactions in the contract. The role `publicKey` has the authority to sign the signature for minting Node ERC721 token. - `buyNode`: Used to mint the ERC721 token. Only the `publicKey` can sign the signatures for minting Node ERC721 tokens, acting as the sole authority to authenticate mint requests. Any compromise to the `publicKey` account may allow the hacker to perform the unauthorized minting of tokens.

Open the report
HighWithdrawal Centralization RiskMetacraft · CertiK · 12 Mar 2025Open

The role `withdrawAddress` has the authority to withdraw tokens from the contract. There are no controls over when this function can be run and the amount that can be withdrawn. ```solidity=174 function withdrawFunds(address _itemToken) external whenNotPaused withdrawAddressOnly() { IERC20(_itemToken).safeTransfer(msg.sender, IERC20(_itemToken).balanceOf(address(this))); emit StakeEvents(block.timestamp,msg.sender, "withdrawFunds Coin"); } modifier withdrawAddressOnly() { require(msg.sender == withdrawAddress, "only withdrawer can call this"); _; } ``` A hacker can take advantage of this function to withdraw all assets within the contract.

Open the report
HighCentralization Related RisksMetacraft. · CertiK · 12 Apr 2024Open

In the contract `MetaCraftIDO` the role `owner` has authority over the functions shown in the diagram below. Any compromise to the `owner` account may allow the hacker to take advantage of this authority and set the project coin and initiate proposals to update `withdrawAddress` and add/remove a multisig wallet. ![](https://accelerator-tasks-prod.acc.corp.certik.com/11ee-f79d-7ade01c0-a460-2d880b79796a/diagrams/centralization_MetaCraftIDO%20New-MetaCraftIDO-owner.svg) In the contract `MetaCraftIDO` the role `withdrawAddress` has authority over the functions shown in the diagram below. Any compromise to the `withdrawAddress` account may allow the hacker to take advantage of this authority and transfer tokens out of the contract 72 hours after the claim timestamp. ![](https://accelerator-tasks-prod.acc.corp.certik.com/11ee-f79d-7ade01c0-a460-2d880b79796a/diagrams/centralization_MetaCraftIDO%20New-MetaCraftIDO-withdrawAddress.svg) In the contract `MetaCraftIDO` the role `publicKey` can provide signatures for the following functions: - `setProjectInfo()` - `investInWithVerify()` - `refundOut()` - `depositProjectCoin()` - `claimProjectCoin()` Any compromise to the `publicKey` account may allow the hacker to take advantage of this authority and allow unauthorized users to modify critical variables, invest, refund, deposit, and claim. In the contract `MetaCraftIDO` the role `_owners` has authority over the following functions: - `setProjectInfo()` - `signUserAdd()` - `signUserDel()` - `signTransaction()` - `executeTransaction()` Any compromise to the `_owners` accounts (multisig wallets) may allow the hacker to take advantage of this authority and modify critical variables; delete a proposal or approve a proposal to update the `withdrawAddress`, add/remove addresses from `_owners`. It's important to note that a proposal requires approvals from 3 `_owners`.

Open the report
HighCentralization RiskMetacraft. · CertiK · 5 Sep 2022Open

In the contract, `MetaCraftAuction`, the role, `owner`, has the authority over the functions shown in the diagram below. Any compromise to the privileged account which has access to `owner` may allow the hacker to take advantage of this. ![](https://accelerator-tasks-prod.acc.corp.certik.com/3487d589d9f447169060a44a5ed06194/MetaCraftAuction-owner.svg) In the contract, `MetaCraftAuction`, the role, `withdrawAddress`, has the authority over the functions shown in the diagram below. Any compromise to the privileged account which has access to `withdrawAddress` may allow the hacker to take advantage of this. ![](https://accelerator-tasks-prod.acc.corp.certik.com/3487d589d9f447169060a44a5ed06194/MetaCraftAuction-withdrawAddress.svg)

Open the report
HighCentralization RiskMetacraft. · CertiK · 5 Sep 2022Open

In the contract, `MetaCraftItem`, the role, `owner`, has the authority over the functions shown in the diagram below. Any compromise to the privileged account which has access to `owner` may allow the hacker to take advantage of this. ![](https://accelerator-tasks-prod.acc.corp.certik.com/3487d589d9f447169060a44a5ed06194/MetaCraftItem-owner.svg)

Open the report
HighCentralization RiskMetacraft. · CertiK · 5 Sep 2022Open

In the contract, `MetaCraftTrade`, the role, `owner`, has the authority over the functions shown in the diagram below. Any compromise to the privileged account which has access to `owner` may allow the hacker to take advantage of this. ![](https://accelerator-tasks-prod.acc.corp.certik.com/3487d589d9f447169060a44a5ed06194/MetaCraftTrade-owner.svg) In the contract, `MetaCraftTrade`, the role, `withdrawAddress`, has the authority over the functions shown in the diagram below. Any compromise to the privileged account which has access to `withdrawAddress` may allow the hacker to take advantage of this. ![](https://accelerator-tasks-prod.acc.corp.certik.com/3487d589d9f447169060a44a5ed06194/MetaCraftTrade-withdrawAddress.svg)

Open the report
HighCentralization Risks in NFTS.solMetacraft. · CertiK · 5 Sep 2022Open

In the contract `Ownable` the role `owner_` has authority over the functions listed below: - `transferOwnership()`: transfer ownership to another account. Any compromise to the `owner_` account may allow the hacker to take advantage of this authority and change the configuration of the contract. In the contract `MyDelegated` the role `owner_` and `delegates` have authority over the functions listed below: - `setDelegate()`: set the delegates of an account. Any compromise to the `owner_` and `delegates` account may allow the hacker to take advantage of this authority and change the configuration of the contract. In the contract `MetaCraftToken` the role `owner_` has authority over the functions listed below: - `setEmergentHalt()`: manage the state variable `halted_`; - `transferAnyERC20Token()`: transfer assets to the `owner_`. Any compromise to the `owner_` account may allow the hacker to take advantage of this authority, change the configuration of the contract, and transfer assets. In the contract `MetaCraftToken` the role `delegates` has authority over the functions listed below: - `mint()`: mint tokens to an account; - `burn()`: burn tokens of an account. Any compromise to the `delegates` account may allow the hacker to take advantage of this authority, and mint/burn tokens of the contract. --- The following content is based on commit [b16c503fd485b16c30439befb11028b9e6739329](https://github.com/metacraftpro/metacontract/commit/b16c503fd485b16c30439befb11028b9e6739329). The team removed the contract `MyDelegated` and refactored the contract `Ownable`. In the contract `Ownable` the role `_owner` has authority over the functions listed below: - `renounceOwnership()`: renounce ownership of the contract; - `transferOwnership()`: transfer ownership to another account. Any compromise to the `_owner` account may allow the hacker to take advantage of this authority and change the configuration of the contract. In the contract `MetaCraftToken` the role `_owner` has authority over the functions listed below: - `setEmergentHalt()`: manage the state variable `halted_`; - `mint()`: mint tokens to an account; - `burn()`: burn tokens of an account. Any compromise to the `_owner` account may allow the hacker to take advantage of this authority, change the configuration of the contract, and mint/burn tokens of the contract. --- The following content is based on commit [e783b1a66bbe9a17bbc6e3ec747cfc2a4d4b32f3](https://github.com/metacraftpro/metacontract/tree/e783b1a66bbe9a17bbc6e3ec747cfc2a4d4b32f3). The team removed the `mint()` and `burn()` functions, and will distribute the initial tokens to `msg.sender`, which is a centralized risk on Initial Token Distribution.

Open the report
HighInitial Token DistributionMetacraft. · CertiK · 5 Sep 2022Open

The following content is based on commit [e783b1a66bbe9a17bbc6e3ec747cfc2a4d4b32f3](https://github.com/metacraftpro/metacontract/tree/e783b1a66bbe9a17bbc6e3ec747cfc2a4d4b32f3). All of the MCTP tokens are sent to the contract deployer when deploying the contract. This could be a centralization risk as the deployer can distribute MCTP tokens without obtaining the consensus of the community.

Open the report
HighLack of returning the NFTs to userMetacraft. · CertiK · 5 Sep 2022Open

It is needed to transfer all the NFTs back to the owners before calling the `destroy` function. Also for the ERC20 tokens in the contract.

Open the report
HighMissing Check Existing TradeMetacraft. · CertiK · 5 Sep 2022Open

It is possible to add the same trade because the owner can change the NFT contract and different NFT contracts can generate the same NFT id. There is no check on the existing trade to avoid adding the same trade in the function `openTrade`. The staked nft in trade will be lost when the trade is overridden.

Open the report
Show 10 more
HighSide effect of updating the value of `itemToken`Metacraft. · CertiK · 5 Sep 2022Open

Update the value of `itemToken` will cause the old trades in the `trades` array fail to be processed due to the failure of transferring the NFTs.

Open the report
MediumIncompatibility With Deflationary Tokens (Non-staMetacraft. · CertiK · 12 Apr 2024Open

The project design may not be compatible with non-standard ERC20 tokens, such as deflationary tokens or rebase tokens. The functions use `transferFrom()` to move funds from the sender to the recipient but fail to verify if the received token amount matches the transferred amount. This could pose an issue with fee-on-transfer tokens, where the post-transfer balance might be less than anticipated, leading to balance inconsistencies. There might be subsequent checks for a second transfer, but an attacker might exploit leftover funds (such as those accidentally sent by another user) to gain unjustified credit.

Open the report
MediumWithdrawal Blockage in `withdrawAllFunds()` Due tMetacraft. · CertiK · 12 Apr 2024Open

The `withdrawAllFunds()` function in the contract allows the withdrawal of project coins under the condition that all users have withdrawn their allocated tokens. This mechanism creates a potential deadlock where the withdrawal of project coins by the managing entity can be indefinitely blocked if even a single user fails to withdraw their tokens. This design inadvertently grants any user the power to prevent the withdrawal of project coins, posing a significant risk to lock the project tokens in the contract. ```solidity function withdrawAllFunds(address tokenAddress_, uint256 amount_) external nonReentrant notContract withdrawAddressOnly() { uint256 balance = IERC20(tokenAddress_).balanceOf(address(this)); require(balance >= amount_, "balance insufficent!"); require(investCoinAddress == tokenAddress_ || projectCoinAddress == tokenAddress_, "Coin Address Not Correct!"); require(block.timestamp - claimTimestamp >= 3 days, "Withdraw Fund Until 72 hours after Claim "); uint256 investAmount = investedAmount[investCoinAddress]; uint256 claimAmount = claimedAmount[projectCoinAddress]; if(tokenAddress_ == investCoinAddress){ refundedAmount[tokenAddress_] += amount_; emit IDOStatusChange(tokenAddress_, amount_, msg.sender, "Manager Withdraw invest Coins"); } else if(tokenAddress_ == projectCoinAddress){ require((investAmount * 10 ** decimals / projectCoinPrice - claimAmount == 0 ),"Some others not claimed, can not withdraw so many!"); projectCoinAmount[tokenAddress_] -= amount_; claimedAmount[tokenAddress_] += amount_; emit IDOStatusChange(tokenAddress_, amount_, msg.sender, "Manager Withdraw invest Coins"); } else revert("withDraw TokenAddress ERROR"); IERC20(tokenAddress_).safeTransfer(msg.sender, amount_); } ```

Open the report
LowConcerns about `itemToken` type and reward distriMetacraft · CertiK · 12 Mar 2025Open

When users stake or distribute items, they specify the `itemToken`. Therefore, we need to check the following points with the team: 1. If there is documentation specifying the `itemToken` type when users stake or claim? Using arbitrary tokens may pose potential risks, such as **Unchecked ERC-20 `transfer()`/`transferFrom()` Call** and **Potential Reentrancy Issue**. 2. The source of the reward token sent to the user when staking or unstaking. If there is no sufficient deposited `itemToken` in the contract, this scenario creates a situation where the payouts for the initial users (like User A) are dependent on the deposits made by the newer users (like User B). If the inflow of new stakes ceases or slows, the contract will not have enough tokens to pay out the rewards or return the stakes, characterizing a Ponzi scheme dynamic.

Open the report
LowIncompatibility With Deflationary Tokens (Non-staMetacraft · CertiK · 12 Mar 2025Open

The project design may not be compatible with non-standard ERC20 tokens, such as deflationary tokens or rebase tokens.

Open the report
LowInconsistent Requirements in `openStake()`, `unStMetacraft · CertiK · 12 Mar 2025Open

The `unStake()` function and `reStake()` function impose a restriction that prevents its execution by contracts, however, such a requirement is not present in the `openStake()` function. Consequently, contracts engaging in staking might encounter difficulties when attempting to unstake or restake their staked tokens. ```solidity function openStake( address _itemToken, uint256 _tokenAmount, uint256 _duration ) public whenNotPaused virtual{ ... } function unStake(address _itemToken,uint256 _tokenAmount,uint256 _duration) public whenNotPaused noReentrancy //anti re-entrancy notContract(msg.sender) //anti contract address virtual{ ... } ```

Open the report
LowInefficient Memory ParameterMetacraft · CertiK · 12 Mar 2025Open

One or more parameters with `memory` data location are never modified in their functions and those functions are never called internally within the contract. Thus, their data location can be changed to `calldata` to avoid the gas consumption copying from calldata to memory. ```solidity=398 function setBaseURI(string memory baseURI_) external { _baseURIextended = baseURI_; } ``` - `setBaseURI` has memory location parameters: `baseURI_`. ```solidity=402 function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual //override(ERC721URIStorage) { require(tokenId <= _tokenIds.current(), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } ``` - `_setTokenURI` has memory location parameters: `tokenURI_`. ```solidity=433 function buyNode( address _to, string memory tokenURI_, address parentAddress //uint256 tokenPrice ){ ... } ``` - `buyNode()` has memory location parameters: `tokenURI_`.

Open the report
LowMissing Input ValidationsMetacraft · CertiK · 12 Mar 2025Open

The `tokenDecimals` variable is used to calculate the mint price for `buyNode()`. However, there is no consistency check between `tokenDecimals` and the provided ERC20 token's decimals during initialization, which may result in an incorrect mint fee if they are misaligned. ```solidity ERC20Token = IERC20(_erc20Token); tokenDecimals = _decimals; ``` --- In the `MCTPStakeNew` contract, the `addOwner` and `removeOwner` never checks if the address to be added is already an owner, nor does it check if the address to be removed is truly an existing owner. It only ensures that the `_owner` is not a zero address. If an address that is already on the owner's list is added, the contract may contain inconsistent or duplicated data. ```solidity function addOwner(address _owner) public { ... require(_owner != address(0),"Zero Address Error!"); ... } function removeOwner(address _owner) public { ... require(_owner != address(0),"Zero Address Error!"); ... } ```

Open the report
LowPotential Cross-Chain/Cross-Contract Replay AttacMetacraft · CertiK · 12 Mar 2025Open

According to the team's message, the team plans to upgrade the contract in the future. The team may need to redeploy the `MCTPvNode` contract to upgrade it since the contract itself is not upgradeable. However, redeploying the contract may introduce new attack vectors. The current signature design in the `MCTPvNode` contract is not properly verified with the current chain ID and the address of the contract, thus allowing attackers to perform replay attacks across chains or contracts (from the old version to the new version). Especially if the team plans to deploy contracts on multiple chains or if the team has deployed multiple versions of contracts, the signature and message hash can be reused in the future.

Open the report
LowPotential Optimization to Multi-Sign MechanismMetacraft · CertiK · 12 Mar 2025Open

To optimize the `MetaCraftVNode` contract for handling administrative actions like adding and removing owners, setting parameters, and updating addresses, we can utilize a generic transaction mechanism. This contract can streamline the process by using a single structure to manage different types of transactions, reducing redundancy and enhancing maintainability. ### Administrative Functions Ensure that administrative functions such as `setOwner`, `setParams`, and similar functions can only be executed by `address(this)`. ```solidity modifier onlySelf() { require(msg.sender == address(this), "Unauthorized: can only be called by the contract itself"); _; } function setOwner(address owner, uint8 status) public onlySelf { _validOwners[owner] = status; } function setParameters(/* Parameters */) public onlySelf { // Implementation for setting parameters } ``` ### Data Structures: - `TransactionType`: An enum to categorize transaction types. - `Transaction`: A struct to hold transaction details, including type, data payload, signature count, and execution status. ```solidity enum TransactionType { AddOwner, RemoveOwner, SetParameter, SetSalesAddress } struct Transaction { TransactionType type; bytes data; uint8 signatureCount; uint256 timestamp; bool executed; } ``` ### Functions - **Transaction Creation**: Function to add transactions with data validation. - **Signing Transactions**: Function for authorized owners to sign pending transactions. - **Executing Transactions**: Function to execute signed transactions using dynamic method invocation. ```solidity mapping(uint => Transaction) private _transactions; uint[] private _pendingTransactions; mapping(uint => mapping(address => bool)) private signatures; modifier notExecuted(uint transactionId) { require(!_transactions[transactionId].executed, "Transaction already executed"); _; } function addTransaction(TransactionType _type, bytes memory _data) public onlyValidOwner{ ... } function signTransaction(uint transactionId) public onlyValidOwner{ } function executeTransaction(uint transactionId) public onlyValidOwner notExecuted(transactionId){ ... } ``` ### Security Measures: - **Function Selector Verification**: Before adding a transaction, verify that the function selector matches the expected function for the transaction type. - **Execution Control**: Ensure that transactions can only be executed once they have the required number of signatures and are verified for correct method invocation. ```solidity function addTransaction(TransactionType _type, bytes memory _data) public onlyValidOwner { // Ensure data is at least 4 bytes long require(_data.length >= 4, "Data too short for a valid function selector"); require(isValidFunctionSelector(_type, bytes4(_data)), "Invalid function selector for transaction type"); ... } function executeTransaction(uint transactionId) onlyValidOwner notExecuted(transactionId) { ... (bool success,) = address(this).call(_transactions[transactionId].data); require(success, "Transaction execution failed"); ... } function isValidFunctionSelector(TransactionType _type, bytes4 selector) private pure returns (bool) { if (_type == TransactionType.AddOwner && selector == this.setOwner.selector) return true; if (_type == TransactionType.RemoveOwner && selector == this.setOwner.selector) return true; if (_type == TransactionType.SetParameter && selector == this.setParameters.selector) return true; if (_type == TransactionType.SetSalesAddress && selector == this.setSalesAddress.selector) return true; return false; } ```

Open the report
Show 10 more
LowPotential Unintended Max Pending TimeMetacraft · CertiK · 12 Mar 2025Open

The `timestamp` of a transaction is updated each time a valid owner signs the transaction. This is observed in functions like `signTransaction`, `signUserAdd`, and `signUserDel` where after a signature, the transaction's timestamp is set to the current block time (`transaction.timestamp = block.timestamp`). Our understanding is that if a transaction does not accumulate enough signatures (reaching the `MIN_SIGNATURES` threshold) within 96 hours, it should be considered expired and deleted, making room for a new transaction. However, given the timestamp refresh mechanism on each signature, the real pending time (the time a transaction remains in a pending state without reaching the minimum required signatures) can indeed exceed the intended 96 hours. This pending time would reset with each new signature, potentially leading to scenarios where a transaction remains pending for considerably longer than intended, especially if signatures are spaced out over time.

Open the report
LowPotential Unintended Reward Loss During Unstake OMetacraft · CertiK · 12 Mar 2025Open

The `unStake()` function allows users to withdraw their staked principal and rewards, but only the unstaked portion (`_tokenAmount`) will be considered for reward calculation. The remaining tokens (`stake.tokenAmount - _tokenAmount`) will not accrue rewards, and the staking duration will reset. Users must wait for the full duration again before they can withdraw the rest. ```solidity /** * @dev unstake a token by the staker. * @param _tokenAmount The trade to be cancelled. */ function unStake(address _itemToken,uint256 _tokenAmount,uint256 _duration) public nonReentrant //anti re-entranc //whenNotPaused notContract(msg.sender) //anti contract address virtual { ... require( stake.tokenAmount >=_tokenAmount, "Stake token Amount insufficient." ); ... uint256 stakeProfit=0; uint256 payprofit = 0; if(_duration == 180) payprofit = _tokenAmount*half_APY/100/2; //half of year should divided by 2 if(_duration == 365) payprofit = _tokenAmount*full_APY/100; // full year if(_duration == 730) payprofit = _tokenAmount*two_APY*2/100; // two years should multiply by 2 ... stake.tokenAmount -= _tokenAmount; stake.reward = 0; stake.timestamp = block.timestamp; totalStakeAmount[_itemToken]-=_tokenAmount; stakeAmounts[_itemToken][_duration]-=_tokenAmount; ... } ```

Open the report
LowTransaction Ready to Be Executed Can Be Deleted BMetacraft · CertiK · 12 Mar 2025Open

The method `deleteMaxPendingTx` can indeed delete a transaction that is ready for execution if a new transaction is proposed. ```solidity //for set param Txs if (pendingsetTx.timestamp > 0 ){ if (block.timestamp - pendingsetTx.timestamp > maxPendingTime){ deleteSetTx(txId); }else revert("has pending txs yet! Please sign them first"); } ``` Suppose a transaction reaches the necessary threshold of approvals and is pending execution, having passed any mandatory waiting periods (`observationPeriod`). After 96 hours, if the transaction is not executed by any owner and a new transaction is initiated, the `deleteMaxPendingTx` function will be called and then the transaction ready to be executed will be deleted.

Open the report
LowUnused `duration` levelMetacraft · CertiK · 12 Mar 2025Open

Upon reviewing the `getUserAllStake()` function, we observed that it allows users to query seven different duration levels, and users can specify any duration when staking and unstaking. However, only three duration levels—180, 365, and 730—entitle users to claim rewards.

Open the report
LowUnused `timestamp` In `buyNode` FunctionMetacraft · CertiK · 12 Mar 2025Open

In the `buyNode` function, the `timestamp` parameter indeed appears to be unused in any meaningful validation, which might be a security oversight depending on the intended functionality. Typically, a `timestamp` is used to ensure that the action being taken is relevant to a specific window of time. ```solidity function buyNode( uint256 timestamp, bytes32 nonce, bytes32 message, bytes memory signature, address parentAddress, uint256 maxPrice ) nonReentrant notContract external returns (uint256){ require(!halted, "Node Halted!"); bytes32 challenge = getChallenge(timestamp, nonce, parentAddress, msg.sender); ... } ```

Open the report
LowUnbounded data structuresmumubit · CertiK · 21 Aug 2024Open

In `TonClaim` contract the maps `claim_record` and `claim_list` are not bounded. As the contract's persistent state grows in size, read and write operations become more expensive in terms of gas. In extreme cases, they may cost more than a transaction's gas limit, rendering the contract unusable. Therefore, [it's important](https://tact-by-example.org/06-unbounded-arrays) to design contracts with an upper bound on state size.

Open the report
LowUnsafe handle of `TokenNotification`mumubit · CertiK · 21 Aug 2024Open

The `TonClaim` `TokenNotification` works this way: 1. Ensures `sender() == self.this_contract_projectCoinWallet` 2. Updates `self.contract_balance` However, if some other unexpected jettons (like `invest_coin`) arrive, they will not be returned and will be blocked forever. The `MumubitIdo` `TokenNotification` handler only processes the jettons to `this_contract_investCoinWallet`. All the others are silently accepted. ```c=330 require(context().sender == self.this_contract_investCoinWallet, "not from the correct jetton wallet"); ``` The check is redundant. In case the payload is in an invalid format, the jettons are silently accepted with no compensation for the user. ```c=327 require(context().value >= ton("0.1"), "not enough value"); ``` Checking if enough gas provided in the `TokenNotification` handler increases the chances the jettons will be lost. It is redundant.

Open the report
LowAbsence of Time Lock in `signUserAdd()` and `signMetacraft. · CertiK · 12 Apr 2024Open

The functions `signUserAdd()` and `signUserDel()` lack the implementation of a time lock mechanism, unlike the `signTransaction()` function.

Open the report
LowDefault Timestamps Predating Current DateMetacraft. · CertiK · 12 Apr 2024Open

The contract sets the following default timestamps that are earlier than the current date (April 3, 2024), affecting the ability to perform deposit operations and other time-sensitive functions. ```solidity=27 uint256 public startTimestamp = 1711035000; uint256 public endSellTimestamp = 1711040000; uint256 public protectTimestamp = 1711045000; uint256 public claimTimestamp = 1711050000; ```

Open the report
LowReusability of Signatures and Lack of SpecificityMetacraft. · CertiK · 12 Apr 2024Open

The following functions need the `publicKey`'s signature to be invoked: - setProjectInfo() - investInWithVerify() - refundOut() - depositProjectCoin() - claimProjectCoin() However, in the current design, these functions do not include validations to prevent the reuse of signatures across multiple transactions. Moreover, the signature mechanism lacks specificity, as the signature does not include token amounts for operations including `setProjectInfo()`, `depositProjectCoin()`, and `investInWithVerify()`. This could potentially lead to security vulnerabilities, such as signature replay attacks or unauthorized actions not explicitly approved by the signer. Additionally, the signature includes `userLevel`. If a user's `userLevel` has been changed, they can still use the previous `userLevel` to invest.

Open the report
Show 7 more
LowThird-Party Dependency UsageMetacraft. · CertiK · 12 Apr 2024Open

The contract is serving as the underlying entity to interact with one or more third party protocols. The scope of the audit treats third party entities as black boxes and assumes their functional correctness. However, in the real world, third parties can be compromised and this may lead to lost or stolen assets. In addition, upgrades of third parties can possibly create severe impacts, such as increasing fees of third parties, migrating to new LP pools, etc. ```solidity=23 address public projectCoinAddress;//raisecoinaddress ``` - The functions `depositProjectCoin()` and `claimProjectCoin()` interact with third party contract with `IERC20` interface via `projectCoinAddress`. --- ```solidity=24 address public investCoinAddress; //moneyaddress ``` - The functions `refundOut()` and `investInWithVerify()` interact with third party contract with `IERC20` interface via `investCoinAddress`.

Open the report
LowData overwritingMetacraft. · CertiK · 5 Sep 2022Open

The same NFT could be traded or canceled multiple times and its old data in the `trades` array will be overwrote by the new trading. Is that designed as expected?

Open the report
LowEveryone Can Mint NFTMetacraft. · CertiK · 5 Sep 2022Open

Function `mintNFT` is public to anyone, without access limit, so anyone can call it to mint NFT. Is that designed as expected?

Open the report
LowMissing emit eventsMetacraft. · CertiK · 5 Sep 2022Open

There should always be events emitted in the sensitive functions that are controlled by centralization roles.

Open the report
LowUnchecked Value of ERC-20 `transferFrom()` CallMetacraft. · CertiK · 5 Sep 2022Open

The linked `transferFrom()` invocations do not check the return value of the function call which should yield a `true` result in case of a proper ERC-20 implementation.

Open the report
LowUnsafe ERC-721 `transferFrom()` CallMetacraft. · CertiK · 5 Sep 2022Open

The implementation of `transferFrom()` in openzeppelin does not check the return value of `IERC721Receiver-onERC721Received`. If the `to` address is a smart contract, the transferred nft token may be locked forever.

Open the report
LowUser Can Buy Any Trade With `bnb`Metacraft. · CertiK · 5 Sep 2022Open

In the function `executeTrade(uint256 _item)`, the symbol of the trade will not be checked and it means that user can buy any type of trade with `bnb`. Is that designed as expected?

Open the report

Contracts

No deployed address is recorded for these audits.

The reports name a repository or files. Open a report to see its scope.

The repositories and files the reports name

Show this on your site

Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.

Content

Facts

Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.

Fixed as
Language

Style

Layout
Theme
Accent
Corners

Format

Size
Date
Embed as
HTML
<head>
<script src="https://widget.trustblock.run/project-widget.min.js" defer></script>
</head>
<body>
<div
data-tb-project-widget
data-tb-project-slug="mumubit"
></div>
</body>

Paste the code where the label should appear. It uses no API credit and updates by itself.

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us