diff --git a/src/MultiSigContractV2.sol b/src/MultiSigContractV2.sol index fc55b8c..e8f15c6 100644 --- a/src/MultiSigContractV2.sol +++ b/src/MultiSigContractV2.sol @@ -33,4 +33,73 @@ contract MultiSigContractV2 is Ownable, ReentrancyGuard, Pausable { error MultiSigContract__SignerNotFound(); error MultiSigContract__InsufficientSignatures(); error MultiSigContract__InvalidAddress(); + error MultiSigContract__TimelockActive(); + error MultiSigContract__EmergencyModeActive(); + error MultiSigContract__InvalidThreshold(); + error MultiSigContract__DuplicateSigner(); + + //////////////////// + // Constants // + ////////////////// + 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 // + //////////////////// + + /// @notice Factory token contract reference + FactoryTokenContract public factoryTokenContract; + + /// @notice Sign Protocol instance + ISP public spInstance; + + /// @notice Schema IDs for different attestation types + 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 + + /// @notice Transaction expiry duration + //uint256 public transactionExpiry = DEFAULT_TX_EXPIRY; + + /// @notice Emergency mode status + bool public emergencyMode; + + /// @notice Emergency admin (can pause/unpause in emergencies) + address public emergencyAdmin; + + //////////////////// + // 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"); + } }