The audit of the Dai Stablecoin contract revealed critical vulnerabilities related to unchecked arithmetic operations, which could lead to incorrect token balances and total supply. Additionally, significant centralization risks exist due to the 'ward' access control mechanism, particularly concerning the ability of authorized wards to burn any user's tokens without explicit approval. The contract implements standard ERC-20 functionality along with EIP-2612 permit, but inconsistent application of safe arithmetic functions poses a severe threat to the token's integrity. Recommendations focus on addressing these arithmetic flaws and mitigating centralization risks.
On-chain security analysis — is it a scam or legit?
Is Dai Stablecoin Safe?
Not verified
This record has not gone through deep verification and is not being monitored. The score is a dated snapshot — the token’s risk can change at any time.Own this token? Put it under verification →The audit of the Dai Stablecoin contract revealed critical vulnerabilities related to unchecked arithmetic operations, which could lead to incorrect token balances and total supply.
Read the full analysis- Ownership status UNKNOWN
- Mintable supply — no cap found, dilution unbounded
- Top-10 concentration > 20%
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 78.5%
- LP top3 unlocked holders = 97.8%
- 1 Critical finding(s) from audit
- 1 High finding(s) from audit
- 1 Medium finding(s) from audit
Exact factors
- Ownership status UNKNOWN (owner could not be resolved)
- Mintable supply — no cap found, dilution unbounded
- Top-10 concentration > 20% (36.2% total → 23.8% effective; 15.6% in EOAs, 20.6% in contracts — mild)
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 78.5% (independent LP — depth risk, pool = 52% of DEX liquidity)
- LP top3 unlocked holders = 97.8% (independent LP — depth risk, pool = 52% of DEX liquidity)
- 1 Critical finding(s) from audit
- 1 High finding(s) from audit
- 1 Medium finding(s) from audit
Each factor is an on-chain fact recorded at the time of this analysis. The score is computed from them by a deterministic function, so the same contract returns the same score for anyone who runs the audit. How scores are computed
Security Checklist
as of audit · Sep 4Holders
as of audit · Sep 4, 2026- Contractstreasury, vesting, bridge, staking20.6%
- Walletsanonymous holders, free to sell15.6%
- Everyone elsethe rest of the supply63.8%
How holder types affect the score
Share held by contracts — treasury, vesting, bridge or staking — is discounted against share held by wallets when the score is computed: a contract cannot decide to sell the way an anonymous holder can, though it can still be drained or voted to sell. Effective concentration is the figure the risk score is actually calculated from.
Holder balances as recorded by the audit of Sep 4, 2026
Liquidity
as of audit · Sep 4- UniswapUSD₮0Analysed$94.6K51.8%
- UniswapUSDC$49.0K26.9%
- UniswapUSDC$24.9K13.7%
- UniswapUSD₮0$10.7K5.8%
- CamelotUSDC$2.2K1.2%
- KyberswapUSDC$7330.4%
Show 2 more pairs
The risk score reads depth across every pair.
The LP tokens of the analysed pool are not locked or burned, so whoever holds them can withdraw that liquidity.
0xea32…010d0x9023…9d700x3750…0d7b0x47c0…596c0xbb96…7da20x671a…8b5e0xdd95…7c630x3086…30980x6c81…f94c0x2cd5…6d4cNo privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.
Security Findings
CriticalUnchecked Arithmetic Operations Leading to Integer Overflow/Underflow
Several critical arithmetic operations within the contract do not utilize the provided safe arithmetic functions (_add, _sub), exposing the contract to integer overflow and underflow vulnerabilities. Specifically:
1. Additions to balanceOf[to] in mint, transfer, and transferFrom (balanceOf[to] = balanceOf[to] + value;) are unchecked and can overflow.
2. Subtraction from totalSupply in burn (totalSupply = totalSupply - value;) is unchecked and can underflow if totalSupply is less than value (even if balanceOf[from] is sufficient).
This can lead to incorrect token balances, total supply, and potentially loss of funds or system instability. (7.2 Code Security)C-01
Issue
Several critical arithmetic operations within the contract do not utilize the provided safe arithmetic functions (_add, _sub), exposing the contract to integer overflow and underflow vulnerabilities. Specifically:
1. Additions to balanceOf[to] in mint, transfer, and transferFrom (balanceOf[to] = balanceOf[to] + value;) are unchecked and can overflow.
2. Subtraction from totalSupply in burn (totalSupply = totalSupply - value;) is unchecked and can underflow if totalSupply is less than value (even if balanceOf[from] is sufficient).
This can lead to incorrect token balances, total supply, and potentially loss of funds or system instability. (7.2 Code Security)
Fix
All arithmetic operations involving token balances, total supply, and allowances must consistently use the _add and _sub internal functions or a battle-tested SafeMath library to prevent overflows and underflows. Ensure that every addition and subtraction is protected by these safe arithmetic checks.
Status
Unresolved
HighCentralized Ward Can Burn Any User's Tokens Without Approval
The burn function's logic allows an authorized ward (wards[msg.sender] == 1) to bypass the allowance check when burning tokens from any address (from), even if from is not msg.sender. This means a ward can unilaterally burn tokens belonging to any user without their explicit approval, which is a significant centralization risk and deviates from standard ERC-20 burnFrom behavior. (7.3 Access Control, 7.4 Economic)H-01
Issue
The burn function's logic allows an authorized ward (wards[msg.sender] == 1) to bypass the allowance check when burning tokens from any address (from), even if from is not msg.sender. This means a ward can unilaterally burn tokens belonging to any user without their explicit approval, which is a significant centralization risk and deviates from standard ERC-20 burnFrom behavior. (7.3 Access Control, 7.4 Economic)
Fix
Modify the burn function to strictly enforce allowance checks for all burnFrom operations. If the intent is for wards to have privileged burning capabilities, this should be clearly documented, and a more robust governance mechanism (e.g., multi-signature approval) should be implemented for such sensitive actions to mitigate the risk of abuse or compromise.
Status
Unresolved
MediumCentralized Access Control for Core Token Operations
The contract utilizes a centralized access control mechanism based on a wards mapping and an auth modifier. The deployer is initially the sole ward, with the power to add or remove other wards via rely and deny functions. Critical operations like mint are restricted to these authorized wards. This centralization creates a single point of failure; a compromise of a ward's private key could lead to unauthorized token minting or administrative control. (7.3 Access Control, 7.5 Governance)M-01
Issue
The contract utilizes a centralized access control mechanism based on a wards mapping and an auth modifier. The deployer is initially the sole ward, with the power to add or remove other wards via rely and deny functions. Critical operations like mint are restricted to these authorized wards. This centralization creates a single point of failure; a compromise of a ward's private key could lead to unauthorized token minting or administrative control. (7.3 Access Control, 7.5 Governance)
Fix
Consider implementing a multi-signature wallet (e.g., Gnosis Safe) for the wards addresses to distribute control and reduce the single point of failure risk. For highly sensitive operations like mint, explore adding time-locks or a more decentralized governance mechanism if aligned with the project's long-term vision.
Status
Unresolved
InfoMissing ERC-20 decimals() Function
The contract defines decimals as a public constant uint8, which makes its value accessible. However, it does not implement the decimals() function as explicitly specified in the ERC-20 standard. While functionally equivalent for many applications, some tools or interfaces might expect the function call. (7.1 Architecture)I-01
decimals() FunctionIssue
The contract defines decimals as a public constant uint8, which makes its value accessible. However, it does not implement the decimals() function as explicitly specified in the ERC-20 standard. While functionally equivalent for many applications, some tools or interfaces might expect the function call. (7.1 Architecture)
Fix
Add a function decimals() external view returns (uint8) that simply returns the decimals constant to ensure full ERC-20 compliance and broader compatibility with ecosystem tools.
Status
Unresolved
InfoRedundant _DOMAIN_SEPARATOR Calculation in permit Function
The permit function recalculates the EIP-712 domain separator using _calculateDomainSeparator(chainId) if the current chainId differs from deploymentChainId. While this handles chain forks correctly, the contract already stores _DOMAIN_SEPARATOR as an immutable variable and provides a public DOMAIN_SEPARATOR() view function that performs the same conditional check. The permit function could potentially reuse the existing DOMAIN_SEPARATOR() function or the stored _DOMAIN_SEPARATOR after its own chainId check, avoiding redundant computation. (7.2 Code Security)I-02
_DOMAIN_SEPARATOR Calculation in permit FunctionIssue
The permit function recalculates the EIP-712 domain separator using _calculateDomainSeparator(chainId) if the current chainId differs from deploymentChainId. While this handles chain forks correctly, the contract already stores _DOMAIN_SEPARATOR as an immutable variable and provides a public DOMAIN_SEPARATOR() view function that performs the same conditional check. The permit function could potentially reuse the existing DOMAIN_SEPARATOR() function or the stored _DOMAIN_SEPARATOR after its own chainId check, avoiding redundant computation. (7.2 Code Security)
Fix
Optimize the permit function to reuse the DOMAIN_SEPARATOR() function or the stored _DOMAIN_SEPARATOR directly after its chainId == deploymentChainId check, to avoid unnecessary recalculation and improve gas efficiency.
Status
Unresolved
InfoRestrictive transfer and transferFrom to address(this) Check
The transfer and transferFrom functions explicitly prevent transfers to address(this) (the token contract itself) with the check `require(to != address(0) && to != address(this), 'Dai/invalid-address');. While preventing transfers to address(0)` is standard, disallowing transfers to the token contract might be overly restrictive depending on future protocol designs. Some DeFi protocols or token mechanisms might intentionally send tokens to the token contract for specific purposes (e.g., burning, staking, or locking). (7.1 Architecture)I-03
transfer and transferFrom to address(this) CheckIssue
The transfer and transferFrom functions explicitly prevent transfers to address(this) (the token contract itself) with the check `require(to != address(0) && to != address(this), 'Dai/invalid-address');. While preventing transfers to address(0)` is standard, disallowing transfers to the token contract might be overly restrictive depending on future protocol designs. Some DeFi protocols or token mechanisms might intentionally send tokens to the token contract for specific purposes (e.g., burning, staking, or locking). (7.1 Architecture)
Fix
Review if the restriction to != address(this) is absolutely necessary for all current and anticipated use cases. If there are scenarios where sending tokens to the contract itself is desired or could be beneficial, this check should be removed or made conditional. Otherwise, clearly document this design choice and its implications.
Status
Unresolved
Analysis
AI Copilotas of audit · Sep 4The contract implements core ERC-20 functionalities and EIP-2612 permit, including a robust EIP-712 domain separator calculation. It also provides internal _add and _sub functions for safe arithmetic. However, a critical technical flaw is the inconsistent application of these safe arithmetic functions, leading to unchecked additions and subtractions in balanceOf and totalSupply updates (7.2 Code Security). This exposes the contract to integer overflow and underflow vulnerabilities, which can corrupt token balances and total supply. The burn function also contains an unchecked subtraction for totalSupply (7.2 Code Security).
The contract employs a centralized 'ward' access control system, where the deployer is initially the sole administrator, capable of adding or removing other wards (7.3 Access Control). This centralization extends to critical operations like mint, which is restricted to wards. A significant economic risk is present in the burn function, where an authorized ward can burn tokens from any address without requiring prior allowance, deviating from standard ERC-20 burnFrom behavior and creating a powerful, centralized control point over user funds (7.4 Economic, 7.5 Governance).
The contract is not designed as an upgradeable proxy and does not implement any upgrade mechanisms. Therefore, there are no specific upgrade-related risks inherent in its architecture (7.7 Upgrades). Any future changes would require a new deployment and migration.
Prioritize the immediate remediation of all unchecked arithmetic operations by consistently applying the provided _add and _sub internal functions or integrating a robust SafeMath library for all balance, total supply, and allowance modifications.
This is crucial to prevent integer overflows and underflows that could compromise the token's integrity and user funds. Additionally, review and revise the burn function's access control to either strictly enforce allowance for all burnFrom operations or clearly document and justify the privileged burning capability of wards, potentially implementing a multi-signature scheme for such sensitive actions. Consider implementing a multi-signature wallet for the 'ward' addresses to enhance security and decentralize administrative control over critical functions like mint and rely/deny.
Contract & Record
Free for any token on the record. It links to this page and always shows the current score and the date it was checked.
- Sep 4, 202669High
- Aug 12, 202674High
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Would You Like a More Detailed Audit of Dai Stablecoin?
Our AI-powered scanner gives you a deeper, real-time smart contract analysis — free, with every scoring factor shown.
Get Detailed Audit Is this your token? Publish your own audit on this page