You gave a Permit2 authorization to a router contract on Uniswap, then switched to the built-in aggregator in the OKX Web3 wallet and found it works too—this is completely normal, not a bug, and your authorization wasn't "stolen." That's because Permit2 is designed so that all contracts integrated with this standard can share the same authorization, as long as the spender field in the signature points to the current contract address.
Step 1: Understanding Permit2's "Shared Authorization" Mechanism
What to do: Understand why switching frontends still works and what the verification mechanism is.
How to do it: Permit2 operates in two layers:
Layer 1 (on-chain authorization): You gave the Permit2 official contract (
0x000000000022D473030F116dDEE9F6B43aC78BA3) an infinite allowance viaapprove. This is like giving the Permit2 contract a master key; this authorization isn't tied to any specific dApp.Layer 2 (off-chain signature): When you signed the Permit2 message on Uniswap's frontend, it included a field called
spender—which determines who can move your funds. On Uniswap, thespenderis Uniswap's Universal Router address; when you switch to the OKX aggregator, OKX's contract fillsspenderwith its own contract address when calling Permit2.
Completion criteria: You can clearly explain: it works across frontends because the OKX aggregator also integrates Permit2, and its call to the Permit2 contract passes signature verification.
Step 2: Check if the Authorization Really Works "Cross-Frontend"
What to do: Confirm whether the OKX aggregator actually uses Permit2 instead of the traditional approve path.
How to do it: Initiate a small swap on the OKX aggregator. When the wallet prompts you to sign, check the signature content structure. If it shows a "Permit2" or "Permit" type signature (usually wallets indicate this), it's using the Permit2 allowance pool. If it shows a traditional approve transaction, your previous authorization isn't being reused.
Completion criteria: You can confirm OKX is using the Permit2 signature path.
Step 3: Assessing the Risks of "Shared Authorization"
What to do: Since authorization can be shared across frontends, what is the security boundary?
How to do it: The core risk is one thing: Any Permit2 signature you've signed, as long as it hasn't expired, can be used by any contract that integrates Permit2 to move your funds, provided the spender field in the signature points to itself. There are two modes:
AllowanceTransfer mode: You set a specific allowance and expiration for a particular
spender(like Uniswap) stored in the Permit2 contract. As long as it hasn't expired, thatspendercan use it repeatedly without you needing to sign again. This is your current state.SignatureTransfer mode: You sign a one-time permit that is only valid for the current transaction, used once and then void, leaving no "pending authorization."
High risk: If you sign a Permit2 signature on a phishing site that sets
spenderto an attacker's contract address, the attacker can use that signature to drain your tokens via Permit2 before the signature expires, even if you switch back to Uniswap or OKX. Permit2 signatures are off-chain, so they don't trigger on-chain transaction records, making them hard to notice.
Common misunderstanding: Many people confuse "authorizing the Permit2 contract" with "authorizing a specific dApp." Giving the Permit2 contract an on-chain approve does not mean you have authorized all dApps. Each dApp that wants to use Permit2 must obtain a separate Permit2 message you sign—and the spender field in that message determines who can access your funds. Uniswap works because you signed with spender set to Uniswap; OKX works because OKX's contract is also in the Permit2 whitelist and your previously signed expiration hasn't expired yet.
Verification method: Connect your wallet to Revoke.cash, check the Permit2 contract's allowances for each token, and see each spender's remaining expiration. If you see an unknown spender with an allowance of uint256.max, revoke it immediately on Revoke.cash. To disable cross-frontend reuse, the only way is to revoke the Permit2 contract's allowance and go back to the traditional approve flow—but then you'll return to the old mode of re-authorizing each time you switch dApps.


