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.
Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Metacraft | Security firm: CertiK | Date: | Scope: Repository at commit dac85fa | No open critical findings | Open · skynet.certik.com |
| mumubit | Security firm: CertiK | Date: | Scope: Not recorded (see the report) | No open critical findings | Open · skynet.certik.com |
| Metacraft. | Security firm: CertiK | Date: | Scope: Repository at commit 1393423 | No open critical findings | Open · skynet.certik.com |
| Metacraft. | Security firm: CertiK | Date: | Scope: Files named in the report | 5 critical findings, fixed | Open · skynet.certik.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 5 |
| High | 11 | 1 | 4 |
| Medium | 2 | 6 | 15 |
| Low | 24 | 0 | 77 |
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 reportThe 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 reportIn 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.  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.  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 reportIn 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.  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. 
Open the reportIn 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. 
Open the reportIn 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.  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. 
Open the reportIn 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 reportThe 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 reportIt 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 reportIt 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 reportUpdate 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 reportThe 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 reportThe `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 reportWhen 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 reportThe project design may not be compatible with non-standard ERC20 tokens, such as deflationary tokens or rebase tokens.
Open the reportThe `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 reportOne 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 reportThe `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 reportAccording 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 reportTo 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 reportThe `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 reportThe `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 reportThe 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 reportUpon 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 reportIn 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 reportIn `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 reportThe `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 reportThe functions `signUserAdd()` and `signUserDel()` lack the implementation of a time lock mechanism, unlike the `signTransaction()` function.
Open the reportThe 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 reportThe 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 reportThe 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 reportThe 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 reportFunction `mintNFT` is public to anyone, without access limit, so anyone can call it to mint NFT. Is that designed as expected?
Open the reportThere should always be events emitted in the sensitive functions that are controlled by centralization roles.
Open the reportThe 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 reportThe 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 reportIn 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 reportThe reports name a repository or files. Open a report to see its scope.
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.
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.
<head><script src="https://widget.trustblock.run/project-widget.min.js" defer></script></head><body><divdata-tb-project-widgetdata-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