uups-checker 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitmodules +6 -0
- package/AIFI_AUDIT.md +220 -0
- package/ALL_AUDITS_SUMMARY.md +366 -0
- package/ALPHA_PROXY_CRITICAL_FINDING.md +136 -0
- package/ALPHA_PROXY_FINAL_ANALYSIS.md +213 -0
- package/ALPHA_PROXY_FINAL_VERDICT.md +233 -0
- package/ALPHA_PROXY_SELFDESTRUCT_EXPLOIT.md +161 -0
- package/ARIA-foundry-test.txt +9 -0
- package/ARIA-mythril-analysis.txt +20 -0
- package/ARIA-slither-analysis.txt +38 -0
- package/ARIA_AI_SECURITY_AUDIT.md +290 -0
- package/ARIA_VERIFIED_AUDIT.md +259 -0
- package/ARIA_VERIFIED_slither.txt +76 -0
- package/ARIVA_source.txt +1 -0
- package/ARK_AUDIT.md +349 -0
- package/BANANA_AUDIT.md +365 -0
- package/BAS_AUDIT.md +451 -0
- package/BAS_TOKEN_AUDIT.md +235 -0
- package/BCE_EXPLOIT_ANALYSIS.md +165 -0
- package/BEEFY_BNB_CHAIN_ANALYSIS.md +488 -0
- package/BEEFY_MONAD_ANALYSIS.md +239 -0
- package/BEEFY_STAKING_ANALYSIS.md +136 -0
- package/BEEFY_XVS_WBNB_ACTUAL_FINDINGS.md +223 -0
- package/BEEFY_XVS_WBNB_CRITICAL_FINDINGS.md +269 -0
- package/BLOCKSEC_ATTACK_KNOWLEDGE_BASE.md +771 -0
- package/BRISE_ANALYSIS.txt +31 -0
- package/BRISE_BSC_DAPPS.txt +68 -0
- package/BRISE_EXPLOITS_FOUND.md +98 -0
- package/BRISE_REAL_EXPLOITS.md +115 -0
- package/BRISE_WHITEHAT_REPORT.md +162 -0
- package/BRISEstake_Analysis.txt +95 -0
- package/BSCSLOCKTOKEN_CRITICAL_FINDING.md +240 -0
- package/BSW_BISWAP_SECURITY_AUDIT.md +330 -0
- package/BTCST_FINAL_VERDICT.md +319 -0
- package/BTCST_MINING_REBASE_ANALYSIS.md +229 -0
- package/BTCST_ROUNDING_DEEP_DIVE.md +293 -0
- package/BTCST_ROUNDING_FINAL_VERDICT.md +9 -0
- package/BTCST_SECURITY_ANALYSIS.md +391 -0
- package/BTR_AUDIT.md +210 -0
- package/BeamBridge-analysis.md +226 -0
- package/BeamToken-analysis.md +201 -0
- package/BitgertSwap_Investigation.txt +107 -0
- package/CEEK_STAKING_ANALYSIS.md +0 -0
- package/CHAINBASE_AUDIT.md +422 -0
- package/COMPLETE_AUDIT_SUMMARY.md +342 -0
- package/CORRECTED_ANALYSIS.txt +115 -0
- package/DBXEN_COMPARISON_SUMMARY.md +232 -0
- package/DBXEN_EXPLOIT_ANALYSIS.md +530 -0
- package/DOPFairLaunch_raw.json +29 -0
- package/DOPFairLaunch_source.txt +0 -0
- package/DOP_BRIDGE_FINAL_ANALYSIS.txt +86 -0
- package/DOP_BUSD_LP_ANALYSIS.txt +44 -0
- package/DOP_FAIRLAUNCH_ANALYSIS.txt +61 -0
- package/DOP_FAIRLAUNCH_FINAL_VERDICT.txt +113 -0
- package/DOP_STAKING_CONTRACT_ANALYSIS.txt +67 -0
- package/DSYNC_ECOSYSTEM_ANALYSIS.md +221 -0
- package/DSyncStaking-exploit-analysis.md +153 -0
- package/DSyncVault-analysis.md +120 -0
- package/DUSD_PROXY_AUDIT.md +407 -0
- package/DXSALE_LOCK_AUDIT.md +0 -0
- package/DXSaleLock_bytecode.txt +1 -0
- package/ECHIDNA_QUICK_START.md +101 -0
- package/ELEPHANT_ECOSYSTEM_AUDIT_PLAN.md +159 -0
- package/ELEPHANT_ECOSYSTEM_COMPREHENSIVE_AUDIT.md +427 -0
- package/ELEPHANT_SECURITY_ANALYSIS.md +209 -0
- package/ELEPHANT_VULNERABILITIES_EXPLAINED.md +455 -0
- package/EXPLOIT_FIX.md +300 -0
- package/EXPLOIT_INSTRUCTIONS.md +273 -0
- package/EXPLOIT_SUMMARY.md +285 -0
- package/EXPLOIT_SUMMARY.txt +175 -0
- package/FALCON_FINANCE_AUDIT.md +258 -0
- package/FANDOM_AUDIT.md +359 -0
- package/FEE_ON_TRANSFER_ANALYSIS.md +228 -0
- package/FINAL_AUDIT_REPORT.md +0 -0
- package/FOLIO_PROXY_AUDIT.md +299 -0
- package/FOT_EXPLOIT_RESULTS.txt +110 -0
- package/FOT_TOKENS_AUDITED.md +103 -0
- package/HEGIC-mythril-analysis.txt +39 -0
- package/HEGIC_COMPLETE_ANALYSIS.md +343 -0
- package/HOTCROSS_SWAP_EXPLOIT_ANALYSIS.md +123 -0
- package/ICECREAMSWAP_EXPLOITS.md +259 -0
- package/IMMUNEFI_REPORT.md +314 -0
- package/KCCPAD_EXPLOIT_GUIDE.md +285 -0
- package/KEL_CEL_EXPLOIT_ANALYSIS.md +0 -0
- package/KOGE_AUDIT.md +328 -0
- package/LENDFLARE_ANALYSIS.md +239 -0
- package/LENDFLARE_ECHIDNA_GUIDE.md +356 -0
- package/LENDFLARE_EXPLOIT_INSTRUCTIONS.md +297 -0
- package/LENDFLARE_EXPLOIT_SUMMARY.md +292 -0
- package/LENDFLARE_FLASHLOAN_GUIDE.md +383 -0
- package/LENDFLARE_FUZZING_RESULTS.md +252 -0
- package/LENDFLARE_HONEYPOT_BYPASS_ANALYSIS.md +420 -0
- package/LENDFLARE_MANUAL_FUZZING.md +324 -0
- package/LENDFLARE_MYTHRIL_ANALYSIS.md +339 -0
- package/LENDFLARE_V3_BYPASS.md +296 -0
- package/LFTDECOMPILE.txt +14478 -0
- package/LFT_ACCOUNTING_ANALYSIS.md +0 -0
- package/LFT_ACCOUNTING_BUG_ANALYSIS.md +426 -0
- package/LFT_BACKDOOR_DEEP_DIVE.md +0 -0
- package/LFT_CRITICAL_EXPLOIT_CONFIRMED.md +428 -0
- package/LFT_EXPLOIT_VISUAL.md +253 -0
- package/LFT_QUICK_SUMMARY.md +124 -0
- package/LFT_REVERSE_EXPLOIT_ANALYSIS.md +521 -0
- package/MGO_AUDIT_REPORT.md +420 -0
- package/MYTHRIL_FINAL_REPORT.md +306 -0
- package/MYTHRIL_SLITHER_SUMMARY.md +244 -0
- package/NETX_MIGRATION_AUDIT.md +0 -0
- package/NPM_PUBLISH_GUIDE.md +0 -0
- package/NRV_CRITICAL_EXPLOIT.txt +143 -0
- package/NetX_Analysis.txt +76 -0
- package/NetX_Migration_bytecode.txt +1 -0
- package/NetX_Migration_source.txt +0 -0
- package/NetX_Token_source.txt +0 -0
- package/NetxWhitehatRescue +22 -0
- package/OILER_ATTACK_VISUAL.md +351 -0
- package/OILER_BLOCKSEC_TEST_RESULTS.md +421 -0
- package/OILER_DEEP_ANALYSIS.md +212 -0
- package/OILER_FINAL_EXPLOIT_REPORT.md +241 -0
- package/OILER_FINAL_VERDICT.md +339 -0
- package/OILER_REENTRANCY_EXPLAINED.md +638 -0
- package/OILER_REENTRANCY_FINAL_SUMMARY.md +391 -0
- package/OILER_REENTRANCY_REALITY_CHECK.md +393 -0
- package/OILER_REENTRANCY_STEP_BY_STEP.md +597 -0
- package/OILER_STAKING_MAINNET_ANALYSIS.md +366 -0
- package/OILER_STAKING_SECURITY_ANALYSIS.md +409 -0
- package/PANCAKESWAP_UNDERFLOW_HUNTING.md +317 -0
- package/POLS_MULTICHAIN_AUDIT.md +0 -0
- package/POSI_STAKING_AUDIT.md +0 -0
- package/PROXY2_SECURITY_ANALYSIS.md +0 -0
- package/Proxy2TACS +29748 -0
- package/QUICK_START.md +240 -0
- package/RAMP_SECURITY_ANALYSIS.md +0 -0
- package/README.md +238 -0
- package/REAUDIT_MASTER_LIST.txt +15 -0
- package/RING_analysis.txt +212 -0
- package/RPC +4 -0
- package/RULES.txt +20 -0
- package/SIREN_AUDIT.md +186 -0
- package/SYNC_EXPLOIT_README.md +0 -0
- package/SYNC_TOKEN_EXPLOIT_REPORT.md +224 -0
- package/TLM_raw.html +0 -0
- package/TLM_raw.txt +0 -0
- package/TLM_response.json +1 -0
- package/TRADOOR_AUDIT.md +253 -0
- package/TRUNK_AUDIT.md +285 -0
- package/UNIBASE_AUDIT.md +241 -0
- package/UNLOCK_ANALYSIS.md +0 -0
- package/UNLOCK_EXPLOIT.md +49 -0
- package/UNLOCK_EXPLOIT_ANALYSIS.md +0 -0
- package/UPS +232 -0
- package/UUPSCHECKER +208 -0
- package/VAULT_PROXY_AUDIT.md +457 -0
- package/VAULT_PROXY_FINAL_VERDICT.md +0 -0
- package/VERIFIED_EXPLOITS_FINAL.txt +146 -0
- package/WKEYDAO2_AUDIT.md +245 -0
- package/WSG_AUDIT.md +0 -0
- package/XFI_DEEP_ANALYSIS.md +327 -0
- package/YOOSHI_EXPLOIT_GUIDE.md +119 -0
- package/YSDAO_EXPLOIT_GUIDE.md +0 -0
- package/agent-4-bundle.md +22490 -0
- package/alpha-proxy-echidna.txt +1 -0
- package/alpha-proxy-fuzz-results.txt +81 -0
- package/alpha-proxy-mythril.txt +2 -0
- package/analyze-btcst-farm.js +54 -0
- package/analyze-dxsale-lock.js +75 -0
- package/analyze-elephant.js +69 -0
- package/analyze-fara-rewards.js +109 -0
- package/analyze-fara-storage.js +83 -0
- package/analyze-lft-transaction.js +158 -0
- package/analyze-lock-bytecode.js +59 -0
- package/analyze-shegic.js +0 -0
- package/analyze-staking-abi.js +0 -0
- package/analyze-sxp.js +57 -0
- package/analyze-tlm.js +76 -0
- package/analyze-trumpet.js +98 -0
- package/analyze-unlimited-nft.js +108 -0
- package/analyze_elephant.sh +27 -0
- package/analyze_vault.sh +32 -0
- package/aria-bytecode.txt +1 -0
- package/aria_response.json +1 -0
- package/ark_temp/README.md +66 -0
- package/ark_temp/lib/forge-std/.gitattributes +1 -0
- package/ark_temp/lib/forge-std/.github/CODEOWNERS +1 -0
- package/ark_temp/lib/forge-std/.github/dependabot.yml +6 -0
- package/ark_temp/lib/forge-std/.github/workflows/ci.yml +125 -0
- package/ark_temp/lib/forge-std/.github/workflows/sync.yml +36 -0
- package/ark_temp/lib/forge-std/CONTRIBUTING.md +193 -0
- package/ark_temp/lib/forge-std/LICENSE-APACHE +203 -0
- package/ark_temp/lib/forge-std/LICENSE-MIT +25 -0
- package/ark_temp/lib/forge-std/README.md +314 -0
- package/ark_temp/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
- package/ark_temp/lib/forge-std/package.json +16 -0
- package/ark_temp/lib/forge-std/scripts/vm.py +636 -0
- package/audits/AiFi-security-audit-20260326.md +499 -0
- package/audits/BasedAI-Brains-security-audit-20260324.md +651 -0
- package/audits/BinanceAlphaWallet-pashov-ai-audit-report-20260324-170000.md +362 -0
- package/audits/DGToken-security-audit-20260324.md +376 -0
- package/audits/DSyncStaking-audit-part1.md +161 -0
- package/audits/DSyncStaking-security-audit-20260324.md +547 -0
- package/audits/DecompiledERC20-security-audit-20260325.md +397 -0
- package/audits/DegenVC-security-audit-20260324.md +585 -0
- package/audits/DelreyInu-security-audit-20260324.md +463 -0
- package/audits/DestraNetwork-security-audit-20260324.md +705 -0
- package/audits/DomiToken-security-audit-20260324.md +514 -0
- package/audits/LendFlareToken-security-audit-20260325.md +197 -0
- package/audits/LockReleaseTokenPool-security-audit-20260324.md +482 -0
- package/audits/MOG-pashov-ai-audit-report-20260324-164900.md +229 -0
- package/audits/PAALAI-security-audit-20260324.md +475 -0
- package/audits/PAR-security-audit-20260325.md +311 -0
- package/audits/PepeCoinStaking-security-audit-20260324.md +358 -0
- package/audits/StakingPool-security-audit-20260324.md +517 -0
- package/audits/SyncToken-security-audit-20260324.md +778 -0
- package/audits/UndeadToken-decompiled-security-audit-20260324.md +485 -0
- package/audits/UnknownToken-decompiled-security-audit-20260324.md +647 -0
- package/audits/XFIStaking-security-audit-20260324.md +682 -0
- package/audits/Xfinance-security-audit-20260324.md +463 -0
- package/audits/basedAIFarm-security-audit-20260324.md +330 -0
- package/audits/pepeCoin-security-audit-20260324.md +462 -0
- package/bin/ups +232 -0
- package/binance-wallet-exploit/.env.example +2 -0
- package/binance-wallet-exploit/EXECUTIVE_SUMMARY.md +272 -0
- package/binance-wallet-exploit/EXPLOIT_SUMMARY.md +104 -0
- package/binance-wallet-exploit/FINAL_ANALYSIS.md +326 -0
- package/binance-wallet-exploit/FLASHLOAN_ATTACK.md +292 -0
- package/binance-wallet-exploit/HONEYPOT_REPORT.md +526 -0
- package/binance-wallet-exploit/INVESTIGATION_COMPLETE.md +362 -0
- package/binance-wallet-exploit/LENDFLARE_EXPLOIT.md +219 -0
- package/binance-wallet-exploit/LENDFLARE_FINAL_ATTACK.md +307 -0
- package/binance-wallet-exploit/LENDFLARE_REAL_EXPLOIT.md +286 -0
- package/binance-wallet-exploit/LENDFLARE_RUGPULL.md +269 -0
- package/binance-wallet-exploit/LFT_ANALYSIS.md +206 -0
- package/binance-wallet-exploit/QUICK_START.md +75 -0
- package/binance-wallet-exploit/README.md +195 -0
- package/binance-wallet-exploit/REAL_TX_EXPLOIT_ANALYSIS.md +271 -0
- package/binance-wallet-exploit/REMIX_INSTRUCTIONS.md +223 -0
- package/binance-wallet-exploit/TEST_RESULTS.md +203 -0
- package/binance-wallet-exploit/cache/solidity-files-cache.json +1 -0
- package/binance-wallet-exploit/cache/test-failures +1 -0
- package/binance-wallet-exploit/lib/forge-std/.gitattributes +1 -0
- package/binance-wallet-exploit/lib/forge-std/.github/CODEOWNERS +1 -0
- package/binance-wallet-exploit/lib/forge-std/.github/dependabot.yml +6 -0
- package/binance-wallet-exploit/lib/forge-std/.github/workflows/ci.yml +125 -0
- package/binance-wallet-exploit/lib/forge-std/.github/workflows/sync.yml +36 -0
- package/binance-wallet-exploit/lib/forge-std/CONTRIBUTING.md +193 -0
- package/binance-wallet-exploit/lib/forge-std/LICENSE-APACHE +203 -0
- package/binance-wallet-exploit/lib/forge-std/LICENSE-MIT +25 -0
- package/binance-wallet-exploit/lib/forge-std/README.md +314 -0
- package/binance-wallet-exploit/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
- package/binance-wallet-exploit/lib/forge-std/package.json +16 -0
- package/binance-wallet-exploit/lib/forge-std/scripts/vm.py +636 -0
- package/binance-wallet-exploit/out/build-info/1e9aa7e86cf56962.json +1 -0
- package/binance-wallet-exploit/out/build-info/6f56f10e9d7b56eb.json +1 -0
- package/binance-wallet-exploit/out/build-info/7edba961ff697a24.json +1 -0
- package/binance-wallet-exploit/out/build-info/8c27fe3efea2f2e7.json +1 -0
- package/binance-wallet-exploit/out/build-info/978b680daffec63a.json +1 -0
- package/binance-wallet-exploit/out/build-info/9806b900b5672d0c.json +1 -0
- package/binance-wallet-exploit/out/build-info/b4b9ff36e9b3fc27.json +1 -0
- package/binance-wallet-exploit/out/build-info/b6f4df9ae05c0812.json +1 -0
- package/binance-wallet-exploit/out/build-info/c88dbc86551f7b5c.json +1 -0
- package/binance-wallet-exploit/out/build-info/e9657504010623db.json +1 -0
- package/cache/fuzz/failures/ARIAVerifiedFuzzTest/testFuzz_ApprovalRaceCondition +1 -0
- package/cache/fuzz/failures/HotCrossSwapFuzzTest/testFuzz_DirectTransferExploit +1 -0
- package/cache/fuzz/failures/HotCrossSwapFuzzTest/testFuzz_LargeSwapDrain +1 -0
- package/cache/fuzz/failures/LendFlareFuzz/testFuzz_ApprovalExploit +1 -0
- package/cache/fuzz/failures/LendFlareFuzz/testFuzz_BalanceManipulation +1 -0
- package/cache/fuzz/failures/LendFlareFuzz/testFuzz_RateManipulation +1 -0
- package/cache/fuzz/failures/LendFlareFuzz/testFuzz_StorageManipulation +1 -0
- package/cache/fuzz/failures/PARFuzzTest/testFuzz_OverflowTransfer +1 -0
- package/cache/fuzz/failures/PARFuzzTest/testFuzz_Transfer +1 -0
- package/cache/fuzz/failures/XFIDeepFuzz/testFuzz_FrontrunAddfunds +1 -0
- package/cache/fuzz/failures/XFIDeepFuzz/testFuzz_RewardOverflow +1 -0
- package/cache/fuzz/failures/XFIDeepFuzz/testFuzz_RoundingExploit +1 -0
- package/cache/fuzz/failures/XFIDeepFuzz/testFuzz_WithdrawLimit +1 -0
- package/cache/solidity-files-cache.json +1 -0
- package/cache/test-failures +1 -0
- package/calculate-elephant-flashloan.js +195 -0
- package/check-address-approval.js +112 -0
- package/check-alpha-proxy.js +42 -0
- package/check-arbitrage.js +155 -0
- package/check-aria-token.js +47 -0
- package/check-ark.sh +20 -0
- package/check-btcst-mining.js +75 -0
- package/check-btcst-pools.js +163 -0
- package/check-btcst.js +88 -0
- package/check-caller.js +26 -0
- package/check-ceek-lp.js +73 -0
- package/check-ceek.js +47 -0
- package/check-dxsale-address.js +35 -0
- package/check-fara-exploit-timing.js +56 -0
- package/check-fara-real-exploit.js +73 -0
- package/check-flashloan-limits.js +129 -0
- package/check-kel-cel-pool.js +91 -0
- package/check-lax-staking.js +41 -0
- package/check-lendflare.js +165 -0
- package/check-lft-accounting.js +109 -0
- package/check-lft-roles.js +165 -0
- package/check-lock-time.js +47 -0
- package/check-min-stake.js +73 -0
- package/check-mystery-contract.js +52 -0
- package/check-next-token.js +50 -0
- package/check-nora-lock.js +67 -0
- package/check-oiler-approvals.js +116 -0
- package/check-oiler-proxy.js +73 -0
- package/check-oiler-staking.js +117 -0
- package/check-proxy-simple.js +71 -0
- package/check-recent-stakes.js +54 -0
- package/check-shegic-holdings.js +67 -0
- package/check-snowcrash-ecosystem.js +83 -0
- package/check-sync-lp.js +97 -0
- package/check-sync-stake.js +42 -0
- package/check-tlm.js +37 -0
- package/check-token-pools.js +146 -0
- package/check-trunk-depeg.js +181 -0
- package/check-tusd-decimals.js +58 -0
- package/check-user-storage-deep.js +81 -0
- package/check-welephant-pools.js +130 -0
- package/check-xfi-pool.js +75 -0
- package/check-zypher.js +32 -0
- package/check_proxy.sh +36 -0
- package/compare-tlm-chains.js +90 -0
- package/contract_0x05f2.html +6025 -0
- package/contract_0x3720.html +6361 -0
- package/contract_0x928e.html +5606 -0
- package/contract_0xc42d.html +5304 -0
- package/contract_page.html +5789 -0
- package/decode-stake-tx.js +50 -0
- package/deep-analyze-lock.js +82 -0
- package/dune_uups_proxy_query.sql +42 -0
- package/dune_uups_vulnerable_query.sql +0 -0
- package/echidna/alpha-proxy.yaml +14 -0
- package/echidna/elephant.yaml +7 -0
- package/echidna/lendflare.yaml +42 -0
- package/echidna.config.yaml +12 -0
- package/elephant_raw.json +1 -0
- package/eps_raw.json +1 -0
- package/exploit/.github/workflows/test.yml +38 -0
- package/exploit/.gitmodules +3 -0
- package/exploit/README.md +66 -0
- package/exploit/foundry.lock +8 -0
- package/exploit/lib/forge-std/.gitattributes +1 -0
- package/exploit/lib/forge-std/.github/CODEOWNERS +1 -0
- package/exploit/lib/forge-std/.github/dependabot.yml +6 -0
- package/exploit/lib/forge-std/.github/workflows/ci.yml +125 -0
- package/exploit/lib/forge-std/.github/workflows/sync.yml +36 -0
- package/exploit/lib/forge-std/CONTRIBUTING.md +193 -0
- package/exploit/lib/forge-std/LICENSE-APACHE +203 -0
- package/exploit/lib/forge-std/LICENSE-MIT +25 -0
- package/exploit/lib/forge-std/README.md +314 -0
- package/exploit/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
- package/exploit/lib/forge-std/package.json +16 -0
- package/exploit/lib/forge-std/scripts/vm.py +636 -0
- package/exploit_analysis.txt +51 -0
- package/extract_contract.py +21 -0
- package/extract_elephant_contracts.py +24 -0
- package/fara-staking-bytecode.txt +1 -0
- package/fara-staking-raw.txt +1 -0
- package/fetch-aria.js +46 -0
- package/fetch-contract.js +50 -0
- package/fetch-shegic-source.js +86 -0
- package/fetch-snowcrash.js +44 -0
- package/fetch-staking-source.js +53 -0
- package/fetch-tlm.js +60 -0
- package/fetch_elephant_source.py +32 -0
- package/find-ceek-staking.js +21 -0
- package/find-exploit-tx.js +88 -0
- package/find-oiler-holders.js +100 -0
- package/find-tlm-holder.js +36 -0
- package/find-vulnerable-fund.js +94 -0
- package/foundry.lock +8 -0
- package/fuzz-all.sh +53 -0
- package/get-aria-contract.py +40 -0
- package/get-lft-holders.js +89 -0
- package/get-tlm-source.sh +8 -0
- package/harvest_txs.json +1 -0
- package/lft-bytecode-raw.txt +1 -0
- package/lft-bytecode.json +1 -0
- package/lft-impl.bin +1 -0
- package/lft-implementation-bytecode.txt +1 -0
- package/lib/forge-std/.gitattributes +1 -0
- package/lib/forge-std/.github/CODEOWNERS +1 -0
- package/lib/forge-std/.github/dependabot.yml +6 -0
- package/lib/forge-std/.github/workflows/ci.yml +125 -0
- package/lib/forge-std/.github/workflows/sync.yml +36 -0
- package/lib/forge-std/CONTRIBUTING.md +193 -0
- package/lib/forge-std/LICENSE-APACHE +203 -0
- package/lib/forge-std/LICENSE-MIT +25 -0
- package/lib/forge-std/README.md +314 -0
- package/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
- package/lib/forge-std/package.json +16 -0
- package/lib/forge-std/scripts/vm.py +636 -0
- package/lib/openzeppelin-contracts/.changeset/config.json +12 -0
- package/lib/openzeppelin-contracts/.codecov.yml +12 -0
- package/lib/openzeppelin-contracts/.editorconfig +21 -0
- package/lib/openzeppelin-contracts/.eslintrc +20 -0
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md +21 -0
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml +4 -0
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
- package/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md +20 -0
- package/lib/openzeppelin-contracts/.github/actions/gas-compare/action.yml +49 -0
- package/lib/openzeppelin-contracts/.github/actions/setup/action.yml +21 -0
- package/lib/openzeppelin-contracts/.github/actions/storage-layout/action.yml +55 -0
- package/lib/openzeppelin-contracts/.github/workflows/actionlint.yml +18 -0
- package/lib/openzeppelin-contracts/.github/workflows/changeset.yml +28 -0
- package/lib/openzeppelin-contracts/.github/workflows/checks.yml +118 -0
- package/lib/openzeppelin-contracts/.github/workflows/docs.yml +19 -0
- package/lib/openzeppelin-contracts/.github/workflows/formal-verification.yml +68 -0
- package/lib/openzeppelin-contracts/.github/workflows/release-cycle.yml +214 -0
- package/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml +34 -0
- package/lib/openzeppelin-contracts/.gitmodules +7 -0
- package/lib/openzeppelin-contracts/.mocharc.js +4 -0
- package/lib/openzeppelin-contracts/.prettierrc +15 -0
- package/lib/openzeppelin-contracts/.solcover.js +13 -0
- package/lib/openzeppelin-contracts/CHANGELOG.md +972 -0
- package/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md +73 -0
- package/lib/openzeppelin-contracts/CONTRIBUTING.md +36 -0
- package/lib/openzeppelin-contracts/GUIDELINES.md +148 -0
- package/lib/openzeppelin-contracts/LICENSE +22 -0
- package/lib/openzeppelin-contracts/README.md +107 -0
- package/lib/openzeppelin-contracts/RELEASING.md +45 -0
- package/lib/openzeppelin-contracts/SECURITY.md +42 -0
- package/lib/openzeppelin-contracts/audits/2017-03.md +292 -0
- package/lib/openzeppelin-contracts/audits/2018-10.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2022-10-Checkpoints.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2022-10-ERC4626.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2023-05-v4.9.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2023-10-v5.0.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/README.md +17 -0
- package/lib/openzeppelin-contracts/certora/Makefile +54 -0
- package/lib/openzeppelin-contracts/certora/README.md +60 -0
- package/lib/openzeppelin-contracts/certora/diff/access_manager_AccessManager.sol.patch +97 -0
- package/lib/openzeppelin-contracts/certora/reports/2021-10.pdf +0 -0
- package/lib/openzeppelin-contracts/certora/reports/2022-03.pdf +0 -0
- package/lib/openzeppelin-contracts/certora/reports/2022-05.pdf +0 -0
- package/lib/openzeppelin-contracts/certora/run.js +160 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessControl.spec +119 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessControlDefaultAdminRules.spec +464 -0
- package/lib/openzeppelin-contracts/certora/specs/DoubleEndedQueue.spec +300 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20.spec +352 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20FlashMint.spec +55 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20Wrapper.spec +198 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC721.spec +679 -0
- package/lib/openzeppelin-contracts/certora/specs/EnumerableMap.spec +333 -0
- package/lib/openzeppelin-contracts/certora/specs/EnumerableSet.spec +246 -0
- package/lib/openzeppelin-contracts/certora/specs/Initializable.spec +165 -0
- package/lib/openzeppelin-contracts/certora/specs/Ownable.spec +77 -0
- package/lib/openzeppelin-contracts/certora/specs/Ownable2Step.spec +108 -0
- package/lib/openzeppelin-contracts/certora/specs/Pausable.spec +96 -0
- package/lib/openzeppelin-contracts/certora/specs/TimelockController.spec +274 -0
- package/lib/openzeppelin-contracts/certora/specs/helpers/helpers.spec +7 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControl.spec +8 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControlDefaultAdminRules.spec +36 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC20.spec +11 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC2612.spec +5 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashBorrower.spec +3 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashLender.spec +5 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC5313.spec +3 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC721.spec +17 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC721Receiver.spec +3 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable.spec +5 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable2Step.spec +7 -0
- package/lib/openzeppelin-contracts/certora/specs.json +86 -0
- package/lib/openzeppelin-contracts/contracts/access/README.adoc +43 -0
- package/lib/openzeppelin-contracts/contracts/finance/README.adoc +14 -0
- package/lib/openzeppelin-contracts/contracts/governance/README.adoc +167 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/README.adoc +82 -0
- package/lib/openzeppelin-contracts/contracts/metatx/README.adoc +12 -0
- package/lib/openzeppelin-contracts/contracts/package.json +32 -0
- package/lib/openzeppelin-contracts/contracts/proxy/README.adoc +87 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc +41 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc +67 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc +67 -0
- package/lib/openzeppelin-contracts/contracts/token/common/README.adoc +10 -0
- package/lib/openzeppelin-contracts/contracts/utils/README.adoc +88 -0
- package/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE +11 -0
- package/lib/openzeppelin-contracts/docs/README.md +16 -0
- package/lib/openzeppelin-contracts/docs/antora.yml +7 -0
- package/lib/openzeppelin-contracts/docs/config.js +21 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3a.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3b.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-6.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-deposit.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-mint.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-linear.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglog.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglogext.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-exec.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc +23 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc +204 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/backwards-compatibility.adoc +48 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc +11 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc +19 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc +145 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc +71 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc +77 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc4626.adoc +214 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc +79 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc +77 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/faq.adoc +13 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc +240 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc +79 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc +31 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc +77 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc +185 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc +15 -0
- package/lib/openzeppelin-contracts/docs/templates/contract.hbs +111 -0
- package/lib/openzeppelin-contracts/docs/templates/helpers.js +46 -0
- package/lib/openzeppelin-contracts/docs/templates/page.hbs +4 -0
- package/lib/openzeppelin-contracts/docs/templates/properties.js +64 -0
- package/lib/openzeppelin-contracts/hardhat/env-artifacts.js +24 -0
- package/lib/openzeppelin-contracts/hardhat/env-contract.js +25 -0
- package/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js +45 -0
- package/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js +6 -0
- package/lib/openzeppelin-contracts/hardhat/task-test-get-files.js +25 -0
- package/lib/openzeppelin-contracts/hardhat.config.js +131 -0
- package/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE +661 -0
- package/lib/openzeppelin-contracts/lib/erc4626-tests/README.md +116 -0
- package/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml +92 -0
- package/lib/openzeppelin-contracts/lib/forge-std/.gitmodules +3 -0
- package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE +203 -0
- package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT +25 -0
- package/lib/openzeppelin-contracts/lib/forge-std/README.md +250 -0
- package/lib/openzeppelin-contracts/lib/forge-std/package.json +16 -0
- package/lib/openzeppelin-contracts/logo.svg +15 -0
- package/lib/openzeppelin-contracts/netlify.toml +3 -0
- package/lib/openzeppelin-contracts/package-lock.json +16544 -0
- package/lib/openzeppelin-contracts/package.json +96 -0
- package/lib/openzeppelin-contracts/remappings.txt +1 -0
- package/lib/openzeppelin-contracts/renovate.json +4 -0
- package/lib/openzeppelin-contracts/requirements.txt +1 -0
- package/lib/openzeppelin-contracts/scripts/checks/compare-layout.js +20 -0
- package/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js +243 -0
- package/lib/openzeppelin-contracts/scripts/checks/extract-layout.js +38 -0
- package/lib/openzeppelin-contracts/scripts/checks/generation.sh +6 -0
- package/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js +54 -0
- package/lib/openzeppelin-contracts/scripts/gen-nav.js +41 -0
- package/lib/openzeppelin-contracts/scripts/generate/format-lines.js +16 -0
- package/lib/openzeppelin-contracts/scripts/generate/run.js +49 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js +247 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js +17 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js +146 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js +283 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js +250 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js +126 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js +78 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js +30 -0
- package/lib/openzeppelin-contracts/scripts/git-user-config.sh +6 -0
- package/lib/openzeppelin-contracts/scripts/helpers.js +37 -0
- package/lib/openzeppelin-contracts/scripts/prepack.sh +23 -0
- package/lib/openzeppelin-contracts/scripts/prepare-docs.sh +26 -0
- package/lib/openzeppelin-contracts/scripts/release/format-changelog.js +33 -0
- package/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js +15 -0
- package/lib/openzeppelin-contracts/scripts/release/update-comment.js +34 -0
- package/lib/openzeppelin-contracts/scripts/release/version.sh +11 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh +8 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js +48 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh +20 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh +26 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh +26 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js +7 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js +17 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/start.sh +35 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/state.js +112 -0
- package/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js +45 -0
- package/lib/openzeppelin-contracts/scripts/solhint-custom/index.js +84 -0
- package/lib/openzeppelin-contracts/scripts/solhint-custom/package.json +5 -0
- package/lib/openzeppelin-contracts/scripts/update-docs-branch.js +65 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/README.md +21 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/patch-apply.sh +19 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/patch-save.sh +18 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/transpile-onto.sh +54 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/transpile.sh +47 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/upgradeable.patch +360 -0
- package/lib/openzeppelin-contracts/slither.config.json +5 -0
- package/lib/openzeppelin-contracts/solhint.config.js +20 -0
- package/mythril-lft-output.txt +1 -0
- package/mythril-lft-symbolic.txt +18 -0
- package/mythril-lft.sh +20 -0
- package/mythril-symbolic-output.txt +1 -0
- package/mythril-symbolic.sh +42 -0
- package/out/build-info/0026b78428192979.json +1 -0
- package/out/build-info/03c4fc3b88486eba.json +1 -0
- package/out/build-info/0540afa9b9a5c5a6.json +1 -0
- package/out/build-info/081932f505bc08b9.json +1 -0
- package/out/build-info/0da104ba0d6642d5.json +1 -0
- package/out/build-info/197281971dbb5f23.json +1 -0
- package/out/build-info/197e7e332832a232.json +1 -0
- package/out/build-info/1a1cab9136eb5f94.json +1 -0
- package/out/build-info/1b320204eb162aa2.json +1 -0
- package/out/build-info/1e03f94398052674.json +1 -0
- package/out/build-info/22ac085949602937.json +1 -0
- package/out/build-info/234ef37453a9fa64.json +1 -0
- package/out/build-info/2447db7b1878fa8e.json +1 -0
- package/out/build-info/25568daeb484f5ff.json +1 -0
- package/out/build-info/27465853244c49ce.json +1 -0
- package/out/build-info/2c57a9e0f087453b.json +1 -0
- package/out/build-info/3c62ae7de8da68c4.json +1 -0
- package/out/build-info/3e771ae109e97bb3.json +1 -0
- package/out/build-info/460499bc0a3465c4.json +1 -0
- package/out/build-info/47ce37e50a4f115e.json +1 -0
- package/out/build-info/4fcce5c63cf427d6.json +1 -0
- package/out/build-info/4fd0a53fe63fddbb.json +1 -0
- package/out/build-info/50f1247db9d769cc.json +1 -0
- package/out/build-info/5317d0181a7a5e02.json +1 -0
- package/out/build-info/594df509275ceb5b.json +1 -0
- package/out/build-info/61983ac3f6141719.json +1 -0
- package/out/build-info/638c4548307122fe.json +1 -0
- package/out/build-info/67c2c43bdb7c0ded.json +1 -0
- package/out/build-info/777f42643aad37b7.json +1 -0
- package/out/build-info/7d7856f19e845354.json +1 -0
- package/out/build-info/83976260b6f71e94.json +1 -0
- package/out/build-info/83c23882000b963d.json +1 -0
- package/out/build-info/84b2cce8f70b36be.json +1 -0
- package/out/build-info/8bc13d31d7c3206a.json +1 -0
- package/out/build-info/8e183bd4d9d8cf88.json +1 -0
- package/out/build-info/94bfe1e7cafa8ff5.json +1 -0
- package/out/build-info/99ec7d5e8d8ff360.json +1 -0
- package/out/build-info/9ac044b29daa7d5e.json +1 -0
- package/out/build-info/9b203227ff5d2e63.json +1 -0
- package/out/build-info/9d18c5872c4282dd.json +1 -0
- package/out/build-info/9f77f04f33baf9a3.json +1 -0
- package/out/build-info/a6e1caf974787982.json +1 -0
- package/out/build-info/a94b6348867a62d6.json +1 -0
- package/out/build-info/ad93721947a8b195.json +1 -0
- package/out/build-info/b42daddb5aa4b19f.json +1 -0
- package/out/build-info/bf13512ae899f7e8.json +1 -0
- package/out/build-info/c39f86c20a548c4a.json +1 -0
- package/out/build-info/cb12bb975a2f4e65.json +1 -0
- package/out/build-info/d0c6788fadc2aa60.json +1 -0
- package/out/build-info/d2726bf94ed5b845.json +1 -0
- package/out/build-info/d4eb00da50cce5cb.json +1 -0
- package/out/build-info/db931924a3bc8bdd.json +1 -0
- package/out/build-info/e1a503d49bc77401.json +1 -0
- package/out/build-info/efe5396f8892ce77.json +1 -0
- package/out/build-info/f536d90ced745969.json +1 -0
- package/out/build-info/fed38823c7019b82.json +1 -0
- package/package.json +51 -0
- package/page.html +5384 -0
- package/pancakeswap-simple-tvl.sql +15 -0
- package/pancakeswap-top-pools.sql +29 -0
- package/pancakeswap-tvl-optimized.sql +57 -0
- package/pancakeswap-tvl-query.sql +60 -0
- package/pancakeswap-underflow-hunting.sql +51 -0
- package/pancakeswap-vulnerability-queries.sql +200 -0
- package/posi_page.html +6369 -0
- package/posi_response.json +29 -0
- package/proxy_page.html +500 -0
- package/run_mythril_elephant.sh +18 -0
- package/sHEGIC-bytecode.bin +6 -0
- package/sHEGIC-mythril-analysis.txt +1 -0
- package/sHEGIC-mythril-full.txt +134 -0
- package/sHEGIC_ANALYSIS.md +135 -0
- package/sHEGIC_EXPLOIT_ANALYSIS.md +317 -0
- package/sHEGIC_MYTHRIL_ANALYSIS.md +361 -0
- package/scrape-snowcrash.js +28 -0
- package/scripts/yooshi_drain.sh +154 -0
- package/shi_raw.json +1 -0
- package/temp.json +1 -0
- package/temp_harvest.json +1 -0
- package/temp_pika.json +1 -0
- package/temp_posi.json +1 -0
- package/temp_response.json +1 -0
- package/test-lft-hidden-balance.js +108 -0
- package/test-xfi-exploit.js +140 -0
- package/trunk-liquidity-rescue.js +164 -0
- package/vBABY_page.html +6153 -0
- package/vBABY_response.json +29 -0
- package/wsg_response.json +1 -0
- package/yooldo_page.html +10371 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import "helpers/helpers.spec";
|
|
2
|
+
import "methods/IAccessControlDefaultAdminRules.spec";
|
|
3
|
+
import "methods/IAccessControl.spec";
|
|
4
|
+
import "AccessControl.spec";
|
|
5
|
+
|
|
6
|
+
use rule onlyGrantCanGrant filtered {
|
|
7
|
+
f -> f.selector != sig:acceptDefaultAdminTransfer().selector
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
12
|
+
│ Definitions │
|
|
13
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
14
|
+
*/
|
|
15
|
+
definition timeSanity(env e) returns bool =
|
|
16
|
+
e.block.timestamp > 0 && e.block.timestamp + defaultAdminDelay(e) < max_uint48;
|
|
17
|
+
|
|
18
|
+
definition delayChangeWaitSanity(env e, uint48 newDelay) returns bool =
|
|
19
|
+
e.block.timestamp + delayChangeWait_(e, newDelay) < max_uint48;
|
|
20
|
+
|
|
21
|
+
definition isSet(uint48 schedule) returns bool =
|
|
22
|
+
schedule != 0;
|
|
23
|
+
|
|
24
|
+
definition hasPassed(env e, uint48 schedule) returns bool =
|
|
25
|
+
assert_uint256(schedule) < e.block.timestamp;
|
|
26
|
+
|
|
27
|
+
definition increasingDelaySchedule(env e, uint48 newDelay) returns mathint =
|
|
28
|
+
e.block.timestamp + min(newDelay, defaultAdminDelayIncreaseWait());
|
|
29
|
+
|
|
30
|
+
definition decreasingDelaySchedule(env e, uint48 newDelay) returns mathint =
|
|
31
|
+
e.block.timestamp + defaultAdminDelay(e) - newDelay;
|
|
32
|
+
|
|
33
|
+
/*
|
|
34
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
35
|
+
│ Invariant: defaultAdmin holds the DEFAULT_ADMIN_ROLE │
|
|
36
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
37
|
+
*/
|
|
38
|
+
invariant defaultAdminConsistency(address account)
|
|
39
|
+
(account == defaultAdmin() && account != 0) <=> hasRole(DEFAULT_ADMIN_ROLE(), account)
|
|
40
|
+
{
|
|
41
|
+
preserved with (env e) {
|
|
42
|
+
require nonzerosender(e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
48
|
+
│ Invariant: Only one account holds the DEFAULT_ADMIN_ROLE │
|
|
49
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
50
|
+
*/
|
|
51
|
+
invariant singleDefaultAdmin(address account, address another)
|
|
52
|
+
hasRole(DEFAULT_ADMIN_ROLE(), account) && hasRole(DEFAULT_ADMIN_ROLE(), another) => another == account
|
|
53
|
+
{
|
|
54
|
+
preserved {
|
|
55
|
+
requireInvariant defaultAdminConsistency(account);
|
|
56
|
+
requireInvariant defaultAdminConsistency(another);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
62
|
+
│ Invariant: DEFAULT_ADMIN_ROLE's admin is always DEFAULT_ADMIN_ROLE │
|
|
63
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
64
|
+
*/
|
|
65
|
+
invariant defaultAdminRoleAdminConsistency()
|
|
66
|
+
getRoleAdmin(DEFAULT_ADMIN_ROLE()) == DEFAULT_ADMIN_ROLE();
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
70
|
+
│ Invariant: owner is the defaultAdmin │
|
|
71
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
72
|
+
*/
|
|
73
|
+
invariant ownerConsistency()
|
|
74
|
+
defaultAdmin() == owner();
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
78
|
+
│ Function correctness: revokeRole only affects the specified user/role combo │
|
|
79
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
80
|
+
*/
|
|
81
|
+
rule revokeRoleEffect(env e, bytes32 role) {
|
|
82
|
+
require nonpayable(e);
|
|
83
|
+
|
|
84
|
+
bytes32 otherRole;
|
|
85
|
+
address account;
|
|
86
|
+
address otherAccount;
|
|
87
|
+
|
|
88
|
+
bool isCallerAdmin = hasRole(getRoleAdmin(role), e.msg.sender);
|
|
89
|
+
bool hasOtherRoleBefore = hasRole(otherRole, otherAccount);
|
|
90
|
+
|
|
91
|
+
revokeRole@withrevert(e, role, account);
|
|
92
|
+
bool success = !lastReverted;
|
|
93
|
+
|
|
94
|
+
bool hasOtherRoleAfter = hasRole(otherRole, otherAccount);
|
|
95
|
+
|
|
96
|
+
// liveness
|
|
97
|
+
assert success <=> isCallerAdmin && role != DEFAULT_ADMIN_ROLE(),
|
|
98
|
+
"roles can only be revoked by their owner except for the default admin role";
|
|
99
|
+
|
|
100
|
+
// effect
|
|
101
|
+
assert success => !hasRole(role, account),
|
|
102
|
+
"role is revoked";
|
|
103
|
+
|
|
104
|
+
// no side effect
|
|
105
|
+
assert hasOtherRoleBefore != hasOtherRoleAfter => (role == otherRole && account == otherAccount),
|
|
106
|
+
"no other role is affected";
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/*
|
|
110
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
111
|
+
│ Function correctness: renounceRole only affects the specified user/role combo │
|
|
112
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
113
|
+
*/
|
|
114
|
+
rule renounceRoleEffect(env e, bytes32 role) {
|
|
115
|
+
require nonpayable(e);
|
|
116
|
+
|
|
117
|
+
bytes32 otherRole;
|
|
118
|
+
address account;
|
|
119
|
+
address otherAccount;
|
|
120
|
+
|
|
121
|
+
bool hasOtherRoleBefore = hasRole(otherRole, otherAccount);
|
|
122
|
+
address adminBefore = defaultAdmin();
|
|
123
|
+
address pendingAdminBefore = pendingDefaultAdmin_();
|
|
124
|
+
uint48 scheduleBefore = pendingDefaultAdminSchedule_();
|
|
125
|
+
|
|
126
|
+
renounceRole@withrevert(e, role, account);
|
|
127
|
+
bool success = !lastReverted;
|
|
128
|
+
|
|
129
|
+
bool hasOtherRoleAfter = hasRole(otherRole, otherAccount);
|
|
130
|
+
address adminAfter = defaultAdmin();
|
|
131
|
+
address pendingAdminAfter = pendingDefaultAdmin_();
|
|
132
|
+
uint48 scheduleAfter = pendingDefaultAdminSchedule_();
|
|
133
|
+
|
|
134
|
+
// liveness
|
|
135
|
+
assert success <=> (
|
|
136
|
+
account == e.msg.sender &&
|
|
137
|
+
(
|
|
138
|
+
role != DEFAULT_ADMIN_ROLE() ||
|
|
139
|
+
account != adminBefore ||
|
|
140
|
+
(
|
|
141
|
+
pendingAdminBefore == 0 &&
|
|
142
|
+
isSet(scheduleBefore) &&
|
|
143
|
+
hasPassed(e, scheduleBefore)
|
|
144
|
+
)
|
|
145
|
+
)
|
|
146
|
+
),
|
|
147
|
+
"an account only can renounce by itself with a delay for the default admin role";
|
|
148
|
+
|
|
149
|
+
// effect
|
|
150
|
+
assert success => !hasRole(role, account),
|
|
151
|
+
"role is renounced";
|
|
152
|
+
|
|
153
|
+
assert success => (
|
|
154
|
+
(
|
|
155
|
+
role == DEFAULT_ADMIN_ROLE() &&
|
|
156
|
+
account == adminBefore
|
|
157
|
+
) ? (
|
|
158
|
+
adminAfter == 0 &&
|
|
159
|
+
pendingAdminAfter == 0 &&
|
|
160
|
+
scheduleAfter == 0
|
|
161
|
+
) : (
|
|
162
|
+
adminAfter == adminBefore &&
|
|
163
|
+
pendingAdminAfter == pendingAdminBefore &&
|
|
164
|
+
scheduleAfter == scheduleBefore
|
|
165
|
+
)
|
|
166
|
+
),
|
|
167
|
+
"renouncing default admin role cleans state iff called by previous admin";
|
|
168
|
+
|
|
169
|
+
// no side effect
|
|
170
|
+
assert hasOtherRoleBefore != hasOtherRoleAfter => (
|
|
171
|
+
role == otherRole &&
|
|
172
|
+
account == otherAccount
|
|
173
|
+
),
|
|
174
|
+
"no other role is affected";
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/*
|
|
178
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
179
|
+
│ Rule: defaultAdmin is only affected by accepting an admin transfer or renoucing │
|
|
180
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
181
|
+
*/
|
|
182
|
+
rule noDefaultAdminChange(env e, method f, calldataarg args) {
|
|
183
|
+
address adminBefore = defaultAdmin();
|
|
184
|
+
f(e, args);
|
|
185
|
+
address adminAfter = defaultAdmin();
|
|
186
|
+
|
|
187
|
+
assert adminBefore != adminAfter => (
|
|
188
|
+
f.selector == sig:acceptDefaultAdminTransfer().selector ||
|
|
189
|
+
f.selector == sig:renounceRole(bytes32,address).selector
|
|
190
|
+
),
|
|
191
|
+
"default admin is only affected by accepting an admin transfer or renoucing";
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/*
|
|
195
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
196
|
+
│ Rule: pendingDefaultAdmin is only affected by beginning, completing (accept or renounce), or canceling an admin │
|
|
197
|
+
│ transfer │
|
|
198
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
199
|
+
*/
|
|
200
|
+
rule noPendingDefaultAdminChange(env e, method f, calldataarg args) {
|
|
201
|
+
address pendingAdminBefore = pendingDefaultAdmin_();
|
|
202
|
+
uint48 scheduleBefore = pendingDefaultAdminSchedule_();
|
|
203
|
+
f(e, args);
|
|
204
|
+
address pendingAdminAfter = pendingDefaultAdmin_();
|
|
205
|
+
uint48 scheduleAfter = pendingDefaultAdminSchedule_();
|
|
206
|
+
|
|
207
|
+
assert (
|
|
208
|
+
pendingAdminBefore != pendingAdminAfter ||
|
|
209
|
+
scheduleBefore != scheduleAfter
|
|
210
|
+
) => (
|
|
211
|
+
f.selector == sig:beginDefaultAdminTransfer(address).selector ||
|
|
212
|
+
f.selector == sig:acceptDefaultAdminTransfer().selector ||
|
|
213
|
+
f.selector == sig:cancelDefaultAdminTransfer().selector ||
|
|
214
|
+
f.selector == sig:renounceRole(bytes32,address).selector
|
|
215
|
+
),
|
|
216
|
+
"pending admin and its schedule is only affected by beginning, completing, or cancelling an admin transfer";
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/*
|
|
220
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
221
|
+
│ Rule: defaultAdminDelay can't be changed atomically by any function │
|
|
222
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
223
|
+
*/
|
|
224
|
+
rule noDefaultAdminDelayChange(env e, method f, calldataarg args) {
|
|
225
|
+
uint48 delayBefore = defaultAdminDelay(e);
|
|
226
|
+
f(e, args);
|
|
227
|
+
uint48 delayAfter = defaultAdminDelay(e);
|
|
228
|
+
|
|
229
|
+
assert delayBefore == delayAfter,
|
|
230
|
+
"delay can't be changed atomically by any function";
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/*
|
|
234
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
235
|
+
│ Rule: pendingDefaultAdminDelay is only affected by changeDefaultAdminDelay or rollbackDefaultAdminDelay │
|
|
236
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
237
|
+
*/
|
|
238
|
+
rule noPendingDefaultAdminDelayChange(env e, method f, calldataarg args) {
|
|
239
|
+
uint48 pendingDelayBefore = pendingDelay_(e);
|
|
240
|
+
f(e, args);
|
|
241
|
+
uint48 pendingDelayAfter = pendingDelay_(e);
|
|
242
|
+
|
|
243
|
+
assert pendingDelayBefore != pendingDelayAfter => (
|
|
244
|
+
f.selector == sig:changeDefaultAdminDelay(uint48).selector ||
|
|
245
|
+
f.selector == sig:rollbackDefaultAdminDelay().selector
|
|
246
|
+
),
|
|
247
|
+
"pending delay is only affected by changeDefaultAdminDelay or rollbackDefaultAdminDelay";
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/*
|
|
251
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
252
|
+
│ Rule: defaultAdminDelayIncreaseWait can't be changed atomically by any function │
|
|
253
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
254
|
+
*/
|
|
255
|
+
rule noDefaultAdminDelayIncreaseWaitChange(env e, method f, calldataarg args) {
|
|
256
|
+
uint48 delayIncreaseWaitBefore = defaultAdminDelayIncreaseWait();
|
|
257
|
+
f(e, args);
|
|
258
|
+
uint48 delayIncreaseWaitAfter = defaultAdminDelayIncreaseWait();
|
|
259
|
+
|
|
260
|
+
assert delayIncreaseWaitBefore == delayIncreaseWaitAfter,
|
|
261
|
+
"delay increase wait can't be changed atomically by any function";
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/*
|
|
265
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
266
|
+
│ Function correctness: beginDefaultAdminTransfer sets a pending default admin and its schedule │
|
|
267
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
268
|
+
*/
|
|
269
|
+
rule beginDefaultAdminTransfer(env e, address newAdmin) {
|
|
270
|
+
require timeSanity(e);
|
|
271
|
+
require nonpayable(e);
|
|
272
|
+
require nonzerosender(e);
|
|
273
|
+
requireInvariant defaultAdminConsistency(e.msg.sender);
|
|
274
|
+
|
|
275
|
+
beginDefaultAdminTransfer@withrevert(e, newAdmin);
|
|
276
|
+
bool success = !lastReverted;
|
|
277
|
+
|
|
278
|
+
// liveness
|
|
279
|
+
assert success <=> e.msg.sender == defaultAdmin(),
|
|
280
|
+
"only the current default admin can begin a transfer";
|
|
281
|
+
|
|
282
|
+
// effect
|
|
283
|
+
assert success => pendingDefaultAdmin_() == newAdmin,
|
|
284
|
+
"pending default admin is set";
|
|
285
|
+
assert success => to_mathint(pendingDefaultAdminSchedule_()) == e.block.timestamp + defaultAdminDelay(e),
|
|
286
|
+
"pending default admin delay is set";
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/*
|
|
290
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
291
|
+
│ Rule: A default admin can't change in less than the applied schedule │
|
|
292
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
293
|
+
*/
|
|
294
|
+
rule pendingDefaultAdminDelayEnforced(env e1, env e2, method f, calldataarg args, address newAdmin) {
|
|
295
|
+
require e1.block.timestamp <= e2.block.timestamp;
|
|
296
|
+
|
|
297
|
+
uint48 delayBefore = defaultAdminDelay(e1);
|
|
298
|
+
address adminBefore = defaultAdmin();
|
|
299
|
+
|
|
300
|
+
// There might be a better way to generalize this without requiring `beginDefaultAdminTransfer`, but currently
|
|
301
|
+
// it's the only way in which we can attest that only `delayBefore` has passed before a change.
|
|
302
|
+
beginDefaultAdminTransfer(e1, newAdmin);
|
|
303
|
+
f(e2, args);
|
|
304
|
+
|
|
305
|
+
address adminAfter = defaultAdmin();
|
|
306
|
+
|
|
307
|
+
// change can only happen towards the newAdmin, with the delay
|
|
308
|
+
assert adminAfter != adminBefore => (
|
|
309
|
+
adminAfter == newAdmin &&
|
|
310
|
+
to_mathint(e2.block.timestamp) >= e1.block.timestamp + delayBefore
|
|
311
|
+
),
|
|
312
|
+
"The admin can only change after the enforced delay and to the previously scheduled new admin";
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/*
|
|
316
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
317
|
+
│ Function correctness: acceptDefaultAdminTransfer updates defaultAdmin resetting the pending admin and its schedule │
|
|
318
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
319
|
+
*/
|
|
320
|
+
rule acceptDefaultAdminTransfer(env e) {
|
|
321
|
+
require nonpayable(e);
|
|
322
|
+
|
|
323
|
+
address pendingAdminBefore = pendingDefaultAdmin_();
|
|
324
|
+
uint48 scheduleBefore = pendingDefaultAdminSchedule_();
|
|
325
|
+
|
|
326
|
+
acceptDefaultAdminTransfer@withrevert(e);
|
|
327
|
+
bool success = !lastReverted;
|
|
328
|
+
|
|
329
|
+
// liveness
|
|
330
|
+
assert success <=> (
|
|
331
|
+
e.msg.sender == pendingAdminBefore &&
|
|
332
|
+
isSet(scheduleBefore) &&
|
|
333
|
+
hasPassed(e, scheduleBefore)
|
|
334
|
+
),
|
|
335
|
+
"only the pending default admin can accept the role after the schedule has been set and passed";
|
|
336
|
+
|
|
337
|
+
// effect
|
|
338
|
+
assert success => defaultAdmin() == pendingAdminBefore,
|
|
339
|
+
"Default admin is set to the previous pending default admin";
|
|
340
|
+
assert success => pendingDefaultAdmin_() == 0,
|
|
341
|
+
"Pending default admin is reset";
|
|
342
|
+
assert success => pendingDefaultAdminSchedule_() == 0,
|
|
343
|
+
"Pending default admin delay is reset";
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/*
|
|
347
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
348
|
+
│ Function correctness: cancelDefaultAdminTransfer resets pending default admin and its schedule │
|
|
349
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
350
|
+
*/
|
|
351
|
+
rule cancelDefaultAdminTransfer(env e) {
|
|
352
|
+
require nonpayable(e);
|
|
353
|
+
require nonzerosender(e);
|
|
354
|
+
requireInvariant defaultAdminConsistency(e.msg.sender);
|
|
355
|
+
|
|
356
|
+
cancelDefaultAdminTransfer@withrevert(e);
|
|
357
|
+
bool success = !lastReverted;
|
|
358
|
+
|
|
359
|
+
// liveness
|
|
360
|
+
assert success <=> e.msg.sender == defaultAdmin(),
|
|
361
|
+
"only the current default admin can cancel a transfer";
|
|
362
|
+
|
|
363
|
+
// effect
|
|
364
|
+
assert success => pendingDefaultAdmin_() == 0,
|
|
365
|
+
"Pending default admin is reset";
|
|
366
|
+
assert success => pendingDefaultAdminSchedule_() == 0,
|
|
367
|
+
"Pending default admin delay is reset";
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/*
|
|
371
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
372
|
+
│ Function correctness: changeDefaultAdminDelay sets a pending default admin delay and its schedule │
|
|
373
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
374
|
+
*/
|
|
375
|
+
rule changeDefaultAdminDelay(env e, uint48 newDelay) {
|
|
376
|
+
require timeSanity(e);
|
|
377
|
+
require nonpayable(e);
|
|
378
|
+
require nonzerosender(e);
|
|
379
|
+
require delayChangeWaitSanity(e, newDelay);
|
|
380
|
+
requireInvariant defaultAdminConsistency(e.msg.sender);
|
|
381
|
+
|
|
382
|
+
uint48 delayBefore = defaultAdminDelay(e);
|
|
383
|
+
|
|
384
|
+
changeDefaultAdminDelay@withrevert(e, newDelay);
|
|
385
|
+
bool success = !lastReverted;
|
|
386
|
+
|
|
387
|
+
// liveness
|
|
388
|
+
assert success <=> e.msg.sender == defaultAdmin(),
|
|
389
|
+
"only the current default admin can begin a delay change";
|
|
390
|
+
|
|
391
|
+
// effect
|
|
392
|
+
assert success => pendingDelay_(e) == newDelay,
|
|
393
|
+
"pending delay is set";
|
|
394
|
+
|
|
395
|
+
assert success => (
|
|
396
|
+
assert_uint256(pendingDelaySchedule_(e)) > e.block.timestamp ||
|
|
397
|
+
delayBefore == newDelay || // Interpreted as decreasing, x - x = 0
|
|
398
|
+
defaultAdminDelayIncreaseWait() == 0
|
|
399
|
+
),
|
|
400
|
+
"pending delay schedule is set in the future unless accepted edge cases";
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/*
|
|
404
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
405
|
+
│ Rule: A delay can't change in less than the applied schedule │
|
|
406
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
407
|
+
*/
|
|
408
|
+
rule pendingDelayWaitEnforced(env e1, env e2, method f, calldataarg args, uint48 newDelay) {
|
|
409
|
+
require e1.block.timestamp <= e2.block.timestamp;
|
|
410
|
+
|
|
411
|
+
uint48 delayBefore = defaultAdminDelay(e1);
|
|
412
|
+
|
|
413
|
+
changeDefaultAdminDelay(e1, newDelay);
|
|
414
|
+
f(e2, args);
|
|
415
|
+
|
|
416
|
+
uint48 delayAfter = defaultAdminDelay(e2);
|
|
417
|
+
|
|
418
|
+
mathint delayWait = newDelay > delayBefore ? increasingDelaySchedule(e1, newDelay) : decreasingDelaySchedule(e1, newDelay);
|
|
419
|
+
|
|
420
|
+
assert delayAfter != delayBefore => (
|
|
421
|
+
delayAfter == newDelay &&
|
|
422
|
+
to_mathint(e2.block.timestamp) >= delayWait
|
|
423
|
+
),
|
|
424
|
+
"A delay can only change after the applied schedule";
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/*
|
|
428
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
429
|
+
│ Rule: pending delay wait is set depending on increasing or decreasing the delay │
|
|
430
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
431
|
+
*/
|
|
432
|
+
rule pendingDelayWait(env e, uint48 newDelay) {
|
|
433
|
+
uint48 oldDelay = defaultAdminDelay(e);
|
|
434
|
+
changeDefaultAdminDelay(e, newDelay);
|
|
435
|
+
|
|
436
|
+
assert newDelay > oldDelay => to_mathint(pendingDelaySchedule_(e)) == increasingDelaySchedule(e, newDelay),
|
|
437
|
+
"Delay wait is the minimum between the new delay and a threshold when the delay is increased";
|
|
438
|
+
assert newDelay <= oldDelay => to_mathint(pendingDelaySchedule_(e)) == decreasingDelaySchedule(e, newDelay),
|
|
439
|
+
"Delay wait is the difference between the current and the new delay when the delay is decreased";
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/*
|
|
443
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
444
|
+
│ Function correctness: rollbackDefaultAdminDelay resets the delay and its schedule │
|
|
445
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
446
|
+
*/
|
|
447
|
+
rule rollbackDefaultAdminDelay(env e) {
|
|
448
|
+
require nonpayable(e);
|
|
449
|
+
require nonzerosender(e);
|
|
450
|
+
requireInvariant defaultAdminConsistency(e.msg.sender);
|
|
451
|
+
|
|
452
|
+
rollbackDefaultAdminDelay@withrevert(e);
|
|
453
|
+
bool success = !lastReverted;
|
|
454
|
+
|
|
455
|
+
// liveness
|
|
456
|
+
assert success <=> e.msg.sender == defaultAdmin(),
|
|
457
|
+
"only the current default admin can rollback a delay change";
|
|
458
|
+
|
|
459
|
+
// effect
|
|
460
|
+
assert success => pendingDelay_(e) == 0,
|
|
461
|
+
"Pending default admin is reset";
|
|
462
|
+
assert success => pendingDelaySchedule_(e) == 0,
|
|
463
|
+
"Pending default admin delay is reset";
|
|
464
|
+
}
|