From 22fec75b7ae6cd93241c9ddc4becb1c8186f56b7 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:19:19 -0700 Subject: [PATCH 01/21] feat: Add error MultiSigContract__TimelockActive --- src/MultiSigContractV2.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index fc55b8c..5dd3829 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -33,4 +33,6 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { error MultiSigContract__SignerNotFound(); error MultiSigContract__InsufficientSignatures(); error MultiSigContract__InvalidAddress(); + error MultiSigContract__TimelockActive(); + } From 9f767f328bd1e2b895b78d2ff5d612cecd3ac6b8 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:19:36 -0700 Subject: [PATCH 02/21] feat: Add error MultiSigContract__EmergencyModeActive --- src/MultiSigContractV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 5dd3829..b81ff59 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -34,5 +34,6 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { error MultiSigContract__InsufficientSignatures(); error MultiSigContract__InvalidAddress(); error MultiSigContract__TimelockActive(); + error MultiSigContract__EmergencyModeActive(); } From bd00dc7a4d2dc7318df910c6fcfcf2cbe94041b3 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:20:01 -0700 Subject: [PATCH 03/21] feat: Add error MultiSigContract__InvalidThreshold --- src/MultiSigContractV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index b81ff59..3cfbeed 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -35,5 +35,5 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { error MultiSigContract__InvalidAddress(); error MultiSigContract__TimelockActive(); error MultiSigContract__EmergencyModeActive(); - +error MultiSigContract__InvalidThreshold(); } From d41af01d0974f323d683f17921bc374c7326dd64 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:20:20 -0700 Subject: [PATCH 04/21] feat: Add error MultiSigContract__DuplicateSigner --- src/MultiSigContractV2.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 3cfbeed..318989e 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -36,4 +36,6 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { error MultiSigContract__TimelockActive(); error MultiSigContract__EmergencyModeActive(); error MultiSigContract__InvalidThreshold(); + error MultiSigContract__DuplicateSigner(); + } From afb1e9c95fcf456d33d5b034c5059862b96f3de4 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:20:55 -0700 Subject: [PATCH 05/21] feat: Add Constant Natspec Section Header --- src/MultiSigContractV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 318989e..5c4eea3 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -38,4 +38,7 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { error MultiSigContract__InvalidThreshold(); error MultiSigContract__DuplicateSigner(); + //////////////////// + // Constants // + ////////////////// } From 139747150bfa49475a59d2f0eac6b5d87a44f7b1 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:21:24 -0700 Subject: [PATCH 06/21] feat: Add Factory token contract reference --- src/MultiSigContractV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 5c4eea3..31e42e6 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -41,4 +41,7 @@ error MultiSigContract__InvalidThreshold(); //////////////////// // Constants // ////////////////// + + /// @notice Factory token contract reference + FactoryTokenContract public factoryTokenContract; } From 4b79d761e30b58c72ae43614523cefa002ba4311 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:21:47 -0700 Subject: [PATCH 07/21] feat: Add Sign Protocol instance --- src/MultiSigContractV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 31e42e6..dc45963 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -44,4 +44,7 @@ error MultiSigContract__InvalidThreshold(); /// @notice Factory token contract reference FactoryTokenContract public factoryTokenContract; + + /// @notice Sign Protocol instance + ISP public spInstance; } From 8d08b235d0a1de5bb8eacda68223097697ed83ea Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:22:33 -0700 Subject: [PATCH 08/21] feat: Add Constructor Function & Natspec Comments --- src/MultiSigContractV2.sol | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index dc45963..a71a3d9 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -47,4 +47,30 @@ error MultiSigContract__InvalidThreshold(); /// @notice Sign Protocol instance ISP public spInstance; + + //////////////////// + // Constructor // + //////////////////// + + constructor( + address _spInstance, + uint64 _signatureSchemaId, + uint64 _revocationSchemaId, + uint64 _executionSchemaId, + address _emergencyAdmin, + address _initialOwner + ) Ownable(_initialOwner) { + if (_spInstance == address(0) || _emergencyAdmin == address(0)) { + revert MultiSigContract__InvalidAddress(); + } + + spInstance = ISP(_spInstance); + signatureSchemaId = _signatureSchemaId; + revocationSchemaId = _revocationSchemaId; + executionSchemaId = _executionSchemaId; + emergencyAdmin = _emergencyAdmin; + + // Add owner as initial signer with admin role + _addSigner(_initialOwner, "admin"); + } } From 96db84b83a0bfcdebf58a81c6254db19493d8e60 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:23:09 -0700 Subject: [PATCH 09/21] feat: Add Schema IDs for different attestation types --- src/MultiSigContractV2.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index a71a3d9..b3661a8 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -48,6 +48,11 @@ error MultiSigContract__InvalidThreshold(); /// @notice Sign Protocol instance ISP public spInstance; + /// @notice Schema IDs for different attestation types + uint64 public signatureSchemaId; + uint64 public revocationSchemaId; + uint64 public executionSchemaId; + //////////////////// // Constructor // //////////////////// From c2044bf6783cf1c61576cb8d49ba06fbb710faad Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:23:38 -0700 Subject: [PATCH 10/21] feat: Add ScheGlobal signature threshold --- src/MultiSigContractV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index b3661a8..c167945 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -52,6 +52,9 @@ error MultiSigContract__InvalidThreshold(); uint64 public signatureSchemaId; uint64 public revocationSchemaId; uint64 public executionSchemaId; + + /// @notice Global signature threshold (percentage * 100, e.g., 6000 = 60%) + uint256 public signatureThreshold = 6000; // 60% by default //////////////////// // Constructor // From 9fd9f0103c320e70b2c1ccea625492d05515a451 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:24:52 -0700 Subject: [PATCH 11/21] feat: Add Emergency mode status --- src/MultiSigContractV2.sol | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index c167945..4546a77 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -55,6 +55,12 @@ error MultiSigContract__InvalidThreshold(); /// @notice Global signature threshold (percentage * 100, e.g., 6000 = 60%) uint256 public signatureThreshold = 6000; // 60% by default + + /// @notice Transaction expiry duration + //uint256 public transactionExpiry = DEFAULT_TX_EXPIRY; + + /// @notice Emergency mode status + bool public emergencyMode; //////////////////// // Constructor // From e1a364df2af88361294f42b686fd5fedce0de224 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:25:10 -0700 Subject: [PATCH 12/21] feat: Add Emergency admin (can pause/unpause in emergencies) --- src/MultiSigContractV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 4546a77..23d27de 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -61,6 +61,9 @@ error MultiSigContract__InvalidThreshold(); /// @notice Emergency mode status bool public emergencyMode; + + /// @notice Emergency admin (can pause/unpause in emergencies) + address public emergencyAdmin; //////////////////// // Constructor // From 2edd7d2c7afd96d98b7b4cf8f67e0e2ced12c3de Mon Sep 17 00:00:00 2001 From: malgus01 Date: Sun, 28 Sep 2025 10:26:31 -0700 Subject: [PATCH 13/21] feat: forge fmt --- src/MultiSigContractV2.sol | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 23d27de..394b88c 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -35,7 +35,7 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { error MultiSigContract__InvalidAddress(); error MultiSigContract__TimelockActive(); error MultiSigContract__EmergencyModeActive(); -error MultiSigContract__InvalidThreshold(); + error MultiSigContract__InvalidThreshold(); error MultiSigContract__DuplicateSigner(); //////////////////// @@ -64,11 +64,11 @@ error MultiSigContract__InvalidThreshold(); /// @notice Emergency admin (can pause/unpause in emergencies) address public emergencyAdmin; - + //////////////////// // Constructor // //////////////////// - + constructor( address _spInstance, uint64 _signatureSchemaId, @@ -76,7 +76,9 @@ error MultiSigContract__InvalidThreshold(); uint64 _executionSchemaId, address _emergencyAdmin, address _initialOwner - ) Ownable(_initialOwner) { + ) + Ownable(_initialOwner) + { if (_spInstance == address(0) || _emergencyAdmin == address(0)) { revert MultiSigContract__InvalidAddress(); } @@ -86,8 +88,8 @@ error MultiSigContract__InvalidThreshold(); revocationSchemaId = _revocationSchemaId; executionSchemaId = _executionSchemaId; emergencyAdmin = _emergencyAdmin; - + // Add owner as initial signer with admin role - _addSigner(_initialOwner, "admin"); + //_addSigner(_initialOwner, "admin"); } } From 0baccc39a31520ca113d085a73170ecc5024db8c Mon Sep 17 00:00:00 2001 From: malgus01 Date: Mon, 29 Sep 2025 10:28:22 -0700 Subject: [PATCH 14/21] feat: Add State Variable Natspec Section Header --- src/MultiSigContractV2.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 394b88c..3839e5e 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -42,6 +42,10 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { // Constants // ////////////////// + //////////////////// + // State Variables // + //////////////////// + /// @notice Factory token contract reference FactoryTokenContract public factoryTokenContract; From f89ff4648d4b867e4f34d96849b5d69bdf678792 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Mon, 29 Sep 2025 10:28:50 -0700 Subject: [PATCH 15/21] feat: Add public constant MAX_SIGNERS --- src/MultiSigContractV2.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 3839e5e..002327a 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -41,11 +41,12 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { //////////////////// // Constants // ////////////////// - + uint256 public constant MAX_SIGNERS = 20; + //////////////////// // State Variables // //////////////////// - + /// @notice Factory token contract reference FactoryTokenContract public factoryTokenContract; From 470b2b52b9207c7826b4d2f0845c44605b7b088f Mon Sep 17 00:00:00 2001 From: malgus01 Date: Mon, 29 Sep 2025 10:29:20 -0700 Subject: [PATCH 16/21] feat: Add public constant MIN_SIGNERS --- src/MultiSigContractV2.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 002327a..14d793d 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -42,7 +42,9 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { // Constants // ////////////////// uint256 public constant MAX_SIGNERS = 20; - + uint256 public constant MIN_SIGNERS = 2; + + //////////////////// // State Variables // //////////////////// From 3e37919b87bf41c39ba03ad37088e2726307683d Mon Sep 17 00:00:00 2001 From: malgus01 Date: Mon, 29 Sep 2025 10:29:37 -0700 Subject: [PATCH 17/21] feat: Add public constant MAX_SIGNATURE_THRESHOLD --- src/MultiSigContractV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 14d793d..91f228e 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -43,6 +43,7 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { ////////////////// uint256 public constant MAX_SIGNERS = 20; uint256 public constant MIN_SIGNERS = 2; + uint256 public constant MAX_SIGNATURE_THRESHOLD = 100; // 100% //////////////////// From c492aeb49b7b2f8a962fc5b2c33577c55f71a146 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Mon, 29 Sep 2025 10:29:58 -0700 Subject: [PATCH 18/21] feat: Add public constant DEFAULT_TX_EXPIRY --- src/MultiSigContractV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 91f228e..ba59146 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -44,7 +44,7 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { uint256 public constant MAX_SIGNERS = 20; uint256 public constant MIN_SIGNERS = 2; uint256 public constant MAX_SIGNATURE_THRESHOLD = 100; // 100% - + uint256 public constant DEFAULT_TX_EXPIRY = 7 days; //////////////////// // State Variables // From a40604d3c3cb18212622e5404e943c5f733924d2 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Mon, 29 Sep 2025 10:30:13 -0700 Subject: [PATCH 19/21] feat: Add public constant TIMELOCK_DURATION --- src/MultiSigContractV2.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index ba59146..9b89cd6 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -45,6 +45,8 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { uint256 public constant MIN_SIGNERS = 2; uint256 public constant MAX_SIGNATURE_THRESHOLD = 100; // 100% uint256 public constant DEFAULT_TX_EXPIRY = 7 days; + uint256 public constant TIMELOCK_DURATION = 2 days; + //////////////////// // State Variables // From bb39060e7940f03d39f132af14da5e6d053b1505 Mon Sep 17 00:00:00 2001 From: malgus01 Date: Mon, 29 Sep 2025 10:30:29 -0700 Subject: [PATCH 20/21] feat: Add public constant EMERGENCY_TIMELOCK --- src/MultiSigContractV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 9b89cd6..3a5025b 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -46,6 +46,7 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { uint256 public constant MAX_SIGNATURE_THRESHOLD = 100; // 100% uint256 public constant DEFAULT_TX_EXPIRY = 7 days; uint256 public constant TIMELOCK_DURATION = 2 days; + uint256 public constant EMERGENCY_TIMELOCK = 24 hours; //////////////////// From d1c342596a438a83bf72fe5994d0ec773769faad Mon Sep 17 00:00:00 2001 From: malgus01 Date: Mon, 29 Sep 2025 10:30:41 -0700 Subject: [PATCH 21/21] feat: forge fmt --- src/MultiSigContractV2.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index 3a5025b..e8f15c6 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -41,14 +41,13 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { //////////////////// // Constants // ////////////////// - uint256 public constant MAX_SIGNERS = 20; - uint256 public constant MIN_SIGNERS = 2; + uint256 public constant MAX_SIGNERS = 20; + uint256 public constant MIN_SIGNERS = 2; uint256 public constant MAX_SIGNATURE_THRESHOLD = 100; // 100% uint256 public constant DEFAULT_TX_EXPIRY = 7 days; uint256 public constant TIMELOCK_DURATION = 2 days; uint256 public constant EMERGENCY_TIMELOCK = 24 hours; - //////////////////// // State Variables // ////////////////////