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,293 @@
|
|
|
1
|
+
# BTCST ROUNDING ERROR DEEP ANALYSIS
|
|
2
|
+
|
|
3
|
+
## 🔍 THE ROUNDING ERROR QUESTION
|
|
4
|
+
|
|
5
|
+
Can we exploit rounding errors in BTCST's time-lock mechanism?
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📐 THE MATH BREAKDOWN
|
|
10
|
+
|
|
11
|
+
### Time-Lock Parameters
|
|
12
|
+
- **Lock Time**: 25 weeks = 175 days
|
|
13
|
+
- **Lock Rounds**: 25 rounds
|
|
14
|
+
- **Time Unit**: 86400 seconds (1 day)
|
|
15
|
+
- **Time Per Round**: 175 days / 25 rounds = 7 days per round
|
|
16
|
+
|
|
17
|
+
### The Unlock Calculation
|
|
18
|
+
|
|
19
|
+
```solidity
|
|
20
|
+
function getFreeToTransferAmount(address account) external view returns (uint256) {
|
|
21
|
+
uint256 timePerRound = _lockTime.div(_lockRounds); // 175 / 25 = 7 days
|
|
22
|
+
uint start = freeTime - _lockTime * _lockTimeUnitPerSeconds;
|
|
23
|
+
uint passed = now - start;
|
|
24
|
+
uint passedRound = passed.div(timePerRound * _lockTimeUnitPerSeconds);
|
|
25
|
+
freeAmount = lockedBal.mul(passedRound).div(_lockRounds);
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Breaking Down Each Step
|
|
30
|
+
|
|
31
|
+
1. **timePerRound** = 175 / 25 = 7 (no rounding error)
|
|
32
|
+
2. **start** = freeTime - (175 * 86400) = freeTime - 15,120,000 seconds
|
|
33
|
+
3. **passed** = now - start (time elapsed since lock)
|
|
34
|
+
4. **passedRound** = passed / (7 * 86400) = passed / 604,800
|
|
35
|
+
5. **freeAmount** = (lockedBal * passedRound) / 25
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 🎯 ROUNDING ERROR ANALYSIS
|
|
40
|
+
|
|
41
|
+
### Error Source #1: passedRound Calculation
|
|
42
|
+
|
|
43
|
+
```solidity
|
|
44
|
+
uint passedRound = passed.div(timePerRound * _lockTimeUnitPerSeconds);
|
|
45
|
+
// passedRound = passed / 604,800
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Rounding Loss**: `passed % 604,800` seconds are TRUNCATED
|
|
49
|
+
|
|
50
|
+
**Example**:
|
|
51
|
+
- If passed = 604,799 seconds (just 1 second before round 1)
|
|
52
|
+
- passedRound = 604,799 / 604,800 = 0 (TRUNCATED)
|
|
53
|
+
- If passed = 604,800 seconds (exactly round 1)
|
|
54
|
+
- passedRound = 604,800 / 604,800 = 1
|
|
55
|
+
|
|
56
|
+
**Maximum Loss Per Round**: 604,799 seconds = ~7 days worth of unlock
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
### Error Source #2: freeAmount Calculation
|
|
61
|
+
|
|
62
|
+
```solidity
|
|
63
|
+
freeAmount = lockedBal.mul(passedRound).div(_lockRounds);
|
|
64
|
+
// freeAmount = (lockedBal * passedRound) / 25
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Rounding Loss**: `(lockedBal * passedRound) % 25` is TRUNCATED
|
|
68
|
+
|
|
69
|
+
**Example with 1,000,000 tokens**:
|
|
70
|
+
- After round 1: (1,000,000 * 1) / 25 = 40,000 (exact)
|
|
71
|
+
- After round 2: (1,000,000 * 2) / 25 = 80,000 (exact)
|
|
72
|
+
- After round 3: (1,000,000 * 3) / 25 = 120,000 (exact)
|
|
73
|
+
|
|
74
|
+
**BUT with 1,000,001 tokens**:
|
|
75
|
+
- After round 1: (1,000,001 * 1) / 25 = 40,000 (loses 1 wei)
|
|
76
|
+
- After round 2: (1,000,001 * 2) / 25 = 80,000 (loses 2 wei)
|
|
77
|
+
- After round 3: (1,000,001 * 3) / 25 = 120,000 (loses 3 wei)
|
|
78
|
+
|
|
79
|
+
**Maximum Loss**: 24 wei per token over 25 rounds
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 💡 THE CRITICAL INSIGHT
|
|
84
|
+
|
|
85
|
+
### The REAL Rounding Error is in TIME, not TOKENS!
|
|
86
|
+
|
|
87
|
+
The biggest rounding error is **passedRound calculation**:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
passedRound = passed / 604,800
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
This means:
|
|
94
|
+
- At 604,799 seconds: passedRound = 0 (0% unlocked)
|
|
95
|
+
- At 604,800 seconds: passedRound = 1 (4% unlocked)
|
|
96
|
+
|
|
97
|
+
**THAT'S A MASSIVE JUMP!**
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 🚨 EXPLOIT STRATEGY: TIME-BASED ROUNDING
|
|
102
|
+
|
|
103
|
+
### The Attack Vector
|
|
104
|
+
|
|
105
|
+
Instead of exploiting token rounding (wei-level), exploit TIME rounding (round-level)!
|
|
106
|
+
|
|
107
|
+
### Scenario 1: Early Unlock via Timestamp Manipulation
|
|
108
|
+
|
|
109
|
+
**Problem**: We can't manipulate `now` (block.timestamp)
|
|
110
|
+
|
|
111
|
+
**BUT**: We CAN choose WHEN to call transfer()
|
|
112
|
+
|
|
113
|
+
### Scenario 2: Cumulative Rounding Across Multiple Locks
|
|
114
|
+
|
|
115
|
+
**Key Insight**: Each mint creates a SEPARATE time-lock record
|
|
116
|
+
|
|
117
|
+
```solidity
|
|
118
|
+
mapping (address => mapping (uint => uint256)) public _timeLockedBalanceRecords;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Attack**:
|
|
122
|
+
1. Get multiple small mints at different times
|
|
123
|
+
2. Each has its own unlock schedule
|
|
124
|
+
3. Rounding errors accumulate across ALL records
|
|
125
|
+
4. Transfer at optimal timestamp to maximize unlocked amount
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 🔬 TESTING THE THEORY
|
|
130
|
+
|
|
131
|
+
Let me calculate the ACTUAL rounding error potential:
|
|
132
|
+
|
|
133
|
+
### Example: 1,000,000 BTCST locked
|
|
134
|
+
|
|
135
|
+
**Decimal**: 17 (so 1,000,000 BTCST = 1e23 wei)
|
|
136
|
+
|
|
137
|
+
**Per Round Unlock**: 1e23 / 25 = 4e21 wei per round
|
|
138
|
+
|
|
139
|
+
**Rounding Error in freeAmount**:
|
|
140
|
+
- (1e23 * passedRound) / 25
|
|
141
|
+
- Maximum remainder: 24 wei (NEGLIGIBLE)
|
|
142
|
+
|
|
143
|
+
**Rounding Error in passedRound**:
|
|
144
|
+
- passed / 604,800
|
|
145
|
+
- Maximum remainder: 604,799 seconds
|
|
146
|
+
- This affects WHICH ROUND you're in, not the amount
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 💰 PROFITABILITY CALCULATION
|
|
151
|
+
|
|
152
|
+
### Scenario: Exploit Time Rounding
|
|
153
|
+
|
|
154
|
+
**Setup**:
|
|
155
|
+
- You have 1,000,000 BTCST locked (1e23 wei)
|
|
156
|
+
- Lock started at timestamp T
|
|
157
|
+
- Each round unlocks 4% (40,000 BTCST)
|
|
158
|
+
|
|
159
|
+
**Attack**:
|
|
160
|
+
1. Wait until timestamp = T + 604,799 seconds (just before round 1)
|
|
161
|
+
2. passedRound = 0, so 0% unlocked
|
|
162
|
+
3. Wait 1 more second to T + 604,800
|
|
163
|
+
4. passedRound = 1, so 4% unlocked (40,000 BTCST)
|
|
164
|
+
|
|
165
|
+
**Profit**: ZERO - you just waited for the normal unlock!
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 🎯 THE REAL QUESTION: Can We BYPASS the Time-Lock?
|
|
170
|
+
|
|
171
|
+
### Looking at _beforeTokenTransfer
|
|
172
|
+
|
|
173
|
+
```solidity
|
|
174
|
+
function _beforeTokenTransfer(address account, address to, uint256 amount) internal {
|
|
175
|
+
uint256 balance = balanceOf(account);
|
|
176
|
+
uint256 lockedBalance = _timeLockedBalances[account];
|
|
177
|
+
|
|
178
|
+
if (lockedBalance == 0 || amount > balance) {
|
|
179
|
+
return; // No locked balance or amount > balance
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
uint256 totalFree = balance.sub(lockedBalance);
|
|
183
|
+
if (amount <= totalFree) {
|
|
184
|
+
return; // Amount is within free balance
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Need to unlock some locked tokens
|
|
188
|
+
uint256 remain = amount.sub(totalFree);
|
|
189
|
+
_updateCostLockedAlreadyFreed(account, remain);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### The Check Logic
|
|
194
|
+
|
|
195
|
+
1. If you have NO locked balance → transfer allowed
|
|
196
|
+
2. If amount ≤ free balance → transfer allowed
|
|
197
|
+
3. If amount > free balance → must unlock from time-locked balance
|
|
198
|
+
|
|
199
|
+
### Can We Bypass?
|
|
200
|
+
|
|
201
|
+
**Option 1**: Transfer exactly at free balance
|
|
202
|
+
- ❌ No bypass, just using available balance
|
|
203
|
+
|
|
204
|
+
**Option 2**: Manipulate lockedBalance to be 0
|
|
205
|
+
- ❌ Requires admin access to change storage
|
|
206
|
+
|
|
207
|
+
**Option 3**: Exploit rounding in _updateCostLockedAlreadyFreed
|
|
208
|
+
- 🤔 Let's check this function...
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 🔍 DEEP DIVE: _updateCostLockedAlreadyFreed
|
|
213
|
+
|
|
214
|
+
```solidity
|
|
215
|
+
function _updateCostLockedAlreadyFreed(address account, uint256 remain) internal {
|
|
216
|
+
// Calculate how much is actually freed
|
|
217
|
+
for (uint256 ii=0; ii < keys.length; ++ii) {
|
|
218
|
+
freeAmount = 0;
|
|
219
|
+
if (keys[ii] <= now) {
|
|
220
|
+
freeAmount = records[keys[ii]]; // Fully unlocked
|
|
221
|
+
} else {
|
|
222
|
+
// Partially unlocked based on time
|
|
223
|
+
freeAmount = records[keys[ii]]
|
|
224
|
+
.mul((now - (keys[ii] - _lockTime * _lockTimeUnitPerSeconds))
|
|
225
|
+
.div(_lockTime.div(_lockRounds) * _lockTimeUnitPerSeconds))
|
|
226
|
+
.div(_lockRounds);
|
|
227
|
+
}
|
|
228
|
+
freeToMove = freeAmount.sub(recordsCost[keys[ii]]);
|
|
229
|
+
allFreed = allFreed.add(freeToMove);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
require(toBeCost <= allFreed, "sending amounts exceeds the free amounts");
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Rounding Error in Partial Unlock
|
|
237
|
+
|
|
238
|
+
```solidity
|
|
239
|
+
freeAmount = records[keys[ii]]
|
|
240
|
+
.mul((now - start) / (timePerRound * timeUnit))
|
|
241
|
+
.div(_lockRounds);
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**This is**: `lockedAmount * passedRound / 25`
|
|
245
|
+
|
|
246
|
+
**Rounding Error**: Same as before - negligible wei-level
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 💀 THE BRUTAL TRUTH
|
|
251
|
+
|
|
252
|
+
### Rounding Errors Are TOO SMALL
|
|
253
|
+
|
|
254
|
+
**Token-level rounding**:
|
|
255
|
+
- Maximum 24 wei per 1e23 wei locked
|
|
256
|
+
- That's 0.000000000000000024%
|
|
257
|
+
- Worth: $0.0000000000001 (NOTHING)
|
|
258
|
+
|
|
259
|
+
**Time-level rounding**:
|
|
260
|
+
- Affects which round you're in
|
|
261
|
+
- But you can't manipulate timestamps
|
|
262
|
+
- Just wait for the next round (normal unlock)
|
|
263
|
+
|
|
264
|
+
**Gas Cost**:
|
|
265
|
+
- Transfer costs ~50,000 gas
|
|
266
|
+
- At 5 gwei = 0.00025 BNB = $0.15
|
|
267
|
+
- Rounding profit: $0.0000000000001
|
|
268
|
+
- **LOSS: $0.15**
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## 🎯 ALTERNATIVE: Multiple Lock Records
|
|
273
|
+
|
|
274
|
+
### The Theory
|
|
275
|
+
|
|
276
|
+
If you have MULTIPLE time-lock records, rounding errors might accumulate:
|
|
277
|
+
|
|
278
|
+
```solidity
|
|
279
|
+
mapping (address => mapping (uint => uint256)) public _timeLockedBalanceRecords;
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Attack**:
|
|
283
|
+
1. Get 1000 separate mints (each creates a record)
|
|
284
|
+
2. Each has 24 wei rounding error
|
|
285
|
+
3. Total: 1000 * 24 = 24,000 wei
|
|
286
|
+
4. Still only $0.000000001 (NOTHING)
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## 🔬 TESTING WITH FOUNDRY
|
|
291
|
+
|
|
292
|
+
Let me create a test to PROVE the rounding is negligible:
|
|
293
|
+
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
# BTCST (Bitcoin Standard Hashrate Token) - CRITICAL SECURITY ANALYSIS
|
|
2
|
+
|
|
3
|
+
## Contract Information
|
|
4
|
+
- **Proxy Address**: `0x78650B139471520656b9E7aA7A5e9276814a38e9`
|
|
5
|
+
- **Implementation**: `0x85d4F83b0Bf400D3aF6fA12C44a28b490689c091`
|
|
6
|
+
- **Admin**: `0xaa4c10aa3de2e4da6b0c0c9d177f1fa77314c9d8`
|
|
7
|
+
- **Owner**: `0xAd3784cD071602d6c9c2980d8e0933466C3F0a0a`
|
|
8
|
+
- **Compiler**: Solidity 0.6.9
|
|
9
|
+
- **Total Supply**: 15,000,000 BTCST
|
|
10
|
+
- **Decimals**: 17 (HIGHLY UNUSUAL!)
|
|
11
|
+
- **Chain**: BSC (Binance Smart Chain)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 🚨 CRITICAL VULNERABILITIES
|
|
16
|
+
|
|
17
|
+
### 1. DECIMAL MANIPULATION ATTACK (CRITICAL)
|
|
18
|
+
|
|
19
|
+
**Function**: `adminChangeDecimal(uint8 decimals_)`
|
|
20
|
+
|
|
21
|
+
```solidity
|
|
22
|
+
function adminChangeDecimal(uint8 decimals_) public onlyOwner {
|
|
23
|
+
_setupDecimals(decimals_);
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Vulnerability**: Owner can change token decimals AFTER deployment
|
|
28
|
+
|
|
29
|
+
**Attack Scenario**:
|
|
30
|
+
1. Token currently has 17 decimals
|
|
31
|
+
2. Owner changes decimals to 9 (reduces by 8 decimals = 100,000,000x reduction)
|
|
32
|
+
3. All existing balances appear 100,000,000x smaller
|
|
33
|
+
4. DEX pools become massively imbalanced
|
|
34
|
+
5. Owner can exploit price discrepancies
|
|
35
|
+
|
|
36
|
+
**Example**:
|
|
37
|
+
- User has 1,000 BTCST (1000 * 10^17 = 1e20 raw units)
|
|
38
|
+
- Owner changes decimals from 17 to 9
|
|
39
|
+
- User's balance now displays as 100,000,000 BTCST (1e20 / 10^9)
|
|
40
|
+
- But DEX pools still use old decimal assumption
|
|
41
|
+
- Owner can arbitrage the price difference
|
|
42
|
+
|
|
43
|
+
**Impact**: TOTAL RUG PULL VECTOR
|
|
44
|
+
- Breaks all DEX integrations
|
|
45
|
+
- Destroys price oracles
|
|
46
|
+
- Allows owner to steal funds via arbitrage
|
|
47
|
+
- No timelock or governance
|
|
48
|
+
|
|
49
|
+
**Exploit Difficulty**: TRIVIAL (owner just calls function)
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### 2. UNUSUAL DECIMAL COUNT (HIGH RISK)
|
|
54
|
+
|
|
55
|
+
**Current Decimals**: 17 (standard is 18)
|
|
56
|
+
|
|
57
|
+
**Risks**:
|
|
58
|
+
- Most DeFi protocols assume 18 decimals
|
|
59
|
+
- Integration errors in DEX pools
|
|
60
|
+
- Rounding errors in calculations
|
|
61
|
+
- Price oracle confusion
|
|
62
|
+
|
|
63
|
+
**Decimal Confusion Attack**:
|
|
64
|
+
1. Find a pool that assumes 18 decimals
|
|
65
|
+
2. Exploit the 10x difference (10^18 vs 10^17)
|
|
66
|
+
3. Profit from rounding errors
|
|
67
|
+
|
|
68
|
+
**Example Pools to Check**:
|
|
69
|
+
- PancakeSwap BTCST/WBNB
|
|
70
|
+
- PancakeSwap BTCST/BUSD
|
|
71
|
+
- Any aggregator that doesn't read decimals correctly
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### 3. COMPLEX TIME-LOCK MECHANISM (MEDIUM-HIGH)
|
|
76
|
+
|
|
77
|
+
**Linear Release Parameters**:
|
|
78
|
+
- Lock Time: 25 weeks (175 days)
|
|
79
|
+
- Lock Rounds: 25 rounds
|
|
80
|
+
- Time Unit: 86400 seconds (1 day)
|
|
81
|
+
|
|
82
|
+
**Vulnerability**: Rounding errors in unlock calculation
|
|
83
|
+
|
|
84
|
+
```solidity
|
|
85
|
+
function getFreeToTransferAmount(address account) external view returns (uint256) {
|
|
86
|
+
// Complex calculation with multiple divisions
|
|
87
|
+
uint256 timePerRound = _lockTime.div(_lockRounds);
|
|
88
|
+
uint passed = now - start;
|
|
89
|
+
uint passedRound = passed.div(timePerRound * _lockTimeUnitPerSeconds);
|
|
90
|
+
freeAmount = lockedBal.mul(passedRound).div(_lockRounds);
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Rounding Error Accumulation**:
|
|
95
|
+
- 25 rounds × potential rounding per round
|
|
96
|
+
- Integer division truncates
|
|
97
|
+
- Small errors can accumulate over time
|
|
98
|
+
- May allow early unlock of tokens
|
|
99
|
+
|
|
100
|
+
**Attack Vector**:
|
|
101
|
+
1. Mint tokens with time-lock
|
|
102
|
+
2. Wait for specific timestamp where rounding favors attacker
|
|
103
|
+
3. Transfer more tokens than should be unlocked
|
|
104
|
+
4. Repeat across multiple rounds
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
### 4. FARM CONTRACT PRIVILEGE ESCALATION (HIGH)
|
|
109
|
+
|
|
110
|
+
**Special Function**: `transferLockedFromFarmWithRecord()`
|
|
111
|
+
|
|
112
|
+
```solidity
|
|
113
|
+
function transferLockedFromFarmWithRecord(
|
|
114
|
+
address recipient,
|
|
115
|
+
uint256 amount,
|
|
116
|
+
uint[] memory tobeCostKeys,
|
|
117
|
+
uint256[] memory tobeCost
|
|
118
|
+
) public onlyFarm
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Vulnerability**: Farm contract can bypass normal time-lock rules
|
|
122
|
+
|
|
123
|
+
**Attack Scenario**:
|
|
124
|
+
1. Owner changes farm contract to malicious address
|
|
125
|
+
2. Malicious farm calls `transferLockedFromFarmWithRecord()`
|
|
126
|
+
3. Provides custom unlock schedule (tobeCostKeys, tobeCost)
|
|
127
|
+
4. Bypasses normal 25-week linear unlock
|
|
128
|
+
5. Instantly unlocks all tokens
|
|
129
|
+
|
|
130
|
+
**Impact**: Complete bypass of time-lock mechanism
|
|
131
|
+
|
|
132
|
+
**Exploit Difficulty**: EASY (owner controls farm address)
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### 5. UPGRADEABLE PROXY RISK (CRITICAL)
|
|
137
|
+
|
|
138
|
+
**Pattern**: AdminUpgradeabilityProxy
|
|
139
|
+
|
|
140
|
+
**Admin Address**: `0xaa4c10aa3de2e4da6b0c0c9d177f1fa77314c9d8`
|
|
141
|
+
|
|
142
|
+
**Vulnerability**: Admin can upgrade to malicious implementation
|
|
143
|
+
|
|
144
|
+
**Attack Scenario**:
|
|
145
|
+
1. Admin deploys malicious implementation
|
|
146
|
+
2. Calls upgrade function (no timelock)
|
|
147
|
+
3. New implementation has backdoor
|
|
148
|
+
4. Admin drains all funds
|
|
149
|
+
|
|
150
|
+
**No Protection**:
|
|
151
|
+
- No timelock on upgrades
|
|
152
|
+
- No governance vote required
|
|
153
|
+
- Single admin has full control
|
|
154
|
+
- No upgrade delay
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
### 6. MULTIPLE ACCESS CONTROL ROLES (MEDIUM)
|
|
159
|
+
|
|
160
|
+
**Roles**:
|
|
161
|
+
- `DEFAULT_ADMIN_ROLE` - Can grant/revoke all roles
|
|
162
|
+
- `MINTER_ROLE` - Can mint tokens
|
|
163
|
+
- `PAUSER_ROLE` - Can pause transfers
|
|
164
|
+
- `owner` - Can change farm, lock parameters, decimals
|
|
165
|
+
- `admin` (proxy) - Can upgrade implementation
|
|
166
|
+
|
|
167
|
+
**Vulnerability**: Role confusion and privilege escalation
|
|
168
|
+
|
|
169
|
+
**Attack Vectors**:
|
|
170
|
+
- Owner != Admin (different addresses)
|
|
171
|
+
- MINTER can mint unlimited tokens
|
|
172
|
+
- PAUSER can freeze all transfers
|
|
173
|
+
- No checks on role assignment
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 🎯 EXPLOIT STRATEGIES
|
|
178
|
+
|
|
179
|
+
### Strategy 1: Decimal Manipulation Arbitrage
|
|
180
|
+
|
|
181
|
+
**Requirements**: Owner access OR wait for owner to change decimals
|
|
182
|
+
|
|
183
|
+
**Steps**:
|
|
184
|
+
1. Monitor `adminChangeDecimal()` calls
|
|
185
|
+
2. When decimals change, immediately:
|
|
186
|
+
- Calculate new price in DEX pools
|
|
187
|
+
- Front-run other traders
|
|
188
|
+
- Arbitrage the price difference
|
|
189
|
+
3. Profit from decimal confusion
|
|
190
|
+
|
|
191
|
+
**Profit Potential**: 10x to 100,000,000x depending on decimal change
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
### Strategy 2: Time-Lock Rounding Exploit
|
|
196
|
+
|
|
197
|
+
**Requirements**: Tokens with time-lock
|
|
198
|
+
|
|
199
|
+
**Steps**:
|
|
200
|
+
1. Mint tokens with `mintWithTimeLock()`
|
|
201
|
+
2. Calculate exact timestamps where rounding favors you
|
|
202
|
+
3. Call `transfer()` at those timestamps
|
|
203
|
+
4. Extract more tokens than should be unlocked
|
|
204
|
+
5. Repeat every round
|
|
205
|
+
|
|
206
|
+
**Profit Potential**: 1-5% extra tokens per round
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### Strategy 3: Farm Contract Takeover
|
|
211
|
+
|
|
212
|
+
**Requirements**: Owner access
|
|
213
|
+
|
|
214
|
+
**Steps**:
|
|
215
|
+
1. Deploy malicious farm contract
|
|
216
|
+
2. Call `changeFarmContract(maliciousFarm)`
|
|
217
|
+
3. Use `transferLockedFromFarmWithRecord()` to unlock all tokens
|
|
218
|
+
4. Dump on market
|
|
219
|
+
|
|
220
|
+
**Profit Potential**: Unlock all time-locked tokens instantly
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
### Strategy 4: Upgrade Attack
|
|
225
|
+
|
|
226
|
+
**Requirements**: Admin access
|
|
227
|
+
|
|
228
|
+
**Steps**:
|
|
229
|
+
1. Deploy malicious implementation with backdoor
|
|
230
|
+
2. Call proxy upgrade function
|
|
231
|
+
3. Execute backdoor to drain funds
|
|
232
|
+
|
|
233
|
+
**Profit Potential**: 100% of contract value
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 📊 ON-CHAIN ANALYSIS
|
|
238
|
+
|
|
239
|
+
### Current State (from check-btcst.js):
|
|
240
|
+
```
|
|
241
|
+
Name: StandardBTCHashrateToken
|
|
242
|
+
Symbol: BTCST
|
|
243
|
+
Decimals: 17
|
|
244
|
+
Total Supply: 15,000,000 BTCST
|
|
245
|
+
Paused: false
|
|
246
|
+
Owner: 0xAd3784cD071602d6c9c2980d8e0933466C3F0a0a
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Key Addresses:
|
|
250
|
+
- **Owner**: Controls decimals, farm, lock parameters
|
|
251
|
+
- **Admin**: Controls proxy upgrades
|
|
252
|
+
- **Farm**: Has special transfer privileges
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 🔍 RECOMMENDED CHECKS
|
|
257
|
+
|
|
258
|
+
### 1. Check DEX Pools for Decimal Confusion
|
|
259
|
+
```javascript
|
|
260
|
+
// Check if any pools assume 18 decimals instead of 17
|
|
261
|
+
// Look for 10x price discrepancies
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### 2. Monitor Owner/Admin Actions
|
|
265
|
+
```javascript
|
|
266
|
+
// Watch for:
|
|
267
|
+
// - adminChangeDecimal() calls
|
|
268
|
+
// - changeFarmContract() calls
|
|
269
|
+
// - Proxy upgrade transactions
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### 3. Analyze Time-Lock Balances
|
|
273
|
+
```javascript
|
|
274
|
+
// Check _timeLockedBalances for large holders
|
|
275
|
+
// Calculate potential rounding errors
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### 4. Test Rounding Errors
|
|
279
|
+
```solidity
|
|
280
|
+
// Create Foundry test to find optimal unlock timestamps
|
|
281
|
+
// Test edge cases in getFreeToTransferAmount()
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 💰 PROFITABILITY ASSESSMENT
|
|
287
|
+
|
|
288
|
+
### Decimal Manipulation:
|
|
289
|
+
- **Difficulty**: Requires owner access
|
|
290
|
+
- **Profit**: MASSIVE (100x to 100,000,000x)
|
|
291
|
+
- **Detection**: HIGH (on-chain event)
|
|
292
|
+
|
|
293
|
+
### Time-Lock Rounding:
|
|
294
|
+
- **Difficulty**: MEDIUM (requires calculation)
|
|
295
|
+
- **Profit**: LOW (1-5% per round)
|
|
296
|
+
- **Detection**: LOW (looks like normal transfer)
|
|
297
|
+
|
|
298
|
+
### Farm Privilege:
|
|
299
|
+
- **Difficulty**: Requires owner access
|
|
300
|
+
- **Profit**: HIGH (unlock all tokens)
|
|
301
|
+
- **Detection**: MEDIUM (unusual transfer pattern)
|
|
302
|
+
|
|
303
|
+
### Upgrade Attack:
|
|
304
|
+
- **Difficulty**: Requires admin access
|
|
305
|
+
- **Profit**: TOTAL (100% of funds)
|
|
306
|
+
- **Detection**: HIGH (upgrade event)
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 🛡️ USER-SIDE EXPLOITS (NO ADMIN ACCESS)
|
|
311
|
+
|
|
312
|
+
### ❌ NO IMMEDIATELY PROFITABLE USER-SIDE EXPLOITS FOUND
|
|
313
|
+
|
|
314
|
+
All major vulnerabilities require either:
|
|
315
|
+
1. Owner access (decimal change, farm change)
|
|
316
|
+
2. Admin access (proxy upgrade)
|
|
317
|
+
3. MINTER_ROLE (unlimited minting)
|
|
318
|
+
|
|
319
|
+
### Possible User-Side Attacks:
|
|
320
|
+
|
|
321
|
+
1. **Decimal Confusion Arbitrage** (IF owner changes decimals):
|
|
322
|
+
- Monitor for `adminChangeDecimal()` event
|
|
323
|
+
- Front-run price adjustments in DEX pools
|
|
324
|
+
- Profit: Depends on decimal change magnitude
|
|
325
|
+
|
|
326
|
+
2. **Time-Lock Rounding Optimization**:
|
|
327
|
+
- Calculate optimal unlock timestamps
|
|
328
|
+
- Transfer at exact moments to maximize rounding
|
|
329
|
+
- Profit: 1-5% extra tokens (NOT WORTH GAS)
|
|
330
|
+
|
|
331
|
+
3. **DEX Pool Exploitation** (IF pools exist with decimal mismatch):
|
|
332
|
+
- Find pools that assume 18 decimals
|
|
333
|
+
- Exploit 10x difference
|
|
334
|
+
- Profit: Depends on pool liquidity
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## 🎯 NEXT STEPS FOR WHITEHAT ANALYSIS
|
|
339
|
+
|
|
340
|
+
### 1. Check for Existing DEX Pools
|
|
341
|
+
```bash
|
|
342
|
+
# Find BTCST pools on PancakeSwap
|
|
343
|
+
# Check if any have decimal confusion
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### 2. Analyze Farm Contract
|
|
347
|
+
```bash
|
|
348
|
+
# Get farm contract address from _farmContract
|
|
349
|
+
# Analyze farm's permissions and logic
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### 3. Test Time-Lock Rounding
|
|
353
|
+
```bash
|
|
354
|
+
# Create Foundry test
|
|
355
|
+
# Simulate 25 rounds of unlocking
|
|
356
|
+
# Calculate cumulative rounding errors
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### 4. Monitor Owner/Admin
|
|
360
|
+
```bash
|
|
361
|
+
# Set up alerts for:
|
|
362
|
+
# - adminChangeDecimal()
|
|
363
|
+
# - changeFarmContract()
|
|
364
|
+
# - Proxy upgrades
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## 📝 CONCLUSION
|
|
370
|
+
|
|
371
|
+
**BTCST has CRITICAL centralization risks but NO user-side exploits without admin access.**
|
|
372
|
+
|
|
373
|
+
**Key Findings**:
|
|
374
|
+
1. ✅ Owner can change decimals (CRITICAL RUG VECTOR)
|
|
375
|
+
2. ✅ Unusual 17 decimals (potential DEX confusion)
|
|
376
|
+
3. ✅ Complex time-lock (minor rounding errors)
|
|
377
|
+
4. ✅ Farm privilege escalation (owner-controlled)
|
|
378
|
+
5. ✅ Upgradeable proxy (admin-controlled)
|
|
379
|
+
6. ❌ No user-side exploits found
|
|
380
|
+
|
|
381
|
+
**Recommendation**:
|
|
382
|
+
- DO NOT hold BTCST long-term (centralization risk)
|
|
383
|
+
- Monitor owner/admin addresses for suspicious activity
|
|
384
|
+
- Check DEX pools for decimal confusion opportunities
|
|
385
|
+
- Set up alerts for contract changes
|
|
386
|
+
|
|
387
|
+
**For Responsible Disclosure**:
|
|
388
|
+
- Report decimal manipulation risk to BTCST team
|
|
389
|
+
- Suggest implementing timelock on critical functions
|
|
390
|
+
- Recommend removing adminChangeDecimal() function
|
|
391
|
+
- Suggest multi-sig for owner/admin roles
|