가입 후 초대 링크를 공유하면 동영상 재생 및 초대 보상을 받을 수 있습니다.

Jace
@JaceX90
🇭🇰 Love Defi
가입 March 2020
2.4K 팔로잉 중    12.5K 팬
⚠️ Twofold ($TWO, Robinhood Chain) — a warning for LPs. I ran an independent, attacker-perspective audit and reproduced the attack on a local fork against real on-chain state: anyone holding Twofold's owner key can drain 100% of every pool's LP principal in four steps. In my PoC I took 100% of the SPY/USDG pool's SPY and all 5,755 USDG from the SPY+NVDA pools — no swap, no reentrancy, one transaction sequence. The mechanism, in plain terms: when the hook binds a "vault" contract it grants that vault an unlimited allowance (type(uint256).max) over the hook's entire balance of that token — while its internal bookkeeping is partitioned per pool. Allowance is global, accounting is per-pool. A vault bound to one new pool therefore gains control over the hook's balance of that currency across all pools. Four steps: ① the owner allowlists a fake vault it controls; ② opens a new pool binding it → the hook auto-grants the unlimited allowance; ③ the stock/WETH legs sit as RAW ERC-20 in the hook — just transferFrom them out; ④ the USDG legs live in Steakhouse — call emergencyRevokeVault to redeem them into the hook's raw balance, then drain. The nastiest part: after the drain the pool still reports the reserves as present, but the hook holds 0. LPs calling removeLiquidity simply revert — the ledger says you're owed, the tokens are gone, the protocol is insolvent toward LPs. Why every built-in defense fails: · the allowlist — the party that picks the vault and the operator are the same address, so the allowlist defends nothing against its own owner; · the "feeless-vault" probe — trivially passed with identity functions; the upstream code itself notes the probe can't stop an adversarial vault; · emergencyRevokeVault — only revokes the allowance of that pool's own vault, never the attacker's vault bound to a different pool. And the key to all of it is a single anonymous EOA: 0xC8720447712e6C4c851B3884b4Ec93F9cE8aD5fD — owner of every contract, de-facto controller of the hook, holder of most LP shares. No multisig, no timelock, empty cast code. Nothing can slow or veto those four steps. Exit signals to watch: a new vault added to VaultAllowlist, a new pool created, emergencyRevokeVault / PoolLivenessUpdated(false) events, that EOA or its linked wallets sending to the PoolManager/Settler, setRewarder / transferHookOwnership pointing at a new address. Disclosure: all attacks were simulated on a local fork only — no mainnet transaction was sent. I'm not claiming the team has rugged. I'm stating that the ability to drain LPs in full is real and sits in the hands of one anonymous, unchecked key that can act at any block. The underlying hook is Uniswap's upstream code deployed byte-for-byte; the "global allowance" design is upstream's, and upstream explicitly requires the operator to be trustworthy. Twofold made that operator a single anonymous EOA with no separation and no delay — while telling users "no contract path can reach LP principal." That's what turns a documented trust assumption into a live rug path. DYOR. Don't bet your principal on the goodwill of one anonymous private key. @RobinhoodCrypto @twofoldfi
더 보기