Skip to main content

proposeUpgrade

Function Type: external
Access Control: isSuperUser
Function Signature: proposeUpgrade(address _newImplementation)

Proposes a new implementation address for contract upgrade with a mandatory 7-day time delay before the upgrade can be executed.

Parameters

ParameterTypeDescription
_newImplementationaddressAddress of the proposed new implementation

Description

This function initiates the first step of the time-delayed governance process for upgrading the contract implementation. It follows the UUPS (Universal Upgradeable Proxy Standard) pattern with additional security through time delays.

Access Control

Modifier: isSuperUser

Only the current superUser can propose contract upgrades, ensuring that only authorized governance can initiate system changes.

Security Features

Time Delay Protection

  • 7-day waiting period: Provides time for community review and security audits
  • Proposal transparency: The proposed implementation address is publicly visible
  • Cancellation capability: SuperUser can reject the proposal at any time

Implementation Validation

The function validates that:

  • The proposed implementation address is not the zero address
  • Basic input validation prevents obvious errors

Upgrade Workflow

1. Implementation Preparation

Before proposing an upgrade:

  • New implementation contract must be deployed
  • Security audits should be completed
  • Compatibility testing should be performed

2. Proposal Submission

// SuperUser proposes new implementation
address newImplementation = 0x1234567890123456789012345678901234567890;
registryContract.proposeUpgrade(newImplementation);

3. Waiting Period (7 Days)

  • Community can review the proposed implementation
  • Security researchers can audit the new code
  • SuperUser can cancel if issues are discovered

4. Upgrade Execution

After 7 days, superUser can execute the upgrade:

registryContract.acceptProposalUpgrade();

Workflow

  1. Access Control: Validates that the caller is the current superUser using the isSuperUser modifier. Reverts with InvalidUser if not authorized.
  2. Input Validation: Checks that _implementation is not the zero address and is different from the current implementation. Reverts on validation failure.
  3. Proposal Creation: Sets the upgradeProposal.implementation to the new address and upgradeProposal.timeToAccept to current timestamp plus 7 days.
  4. State Update: Updates the upgrade proposal state to allow for later acceptance or rejection.

Implementation Requirements

UUPS Compatibility

The new implementation must:

  • Inherit from UUPSUpgradeable
  • Implement required upgrade authorization
  • Maintain storage layout compatibility
  • Include proper initialization functions

Security Considerations

  • Storage layout must be compatible with current version
  • New functions should not break existing functionality
  • Proper access controls must be maintained

Usage Example

// Deploy new implementation
RegistryEvvmV2 newImplementation = new RegistryEvvmV2();

// Propose the upgrade (superUser only)
registryContract.proposeUpgrade(address(newImplementation));

// Query proposal status
AddressTypeProposal memory proposal = registryContract.getUpgradeProposalData();
console.log("Proposed Implementation:", proposal.proposal);
console.log("Can execute after:", proposal.timeToAccept);

Integration Examples

Governance Dashboard

// Monitor upgrade proposals
const monitorUpgradeProposals = async () => {
const proposalData = await registryContract.getUpgradeProposalData();

if (proposalData.proposal !== "0x0000000000000000000000000000000000000000") {
const timeToAccept = new Date(proposalData.timeToAccept * 1000);
const now = new Date();

if (now >= timeToAccept) {
console.log("Upgrade proposal ready for execution");
} else {
const remainingTime = timeToAccept - now;
console.log(`Upgrade proposal pending: ${formatTime(remainingTime)} remaining`);
}
}
};

Automated Testing Pipeline

// Automated testing of proposed implementations
const testProposedImplementation = async (implementationAddress) => {
// Deploy test proxy with new implementation
const testProxy = await deployTestProxy(implementationAddress);

// Run compatibility tests
const compatibilityResults = await runCompatibilityTests(testProxy);

// Run functional tests
const functionalResults = await runFunctionalTests(testProxy);

// Generate test report
const report = {
implementation: implementationAddress,
compatibility: compatibilityResults,
functionality: functionalResults,
recommendation: determineRecommendation(compatibilityResults, functionalResults)
};

return report;
};

Pre-Upgrade Checklist

Technical Validation

  • New implementation deployed and verified
  • Storage layout compatibility confirmed
  • All existing functions maintain compatibility
  • New functionality properly tested
  • Security audit completed

Governance Process

  • Community notification sent
  • Proposal rationale documented
  • Timeline communicated
  • Feedback collection period established

Risk Assessment

  • Rollback plan prepared
  • Impact analysis completed
  • Communication plan ready
  • Monitoring systems prepared

Security Considerations

Implementation Security

  • New implementation should be thoroughly audited
  • Storage layout changes must be carefully managed
  • Access control patterns must be preserved

Proposal Security

  • Validate implementation address before proposing
  • Ensure implementation source code is available
  • Verify implementation deployment was successful

Community Security

  • Allow sufficient time for community review
  • Provide clear documentation of changes
  • Enable feedback and concern reporting

Upgrade Lifecycle

State Queries

Best Practices

Proposal Timing

  • Coordinate with other governance activities
  • Avoid conflicts with superUser transitions
  • Consider community engagement schedules

Communication

  • Announce upgrade proposals publicly
  • Provide detailed change documentation
  • Maintain transparency throughout process

Testing

  • Comprehensive testing on testnets
  • Load testing for performance impact
  • Integration testing with dependent systems