Repository: equilibria-xyz/root
Pull request #126: Return price from Synbook6
Author: login: prateekdefi
Created: 2025-04-09T12:26:37Z | Merged: 2025-04-15T03:42:48Z

Issue: https://linear.app/perennial/issue/PE-2422/[root]-make-synbook6-return-price-instead-of-spread


Diff:
diff --git a/src/synbook/types/SynBook6.sol b/src/synbook/types/SynBook6.sol
index 2f51acb..0d61fbe 100644
--- a/src/synbook/types/SynBook6.sol
+++ b/src/synbook/types/SynBook6.sol
@@ -2,7 +2,7 @@
 pragma solidity ^0.8.13;
 
 import { Fixed6, Fixed6Lib } from "src/number/types/Fixed6.sol";
-import { UFixed6 } from "src/number/types/UFixed6.sol";
+import { UFixed6, UFixed6Lib } from "src/number/types/UFixed6.sol";
 
 /// @dev SynBook6 type
 struct SynBook6 {
@@ -22,25 +22,33 @@ library SynBook6Lib {
     /// @param latest The latest skew in asset terms
     /// @param change The change in skew in asset terms
     /// @param price The price of the underlying asset
-    /// @return The spread in dollar terms
+    /// @return newPrice The price of a given order amount based on the synbook for the account
     function compute(
         SynBook6 memory self,
         Fixed6 latest,
         Fixed6 change,
         UFixed6 price
-    ) internal pure returns (Fixed6) {
-        // sign = 1 for buy / ask and -1 for sell / bid, use f(-x) for sell orders
-        if (change < Fixed6Lib.ZERO) {
-            latest = latest * Fixed6Lib.NEG_ONE;
-            change = change * Fixed6Lib.NEG_ONE;
-        }
+    ) internal pure returns (UFixed6) {
+        // sign = 1 for buy / ask and -1 for sell / bid
+        bool isAsk = change > Fixed6Lib.ZERO;
+
+        // use -f(-x) for ask orders
+        latest = _flipIfAsk(latest, isAsk);
+        change = _flipIfAsk(change, isAsk);
 
         Fixed6 from = latest / Fixed6Lib.from(self.scale);
         Fixed6 to = (latest + change) / Fixed6Lib.from(self.scale);
-        UFixed6 notional = change.abs() * price;
+        Fixed6 spread = _indefinite(self.d0, self.d1, self.d2, self.d3, to, price)
+            - _indefinite(self.d0, self.d1, self.d2, self.d3, from, price);
+
+        // use -f(-x) for ask orders
+        spread = _flipIfAsk(spread, isAsk);
 
-        return _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
-            - _indefinite(self.d0, self.d1, self.d2, self.d3, from, notional);
+        return UFixed6Lib.unsafeFrom(Fixed6Lib.from(price) + spread);
+    }
+
+    function _flipIfAsk(Fixed6 value, bool isAsk) private pure returns (Fixed6) {
+        return isAsk ? value * Fixed6Lib.NEG_ONE : value;
     }
 
     /// @dev f(x) = d0 * x + d1 * x^2 / 2 + d2 * x^3 / 3 + d3 * x^4 / 4
@@ -50,18 +58,18 @@ library SynBook6Lib {
         UFixed6 d2,
         UFixed6 d3,
         Fixed6 value,
-        UFixed6 notional
+        UFixed6 price
     ) private pure returns (Fixed6 result) {
         // d0 * x
-        result = Fixed6Lib.from(notional) * value * Fixed6Lib.from(d0);
+        result = Fixed6Lib.from(price) * value * Fixed6Lib.from(d0);
 
         // d1 * x^2 / 2
-        result = result + (Fixed6Lib.from(notional) * value * value * Fixed6Lib.from(d1) / Fixed6Lib.from(2));
+        result = result + (Fixed6Lib.from(price) * value * value * Fixed6Lib.from(d1) / Fixed6Lib.from(2));
 
         // d2 * x^3 / 3
-        result = result + (Fixed6Lib.from(notional) * value * value * value *  Fixed6Lib.from(d2) / Fixed6Lib.from(3));
+        result = result + (Fixed6Lib.from(price) * value * value * value *  Fixed6Lib.from(d2) / Fixed6Lib.from(3));
 
         // d3 * x^4 / 4
-        result = result + (Fixed6Lib.from(notional) * value * value * value * value * Fixed6Lib.from(d3) / Fixed6Lib.from(4));
+        result = result + (Fixed6Lib.from(price) * value * value * value * value * Fixed6Lib.from(d3) / Fixed6Lib.from(4));
     }
 }
diff --git a/test/synbook/SynBook6.t.sol b/test/synbook/SynBook6.t.sol
index a70ed60..857fee3 100644
--- a/test/synbook/SynBook6.t.sol
+++ b/test/synbook/SynBook6.t.sol
@@ -30,109 +30,109 @@ contract SynBook6Test is RootTest {
     }
 
     function test_computeCurve1ZeroSkew() public view {
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.ZERO, Fixed6Lib.ZERO, price),
-            Fixed6Lib.ZERO,
+            price,
             "zero skew, zero change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.ZERO, Fixed6Lib.from(100), price),
-            Fixed6.wrap(2467175), // 2.467175
+            price + UFixed6.wrap(24611), // price + (2.467175 / price)
             "zero skew, positive change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.ZERO, Fixed6Lib.from(-100), price),
-            Fixed6.wrap(2467175), // 2.467175
+            price - UFixed6.wrap(24611), // price - (2.467175 / price)
             "zero skew, negative change"
         );
     }
 
     function test_computeCurve1PositiveSkew() public view {
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.from(200), Fixed6Lib.ZERO, price),
-            Fixed6Lib.ZERO,
+            price,
             "positive skew, zero change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.from(200), Fixed6Lib.from(100), price),
-            Fixed6.wrap(2737775), // 2.737775
+            price + UFixed6.wrap(23381), // price + (2.737775 / price)
             "positive skew, positive change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.from(200), Fixed6Lib.from(-100), price),
-            Fixed6.wrap(2442575), // 2.442575
+            price - UFixed6.wrap(25349), // price - (2.442575 / price)
             "positive skew, negative change"
         );
     }
 
     function test_computeCurve1NegativeSkew() public view {
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.from(-200), Fixed6Lib.ZERO, price),
-            Fixed6Lib.ZERO,
+            price,
             "negative skew, zero change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.from(-200), Fixed6Lib.from(100), price),
-            Fixed6.wrap(2442575), // 2.442575
+            price + UFixed6.wrap(25349), // price + (2.442575 / price)
             "negative skew, positive change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve1.compute(Fixed6Lib.from(-200), Fixed6Lib.from(-100), price),
-            Fixed6.wrap(2737775), // 2.737775
+            price - UFixed6.wrap(23381), // price - (2.737775 / price)
             "negative skew, negative change"
         );
     }
 
     function test_computeCurve2ZeroSkew() public view {
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.ZERO, Fixed6Lib.ZERO, price),
-            Fixed6Lib.ZERO,
+            price,
             "zero skew, zero change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.ZERO, Fixed6Lib.from(100), price),
-            Fixed6.wrap(2713175), // 2.713175
+            price + UFixed6.wrap(22151), // price + (2.713175 / price)
             "zero skew, positive change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.ZERO, Fixed6Lib.from(-100), price),
-            Fixed6.wrap(2713175), // 2.713175
+            price - UFixed6.wrap(22151), // price - (2.713175 / price)
             "zero skew, negative change"
         );
     }
 
     function test_computeCurve2PositiveSkew() public view {
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.from(200), Fixed6Lib.ZERO, price),
-            Fixed6Lib.ZERO,
+            price,
             "positive skew, zero change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.from(200), Fixed6Lib.from(100), price),
-            Fixed6.wrap(3967775), // 3.967775
+            price + UFixed6.wrap(11081), // price + (3.967775 / price)
             "positive skew, positive change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.from(200), Fixed6Lib.from(-100), price),
-            Fixed6.wrap(1704575), // 1.704575
+            price - UFixed6.wrap(32729), // price - (1.704575 / price)
             "positive skew, negative change"
         );
     }
 
     function test_computeCurve2NegativeSkew() public view {
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.from(-200), Fixed6Lib.ZERO, price),
-            Fixed6Lib.ZERO,
+            price,
             "negative skew, zero change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.from(-200), Fixed6Lib.from(100), price),
-            Fixed6.wrap(1704575), // 1.704575
+            price + UFixed6.wrap(32729), // price + (1.704575 / price)
             "negative skew, positive change"
         );
-        assertFixed6Eq(
+        assertUFixed6Eq(
             curve2.compute(Fixed6Lib.from(-200), Fixed6Lib.from(-100), price),
-            Fixed6.wrap(3967775), // 3.967775
+            price - UFixed6.wrap(11081), // price - (3.967775 / price)
             "negative skew, negative change"
         );
     }


Reviews:
user: login: prateekdefi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T13:44:42Z
user: login: kbrizzle
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-13T01:48:04Z
user: login: prateekdefi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T09:56:56Z
user: login: kbrizzle
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T14:36:11Z
user: login: kbrizzle
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T03:42:43Z

Review comments:
diff_hunk: @@ -42,8 +43,12 @@ library SynBook6Lib {
         Fixed6 to = latest.add(change).div(Fixed6Lib.from(self.scale));
         UFixed6 notional = change.abs().mul(price);
 
-        return _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
+        Fixed6 spread = _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
             .sub(_indefinite(self.d0, self.d1, self.d2, self.d3, from, notional));
+
+        newPrice = isSkewChangePositive
+            ? price.add(spread.abs().div(price))   // long, positive spread raises quote
path: src/synbook/types/SynBook6.sol
user: login: prateekdefi
body: The logic `UFixed6Lib.from(Fixed6Lib.from(notional).add(spread)).div(priceU)` in `SynbookQuoter.sol` loses precision when price is multiplied by amount and again divided by price. `price.add(spread.abs().div(price))` avoids that precision loss.
created_at: 2025-04-09T13:44:42Z
author_association: CONTRIBUTOR
diff_hunk: @@ -42,8 +43,12 @@ library SynBook6Lib {
         Fixed6 to = latest.add(change).div(Fixed6Lib.from(self.scale));
         UFixed6 notional = change.abs().mul(price);
 
-        return _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
+        Fixed6 spread = _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
path: src/synbook/types/SynBook6.sol
user: login: kbrizzle
body: We can simplify this like this:

```
Fixed6 newPrice = price
    .add(_indefinite(self.d0, self.d1, self.d2, self.d3, to, price))
    .sub(_indefinite(self.d0, self.d1, self.d2, self.d3, from, price));
```

This allows us to forgo the other changes here.
created_at: 2025-04-13T01:47:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -42,8 +43,12 @@ library SynBook6Lib {
         Fixed6 to = latest.add(change).div(Fixed6Lib.from(self.scale));
         UFixed6 notional = change.abs().mul(price);
 
-        return _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
+        Fixed6 spread = _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
             .sub(_indefinite(self.d0, self.d1, self.d2, self.d3, from, notional));
+
+        newPrice = isSkewChangePositive
+            ? price.add(spread.abs().div(price))   // long, positive spread raises quote
+            : price.sub(spread.abs().div(price));  // short, positive spread lowers quote
     }
 
     /// @dev f(x) = d0 * x + d1 * x^2 / 2 + d2 * x^3 / 3 + d3 * x^4 / 4
path: src/synbook/types/SynBook6.sol
user: login: kbrizzle
body: we'll need to update `notional` -> `price` here just for naming purposes
created_at: 2025-04-13T01:47:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -42,8 +43,12 @@ library SynBook6Lib {
         Fixed6 to = latest.add(change).div(Fixed6Lib.from(self.scale));
         UFixed6 notional = change.abs().mul(price);
 
-        return _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
+        Fixed6 spread = _indefinite(self.d0, self.d1, self.d2, self.d3, to, notional)
path: src/synbook/types/SynBook6.sol
user: login: prateekdefi
body: Updated in [205f6a0](https://github.com/equilibria-xyz/root/pull/126/commits/205f6a0caa68a900c4de3ffb9551a8f987300b2d). 
created_at: 2025-04-14T09:56:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,25 +22,19 @@ library SynBook6Lib {
     /// @param latest The latest skew in asset terms
     /// @param change The change in skew in asset terms
     /// @param price The price of the underlying asset
-    /// @return The spread in dollar terms
+    /// @return newPrice The price of a given order amount based on the synbook for the account
     function compute(
         SynBook6 memory self,
         Fixed6 latest,
         Fixed6 change,
         UFixed6 price
-    ) internal pure returns (Fixed6) {
-        // sign = 1 for buy / ask and -1 for sell / bid, use f(-x) for sell orders
-        if (change < Fixed6Lib.ZERO) {
path: src/synbook/types/SynBook6.sol
user: login: kbrizzle
body: this section we still need, this was part of the original logic
created_at: 2025-04-14T14:36:11Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-04-09T12:27:59Z
body: # Slither report
  <details><summary>Static Analysis Report</summary>**THIS CHECKLIST IS NOT COMPLETE**. Use `--show-ignored-findings` to show all the results.
Summary
 - [unused-return](#unused-return) (4 results) (Medium)
 - [missing-zero-check](#missing-zero-check) (2 results) (Low)
 - [reentrancy-benign](#reentrancy-benign) (1 results) (Low)
 - [reentrancy-events](#reentrancy-events) (3 results) (Low)
 - [dead-code](#dead-code) (49 results) (Informational)
 - [solc-version](#solc-version) (2 results) (Informational)
 - [naming-convention](#naming-convention) (4 results) (Informational)
 - [too-many-digits](#too-many-digits) (1 results) (Informational)
## unused-return
Impact: Medium
Confidence: Medium
 - [ ] ID-0
[Token6Lib.approve(Token6,address)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token6.sol#L42-L44) ignores return value by [IERC20(Token6.unwrap(self)).approve(grantee,type()(uint256).max)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token6.sol#L43)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token6.sol#L42-L44


 - [ ] ID-1
[Token18Lib.approve(Token18,address)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token18.sol#L42-L44) ignores return value by [IERC20(Token18.unwrap(self)).approve(grantee,type()(uint256).max)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token18.sol#L43)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token18.sol#L42-L44


 - [ ] ID-2
[Token6Lib.approve(Token6,address,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token6.sol#L53-L55) ignores return value by [IERC20(Token6.unwrap(self)).approve(grantee,UFixed6.unwrap(amount))](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token6.sol#L54)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token6.sol#L53-L55


 - [ ] ID-3
[Token18Lib.approve(Token18,address,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token18.sol#L52-L54) ignores return value by [IERC20(Token18.unwrap(self)).approve(grantee,UFixed18.unwrap(amount))](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token18.sol#L53)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token18.sol#L52-L54


## missing-zero-check
Impact: Low
Confidence: Medium
 - [ ] ID-4
[Ownable.updatePendingOwner(address).newPendingOwner](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Ownable.sol#L30) lacks a zero-check on :
		- [_pendingOwner = newPendingOwner](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Ownable.sol#L31)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Ownable.sol#L30


 - [ ] ID-5
[Pausable.updatePauser(address).newPauser](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Pausable.sol#L32) lacks a zero-check on :
		- [_pauser = newPauser](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Pausable.sol#L33)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Pausable.sol#L32


## reentrancy-benign
Impact: Low
Confidence: Medium
 - [ ] ID-6
Reentrancy in [VerifierBase.cancelGroupWithSignature(GroupCancellation,bytes)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L55-L58):
	External calls:
	- [IVerifierBase(this).verifyGroupCancellation(groupCancellation,signature)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L56)
	State variables written after the call(s):
	- [_cancelGroup(groupCancellation.common.account,groupCancellation.group)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L57)
		- [groups[account][group] = true](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L80)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L55-L58


## reentrancy-events
Impact: Low
Confidence: Medium
 - [ ] ID-7
Reentrancy in [VerifierBase.cancelGroupWithSignature(GroupCancellation,bytes)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L55-L58):
	External calls:
	- [IVerifierBase(this).verifyGroupCancellation(groupCancellation,signature)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L56)
	Event emitted after the call(s):
	- [GroupCancelled(account,group)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L81)
		- [_cancelGroup(groupCancellation.common.account,groupCancellation.group)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L57)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L55-L58


 - [ ] ID-8
Reentrancy in [Factory._create(bytes)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L42-L45):
	External calls:
	- [newInstance = IInstance(address(new BeaconProxy(address(this),data)))](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L43)
	Event emitted after the call(s):
	- [InstanceRegistered(newInstance)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L73)
		- [_register(newInstance)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L44)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L42-L45


 - [ ] ID-9
Reentrancy in [Factory._create2(bytes,bytes32)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L51-L54):
	External calls:
	- [newInstance = IInstance(address(new BeaconProxy(address(this),data)))](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L52)
	Event emitted after the call(s):
	- [InstanceRegistered(newInstance)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L73)
		- [_register(newInstance)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L53)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L51-L54


## dead-code
Impact: Informational
Confidence: Medium
 - [ ] ID-10
[eq(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L273-L275) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L273-L275


 - [ ] ID-11
[add(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L272-L274) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L272-L274


 - [ ] ID-12
[Factory._register(IInstance)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L71-L74) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L71-L74


 - [ ] ID-13
[eq(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L280-L282) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L280-L282


 - [ ] ID-14
[add(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L264-L266) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L264-L266


 - [ ] ID-15
[mul(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L288-L290) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L288-L290


 - [ ] ID-16
[eq(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L304-L306) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L304-L306


 - [ ] ID-17
[gt(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L296-L299) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L296-L299


 - [ ] ID-18
[neq(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L312-L314) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L312-L314


 - [ ] ID-19
[mul(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L280-L282) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L280-L282


 - [ ] ID-20
[gt(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L320-L323) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L320-L323


 - [ ] ID-21
[lt(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L298-L301) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L298-L301


 - [ ] ID-22
[div(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L265-L267) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L265-L267


 - [ ] ID-23
[gte(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L314-L316) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L314-L316


 - [ ] ID-24
[sub(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L280-L282) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L280-L282


 - [ ] ID-25
[gte(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L338-L340) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L338-L340


 - [ ] ID-26
[Pausable.__Pausable__initialize()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Pausable.sol#L24-L27) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Pausable.sol#L24-L27


 - [ ] ID-27
[mul(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L264-L266) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L264-L266


 - [ ] ID-28
[lte(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L346-L348) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L346-L348


 - [ ] ID-29
[Instance.__Instance__initialize()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Instance.sol#L19-L21) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Instance.sol#L19-L21


 - [ ] ID-30
[lte(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L315-L317) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L315-L317


 - [ ] ID-31
[mul(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L257-L259) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L257-L259


 - [ ] ID-32
[lt(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L329-L332) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L329-L332


 - [ ] ID-33
[div(Fixed6,Fixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L296-L298) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L296-L298


 - [ ] ID-34
[neq(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L281-L283) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L281-L283


 - [ ] ID-35
[Factory.__Factory__initialize()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L27-L29) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L27-L29


 - [ ] ID-36
[div(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L288-L290) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L288-L290


 - [ ] ID-37
[lt(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L305-L308) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L305-L308


 - [ ] ID-38
[Ownable.__Ownable__initialize()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Ownable.sol#L22-L25) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Ownable.sol#L22-L25


 - [ ] ID-39
[lt(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L321-L324) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L321-L324


 - [ ] ID-40
[gt(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L312-L315) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L312-L315


 - [ ] ID-41
[lte(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L338-L340) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L338-L340


 - [ ] ID-42
[eq(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L296-L298) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L296-L298


 - [ ] ID-43
[sub(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L249-L251) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L249-L251


 - [ ] ID-44
[neq(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L288-L290) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L288-L290


 - [ ] ID-45
[gt(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L289-L292) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L289-L292


 - [ ] ID-46
[gte(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L307-L309) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L307-L309


 - [ ] ID-47
[sub(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L256-L258) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L256-L258


 - [ ] ID-48
[Factory._create2(bytes,bytes32)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L51-L54) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L51-L54


 - [ ] ID-49
[Initializable._constructing()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Initializable.sol#L41-L43) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Initializable.sol#L41-L43


 - [ ] ID-50
[add(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L248-L250) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L248-L250


 - [ ] ID-51
[Factory._computeCreate2Address(bytes,bytes32)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L60-L66) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L60-L66


 - [ ] ID-52
[sub(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L272-L274) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L272-L274


 - [ ] ID-53
[gte(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L330-L332) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L330-L332


 - [ ] ID-54
[Factory._create(bytes)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L42-L45) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L42-L45


 - [ ] ID-55
[lte(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L322-L324) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L322-L324


 - [ ] ID-56
[div(UFixed6,UFixed6)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L272-L274) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L272-L274


 - [ ] ID-57
[add(UFixed18,UFixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L241-L243) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L241-L243


 - [ ] ID-58
[neq(Fixed18,Fixed18)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L304-L306) is never used and should be removed

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L304-L306


## solc-version
Impact: Informational
Confidence: High
 - [ ] ID-59
Version constraint ^0.8.19 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
	- VerbatimInvalidDeduplication
	- FullInlinerNonExpressionSplitArgumentEvaluationOrder
	- MissingSideEffectsOnSelectorAccess.
It is used by:
	- [^0.8.19](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L2)
	- [^0.8.19](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed6.sol#L2)
	- [^0.8.19](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed6.sol#L2)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/Fixed18.sol#L2


 - [ ] ID-60
Version constraint ^0.8.13 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
	- VerbatimInvalidDeduplication
	- FullInlinerNonExpressionSplitArgumentEvaluationOrder
	- MissingSideEffectsOnSelectorAccess
	- StorageWriteRemovalBeforeConditionalTermination
	- AbiReencodingHeadOverflowWithStaticArrayCleanup
	- DirtyBytesArrayToStorage
	- InlineAssemblyMemorySideEffects
	- DataLocationChangeInInternalOverride
	- NestedCalldataArrayAbiReencodingSizeValidation.
It is used by:
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/access/ProxyOwner.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/accumulator/types/Accumulator6.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/accumulator/types/UAccumulator6.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Initializable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Instance.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Ownable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/OwnableStub.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/OwnerDelegatable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/OwnerExecutable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/OwnerWithdrawable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Pausable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/interfaces/IFactory.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/interfaces/IInitializable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/interfaces/IInstance.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/interfaces/IOwnable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/interfaces/IPausable.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/NumberMath.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/number/types/UFixed18.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/synbook/types/SynBook6.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token18.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/token/types/Token6.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/utilization/CurveMath18.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/utilization/CurveMath6.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/utilization/types/JumpRateUtilizationCurve18.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/utilization/types/JumpRateUtilizationCurve6.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/utils/console.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/VerifierBase.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/interfaces/IVerifierBase.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/types/Common.sol#L2)
	- [^0.8.13](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/verifier/types/GroupCancellation.sol#L2)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/access/ProxyOwner.sol#L2


## naming-convention
Impact: Informational
Confidence: High
 - [ ] ID-61
Function [Instance.__Instance__initialize()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Instance.sol#L19-L21) is not in mixedCase

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Instance.sol#L19-L21


 - [ ] ID-62
Function [Ownable.__Ownable__initialize()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Ownable.sol#L22-L25) is not in mixedCase

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Ownable.sol#L22-L25


 - [ ] ID-63
Function [Pausable.__Pausable__initialize()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Pausable.sol#L24-L27) is not in mixedCase

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Pausable.sol#L24-L27


 - [ ] ID-64
Function [Factory.__Factory__initialize()](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L27-L29) is not in mixedCase

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L27-L29


## too-many-digits
Impact: Informational
Confidence: Medium
 - [ ] ID-65
[Factory._computeCreate2Address(bytes,bytes32)](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L60-L66) uses literals with too many digits:
	- [bytecode = abi.encodePacked(type()(BeaconProxy).creationCode,abi.encode(address(this),data))](https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L61-L64)

https://github.com/equilibria-xyz/root/blob/fd81809b2000d073fd740d23e4b63fe1d5d5cff6/src/attribute/Factory.sol#L60-L66


</details>
  <br/>
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-15T03:42:20Z
body: <h2>Unit Test Coverage Report</h2>Coverage after merging <b>prateek/pe-2422-synbook6-return-price</b> into <b>v3</b> will be<table><tbody><tr><th>100.00%</th></tr></tbody></table>

<details><summary>Coverage Report</summary><table><tbody><tr><th>File</th><th>Stmts</th><th>Branches</th><th>Funcs</th><th>Lines</th><th>Uncovered Lines</th></tr><tr><td colspan='6'><b>src/access</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/access/ProxyOwner.sol'>ProxyOwner.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/accumulator/types</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/accumulator/types/Accumulator6.sol'>Accumulator6.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/accumulator/types/UAccumulator6.sol'>UAccumulator6.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/attribute</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/Factory.sol'>Factory.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/Initializable.sol'>Initializable.sol</a></td><td><b>88.24%</b></td><td><b>33.33%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/Initializable.sol#L21-L22'>21&ndash;22</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/Instance.sol'>Instance.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/Ownable.sol'>Ownable.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/OwnableStub.sol'>OwnableStub.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/OwnerDelegatable.sol'>OwnerDelegatable.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/OwnerExecutable.sol'>OwnerExecutable.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/OwnerWithdrawable.sol'>OwnerWithdrawable.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/attribute/Pausable.sol'>Pausable.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/number</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/number/NumberMath.sol'>NumberMath.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/number/types</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/number/types/Fixed18.sol'>Fixed18.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/number/types/Fixed6.sol'>Fixed6.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/number/types/UFixed18.sol'>UFixed18.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/number/types/UFixed6.sol'>UFixed6.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/synbook/types</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/synbook/types/SynBook6.sol'>SynBook6.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/token/types</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/token/types/Token18.sol'>Token18.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/token/types/Token6.sol'>Token6.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/utilization</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/utilization/CurveMath18.sol'>CurveMath18.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/utilization/CurveMath6.sol'>CurveMath6.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/utilization/types</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/utilization/types/JumpRateUtilizationCurve18.sol'>JumpRateUtilizationCurve18.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/utilization/types/JumpRateUtilizationCurve6.sol'>JumpRateUtilizationCurve6.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/utils</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/utils/console.sol'>console.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/verifier</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/verifier/VerifierBase.sol'>VerifierBase.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/verifier/types</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/verifier/types/Common.sol'>Common.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/equilibria-xyz/root/blob/9d61e0acd55ec87b13a2d2a7adb72be947bfdfec/src/verifier/types/GroupCancellation.sol'>GroupCancellation.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr></tbody></table></details>
author_association: NONE