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,300 @@
|
|
|
1
|
+
import "helpers/helpers.spec";
|
|
2
|
+
|
|
3
|
+
methods {
|
|
4
|
+
function pushFront(bytes32) external envfree;
|
|
5
|
+
function pushBack(bytes32) external envfree;
|
|
6
|
+
function popFront() external returns (bytes32) envfree;
|
|
7
|
+
function popBack() external returns (bytes32) envfree;
|
|
8
|
+
function clear() external envfree;
|
|
9
|
+
|
|
10
|
+
// exposed for FV
|
|
11
|
+
function begin() external returns (uint128) envfree;
|
|
12
|
+
function end() external returns (uint128) envfree;
|
|
13
|
+
|
|
14
|
+
// view
|
|
15
|
+
function length() external returns (uint256) envfree;
|
|
16
|
+
function empty() external returns (bool) envfree;
|
|
17
|
+
function front() external returns (bytes32) envfree;
|
|
18
|
+
function back() external returns (bytes32) envfree;
|
|
19
|
+
function at_(uint256) external returns (bytes32) envfree; // at is a reserved word
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
definition full() returns bool = length() == max_uint128;
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
26
|
+
│ Invariant: empty() is length 0 and no element exists │
|
|
27
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
28
|
+
*/
|
|
29
|
+
invariant emptiness()
|
|
30
|
+
empty() <=> length() == 0
|
|
31
|
+
filtered { f -> !f.isView }
|
|
32
|
+
|
|
33
|
+
/*
|
|
34
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
35
|
+
│ Invariant: front points to the first index and back points to the last one │
|
|
36
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
37
|
+
*/
|
|
38
|
+
invariant queueFront()
|
|
39
|
+
at_(0) == front()
|
|
40
|
+
filtered { f -> !f.isView }
|
|
41
|
+
|
|
42
|
+
invariant queueBack()
|
|
43
|
+
at_(require_uint256(length() - 1)) == back()
|
|
44
|
+
filtered { f -> !f.isView }
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
48
|
+
│ Function correctness: pushFront adds an element at the beginning of the queue │
|
|
49
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
50
|
+
*/
|
|
51
|
+
rule pushFront(bytes32 value) {
|
|
52
|
+
uint256 lengthBefore = length();
|
|
53
|
+
bool fullBefore = full();
|
|
54
|
+
|
|
55
|
+
pushFront@withrevert(value);
|
|
56
|
+
bool success = !lastReverted;
|
|
57
|
+
|
|
58
|
+
// liveness
|
|
59
|
+
assert success <=> !fullBefore, "never revert if not previously full";
|
|
60
|
+
|
|
61
|
+
// effect
|
|
62
|
+
assert success => front() == value, "front set to value";
|
|
63
|
+
assert success => to_mathint(length()) == lengthBefore + 1, "queue extended";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
68
|
+
│ Rule: pushFront preserves the previous values in the queue with a +1 offset │
|
|
69
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
70
|
+
*/
|
|
71
|
+
rule pushFrontConsistency(uint256 index) {
|
|
72
|
+
bytes32 beforeAt = at_(index);
|
|
73
|
+
|
|
74
|
+
bytes32 value;
|
|
75
|
+
pushFront(value);
|
|
76
|
+
|
|
77
|
+
// try to read value
|
|
78
|
+
bytes32 afterAt = at_@withrevert(require_uint256(index + 1));
|
|
79
|
+
|
|
80
|
+
assert !lastReverted, "value still there";
|
|
81
|
+
assert afterAt == beforeAt, "data is preserved";
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
86
|
+
│ Function correctness: pushBack adds an element at the end of the queue │
|
|
87
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
88
|
+
*/
|
|
89
|
+
rule pushBack(bytes32 value) {
|
|
90
|
+
uint256 lengthBefore = length();
|
|
91
|
+
bool fullBefore = full();
|
|
92
|
+
|
|
93
|
+
pushBack@withrevert(value);
|
|
94
|
+
bool success = !lastReverted;
|
|
95
|
+
|
|
96
|
+
// liveness
|
|
97
|
+
assert success <=> !fullBefore, "never revert if not previously full";
|
|
98
|
+
|
|
99
|
+
// effect
|
|
100
|
+
assert success => back() == value, "back set to value";
|
|
101
|
+
assert success => to_mathint(length()) == lengthBefore + 1, "queue increased";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
106
|
+
│ Rule: pushBack preserves the previous values in the queue │
|
|
107
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
108
|
+
*/
|
|
109
|
+
rule pushBackConsistency(uint256 index) {
|
|
110
|
+
bytes32 beforeAt = at_(index);
|
|
111
|
+
|
|
112
|
+
bytes32 value;
|
|
113
|
+
pushBack(value);
|
|
114
|
+
|
|
115
|
+
// try to read value
|
|
116
|
+
bytes32 afterAt = at_@withrevert(index);
|
|
117
|
+
|
|
118
|
+
assert !lastReverted, "value still there";
|
|
119
|
+
assert afterAt == beforeAt, "data is preserved";
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
124
|
+
│ Function correctness: popFront removes an element from the beginning of the queue │
|
|
125
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
126
|
+
*/
|
|
127
|
+
rule popFront {
|
|
128
|
+
uint256 lengthBefore = length();
|
|
129
|
+
bytes32 frontBefore = front@withrevert();
|
|
130
|
+
|
|
131
|
+
bytes32 popped = popFront@withrevert();
|
|
132
|
+
bool success = !lastReverted;
|
|
133
|
+
|
|
134
|
+
// liveness
|
|
135
|
+
assert success <=> lengthBefore != 0, "never reverts if not previously empty";
|
|
136
|
+
|
|
137
|
+
// effect
|
|
138
|
+
assert success => frontBefore == popped, "previous front is returned";
|
|
139
|
+
assert success => to_mathint(length()) == lengthBefore - 1, "queue decreased";
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/*
|
|
143
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
144
|
+
│ Rule: at(x) is preserved and offset to at(x - 1) after calling popFront |
|
|
145
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
146
|
+
*/
|
|
147
|
+
rule popFrontConsistency(uint256 index) {
|
|
148
|
+
// Read (any) value that is not the front (this asserts the value exists / the queue is long enough)
|
|
149
|
+
require index > 1;
|
|
150
|
+
bytes32 before = at_(index);
|
|
151
|
+
|
|
152
|
+
popFront();
|
|
153
|
+
|
|
154
|
+
// try to read value
|
|
155
|
+
bytes32 after = at_@withrevert(require_uint256(index - 1));
|
|
156
|
+
|
|
157
|
+
assert !lastReverted, "value still exists in the queue";
|
|
158
|
+
assert before == after, "values are offset and not modified";
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/*
|
|
162
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
163
|
+
│ Function correctness: popBack removes an element from the end of the queue │
|
|
164
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
165
|
+
*/
|
|
166
|
+
rule popBack {
|
|
167
|
+
uint256 lengthBefore = length();
|
|
168
|
+
bytes32 backBefore = back@withrevert();
|
|
169
|
+
|
|
170
|
+
bytes32 popped = popBack@withrevert();
|
|
171
|
+
bool success = !lastReverted;
|
|
172
|
+
|
|
173
|
+
// liveness
|
|
174
|
+
assert success <=> lengthBefore != 0, "never reverts if not previously empty";
|
|
175
|
+
|
|
176
|
+
// effect
|
|
177
|
+
assert success => backBefore == popped, "previous back is returned";
|
|
178
|
+
assert success => to_mathint(length()) == lengthBefore - 1, "queue decreased";
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/*
|
|
182
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
183
|
+
│ Rule: at(x) is preserved after calling popBack |
|
|
184
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
185
|
+
*/
|
|
186
|
+
rule popBackConsistency(uint256 index) {
|
|
187
|
+
// Read (any) value that is not the back (this asserts the value exists / the queue is long enough)
|
|
188
|
+
require to_mathint(index) < length() - 1;
|
|
189
|
+
bytes32 before = at_(index);
|
|
190
|
+
|
|
191
|
+
popBack();
|
|
192
|
+
|
|
193
|
+
// try to read value
|
|
194
|
+
bytes32 after = at_@withrevert(index);
|
|
195
|
+
|
|
196
|
+
assert !lastReverted, "value still exists in the queue";
|
|
197
|
+
assert before == after, "values are offset and not modified";
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/*
|
|
201
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
202
|
+
│ Function correctness: clear sets length to 0 │
|
|
203
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
204
|
+
*/
|
|
205
|
+
rule clear {
|
|
206
|
+
clear@withrevert();
|
|
207
|
+
|
|
208
|
+
// liveness
|
|
209
|
+
assert !lastReverted, "never reverts";
|
|
210
|
+
|
|
211
|
+
// effect
|
|
212
|
+
assert length() == 0, "sets length to 0";
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/*
|
|
216
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
217
|
+
│ Rule: front/back access reverts only if the queue is empty or querying out of bounds │
|
|
218
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
219
|
+
*/
|
|
220
|
+
rule onlyEmptyOrFullRevert(env e) {
|
|
221
|
+
require nonpayable(e);
|
|
222
|
+
|
|
223
|
+
method f;
|
|
224
|
+
calldataarg args;
|
|
225
|
+
|
|
226
|
+
bool emptyBefore = empty();
|
|
227
|
+
bool fullBefore = full();
|
|
228
|
+
|
|
229
|
+
f@withrevert(e, args);
|
|
230
|
+
|
|
231
|
+
assert lastReverted => (
|
|
232
|
+
(f.selector == sig:front().selector && emptyBefore) ||
|
|
233
|
+
(f.selector == sig:back().selector && emptyBefore) ||
|
|
234
|
+
(f.selector == sig:popFront().selector && emptyBefore) ||
|
|
235
|
+
(f.selector == sig:popBack().selector && emptyBefore) ||
|
|
236
|
+
(f.selector == sig:pushFront(bytes32).selector && fullBefore ) ||
|
|
237
|
+
(f.selector == sig:pushBack(bytes32).selector && fullBefore ) ||
|
|
238
|
+
f.selector == sig:at_(uint256).selector // revert conditions are verified in onlyOutOfBoundsRevert
|
|
239
|
+
), "only revert if empty or out of bounds";
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
244
|
+
│ Rule: at(index) only reverts if index is out of bounds |
|
|
245
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
246
|
+
*/
|
|
247
|
+
rule onlyOutOfBoundsRevert(uint256 index) {
|
|
248
|
+
at_@withrevert(index);
|
|
249
|
+
|
|
250
|
+
assert lastReverted <=> index >= length(), "only reverts if index is out of bounds";
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/*
|
|
254
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
255
|
+
│ Rule: only clear/push/pop operations can change the length of the queue │
|
|
256
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
257
|
+
*/
|
|
258
|
+
rule noLengthChange(env e) {
|
|
259
|
+
method f;
|
|
260
|
+
calldataarg args;
|
|
261
|
+
|
|
262
|
+
uint256 lengthBefore = length();
|
|
263
|
+
f(e, args);
|
|
264
|
+
uint256 lengthAfter = length();
|
|
265
|
+
|
|
266
|
+
assert lengthAfter != lengthBefore => (
|
|
267
|
+
(f.selector == sig:pushFront(bytes32).selector && to_mathint(lengthAfter) == lengthBefore + 1) ||
|
|
268
|
+
(f.selector == sig:pushBack(bytes32).selector && to_mathint(lengthAfter) == lengthBefore + 1) ||
|
|
269
|
+
(f.selector == sig:popBack().selector && to_mathint(lengthAfter) == lengthBefore - 1) ||
|
|
270
|
+
(f.selector == sig:popFront().selector && to_mathint(lengthAfter) == lengthBefore - 1) ||
|
|
271
|
+
(f.selector == sig:clear().selector && lengthAfter == 0)
|
|
272
|
+
), "length is only affected by clear/pop/push operations";
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/*
|
|
276
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
277
|
+
│ Rule: only push/pop can change values bounded in the queue (outside values aren't cleared) │
|
|
278
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
279
|
+
*/
|
|
280
|
+
rule noDataChange(env e) {
|
|
281
|
+
method f;
|
|
282
|
+
calldataarg args;
|
|
283
|
+
|
|
284
|
+
uint256 index;
|
|
285
|
+
bytes32 atBefore = at_(index);
|
|
286
|
+
f(e, args);
|
|
287
|
+
bytes32 atAfter = at_@withrevert(index);
|
|
288
|
+
bool atAfterSuccess = !lastReverted;
|
|
289
|
+
|
|
290
|
+
assert !atAfterSuccess <=> (
|
|
291
|
+
(f.selector == sig:clear().selector ) ||
|
|
292
|
+
(f.selector == sig:popBack().selector && index == length()) ||
|
|
293
|
+
(f.selector == sig:popFront().selector && index == length())
|
|
294
|
+
), "indexes of the queue are only removed by clear or pop";
|
|
295
|
+
|
|
296
|
+
assert atAfterSuccess && atAfter != atBefore => (
|
|
297
|
+
f.selector == sig:popFront().selector ||
|
|
298
|
+
f.selector == sig:pushFront(bytes32).selector
|
|
299
|
+
), "values of the queue are only changed by popFront or pushFront";
|
|
300
|
+
}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import "helpers/helpers.spec";
|
|
2
|
+
import "methods/IERC20.spec";
|
|
3
|
+
import "methods/IERC2612.spec";
|
|
4
|
+
|
|
5
|
+
methods {
|
|
6
|
+
// exposed for FV
|
|
7
|
+
function mint(address,uint256) external;
|
|
8
|
+
function burn(address,uint256) external;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
13
|
+
│ Ghost & hooks: sum of all balances │
|
|
14
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
15
|
+
*/
|
|
16
|
+
ghost mathint sumOfBalances {
|
|
17
|
+
init_state axiom sumOfBalances == 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Because `balance` has a uint256 type, any balance addition in CVL1 behaved as a `require_uint256()` casting,
|
|
21
|
+
// leaving out the possibility of overflow. This is not the case in CVL2 where casting became more explicit.
|
|
22
|
+
// A counterexample in CVL2 is having an initial state where Alice initial balance is larger than totalSupply, which
|
|
23
|
+
// overflows Alice's balance when receiving a transfer. This is not possible unless the contract is deployed into an
|
|
24
|
+
// already used address (or upgraded from corrupted state).
|
|
25
|
+
// We restrict such behavior by making sure no balance is greater than the sum of balances.
|
|
26
|
+
hook Sload uint256 balance _balances[KEY address addr] STORAGE {
|
|
27
|
+
require sumOfBalances >= to_mathint(balance);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
hook Sstore _balances[KEY address addr] uint256 newValue (uint256 oldValue) STORAGE {
|
|
31
|
+
sumOfBalances = sumOfBalances - oldValue + newValue;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
36
|
+
│ Invariant: totalSupply is the sum of all balances │
|
|
37
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
38
|
+
*/
|
|
39
|
+
invariant totalSupplyIsSumOfBalances()
|
|
40
|
+
to_mathint(totalSupply()) == sumOfBalances;
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
44
|
+
│ Invariant: balance of address(0) is 0 │
|
|
45
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
46
|
+
*/
|
|
47
|
+
invariant zeroAddressNoBalance()
|
|
48
|
+
balanceOf(0) == 0;
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
52
|
+
│ Rules: only mint and burn can change total supply │
|
|
53
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
54
|
+
*/
|
|
55
|
+
rule noChangeTotalSupply(env e) {
|
|
56
|
+
requireInvariant totalSupplyIsSumOfBalances();
|
|
57
|
+
|
|
58
|
+
method f;
|
|
59
|
+
calldataarg args;
|
|
60
|
+
|
|
61
|
+
uint256 totalSupplyBefore = totalSupply();
|
|
62
|
+
f(e, args);
|
|
63
|
+
uint256 totalSupplyAfter = totalSupply();
|
|
64
|
+
|
|
65
|
+
assert totalSupplyAfter > totalSupplyBefore => f.selector == sig:mint(address,uint256).selector;
|
|
66
|
+
assert totalSupplyAfter < totalSupplyBefore => f.selector == sig:burn(address,uint256).selector;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/*
|
|
70
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
71
|
+
│ Rules: only the token holder or an approved third party can reduce an account's balance │
|
|
72
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
73
|
+
*/
|
|
74
|
+
rule onlyAuthorizedCanTransfer(env e) {
|
|
75
|
+
requireInvariant totalSupplyIsSumOfBalances();
|
|
76
|
+
|
|
77
|
+
method f;
|
|
78
|
+
calldataarg args;
|
|
79
|
+
address account;
|
|
80
|
+
|
|
81
|
+
uint256 allowanceBefore = allowance(account, e.msg.sender);
|
|
82
|
+
uint256 balanceBefore = balanceOf(account);
|
|
83
|
+
f(e, args);
|
|
84
|
+
uint256 balanceAfter = balanceOf(account);
|
|
85
|
+
|
|
86
|
+
assert (
|
|
87
|
+
balanceAfter < balanceBefore
|
|
88
|
+
) => (
|
|
89
|
+
f.selector == sig:burn(address,uint256).selector ||
|
|
90
|
+
e.msg.sender == account ||
|
|
91
|
+
balanceBefore - balanceAfter <= to_mathint(allowanceBefore)
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
97
|
+
│ Rules: only the token holder (or a permit) can increase allowance. The spender can decrease it by using it │
|
|
98
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
99
|
+
*/
|
|
100
|
+
rule onlyHolderOfSpenderCanChangeAllowance(env e) {
|
|
101
|
+
requireInvariant totalSupplyIsSumOfBalances();
|
|
102
|
+
|
|
103
|
+
method f;
|
|
104
|
+
calldataarg args;
|
|
105
|
+
address holder;
|
|
106
|
+
address spender;
|
|
107
|
+
|
|
108
|
+
uint256 allowanceBefore = allowance(holder, spender);
|
|
109
|
+
f(e, args);
|
|
110
|
+
uint256 allowanceAfter = allowance(holder, spender);
|
|
111
|
+
|
|
112
|
+
assert (
|
|
113
|
+
allowanceAfter > allowanceBefore
|
|
114
|
+
) => (
|
|
115
|
+
(f.selector == sig:approve(address,uint256).selector && e.msg.sender == holder) ||
|
|
116
|
+
(f.selector == sig:permit(address,address,uint256,uint256,uint8,bytes32,bytes32).selector)
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
assert (
|
|
120
|
+
allowanceAfter < allowanceBefore
|
|
121
|
+
) => (
|
|
122
|
+
(f.selector == sig:transferFrom(address,address,uint256).selector && e.msg.sender == spender) ||
|
|
123
|
+
(f.selector == sig:approve(address,uint256).selector && e.msg.sender == holder ) ||
|
|
124
|
+
(f.selector == sig:permit(address,address,uint256,uint256,uint8,bytes32,bytes32).selector)
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
130
|
+
│ Rules: mint behavior and side effects │
|
|
131
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
132
|
+
*/
|
|
133
|
+
rule mint(env e) {
|
|
134
|
+
requireInvariant totalSupplyIsSumOfBalances();
|
|
135
|
+
require nonpayable(e);
|
|
136
|
+
|
|
137
|
+
address to;
|
|
138
|
+
address other;
|
|
139
|
+
uint256 amount;
|
|
140
|
+
|
|
141
|
+
// cache state
|
|
142
|
+
uint256 toBalanceBefore = balanceOf(to);
|
|
143
|
+
uint256 otherBalanceBefore = balanceOf(other);
|
|
144
|
+
uint256 totalSupplyBefore = totalSupply();
|
|
145
|
+
|
|
146
|
+
// run transaction
|
|
147
|
+
mint@withrevert(e, to, amount);
|
|
148
|
+
|
|
149
|
+
// check outcome
|
|
150
|
+
if (lastReverted) {
|
|
151
|
+
assert to == 0 || totalSupplyBefore + amount > max_uint256;
|
|
152
|
+
} else {
|
|
153
|
+
// updates balance and totalSupply
|
|
154
|
+
assert to_mathint(balanceOf(to)) == toBalanceBefore + amount;
|
|
155
|
+
assert to_mathint(totalSupply()) == totalSupplyBefore + amount;
|
|
156
|
+
|
|
157
|
+
// no other balance is modified
|
|
158
|
+
assert balanceOf(other) != otherBalanceBefore => other == to;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/*
|
|
163
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
164
|
+
│ Rules: burn behavior and side effects │
|
|
165
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
166
|
+
*/
|
|
167
|
+
rule burn(env e) {
|
|
168
|
+
requireInvariant totalSupplyIsSumOfBalances();
|
|
169
|
+
require nonpayable(e);
|
|
170
|
+
|
|
171
|
+
address from;
|
|
172
|
+
address other;
|
|
173
|
+
uint256 amount;
|
|
174
|
+
|
|
175
|
+
// cache state
|
|
176
|
+
uint256 fromBalanceBefore = balanceOf(from);
|
|
177
|
+
uint256 otherBalanceBefore = balanceOf(other);
|
|
178
|
+
uint256 totalSupplyBefore = totalSupply();
|
|
179
|
+
|
|
180
|
+
// run transaction
|
|
181
|
+
burn@withrevert(e, from, amount);
|
|
182
|
+
|
|
183
|
+
// check outcome
|
|
184
|
+
if (lastReverted) {
|
|
185
|
+
assert from == 0 || fromBalanceBefore < amount;
|
|
186
|
+
} else {
|
|
187
|
+
// updates balance and totalSupply
|
|
188
|
+
assert to_mathint(balanceOf(from)) == fromBalanceBefore - amount;
|
|
189
|
+
assert to_mathint(totalSupply()) == totalSupplyBefore - amount;
|
|
190
|
+
|
|
191
|
+
// no other balance is modified
|
|
192
|
+
assert balanceOf(other) != otherBalanceBefore => other == from;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/*
|
|
197
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
198
|
+
│ Rule: transfer behavior and side effects │
|
|
199
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
200
|
+
*/
|
|
201
|
+
rule transfer(env e) {
|
|
202
|
+
requireInvariant totalSupplyIsSumOfBalances();
|
|
203
|
+
require nonpayable(e);
|
|
204
|
+
|
|
205
|
+
address holder = e.msg.sender;
|
|
206
|
+
address recipient;
|
|
207
|
+
address other;
|
|
208
|
+
uint256 amount;
|
|
209
|
+
|
|
210
|
+
// cache state
|
|
211
|
+
uint256 holderBalanceBefore = balanceOf(holder);
|
|
212
|
+
uint256 recipientBalanceBefore = balanceOf(recipient);
|
|
213
|
+
uint256 otherBalanceBefore = balanceOf(other);
|
|
214
|
+
|
|
215
|
+
// run transaction
|
|
216
|
+
transfer@withrevert(e, recipient, amount);
|
|
217
|
+
|
|
218
|
+
// check outcome
|
|
219
|
+
if (lastReverted) {
|
|
220
|
+
assert holder == 0 || recipient == 0 || amount > holderBalanceBefore;
|
|
221
|
+
} else {
|
|
222
|
+
// balances of holder and recipient are updated
|
|
223
|
+
assert to_mathint(balanceOf(holder)) == holderBalanceBefore - (holder == recipient ? 0 : amount);
|
|
224
|
+
assert to_mathint(balanceOf(recipient)) == recipientBalanceBefore + (holder == recipient ? 0 : amount);
|
|
225
|
+
|
|
226
|
+
// no other balance is modified
|
|
227
|
+
assert balanceOf(other) != otherBalanceBefore => (other == holder || other == recipient);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/*
|
|
232
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
233
|
+
│ Rule: transferFrom behavior and side effects │
|
|
234
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
235
|
+
*/
|
|
236
|
+
rule transferFrom(env e) {
|
|
237
|
+
requireInvariant totalSupplyIsSumOfBalances();
|
|
238
|
+
require nonpayable(e);
|
|
239
|
+
|
|
240
|
+
address spender = e.msg.sender;
|
|
241
|
+
address holder;
|
|
242
|
+
address recipient;
|
|
243
|
+
address other;
|
|
244
|
+
uint256 amount;
|
|
245
|
+
|
|
246
|
+
// cache state
|
|
247
|
+
uint256 allowanceBefore = allowance(holder, spender);
|
|
248
|
+
uint256 holderBalanceBefore = balanceOf(holder);
|
|
249
|
+
uint256 recipientBalanceBefore = balanceOf(recipient);
|
|
250
|
+
uint256 otherBalanceBefore = balanceOf(other);
|
|
251
|
+
|
|
252
|
+
// run transaction
|
|
253
|
+
transferFrom@withrevert(e, holder, recipient, amount);
|
|
254
|
+
|
|
255
|
+
// check outcome
|
|
256
|
+
if (lastReverted) {
|
|
257
|
+
assert holder == 0 || recipient == 0 || spender == 0 || amount > holderBalanceBefore || amount > allowanceBefore;
|
|
258
|
+
} else {
|
|
259
|
+
// allowance is valid & updated
|
|
260
|
+
assert allowanceBefore >= amount;
|
|
261
|
+
assert to_mathint(allowance(holder, spender)) == (allowanceBefore == max_uint256 ? max_uint256 : allowanceBefore - amount);
|
|
262
|
+
|
|
263
|
+
// balances of holder and recipient are updated
|
|
264
|
+
assert to_mathint(balanceOf(holder)) == holderBalanceBefore - (holder == recipient ? 0 : amount);
|
|
265
|
+
assert to_mathint(balanceOf(recipient)) == recipientBalanceBefore + (holder == recipient ? 0 : amount);
|
|
266
|
+
|
|
267
|
+
// no other balance is modified
|
|
268
|
+
assert balanceOf(other) != otherBalanceBefore => (other == holder || other == recipient);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/*
|
|
273
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
274
|
+
│ Rule: approve behavior and side effects │
|
|
275
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
276
|
+
*/
|
|
277
|
+
rule approve(env e) {
|
|
278
|
+
require nonpayable(e);
|
|
279
|
+
|
|
280
|
+
address holder = e.msg.sender;
|
|
281
|
+
address spender;
|
|
282
|
+
address otherHolder;
|
|
283
|
+
address otherSpender;
|
|
284
|
+
uint256 amount;
|
|
285
|
+
|
|
286
|
+
// cache state
|
|
287
|
+
uint256 otherAllowanceBefore = allowance(otherHolder, otherSpender);
|
|
288
|
+
|
|
289
|
+
// run transaction
|
|
290
|
+
approve@withrevert(e, spender, amount);
|
|
291
|
+
|
|
292
|
+
// check outcome
|
|
293
|
+
if (lastReverted) {
|
|
294
|
+
assert holder == 0 || spender == 0;
|
|
295
|
+
} else {
|
|
296
|
+
// allowance is updated
|
|
297
|
+
assert allowance(holder, spender) == amount;
|
|
298
|
+
|
|
299
|
+
// other allowances are untouched
|
|
300
|
+
assert allowance(otherHolder, otherSpender) != otherAllowanceBefore => (otherHolder == holder && otherSpender == spender);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/*
|
|
305
|
+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
306
|
+
│ Rule: permit behavior and side effects │
|
|
307
|
+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
308
|
+
*/
|
|
309
|
+
rule permit(env e) {
|
|
310
|
+
require nonpayable(e);
|
|
311
|
+
|
|
312
|
+
address holder;
|
|
313
|
+
address spender;
|
|
314
|
+
uint256 amount;
|
|
315
|
+
uint256 deadline;
|
|
316
|
+
uint8 v;
|
|
317
|
+
bytes32 r;
|
|
318
|
+
bytes32 s;
|
|
319
|
+
|
|
320
|
+
address account1;
|
|
321
|
+
address account2;
|
|
322
|
+
address account3;
|
|
323
|
+
|
|
324
|
+
// cache state
|
|
325
|
+
uint256 nonceBefore = nonces(holder);
|
|
326
|
+
uint256 otherNonceBefore = nonces(account1);
|
|
327
|
+
uint256 otherAllowanceBefore = allowance(account2, account3);
|
|
328
|
+
|
|
329
|
+
// sanity: nonce overflow, which possible in theory, is assumed to be impossible in practice
|
|
330
|
+
require nonceBefore < max_uint256;
|
|
331
|
+
require otherNonceBefore < max_uint256;
|
|
332
|
+
|
|
333
|
+
// run transaction
|
|
334
|
+
permit@withrevert(e, holder, spender, amount, deadline, v, r, s);
|
|
335
|
+
|
|
336
|
+
// check outcome
|
|
337
|
+
if (lastReverted) {
|
|
338
|
+
// Without formally checking the signature, we can't verify exactly the revert causes
|
|
339
|
+
assert true;
|
|
340
|
+
} else {
|
|
341
|
+
// allowance and nonce are updated
|
|
342
|
+
assert allowance(holder, spender) == amount;
|
|
343
|
+
assert to_mathint(nonces(holder)) == nonceBefore + 1;
|
|
344
|
+
|
|
345
|
+
// deadline was respected
|
|
346
|
+
assert deadline >= e.block.timestamp;
|
|
347
|
+
|
|
348
|
+
// no other allowance or nonce is modified
|
|
349
|
+
assert nonces(account1) != otherNonceBefore => account1 == holder;
|
|
350
|
+
assert allowance(account2, account3) != otherAllowanceBefore => (account2 == holder && account3 == spender);
|
|
351
|
+
}
|
|
352
|
+
}
|