GigaSwap security record

As of 3 Nov 2026, GigaSwap has 1 audit report on Trustblock, by CertiK, dated 7 Feb 2024. That report lists no open critical findings.

Critical findings
No open critical findings
In that report, 1 critical finding was reported. It 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, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.

Audits1

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Gigaswap - AuditSecurity firm: CertiKDate: Scope: Files named in the report1 critical finding, fixedOpen · skynet.certik.com

Findings30

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

SeverityOpenAcknowledgedFixed
Critical001
High203
Medium008
Low3013
Critical`position.count1` Not UpdatedGigaswap - Audit · CertiK · 7 Feb 2024Fixed

In the contract Erc20Sale, the function `applyOffer()` can be called by the position owner to accept the buyer's order. On line 142, the buyer's asset status is updated, but the seller's asset status is not updated. ```solidity=141 // transfer asset2 to position offer.asset2Count -= buyCount; position.count2 += buyCount; ``` That is to say, after the function `applyOffer()` is called, the seller can still retrieve the assets of the order by calling the `withdraw()` function.

Open the report
HighLack Of Access ControlGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The function `withdrawTo()` can be called by anyone as it has no access restriction. This enables anyone to call this and withdraw the asset of the contract.

Open the report
HighPotential Incorrect Calculation Of `position.counGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The function `applyOffer()` can be called by the seller to fill the order, the variable `position.count2` represents the number of assets2 that the buyer can get, if the `priceNom` and `priceDenom` of the order are not the same, then the buyer will get the incorrect number of assets. ```solidity=143 position.count2 += buyCount; ```

Open the report
HighUnable To Receive ERC721 TokenGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The contract `Erc721ItemAssetsController` need to receive the ERC721 tokens, however, the interface `IERC721Receiver` is not implemented by the recipient, so the transfer will be reverted.

Open the report
MediumIncompatibility with Deflationary TokensGigaswap - Audit · CertiK · 7 Feb 2024Fixed

When transferring deflationary ERC20 tokens, the input amount may not be equal to the received amount due to the charged transaction fee. For example, if a user sends 100 deflationary tokens (with a 10% transaction fee), only 90 tokens actually arrived to the contract. However, a failure to discount such fees may allow the same user to withdraw 100 tokens from the contract, which causes the contract to lose 10 tokens in such a transaction. Reference: https://thoreum-finance.medium.com/what-exploit-happened-today-for-gocerberus-and-garuda-also-for-lokum-ybear-piggy-caramelswap-3943ee23a39f ```solidity=68 feeToken.transferFrom(msg.sender, address(this), amount); ``` - Transferring tokens by `amount`. ```solidity=70 totalFeetokensLocked += amount; ``` - The `amount` appears to be used for bookkeeping purposes without compensating the potential transfer fees.

Open the report
MediumMissing Keyword `payable`Gigaswap - Audit · CertiK · 7 Feb 2024Fixed

The function `_lock()` uses `msg.value` structure and is designed to lock the user‘s NFTs into the contract, but the `payable` keyword is missing from the `lockSeconds()`, `lockSecondsFor()`, `lockTime()`, `lockTimeFor()`, `lockPermanent()`, making it impossible to receive native tokens.

Open the report
MediumNo public `swap` functionGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The `_swap()` function is used to swap one asset for another, but `_swap()` is modified to be internal and cannot be called by the user, so the user cannot swap assets.

Open the report
MediumNot Approved Transfer AmountGigaswap - Audit · CertiK · 7 Feb 2024Fixed

When the `buy()` function is called to buy the tokens, the user transfers native tokens to the current contract. If the `Erc20Sale` is not approved to transfer funds from the current contract `Erc20SaleWeth`, the transfer of assets from the current contract to the `Erc20Sale` will fail, resulting in the function being reverted. In Erc20SaleWeth.sol ```solidity=39 _sale.buy(positionId, to, count, priceNom, priceDenom, address(this)); ``` In Erc20Sale.sol ```solidity=366 IERC20(pos.asset2).safeTransferFrom(msg.sender, address(this), spend); ```

Open the report
MediumPotential division by zeroGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The function `addLiquidity()` can be called by anyone to add liquidity, and when no assets exist in the pool, `assetA.count()` is equal to 0, then the `addLiquidity` function will be reverted, since the denominator of line 197 is equal to 0.

Open the report
MediumPotential improper mint liquidityGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The `createAlgorithm()` function is called by `Factory` to set `fee`, `constraints`, `liquidityToken`, `feeTokens` and `feeDistributer` for the position, this function does not accept any assets, but mint liquidity for the owner, then when another user adds liquidity to the position, the owner will share the user's assets in proportion to the liquidity.

Open the report
Show 10 more
MediumPotential Reentrancy AttackGigaswap - Audit · CertiK · 7 Feb 2024Fixed

A reentrancy attack can occur when the contract creates a function that makes an external call to another untrusted contract before resolving any effects. If the attacker can control the untrusted contract, they can make a recursive call back to the original function, repeating interactions that would have otherwise not run after the external call resolved the effects. File: TradingPairAlgorithm.sol ```solidity=519 positionsController.withdrawInternal(own, msg.sender, asset1Count); ``` File: EthAssetsController.sol ```solidity=54 function _withdraw( uint256 assetId, address recipient, uint256 count ) internal override { (bool sent, ) = payable(recipient).call{ value: count }(''); require(sent, 'sent ether error: ether is not sent'); } ```

Open the report
MediumThe number of added liquidity tokens may be zeroGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The `addLiquidity()` function can be called by anyone to add liquidity to a pair. If there is a difference in precision between the two assets, the calculated amount of asset B may result in a value of 0. However, when calling the `withdraw()` function, users have the ability to withdraw asset B proportionally to the liquidity they provided. ```solidity=197 vars.countB = (count * assetB.count()) / assetA.count(); ``` For example:\ assetA[KISHU] : https://etherscan.io/address/0xa2b4c0af19cc16a6cfacce81f192b024d625817d \ assetB[USDC] : https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

Open the report
LowFunction `getDecimals()` Returns Hardcoded ValuesGigaswap - Audit · CertiK · 7 Feb 2024Fixed

In the library ItemRefAsAssetLibrary, there is a view function `getDecimals()` that returns different decimal numbers for different asset types. When the asset type is ERC20 token, the return value is hardcoded to be `9`, which will lead to compatibility issues if the decimal of the specific ERC20 token turns out to be other numbers.

Open the report
LowFunction Can Be Modified With `view`Gigaswap - Audit · CertiK · 7 Feb 2024Fixed

There are functions that do not require modifying the contract state, nor do they need to receive Ether. However, these functions are not labeled with `view` modifiers. Here is the list of applicable functions: * PositionsController.positionsCount() * Vote.erc20Address() * Vote.userVote()

Open the report
LowInconsistent Conditional RequirementsGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The function `withdraw()` is modified by the `onlyDealsController` and can only be called by the `DealsController` contract, which is inconsistent with the 119 lines of code that show that the function can also be called by the owner of the point. ```solidity=118 require( address(_dealsController) == msg.sender || ownerAddr == msg.sender, 'only owner or deals controller can withdraw' ); ```

Open the report
LowIncorrect Event EmitGigaswap - Audit · CertiK · 7 Feb 2024Fixed

In the function `createLiquidity()` of the contract GigaSwapToken, the event emits a wrong value. ```solidity=420 _balances[msg.sender] = 1e19; emit Transfer(address(0), msg.sender, initialLiquidity); ```

Open the report
LowLack of access control in `transferToAsset()` funGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The `transferToAsset()` function can be called by anyone to transfer assets to the current contract. The `transferToAssetFrom()` function does the same thing, but is modified by `onlyFactory`.

Open the report
LowLocked EtherGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The contract has one or more payable functions, but does not have a function to withdraw the fund. ```solidity=5 receive() external payable; ``` ```solidity=58 function execute(uint256 pointId, address addr) external payable; ``` ```solidity=65 function withdraw(uint256 pointId) external payable; ``` ```solidity=25 receive() external payable {} ``` ```solidity=110 function withdraw(uint256 pointId) external payable onlyDealsController { ``` ```solidity=129 function execute(uint256 pointId, address addr) ```

Open the report
LowPull-Over-Push PatternGigaswap - Audit · CertiK · 7 Feb 2024Fixed

In the contracts `PositionsController`, `PositionsFactory`, `TradingPairAlgorithm`, `AssetsControllerBase`, `Erc20AssetsController`, `Erc721ItemAssetsController`, `EthAssetsController` and `VoteExecutorBase`, there are functions that can receive Ethers: * PositionsController.transferToAsset() * PositionsController.transferToAssetFrom() * PositionsFactory.createLockPosition() * PositionsFactory.createTradingPairPosition() * TradingPairAlgorithm.addLiquidity() * AssetsControllerBase.transferToAsset() * Erc20AssetsController.initialize() * Erc721ItemAssetsController.initialize() * EthAssetsController.initialize() * VoteExecutorBase._startVote() These functions will calculate and deduct the required amount of Ether and send the extra Ethers back to ether the `msg.sender` or a passed-in surplus-receiving address.

Open the report
LowQuestionable Usage of `positionId`Gigaswap - Audit · CertiK · 7 Feb 2024Fixed

In Erc20Sale.sol, the ordering logic incorporates the `positionId` parameter; however, it is worth noting that the order price is not related to the asset1/asset2 ratio within the position of `positionId`. Instead, the order price is determined by the buyer through the createOffer function, which takes input parameters asset1Count and asset2Count. The function `applyOffer` called by the buyer does not include a price check and will accept and execute the order in its entirety.

Open the report
Show 5 more
LowTests Fail To RunGigaswap - Audit · CertiK · 7 Feb 2024Fixed

When running `test` on the parent folder, an error occurs: ```bash TradingPair: 8) "before each" hook for "проверка ридера сделок" Weth: 9) "before each" hook for "without allowance" stacking: 10) "before each" hook for "клайм стакового токена" Erc20SaleReal: 11) "before each" hook for "bug 1" RealTest: 12) "before each" hook for "проверка торговой пары 3" swapper: 13) "before each" hook for "проверка наличия фабрики" Vote: 14) "before each" hook for "начальная ситуация" 0 passing (18ms) 14 failing ```

Open the report
LowTypos in Comments and CodesGigaswap - Audit · CertiK · 7 Feb 2024Fixed

There are several typos in the contracts, please see the above to find the locations, and the word with typos are listed here: - Begining - Distributers - Interwal - Liisted - Ofer - Percentil - Poind - addres - algotithm - algotithms - ammount - applyed - creane - dealpoints - deviding - distributers - distrubute - enouth - feeasset - incrementations - interwal - lquidity - maxbuy - maxbyu - nfos - notging - ofer - oply - owanble - percentil - permament - pnly - recepient - retruns - reves - setted - slppage - speciffic - swaped - tyoe - usefull

Open the report
LowUnused Import FileGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The `IERC721Receiver`interface is imported in the `Erc721Locker.sol` file but are not utilized.

Open the report
LowUnused ValueGigaswap - Audit · CertiK · 7 Feb 2024Fixed

```solidity=108 value = msg.value; ``` - The variable `value` is never used after this assignment.

Open the report
LowVariables That Could Be Declared as ImmutableGigaswap - Audit · CertiK · 7 Feb 2024Fixed

The linked variables assigned in the constructor can be declared as `immutable`. Immutable state variables can be assigned during contract creation but will remain constant throughout the lifetime of a deployed contract. A big advantage of immutable variables is that reading them is significantly cheaper than reading from regular state variables since they will not be stored in storage.

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