🚧 This documentation is currently under development. Content may be incomplete or subject to change. 🚧
Skip to content

Safe Arithmetic ​

Same operations as core arithmetic, but returning two handles: (ebool success, result). When success is false, the result is always 0.

Use safe arithmetic when your contract needs to detect and handle overflow or underflow without leaking information through transaction reverts.

Supported types: euint16, euint256, eint16, eint256

Usage ​

solidity
(ebool ok, euint256 newBalance) = Nox.safeAdd(balance, amount);
// Use select to keep the old balance on failure
euint256 finalBalance = Nox.select(ok, newBalance, balance);
Nox.allowThis(finalBalance);

safeAdd ​

solidity
function safeAdd(euint256 a, euint256 b) internal returns (ebool success, euint256 result)

Addition with overflow detection. Returns success = false and result = 0 on overflow.

  • Unsigned: success = false when a + b > MAX
  • Signed: success = false when the result exceeds MAX or goes below MIN
Example (Uint8)successresultReason
SafeAdd(200, 100)false0Overflow
SafeAdd(255, 1)false0Overflow
SafeAdd(200, 55)true255No overflow
SafeAdd(100, 50)true150No overflow
SafeAdd(0, 0)true0No overflow
Example (Int8)successresultReason
SafeAdd(127, 1)false0Positive overflow
SafeAdd(-128, -1)false0Negative overflow
SafeAdd(100, 20)true120No overflow
SafeAdd(-50, -50)true-100No overflow

safeSub ​

solidity
function safeSub(euint256 a, euint256 b) internal returns (ebool success, euint256 result)

Subtraction with underflow detection. Returns success = false and result = 0 on underflow.

  • Unsigned: success = false when a - b < 0
  • Signed: success = false when the result exceeds MAX or goes below MIN
Example (Uint8)successresultReason
SafeSub(0, 1)false0Underflow
SafeSub(50, 100)false0Underflow
SafeSub(100, 50)true50No underflow
SafeSub(0, 0)true0No underflow
Example (Int8)successresultReason
SafeSub(-128, 1)false0Signed underflow
SafeSub(127, -1)false0Equivalent to 127 + 1, overflow
SafeSub(0, 0)true0No underflow

safeMul ​

solidity
function safeMul(euint256 a, euint256 b) internal returns (ebool success, euint256 result)

Multiplication with overflow detection. Returns success = false and result = 0 on overflow.

  • Unsigned: success = false when a * b > MAX
  • Signed: success = false when the result exceeds MAX or goes below MIN
Example (Uint8)successresultReason
SafeMul(16, 16)false0Overflow
SafeMul(15, 17)false0Overflow
SafeMul(15, 16)true240No overflow
SafeMul(0, x)true0Zero is absorbing
SafeMul(1, x)truexIdentity, no overflow
Example (Int8)successresultReason
SafeMul(-128, -1)false0Overflow (128 > MAX)
SafeMul(127, 2)false0Overflow
SafeMul(64, 2)false0Overflow (128 > MAX)
SafeMul(-1, -1)true1No overflow
SafeMul(63, 2)true126No overflow

safeDiv ​

solidity
function safeDiv(euint256 a, euint256 b) internal returns (ebool success, euint256 result)

Division with error detection. Returns success = false and result = 0 on division by zero or signed overflow (MIN / -1).

  • Unsigned: success = false when dividing by zero
  • Signed: success = false when dividing by zero or MIN / -1
Example (Uint8)successresultReason
SafeDiv(255, 0)false0Division by zero
SafeDiv(0, 0)false0Division by zero
SafeDiv(100, 3)true33Normal division
SafeDiv(1, 2)true0Truncated toward zero
SafeDiv(0, 5)true0Zero numerator
Example (Int8)successresultReason
SafeDiv(100, 0)false0Division by zero
SafeDiv(0, 0)false0Division by zero
SafeDiv(-128, -1)false0Signed overflow (MIN / -1)
SafeDiv(-7, 2)true-3Truncated toward zero (not floor)
SafeDiv(50, 5)true10Normal division