PAW Chain security record

Arbitrum, Base, BNB Chain, Ethereum, Polygon (POS)pawchain.netGitHub

As of 3 Nov 2026, PAW Chain has 1 audit report on Trustblock, by CertiK, dated 23 Aug 2023. 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 and findings, contracts and incidents up to Nov 2026. Trustblock does not review code.

Audits1

Newest first

AuditSecurity firmDateScopeCritical findingsReport
PAWSWAPSecurity firm: CertiKDate: Scope: Not recorded (see the report)No open critical findingsOriginal removed

Findings24

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

SeverityOpenAcknowledgedFixed
Critical000
High201
Medium003
Low4014
HighPotential Flashloan AttackPAWSWAP · CertiK · 23 Aug 2023Fixed

Flash loans are a way to borrow large amounts of money for a certain fee. The requirement is that the loans need to be returned within the same transaction in a block. If not, the transaction will be reverted. An attacker can use the borrowed money as the initial funds for an exploit to enlarge the profit or manipulate the token price in decentralized exchanges. The function `CalculatePAWequivalent()` relies on price calculations that are based on-chain, meaning they are susceptible to flash-loan attacks by manipulating the price of given pairs to the attacker's benefit. The balance of the `PAW` in the pair contract can be manipulated as described in the scenario. ```solidity function CalculatePAWequivalent(uint256 amount) public view returns(uint256){ return (((ERC20(PAW).balanceOf(PairContract)*((((1000000000000000000 * amount) / (ERC20(PairContract).totalSupply())))) / 1000000000000000000))*2); } ```

Open the report
Medium`ChangeMultiplier()` Does Not Settle Rewards WithPAWSWAP · CertiK · 23 Aug 2023Fixed

The function `ChangeMultiplier()` in the linked contracts does not settle the current rewards with the old rate. All the staking users will be forced to use the new reward rate. This may be unfair to the user if the new rate is lower.

Open the report
MediumIncorrect Claim ConditionsPAWSWAP · CertiK · 23 Aug 2023Fixed

The conditions to trigger the function `Claim()` are different in the functions `Deposit()` and `Withdraw()`. The `if` condition in the function `Deposit()` lacks the check of `ERC20(wPAW).balanceOf(address(this)) >= (GetUnclaimed(msg.sender))`. As a result, if the balance of the token `wPAW` is not sufficient, the users may not be able to call the function `Deposit()`. ```solidity //Deposit if(Deposits[msg.sender] > 0 && RewardsPaused == false){ Claim(); } //Withdraw if((ERC20(wPAW).balanceOf(address(this)) >= (GetUnclaimed(msg.sender))) && RewardsPaused == false){ Claim(); } ```

Open the report
MediumLogic Issue On `stakedTokenSupply`PAWSWAP · CertiK · 23 Aug 2023Fixed

In the linked contracts in the new commit [cd93a72a77aed596685d4f948976196318a9cdbb](https://github.com/Pawkishi/PAWSWAPtoken/tree/cd93a72a77aed596685d4f948976196318a9cdbb), the value of `stakedTokenSupply` will be the current contract's balance of the staking token(`PAWToken` or `lpToken`). However, this does not consider direct token transfers. If someone mistakenly transfers the staking token directly to the current contract, the result of the variable `stakedTokenSupply` will be incorrect and include the direct transfer amount. This will cause all the stakers to lose some of their rewards.

Open the report
LowChecks Effects Interaction Pattern Not UsedPAWSWAP · CertiK · 23 Aug 2023Fixed

In functions `Deposit()` and `Withdraw()` of the linked contracts `PAWFlexibleStaking` and `PawLPStaking`, the Checks Effects Interaction Pattern is not strictly followed.

Open the report
LowIncompatibility with Deflationary TokensPAWSWAP · CertiK · 23 Aug 2023Fixed

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 For example: ```solidity=50 ERC20(PairContract).transferFrom(msg.sender, address(this), amount); ``` - Transferring tokens by `amount`. ```solidity=52 Deposits[msg.sender] = (Deposits[msg.sender] + amount); ``` - The `amount` appears to be used for bookkeeping purposes without compensating the potential transfer fees.

Open the report
LowLogic Issue On `holderUnlockTime`PAWSWAP · CertiK · 23 Aug 2023Fixed

In the contract `PAWLockedStaking`, the user needs to stake for at least a `lockDuration` before withdraw. 1. The variable `holderUnlockTime[msg.sender]` is used to record the unlock time of each user instead of a single deposit. The below code snippet in the `deposit()` function will not update the `holderUnlockTime[msg.sender]` if there are already locked deposit from the given user. Therefore, the user can shorten the lock time of multiple deposit. ```solidity if(holderUnlockTime[msg.sender] == 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } ``` 2. The conditions of withdrawal restriction and emergency penalty are slightly different. If the block.timestamp equals holderUnlockTime[msg.sender], the user can successfully withdraw the tokens with rewards but still need to pay the exit penalty using `emergencyWithdraw()`. ```solidity require(holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early"); if(holderUnlockTime[msg.sender] >= block.timestamp) ```

Open the report
LowLogic Issue On Function `rewardsRemaining()`PAWSWAP · CertiK · 23 Aug 2023Fixed

The function `rewardsRemaining()` calculate the remaining rewards as `rewardToken.balanceOf(address(this)) - totalStaked`. Based on our understanding, the remaining rewards is the current reward balance - current rewards to be distributed, which should be `rewardToken.balanceOf(address(this)) - calculateNewRewards`.

Open the report
LowMathematical IssuePAWSWAP · CertiK · 23 Aug 2023Fixed

Performing integer division before multiplication truncates the low bits, losing the precision of the calculation. Although the `1000000000000000000` seems to be a multiplying to mitigate the issue, the `*2` operation is placed at the end. Also, the statement contains many redundant parentheses making the code hard to read. ```solidity=155 return (((ERC20(PAW).balanceOf(PairContract)*((((1000000000000000000 * amount) / (ERC20(PairContract).totalSupply())))) / 1000000000000000000))*2); ```

Open the report
LowMissing Emit EventsPAWSWAP · CertiK · 23 Aug 2023Fixed

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

Open the report
Show 8 more
LowMissing Error MessagesPAWSWAP · CertiK · 23 Aug 2023Fixed

The **require** can be used to check for conditions and throw an exception if the condition is not met. It is better to provide a string message containing details about the error that will be passed back to the caller.

Open the report
LowMissing Zero Address ValidationPAWSWAP · CertiK · 23 Aug 2023Fixed

Addresses should be checked before assignment or external call to make sure they are not zero addresses. For example: ```solidity=101 PairContract = NewPair; ``` - `NewPair` is not zero-checked before being used. --- ```solidity=133 Operator = NewOperator; ``` - `NewOperator` is not zero-checked before being used.

Open the report
LowNo Reward If Withdraw During Reward PausePAWSWAP · CertiK · 23 Aug 2023Fixed

If the reward is paused by calling the function `PauseRewards()`, the user can not get any rewards when calling the functions `Deposit()`, `Withdraw()`, `Claim()`. However, in the `Deposit()`, the user's `LastUpdateUnix[user]` is updated; in the function `Withdraw()`, the user's `Deposits[msg.sender]` amount is updated. As a result, even if the user has staked before the pause time, he/she can not get the rewards any more. Based on our understanding, it is reasonable that there is no reward during the pause time, but the user should get the rewards for the staking period before the pause time.

Open the report
LowRedundant StatementsPAWSWAP · CertiK · 23 Aug 2023Fixed

The linked statements do not affect the functionality of the codebase and appear to be either remnants of test code or older functionality. - function _setDividendBalance(), the user's stake is already recorded in `user.amount`, not necessary to mint/burn shares to the user as well. - function estimateAPY(), which is deprecated in the version [76547e0445bacfc912f928ce7c3eac9cb4f4e4cc.](https://github.com/Pawkishi/PAWSWAPtoken/commit/76547e0445bacfc912f928ce7c3eac9cb4f4e4cc)

Open the report
LowReward Calculations LogicPAWSWAP · CertiK · 23 Aug 2023Fixed

The reward calculation logic in the linked stake contracts is not very clear. The reward is calculated with the below code snippet. What is the meaning of the `/ 1000000000000000` operation? ```solidity Unclaimed = (((RewardMultiplier * Time) * Deposits[user]) / 1000000000000000); Unclaimed = (((RewardMultiplier * Time) * CalculatePAWequivalent(Deposits[user])) / 1000000000000000); ```

Open the report
LowUnchecked ERC-20 `transfer()`/`transferFrom()` CaPAWSWAP · CertiK · 23 Aug 2023Fixed

The linked contracts use the transfer()/transferFrom() call without checking their return values. For example: ```solidity ERC20(PairContract).transferFrom(msg.sender, address(this), amount); ERC20(PairContract).transfer(msg.sender, amount); ERC20(wPAW).transfer(msg.sender, Unclaimed); ERC20(PAW).transfer(msg.sender, ERC20(PAW).balanceOf(address(this))); ```

Open the report
LowUnnecessary ArrayPAWSWAP · CertiK · 23 Aug 2023Fixed

The contract only maintains one `PoolInfo` struct, so the array `PoolInfo[]` is unnecessary.

Open the report
LowUpdate Pool in Function `addRewardTreasure()` andPAWSWAP · CertiK · 23 Aug 2023Fixed

In the linked contracts in the new commit [cd93a72a77aed596685d4f948976196318a9cdbb](https://github.com/Pawkishi/PAWSWAPtoken/tree/cd93a72a77aed596685d4f948976196318a9cdbb), the contract owner will use the function `addRewardTreasure()` to transfer reward tokens to the current contract. Also, the function `emergencyWithdraw()` will add back the deducted `rewardTreasure`. However, the functions `addRewardTreasure()` and `emergencyWithdraw()` do not call the function `_updatePool()` to allocate the reward immediately. As a result, the reward will be allocated at the next call to the function `_updatePool()` with `deposit()`, `withdraw()`, `claim()`, etc. This will cause the users to lose some of the rewards.

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.

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="paw-chain"
></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