FNCY security record

BNB Chain, Ethereumfncy.world

As of 3 Nov 2026, FNCY has 1 audit report on Trustblock, by CertiK, dated 22 Mar 2024. That report lists no open critical findings.

Critical findings
No open critical findings
In 1 report.
Open the latest report
Your label, live
Get the label for your site

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

Audits1

Newest first

AuditSecurity firmDateScopeCritical findingsReport
FNCY ChainSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com

Findings43

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

SeverityOpenAcknowledgedFixed
Critical000
High032
Medium034
Low7024
HighMissing Update to `hasMinted` Mapping Allows PoteFNCY Chain · CertiK · 22 Mar 2024Fixed

The function `_checkHasMinted()` is used to ensure that mint functions such as `mint()`, `bulkMint()`, `merchantSelfMint()`, and `bulkMerchantSelfMint()` keep track of minted tokens so that they do not get minted more than once. Since the value of `hasMinted` is never set nor updated, it will always retain its default value of `false`, therefore users can repeatedly call the minting functions to mint tokens more than once with the same parameters. ```solidity=110 bytes32 hash = _hash(collectionConfig, to, nftId, tokenId); require(_verify(collectionConfig, hash, signature), "Mint Failed Authorization"); uint256 rTokenId = 0; _checkHasMinted(collection, nftId); (success, rTokenId) = _mint(collectionConfig, to, tokenId, uri); ``` ```solidity=227 function _checkHasMinted(address collection, uint256[] memory nftIds) internal view { for (uint8 i = 0; i < nftIds.length; i++) { require(!hasMinted[collection][nftIds[i]], "Already Minted"); } } function _checkHasMinted(address collection, uint256 nftId) internal view { require(!hasMinted[collection][nftId], "Already Minted"); } ```

Open the report
HighPotential Denial Of Service Due to Not Reset `deaFNCY Chain · CertiK · 22 Mar 2024Fixed

This `sell` function allows a user to list an NFT for sale. It requires that the provided `_deadline` be greater than the current block timestamp and also greater than the existing deadline for that NFT (`_deadline > deadlines[_nftAddress][_tokenId]`). ```solidity function sell(address _nftAddress, uint256 _tokenId, uint256 _price, uint256 _deadline) public nonReentrant whenNotPaused { require(_deadline >= block.timestamp, "NFTExchange: Expired order"); ... require(_deadline > deadlines[_nftAddress][_tokenId], "NFTExchange: invalid deadline"); deadlines[_nftAddress][_tokenId] = _deadline; ... } ``` However, there is no mechanism to delete or reset the `deadlines[_nftAddress][_tokenId]` mapping. If a user sets the deadline for an NFT (`deadlines[_nftAddress][_tokenId]`) to the maximum value of uint256 (which is `2^256 - 1`), this deadline will essentially never be exceeded by a new deadline value. Once the deadline is set to this maximum value, the sell function cannot be successfully called for that particular `[_nftAddress][_tokenId]` combination again.

Open the report
MediumFailed Fund Transfer in `sellForOffer` FunctionFNCY Chain · CertiK · 22 Mar 2024Fixed

There is an issue in function `sellForOffer()` that will prevent the function from properly executing. When `offerPrice` is greater than 0, there are no funds to be distributed to the seller and the other fee recipients when the internal call to `executeFundsTransfer()` is made. This will cause the function `sellForOffer()` to be unusable. ```solidity=192 if (offeredPrice > 0) { // require(IExchangeFeeInterceptor(interceptors[_nftAddress]).collections(_nftAddress).enable, 'need to setup interceptor'); IExchangeFeeInterceptor(interceptors[_nftAddress]).executeFundsTransfer(_nftAddress, seller, _tokenId, offeredPrice); } ``` Unlike other calls to the function `executeFundsTransfer()`, there is no execution of `TransferHelper.safeTransferETH()` beforehand. ```solidity if (offerPrice > 0) { TransferHelper.safeTransferETH(interceptors[nftAddress], offerPrice); IExchangeFeeInterceptor(interceptors[nftAddress]).executeFundsTransfer(nftAddress, tokenOwner, tokenId, offerPrice); } ```

Open the report
MediumHierarchy of RolesFNCY Chain · CertiK · 22 Mar 2024Fixed

There is an issue related to the management of privileged roles that would allow users of a privileged role the power to add and remove other users who are also under privileged roles. Any exploit can result in the abuse of this power to remove other users from such privileged roles. ### NFTLaunchpad The function `setAdmin()` allows other admins to add or remove each other from the list of admins. ### TransferManagement Members of each role can add new members to this role and can also add and remove members from different other roles.

Open the report
MediumLack of `nonReentrant` Modifiers For `NFTExchangeFNCY Chain · CertiK · 22 Mar 2024Fixed

The following functions can be a target of a re-entrancy attempt since they do not use the `nonReentrant` modifier. This could potentially cause issues and possible damage for the project if not handled appropriately. ```solidity=163 function cancelSell(address _nftAddress, uint256 _tokenId) public whenNotPaused { require(lists[_nftAddress][_tokenId].seller == msg.sender, 'NFTExchange: Only Seller can cancel sell token'); IERC721Upgradeable nft = IERC721Upgradeable(_nftAddress); nft.safeTransferFrom(address(this), msg.sender, _tokenId); delete lists[_nftAddress][_tokenId]; emit CancelAsk(msg.sender, _nftAddress, _tokenId); } ``` The following case is a bit more unique in the sense that it could be used within a re-entrancy attack to make changes that could benefit the attacker. For example, if an exploiter is able to take over the admin role, function `setTradingConfig()` can be used to modify the interceptors to another malicious contract or addresses of choice while the attack is being executed. ```solidity=238 function setTradingConfig(address _nftAddress, address _interceptorAddress) public onlyAdmin { require(address(0) != _nftAddress && address(0) != _interceptorAddress, "require trading config nft and interceptor address"); interceptors[_nftAddress] = payable(_interceptorAddress); } ```

Open the report
MediumPotential Replay Attack Related to `claimOfferedHFNCY Chain · CertiK · 22 Mar 2024Fixed

The way that the `claimOfferedHash` is generated could lead to potential replay attacks since there is no way to identify whether the hash has been previously used or not and can potentially be used again. ```solidity function claimOffered(address nftAddress, uint256 tokenId, uint256 deadline, uint256 offerPrice, bytes calldata offeredHash, bytes memory permitSig) external payable nonReentrant whenNotPaused { ... bytes32 claimOfferedHash = _claimOfferedHash(nftAddress, tokenId, tokenOwner, buyer, offerPrice); require(_verify(tokenOwner, claimOfferedHash, offeredHash), "ClaimOffered::Invalid Signature"); ... } ```

Open the report
Low`nonReentrant` Modifier can be Placed and ExecuteFNCY Chain · CertiK · 22 Mar 2024Fixed

As a best practice, the `nonReentrant` modifier could be placed and executed before other modifiers in functions to prevent reentrancies through other modifiers and make code more efficient. To follow the best practice, please consider placing the `nonReentrant` modifier before the modifiers in the following functions. ```solidity function mint( address collection, address to, uint256 nftId, uint256 tokenId, string memory uri, bytes calldata signature ) external onlySpecialMembers nonReentrant whenNotPaused returns (bool success) { ``` ```solidity function bulkMint( address collection, address[] calldata recipients, uint256[] calldata nftIds, uint256[] calldata tokenIds, string[] calldata uris, bytes calldata signature ) external onlySpecialMembers nonReentrant whenNotPaused ``` ```solidity function merchantSelfMint(address collection, address to, uint256 nftId, uint256 tokenId, string memory uri) external onlyMerchant(collection) nonReentrant whenNotPaused returns(bool success, uint256 rTokenId) { ``` ```solidity function bulkMerchantSelfMint(address collection, address[] calldata recipients, uint256[] calldata nftIds, uint256[] calldata tokenIds, string[] calldata uris) external onlyMerchant(collection) nonReentrant whenNotPaused { ```

Open the report
LowDiscussion on SPECIAL_ROLEFNCY Chain · CertiK · 22 Mar 2024Fixed

It was noted that the role `SPECIAL_ROLE` has access to special minting functions such as `buyFromAnotherChain()` and `entryWithSpecial()`. The audit team would like to understand the use of this role and the members that this role will consist of.

Open the report
LowImplementation of Off-chain Bridge LogicFNCY Chain · CertiK · 22 Mar 2024Fixed

The function `buyFromAnotherChain()` allows users with the role `SPECIAL_ROLE` to mint NFTs from another chain. The audit team would like to better understand how this function will be used and the process of minting NFTs from other chains. It seems that there is an input parameter called `receipt` used to mark the mapping `anotherReceipts[]` as true so that multiple duplicate mints do not occur, however based on the current implementation, more information is required to understand the current implementation.

Open the report
LowInefficient Memory ParameterFNCY Chain · CertiK · 22 Mar 2024Fixed

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=82 function addProject( ``` `addProject` has memory location parameters: `paymentTokens`. --- ```solidity=116 function updateProject( ``` `updateProject` has memory location parameters: `paymentTokens`. --- ```solidity=199 function buyFromAnotherChain(address user, uint256 projectId, uint8 count, string memory receipt, uint256 chainId) public onlySpecial onlyAvailable(projectId) { ``` `buyFromAnotherChain` has memory location parameters: `receipt`. --- ```solidity=222 function entryWithSpecial(address user, uint256 projectId, uint8 count, string memory receipt) public onlySpecial onlyAvailable(projectId) { ``` `entryWithSpecial` has memory location parameters: `receipt`.

Open the report
Show 10 more
LowLack of Checks on `maxFeeRate`FNCY Chain · CertiK · 22 Mar 2024Fixed

The checking within function `_initCollection()` shows checks to ensure that `totalFeeRate` (or the sum of all `fee.feeRate` amounts) equals the `maxFeeRate`. Since there still lacks other checks, this condition is insufficient to prevent issues from occuring. ```solidity=185 require(totalFeeRate == collection.maxFeeRate, "Invalid fee rate construct"); ``` The code snippet below shows how the value of `totalFeeRate` is calculated using the sum of all `fee.feeRate` amounts. ```solidity=173 for (uint8 i = 0; i < fees.length; i++) { Fee memory fee = fees[i]; require(fee.recipient != address(0), "Invalid recipient address"); totalFeeRate += fee.feeRate; ``` The `collection.maxFeeRate` rate does not have an upper limit and there is also no check if the value is greater than the `FEE_BASIS_POINT`. There would be issues and lead to errors if this check is not included since it could potentially lead to larger payments than funds available and cause transfers to fail.

Open the report
LowLocked Blockchain Native TokensFNCY Chain · CertiK · 22 Mar 2024Fixed

The contract has a `receive()` function or payable functions, making it able to receive native tokens. However, it does not have a function to withdraw the funds, which can lead to permanently locked tokens within the contract. ```solidity=283 fallback() external payable { ``` ```solidity=287 receive() external payable { ```

Open the report
LowMissing Deadline in Signature VerificationFNCY Chain · CertiK · 22 Mar 2024Fixed

The `claimOffered` function constructs a hash (`claimOfferedHash`) which is used to verify the seller's signature. This hash includes details like the NFT address, token ID, seller, buyer, and offer price. However, the `deadline` parameter is not included in this hash. ```solidity function claimOffered(address nftAddress, address seller, uint256 tokenId, uint256 deadline, uint256 offerPrice, bytes calldata offeredHash, bytes memory permitSig) external payable nonReentrant whenNotPaused { ... require(deadline > block.timestamp, "expired deadline"); ... bytes32 claimOfferedHash = _claimOfferedHash(nftAddress, tokenId, seller, buyer, offerPrice); ... } ``` Excluding the `deadline` from the hash that is signed by the seller could lead to a scenario where the buyer holds onto a valid signature for an indefinite period. If the market price of the NFT increases, the buyer could potentially execute the `claimOffered` function at a much later date, buying the NFT at the originally offered price, which could be much lower than the current market value. Let's consider this situation: - The seller signs an offer with a certain price and no deadline encoded in the signature. - The buyer waits without executing `claimOffered`. - The seller sells the NFT to someone else via the `buy` function. - In the future, if the seller reacquires the NFT and attempts to sell it again (possibly at a higher price), the buyer from the original offer can still execute `claimOffered` using the old signature, buying the NFT at the old, lower price.

Open the report
LowMissing Deleting `lists[nftAddress][tokenId]` InFNCY Chain · CertiK · 22 Mar 2024Fixed

In the `claimOffered` function, if the `lists[nftAddress][tokenId].seller` is not zero address, the `lists[nftAddress][tokenId]` entry is not cleared or reset after an NFT is successfully claimed. ```solidity function claimOffered(address nftAddress, address seller, uint256 tokenId, uint256 deadline, uint256 offerPrice, bytes calldata offeredHash, bytes memory permitSig) external payable nonReentrant whenNotPaused { ... if (lists[nftAddress][tokenId].seller != address(0)) { // 판매건이 존재하는 경우 if (lists[nftAddress][tokenId].seller != seller) { // 해당 판매건이 기존 seller가 아닌 경우 (서버에 저장되어 있는 값이 아닌경우임.) revert ("[Second] Invalid Token Owners, for invalid this offer request. please drop the this request."); } } ... } ``` This can lead to some issues: - **Inconsistent State**: The contract's state will reflect that the NFT is still for sale even though it has already been sold via `claimOffered`. - **Misleading Information**: It can mislead other users who might be interested in buying the NFT, as they would see it as listed even though it's no longer available.

Open the report
LowPossible integer overflow and dead loopFNCY Chain · CertiK · 22 Mar 2024Fixed

The max value for `uint8` is 255. The `fees.length` is of type `uint256` and may be bigger than 255. Thus `i++` may silently overflow and it becomes a dead loop.

Open the report
LowPotential Cross-Chain Replay AttackFNCY Chain · CertiK · 22 Mar 2024Fixed

Signed messages are not properly verified with the current chain ID, thus allowing attackers to perform replay attacks across chains. Hardcoded or cached chain ID values are also vulnerable since a hard fork may occur and change the chain ID in the future. ```solidity=277 return ecrecover(_hash, v, r, s); ``` - Calling `ecrecover` with a hash that does not properly include the chain ID.

Open the report
LowPotential Rounding Issue In `entryNFT` FunctionFNCY Chain · CertiK · 22 Mar 2024Fixed

The function `entryNFT()` contains potential rounding issues in the following line. ```solidity=172 if (wantBuyCount != count) { paymentAmount = paymentAmount.div(wantBuyCount).mul(count); } ``` In order to avoid possible rounding issues related to integer truncation from division, it would be best to use the value of `project.price` directly to avoid issues related to integer truncation from division of integers.

Open the report
LowRedundant Check in `NFTExchange`FNCY Chain · CertiK · 22 Mar 2024Fixed

There are checks in the `if` statement to only run when `price > 0`, however earlier in the function `buy()` there was already a check to exclude such cases where price = 0. ```solidity function buy(address _nftAddress, uint256 _tokenId, uint256 _maximumPrice) public payable nonReentrant whenNotPaused { ... require(price > 0, 'NFTExchange: Token not in sell book'); ... if (price > 0) { // require(IExchangeFeeInterceptor(interceptors[_nftAddress]).collections(_nftAddress).enable, 'need to setup interceptor'); TransferHelper.safeTransferETH(interceptors[_nftAddress], price); IExchangeFeeInterceptor(interceptors[_nftAddress]).executeFundsTransfer(_nftAddress, seller, _tokenId, price); } ```

Open the report
LowsafeTransfer function does not check for existencFNCY Chain · CertiK · 22 Mar 2024Fixed

The `safeTransfer` function does not check for the existence of the ERC20 token contract , `TransferHelper.sol` performs a transfer with a low-level call without confirming the contract's existence ```solidity function safeTransfer(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'safeTransfer failed'); } function safeTransferFrom(address token, address from, address to, uint256 value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferFrom failed'); } ``` The low-level functions call, delegatecall and staticcall return true as their first return value if the account called is non-existent, as part of the design of the EVM. Contract existence must be checked prior to calling if needed.

Open the report
LowThe Difference Between functions `buyFromAnotherCFNCY Chain · CertiK · 22 Mar 2024Fixed

It was noted that the functions `buyFromAnotherChain()` and `entryWithSpecial()` function similarly with the main difference being the function `entryWithSpecial()` does not make use of the mapping `anotherReceipts[]` to control how many times NFTs can be minted using this function.

Open the report
Show 10 more
LowTreatment of Funds For FundraisingFNCY Chain · CertiK · 22 Mar 2024Fixed

In functions such as `entryNFT()`, `buyFromAnotherChain()`, and `entryWithSpecial()` there will be the minting of tokens when the `project.fundraising` flag is `false`. ```solidity if (!project.fundraising) { for (uint i = 0; i < count; i++) { project.nft.safeMint(msg.sender, 0, ""); } } ``` If the project is for fundraising purposes, no tokens are minted to the user and the amounts sent by the user for fundraising purposes is not recorded in any way.

Open the report
LowUnknown Usage of `deadlines`FNCY Chain · CertiK · 22 Mar 2024Fixed

In the sell functions there is the use of the `deadlines` mapping, which seems to be used to differentiate the updating of the `lists` mapping from the creation of entries in `lists`. ```solidity require(_deadline > deadlines[_nftAddress][_tokenId], "NFTExchange: invalid deadline"); deadlines[_nftAddress][_tokenId] = _deadline; ``` It was noted that this is only used for sell functions and the `buy()` function doesn't make use of the `deadlines` mapping. This could potentially mean that the `buy()` function can be executed on a sell item that has already expired.

Open the report
LowUnprotected InitializerFNCY Chain · CertiK · 22 Mar 2024Fixed

One or more logic contracts do not protect their initializers. An attacker can call the initializer and assume ownership of the logic contract, whereby she can perform privileged operations that trick unsuspecting users into believing that she is the owner of the upgradeable contract. ```solidity=11 contract ExchangeFeeInterceptor is OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { ``` - `ExchangeFeeInterceptor` is an upgradeable contract that does not protect its initializer. ```solidity=63 function initialize(address _exchangeAddress, address _serverSigner) public initializer { ``` - `initialize` is an unprotected initializer function. --- ```solidity=11 contract LaunchpadFeeInterceptor is OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable{ ``` - `LaunchpadFeeInterceptor` is an upgradeable contract that does not protect its initializer. ```solidity=53 function initialize(address _launchpadAddress, address _serverSigner) public initializer { ``` - `initialize` is an unprotected initializer function. --- ```solidity=16 contract NFTExchange is OwnableUpgradeable, PausableUpgradeable, AccessControlUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable { ``` - `NFTExchange` is an upgradeable contract that does not protect its initializer. ```solidity=71 function initialize() public initializer { ``` - `initialize` is an unprotected initializer function. --- ```solidity=21 contract NFTLaunchpad is OwnableUpgradeable, AccessControlUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { ``` - `NFTLaunchpad` is an upgradeable contract that does not protect its initializer. ```solidity=75 function initialize(address _serverSigner) initializer public { ``` - `initialize` is an unprotected initializer function. --- ```solidity=15 contract TransferManagement is OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable, AccessControlUpgradeable, EIP712Upgradeable { ``` - `TransferManagement` is an upgradeable contract that does not protect its initializer. ```solidity=68 function initialize(address _serverSigner) public initializer { ``` - `initialize` is an unprotected initializer function.

Open the report
LowUnreachable and Redundant CodeFNCY Chain · CertiK · 22 Mar 2024Fixed

The following code in the function `entryNFT()` contains some code that is unreachable and therefore redundant. ```solidity=162 if (project.soldCount + count > project.total) { count = (uint8)(project.total - project.soldCount); } ``` In the above code, the `if` statement and the logic within the `if` statement will never be executed because the `require` statement before it restricts the value of `project.soldCount + count` to a value less than or equal to `project.total`. ```solidity=160 require(project.total >= project.soldCount + count, "exceed project sale"); ``` For the same reason, since the value of `count` also never changes it will always be equal to `wantBuyCount` and therefore the following code will never be executed. ```solidity=172 if (wantBuyCount != count) { paymentAmount = paymentAmount.div(wantBuyCount).mul(count); } ```

Open the report
LowUnsafe Integer CastFNCY Chain · CertiK · 22 Mar 2024Fixed

Type casting refers to changing an variable of one data type into another. The code contains an unsafe cast between integer types, which may result in unexpected truncation or sign flipping of the value. ### NFTLaunchpad.sol ```solidity=163 count = (uint8)(project.total - project.soldCount); ``` Casted expression `project.total - project.soldCount` has estimated range [0, 5192296858534827628530496329220095] but target type `uint8` has range [0, 255]. --- ### TransferManagement.sol ```solidity=173 uint8 _size = uint8(recipients.length); ``` Casted expression `recipients.length` has estimated range [0, 115792089237316195423570985008687907853269984665640564039457584007913129639935] but target type `uint8` has range [0, 255].

Open the report
LowUnused Return ValueFNCY Chain · CertiK · 22 Mar 2024Fixed

The smart contract does not check or store the return value of an external call in a local or state variable, which may introduce vulnerabilities due to the unhandled outcome. ```solidity=192 project.nft.safeMint(msg.sender, 0, ""); ``` --- ```solidity=213 project.nft.safeMint(user, 0, ""); ``` --- ```solidity=235 project.nft.safeMint(user, 0, ""); ```

Open the report
LowUnvalidated NFT Contract AddressesFNCY Chain · CertiK · 22 Mar 2024Fixed

The lack of checks around the `_nftAddress` used for selling NFTs could cause issues for users since this is a user-inputted value. A malicious user could potentially cause issues by using the address of a fake or malicious NFT address. If the `_nftAddress` points to a malicious contract, it could implement unexpected behaviors when the `ownerOf` or `safeTransferFrom` functions are called. ```solidity function sell(address _nftAddress, uint256 _tokenId, uint256 _price, uint256 _deadline) public nonReentrant whenNotPaused { require(_deadline >= block.timestamp, "NFTExchange: Expired order"); // require(IExchangeFeeInterceptor(interceptors[_nftAddress]).collections(_nftAddress).enable, 'need to setup interceptor'); require(_price > 0, 'NFTExchange: Price must be granter than zero'); require(_deadline > deadlines[_nftAddress][_tokenId], "NFTExchange: invalid deadline"); deadlines[_nftAddress][_tokenId] = _deadline; IERC721Upgradeable nft = IERC721Upgradeable(_nftAddress); if (lists[_nftAddress][_tokenId].seller != msg.sender) { require(nft.ownerOf(_tokenId) == msg.sender, "NFTExchange: Only NFT Owner can sell"); nft.safeTransferFrom(msg.sender, address(this), _tokenId); } lists[_nftAddress][_tokenId] = ListInfo(payable(msg.sender), _price); emit Ask(msg.sender, _nftAddress, _tokenId, _price); } ``` Even if the malicious contract cannot directly extract funds or directly harm users, it can pollute the `lists` mapping with fake sales, which could mislead other users. Although only certain NFT contract addresses with interceptors can be purchased via the `buy` function, we still recommend adding additional logic to ensure that the `_nftaddress` is legitimate before any operation involving the `_nftAddress`.

Open the report
LowUsage of `nftId`FNCY Chain · CertiK · 22 Mar 2024Fixed

In many of the minting functions including `mint()`, `bulkMint()`, `merchantSelfMint()`, and `bulkMerchantSelfMint()` there is the use of the input parameter `nftId`. There are no checks of the input value of `nftId` to ensure its accuracy and does not seem to be used in the actual execution of the mint.

Open the report
LowUsage of `transfer`/`send` for Sending Native TokFNCY Chain · CertiK · 22 Mar 2024Fixed

It is not recommended to use Solidity's `transfer()` and `send()` functions for transferring native tokens, since some contracts may not be able to receive the funds. Those functions forward only a fixed amount of gas (2300 specifically) and the receiving contracts may run out of gas before finishing the transfer. Also, EVM instructions' gas costs may increase in the future. Thus, some contracts that can receive now may stop working in the future due to the gas limitation. ```solidity=211 payable(msg.sender).transfer(offeredPrice.sub(_offerPrice)); ``` - `NFTExchange.offer()` uses `transfer()`.

Open the report
LowUsage of TransferManagement contractFNCY Chain · CertiK · 22 Mar 2024Fixed

It was noted that none of the functions within the `TransferManagement` contract are used in the other contracts provided in the audit.

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="fncy"
></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