0xRAM LabsAutomated Security Assessment

diadata

https://github.com/diadata-org/diadata
May 26, 2026 at 12:00 AM6d609826-318
0/ 100
CRITICAL RISK

Your protocol has 41 security issues — 3 Critical, 13 High, 9 Medium, 16 Low severity.

Security Overview //

Security Overview

🔴

Access Control

Vulnerable

14 finding(s) — includes critical severity

🟡

Reentrancy Protection

Needs Attention

3 finding(s) — medium/low severity

🔴

Oracle Security

Vulnerable

1 finding(s) — includes high severity

🟢

Upgrade Safety

Secure

🔴

Input Validation

Vulnerable

16 finding(s) — includes high severity

🟡

Event Logging

Needs Attention

10 finding(s) — medium/low severity

Severity Breakdown

Critical
3
High
13
Medium
9
Low
16
Info
0
2,014Lines of Code
16Contracts Analyzed
20Detectors Run
277msScan Duration

Vulnerability Breakdown

Below is a comprehensive breakdown of the vulnerabilities discovered in your smart contracts. As part of our marketing outreach, we expose the highest-severity vulnerability for free.

Free Security InsightCriticalSWC-105

Missing access control on `transfer()`

cryptokitties.sol:57

Impact

An attacker could call `transfer()` to perform privileged actions such as draining funds, minting tokens, or changing contract configuration.

Description

The sensitive function `transfer` is external but has no access control modifier (e.g., onlyOwner, onlyRole) or inline msg.sender check. Anyone can call this function.

Vulnerable Code

55 54 | function balanceOf(address _owner) public view returns (uint256 balance);
56 55 | function ownerOf(uint256 _tokenId) external view returns (address owner);
57 56 | function approve(address _to, uint256 _tokenId) external;
58 >>> 57 | function transfer(address _to, uint256 _tokenId) external;
59 58 | function transferFrom(address _from, address _to, uint256 _tokenId) external;
60 59 |
61 60 | // Events

Recommendation

Add an access control modifier like `onlyOwner` or use OpenZeppelin's `AccessControl` to restrict who can call `transfer()`.

40 More Issues Detected

The following findings require expert review for full remediation guidance.

Critical

Missing access control on `unpause()`

The sensitive function `unpause` is public but has no access control modifier (e.g., onlyOwner, onlyRole) or inline msg.sender check. Anyone can call this function.

209 | /// compromised. 210 | /// @notice This is public rather than external so it can be called by 211 | /// derived contracts. >>> 212 | function unpause() public onlyCEO whenPaused {

Add an access control modifier like `onlyOwner` or use OpenZeppelin's `AccessControl` to restrict who can call `unpause()`.

Full details available in comprehensive audit
Critical

Missing access control on `unpause()`

The sensitive function `unpause` is public but has no access control modifier (e.g., onlyOwner, onlyRole) or inline msg.sender check. Anyone can call this function.

1990 | /// newContractAddress set either, because then the contract was upgraded. 1991 | /// @notice This is public rather than external so we can call super.unpause 1992 | /// without using an expensive CALL. >>> 1993 | function unpause() public onlyCEO whenPaused {

Add an access control modifier like `onlyOwner` or use OpenZeppelin's `AccessControl` to restrict who can call `unpause()`.

Full details available in comprehensive audit
High

Unchecked `.send()` return value

The return value of `.send()` at line 1063 is not checked. Low-level calls return a boolean indicating success or failure, which must be verified.

1060 | pregnantKitties--; 1061 | 1062 | // Send the balance fee to the person who made birth happen. >>> 1063 | msg.sender.send(autoBirthFee);

Capture and check the return value: `(bool success, ) = addr.send(...); require(success, "Call failed");`

Full details available in comprehensive audit
High

Unchecked `.send()` return value

The return value of `.send()` at line 2010 is not checked. Low-level calls return a boolean indicating success or failure, which must be verified.

2007 | uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee; 2008 | 2009 | if (balance > subtractFees) { >>> 2010 | cfoAddress.send(balance - subtractFees);

Capture and check the return value: `(bool success, ) = addr.send(...); require(success, "Call failed");`

Full details available in comprehensive audit
High

Unprotected arithmetic (`-`) in pre-0.8.0 contract

Line 412 performs `-` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

409 | cooldownIndex: cooldownIndex, 410 | generation: uint16(_generation) 411 | }); >>> 412 | uint256 newKittenId = kitties.push(_kitty) - 1;

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`-`) in pre-0.8.0 contract

Line 634 performs `-` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

631 | /// @notice Returns the total number of Kitties currently in existence. 632 | /// @dev Required for ERC-721 compliance. 633 | function totalSupply() public view returns (uint) { >>> 634 | return kitties.length - 1;

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`-=`) in pre-0.8.0 contract

Line 686 performs `-=` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

683 | /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol 684 | function _memcpy(uint _dest, uint _src, uint _len) private view { 685 | // Copy word-length chunks while possible >>> 686 | for(; _len >= 32; _len -= 32) {

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`+=`) in pre-0.8.0 contract

Line 690 performs `+=` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

687 | assembly { 688 | mstore(_dest, mload(_src)) 689 | } >>> 690 | _dest += 32;

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`+=`) in pre-0.8.0 contract

Line 691 performs `+=` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

688 | mstore(_dest, mload(_src)) 689 | } 690 | _dest += 32; >>> 691 | _src += 32;

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`-`) in pre-0.8.0 contract

Line 695 performs `-` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

692 | } 693 | 694 | // Copy remaining bytes >>> 695 | uint256 mask = 256 ** (32 - _len) - 1;

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`+`) in pre-0.8.0 contract

Line 796 performs `+` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

793 | /// @param _kitten A reference to the Kitty in storage which needs its timer started. 794 | function _triggerCooldown(Kitty storage _kitten) internal { 795 | // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex). >>> 796 | _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`+=`) in pre-0.8.0 contract

Line 802 performs `+=` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

799 | // cooldowns array. We could check the array size dynamically, but hard-coding 800 | // this as a constant saves gas. Yay, Solidity! 801 | if (_kitten.cooldownIndex < 13) { >>> 802 | _kitten.cooldownIndex += 1;

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`-`) in pre-0.8.0 contract

Line 1049 performs `-` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

1046 | } 1047 | 1048 | // Call the sooper-sekret gene mixing operation. >>> 1049 | uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

Unprotected arithmetic (`+`) in pre-0.8.0 contract

Line 1053 performs `+` arithmetic in a Solidity <0.8.0 contract without SafeMath. This can silently overflow or underflow.

1050 | 1051 | // Make the new kitten! 1052 | address owner = kittyIndexToOwner[_matronId]; >>> 1053 | uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);

Use OpenZeppelin's SafeMath library for all arithmetic operations, or upgrade to Solidity >=0.8.0 which has built-in overflow checks.

Full details available in comprehensive audit
High

`balanceOf()` used in arithmetic (potential price oracle)

Line 328 uses `balanceOf()` in an arithmetic expression, which may derive a spot price that is manipulable via flash loans.

325 | mapping (uint256 => address) public kittyIndexToOwner; 326 | 327 | // @dev A mapping from owner address to count of tokens that address owns. >>> 328 | // Used internally inside balanceOf() to resolve ownership count.

Use TWAP or Chainlink oracles instead of spot balance calculations.

Full details available in comprehensive audit
Medium

Missing reentrancy guard on `giveBirth`

Function `giveBirth` contains external calls but lacks a `nonReentrant` modifier. While it may follow CEI, a guard provides defense-in-depth.

1060 | pregnantKitties--; 1061 | 1062 | // Send the balance fee to the person who made birth happen. >>> 1063 | msg.sender.send(autoBirthFee);

Add OpenZeppelin's `ReentrancyGuard` and apply `nonReentrant` to functions with external calls.

Full details available in comprehensive audit
Medium

Missing reentrancy guard on `withdrawBalance`

Function `withdrawBalance` contains external calls but lacks a `nonReentrant` modifier. While it may follow CEI, a guard provides defense-in-depth.

1405 | msg.sender == nftAddress 1406 | ); 1407 | // We are using this boolean method to make sure that even if one fails it will still work >>> 1408 | bool res = nftAddress.send(this.balance);

Add OpenZeppelin's `ReentrancyGuard` and apply `nonReentrant` to functions with external calls.

Full details available in comprehensive audit
Medium

Missing reentrancy guard on `withdrawBalance`

Function `withdrawBalance` contains external calls but lacks a `nonReentrant` modifier. While it may follow CEI, a guard provides defense-in-depth.

2007 | uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee; 2008 | 2009 | if (balance > subtractFees) { >>> 2010 | cfoAddress.send(balance - subtractFees);

Add OpenZeppelin's `ReentrancyGuard` and apply `nonReentrant` to functions with external calls.

Full details available in comprehensive audit
Medium

`bid()` lacks slippage and deadline protection

Function `bid` at line 1449 appears to perform a swap/trade operation but has no slippage protection (minAmountOut) or deadline parameter. This makes it highly vulnerable to sandwich attacks and MEV extraction.

1446 | /// @dev Bids on an open auction, completing the auction and transferring 1447 | /// ownership of the NFT if enough Ether is supplied. 1448 | /// @param _tokenId - ID of token to bid on. >>> 1449 | function bid(uint256 _tokenId)

Add a `minAmountOut` or equivalent slippage parameter and a `deadline` parameter. Validate both with require statements.

Full details available in comprehensive audit
Medium

`bid()` lacks slippage and deadline protection

Function `bid` at line 1577 appears to perform a swap/trade operation but has no slippage protection (minAmountOut) or deadline parameter. This makes it highly vulnerable to sandwich attacks and MEV extraction.

1574 | /// is the KittyCore contract because all bid methods 1575 | /// should be wrapped. Also returns the kitty to the 1576 | /// seller rather than the winner. >>> 1577 | function bid(uint256 _tokenId)

Add a `minAmountOut` or equivalent slippage parameter and a `deadline` parameter. Validate both with require statements.

Full details available in comprehensive audit
Medium

`bid()` lacks slippage and deadline protection

Function `bid` at line 1647 appears to perform a swap/trade operation but has no slippage protection (minAmountOut) or deadline parameter. This makes it highly vulnerable to sandwich attacks and MEV extraction.

1644 | 1645 | /// @dev Updates lastSalePrice if seller is the nft contract 1646 | /// Otherwise, works the same as default bid method. >>> 1647 | function bid(uint256 _tokenId)

Add a `minAmountOut` or equivalent slippage parameter and a `deadline` parameter. Validate both with require statements.

Full details available in comprehensive audit
Medium

`bidOnSiringAuction()` lacks slippage and deadline protection

Function `bidOnSiringAuction` at line 1773 appears to perform a swap/trade operation but has no slippage protection (minAmountOut) or deadline parameter. This makes it highly vulnerable to sandwich attacks and MEV extraction.

1770 | /// Immediately breeds the winning matron with the sire on auction. 1771 | /// @param _sireId - ID of the sire on auction. 1772 | /// @param _matronId - ID of the matron owned by the bidder. >>> 1773 | function bidOnSiringAuction(

Add a `minAmountOut` or equivalent slippage parameter and a `deadline` parameter. Validate both with require statements.

Full details available in comprehensive audit
Medium

Locked Ether: contract receives Ether but lacks withdrawal function

Contract `SiringClockAuction` is designed to receive Ether (it defines payable functions, `receive()`, or `fallback()`), but it has no visible function to withdraw or transfer Ether back out. Any Ether sent to this contract will be permanently locked and unrecoverable.

1526 | 1527 | /// @title Reverse auction modified for siring 1528 | /// @notice We omit a fallback function to prevent accidental sends to this contract. >>> 1529 | contract SiringClockAuction is ClockAuction {

Implement a secure administrative withdrawal function (e.g. `withdraw()`) restricted to the contract owner/admin that transfers the contract's balance to an authorized address.

Full details available in comprehensive audit
Medium

Locked Ether: contract receives Ether but lacks withdrawal function

Contract `SaleClockAuction` is designed to receive Ether (it defines payable functions, `receive()`, or `fallback()`), but it has no visible function to withdraw or transfer Ether back out. Any Ether sent to this contract will be permanently locked and unrecoverable.

1595 | 1596 | /// @title Clock auction modified for sale of kitties 1597 | /// @notice We omit a fallback function to prevent accidental sends to this contract. >>> 1598 | contract SaleClockAuction is ClockAuction {

Implement a secure administrative withdrawal function (e.g. `withdraw()`) restricted to the contract owner/admin that transfers the contract's balance to an authorized address.

Full details available in comprehensive audit
Low

Floating pragma: `pragma solidity ^0.4.11`

The Solidity version pragma `^0.4.11` is not locked to a specific compiler version. Different compiler versions may introduce different behavior, optimizations, or bugs.

2 | *Submitted for verification at Etherscan.io on 2017-11-28 3 | */ 4 | >>> 5 | pragma solidity ^0.4.11;

Lock the pragma to a specific version, e.g., `pragma solidity 0.8.20;`. Use the latest stable version for new contracts.

Full details available in comprehensive audit
Low

State-changing function `setCEO` does not emit an event

The function `setCEO` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

162 | 163 | /// @dev Assigns a new address to act as the CEO. Only available to the current CEO. 164 | /// @param _newCEO The address of the new CEO >>> 165 | function setCEO(address _newCEO) external onlyCEO {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `setCFO` does not emit an event

The function `setCFO` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

170 | 171 | /// @dev Assigns a new address to act as the CFO. Only available to the current CEO. 172 | /// @param _newCFO The address of the new CFO >>> 173 | function setCFO(address _newCFO) external onlyCEO {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `setCOO` does not emit an event

The function `setCOO` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

178 | 179 | /// @dev Assigns a new address to act as the COO. Only available to the current CEO. 180 | /// @param _newCOO The address of the new COO >>> 181 | function setCOO(address _newCOO) external onlyCEO {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `pause` does not emit an event

The function `pause` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

200 | 201 | /// @dev Called by any "C-level" role to pause the contract. Used only when 202 | /// a bug or exploit is detected and we need to limit damage. >>> 203 | function pause() external onlyCLevel whenNotPaused {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `unpause` does not emit an event

The function `unpause` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

209 | /// compromised. 210 | /// @notice This is public rather than external so it can be called by 211 | /// derived contracts. >>> 212 | function unpause() public onlyCEO whenPaused {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `setSecondsPerBlock` does not emit an event

The function `setSecondsPerBlock` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

432 | } 433 | 434 | // Any C-level can fix how many seconds per blocks are currently observed. >>> 435 | function setSecondsPerBlock(uint256 secs) external onlyCLevel {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `setMetadataAddress` does not emit an event

The function `setMetadataAddress` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

506 | 507 | /// @dev Set the address of the sibling contract that tracks metadata. 508 | /// CEO only. >>> 509 | function setMetadataAddress(address _contractAddress) public onlyCEO {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `setGeneScienceAddress` does not emit an event

The function `setGeneScienceAddress` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

756 | 757 | /// @dev Update the address of the genetic contract, can only be called by the CEO. 758 | /// @param _address An address of a GeneScience contract instance to be used from this point forward. >>> 759 | function setGeneScienceAddress(address _address) external onlyCEO {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `approveSiring` does not emit an event

The function `approveSiring` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

807 | /// @param _addr The address that will be able to sire with your Kitty. Set to 808 | /// address(0) to clear all siring approvals for this Kitty. 809 | /// @param _sireId A Kitty that you own that _addr will now be able to sire with. >>> 810 | function approveSiring(address _addr, uint256 _sireId)

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

State-changing function `setAutoBirthFee` does not emit an event

The function `setAutoBirthFee` is public/external and mutates state variables, but it does not emit any events. Emitting events is a standard security practice in Solidity to facilitate off-chain tracking, indexing, and security monitoring.

818 | /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only 819 | /// be called by the COO address. (This fee is used to offset the gas cost incurred 820 | /// by the autobirth daemon). >>> 821 | function setAutoBirthFee(uint256 val) external onlyCOO {

Define an event and emit it at the end of the state-changing operations in this function, passing relevant arguments (like old and new values).

Full details available in comprehensive audit
Low

Timestamp dependence in `if` condition

Line 1253 uses `block.timestamp` inside an `if` condition. Since block.timestamp can be slightly manipulated by miners, using it in critical control structures carries a minor security risk.

1250 | // A bit of insurance against negative values (or wraparound). 1251 | // Probably not necessary (since Ethereum guarnatees that the 1252 | // now variable doesn't ever go backwards). >>> 1253 | if (now > _auction.startedAt) {

Use block numbers for coarse time estimation if appropriate, or ensure the design accommodates a timestamp variance of up to 15 minutes.

Full details available in comprehensive audit
Low

Missing zero-address check for parameter `_owner`

Function or constructor `tokensOfOwner` accepts address parameter `_owner` but does not validate if it is the zero address (`address(0)`). Setting critical state variables or roles to the zero address by mistake can cause loss of ownership, permanently locked contracts, or unexpected resets.

652 | /// expensive (it walks the entire Kitty array looking for cats belonging to owner), 653 | /// but it also returns a dynamic array, which is only supported for web3 calls, and 654 | /// not contract-to-contract calls. >>> 655 | function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {

Add a require statement or validation check: `require(_owner != address(0), "Invalid address");` at the beginning of the function.

Full details available in comprehensive audit
Low

Missing zero-address check for parameter `_nftAddress`

Function or constructor `ClockAuction` accepts address parameter `_nftAddress` but does not validate if it is the zero address (`address(0)`). Setting critical state variables or roles to the zero address by mistake can cause loss of ownership, permanently locked contracts, or unexpected resets.

1384 | /// the Nonfungible Interface. 1385 | /// @param _cut - percent cut the owner takes on each auction, must be 1386 | /// between 0-10,000. >>> 1387 | function ClockAuction(address _nftAddress, uint256 _cut) public {

Add a require statement or validation check: `require(_nftAddress != address(0), "Invalid address");` at the beginning of the function.

Full details available in comprehensive audit
Low

Missing zero-address check for parameter `_nftAddr`

Function or constructor `SiringClockAuction` accepts address parameter `_nftAddr` but does not validate if it is the zero address (`address(0)`). Setting critical state variables or roles to the zero address by mistake can cause loss of ownership, permanently locked contracts, or unexpected resets.

1533 | bool public isSiringClockAuction = true; 1534 | 1535 | // Delegate constructor >>> 1536 | function SiringClockAuction(address _nftAddr, uint256 _cut) public

Add a require statement or validation check: `require(_nftAddr != address(0), "Invalid address");` at the beginning of the function.

Full details available in comprehensive audit
Low

Missing zero-address check for parameter `_nftAddr`

Function or constructor `SaleClockAuction` accepts address parameter `_nftAddr` but does not validate if it is the zero address (`address(0)`). Setting critical state variables or roles to the zero address by mistake can cause loss of ownership, permanently locked contracts, or unexpected resets.

1606 | uint256[5] public lastGen0SalePrices; 1607 | 1608 | // Delegate constructor >>> 1609 | function SaleClockAuction(address _nftAddr, uint256 _cut) public

Add a require statement or validation check: `require(_nftAddr != address(0), "Invalid address");` at the beginning of the function.

Full details available in comprehensive audit

Our automated scan found 41 issues. Our expert auditors go deeper — covering logic bugs, economic attack vectors, and cross-contract interactions that automated tools miss.

Initiate Secure Audit Request

Or email us at audit@0xram.com (Contact form is preferred for priority review)

Secure Your Protocol
Before Launch

This automated scan is just the surface. Our team of expert auditors conducts line-by-line manual reviews, formal verification, and economic simulations to ensure your protocol is battle-tested.

Initiate Priority Audit Intake

Or email us at audit@0xram.com (Contact form preferred for priority queueing)

145+
Protocols
$4.82B+
TVL Secured
0
Post-Audit Exploits

© 2026 0xRAM Labs. All rights reserved.

Disclaimer: This report was dynamically generated by our automated static analyzer. It does not replace a comprehensive, line-by-line manual code audit by senior cryptographers.