Skip to content

Closes #660 - #833

Merged
p3ris0n merged 4 commits into
BCPathway:mainfrom
mansur-codes:feat/timelock-state-660
Aug 28, 2026
Merged

Closes #660#833
p3ris0n merged 4 commits into
BCPathway:mainfrom
mansur-codes:feat/timelock-state-660

Conversation

@mansur-codes

Copy link
Copy Markdown
Contributor

What does this PR do?

Adds timelock_expires_at: Option<u64> to UpgradeProposal to enforce a mandatory delay between quorum and execution. The field is None while a proposal is pre-quorum and snapshotted to now + TIMELOCK_DELAY_SECS (24 hours) the moment quorum is first reached, via a new _start_upgrade_timelock_if_quorate helper. Later votes on an already-quorate proposal never reset the value.

Also updates the frozen field name/width tests, upgrade_proposal_fixture, and adds 4 unit tests covering the happy path, idempotency, below-quorum behaviour, and creation state.

Type of change

  • Feature

Checklist

  • I ran pre-commit run --all-files locally and it passed
  • All CI jobs pass on this branch
  • I added or updated tests for new behaviour
  • I updated relevant docs / comments
  • No secrets or credentials are included
  • No breaking changes to public APIs (or I've documented them)

Breaking changes?

No. timelock_expires_at is appended to UpgradeProposal and defaults to None. Since #[contracttype] encodes struct fields by name, existing persisted proposals decode safely with the new field absent — they will read as None.

Related issues

Closes #660

@drips-wave

drips-wave Bot commented Aug 26, 2026

Copy link
Copy Markdown

@mansur-codes Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@p3ris0n

p3ris0n commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

@mansur-codes please resolve conflicts

@p3ris0n

p3ris0n commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

@mansur-codes resolve conflicts

@mansur-codes

Copy link
Copy Markdown
Contributor Author

I will resolve it, i'm on it, its just taking a while

p3ris0n and others added 2 commits August 28, 2026 16:15
Co-authored-by: Cursor <[email protected]>

# Conflicts:
#	contracts/admin/src/lib.rs
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.12.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.14.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.24.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.31.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.32.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.49.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.58.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.66.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.72.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.73.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_admin_implicitly_has_all_roles.96.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_emits_event.15.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_emits_event.16.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_emits_event.47.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_emits_event.74.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_emits_event.88.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.14.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.16.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.17.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.29.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.31.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.33.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.34.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.37.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.47.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.54.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.59.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_every_variant.68.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_idempotent.39.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_idempotent.67.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_many_holders.46.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_many_holders.49.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_many_holders.61.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_many_holders.62.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_many_holders.99.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.11.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.23.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.36.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.38.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.4.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.75.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.78.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.81.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_multiple_roles.83.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.101.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.11.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.15.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.21.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.28.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.29.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.30.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.46.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.48.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.66.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.7.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.85.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_self_grant.99.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.100.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.101.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.19.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.50.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.51.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.75.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.76.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.84.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.85.json
#	contracts/admin/test_snapshots/tests/proptest/fuzz_grant_role_via_super_admin.9.json
@p3ris0n
p3ris0n merged commit cd1e624 into BCPathway:main Aug 28, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Storage] Define Timelock state structure

2 participants