Aperturefinance used distinct token allowances and LP NFT approvals in liquidity management
Aperturefinance used token allowances and liquidity provider (LP) NFT approvals with different scopes in its liquidity management contracts. An ERC-20 allowance authorizes a spender to transfer a permitted amount of a particular token. An ERC-721 permission authorizes transfers of non-fungible tokens (NFTs), individually or through an operator covering the owner's holdings in that NFT contract. Both types mattered after the January 25, 2026 incident involving affected instant-liquidity contracts. Removing a token allowance leaves NFT permissions unchanged, and removing an NFT permission leaves token allowances unchanged. Asset type, network, contract address, and approval scope determine which authorization remains active.
Which approvals did the January 2026 incident affect?
The incident concerned token and LP NFT approvals granted to affected instant-liquidity contracts in the latest V4-ready generation. Minting, adding liquidity, and reinvesting belonged to that affected feature group. The January response covered instant-liquidity use through Uniswap V3 and V4, PancakeSwap V3 and Infinity, Aerodrome, and Velodrome, and called for revoking ERC-20 and ERC-721 permissions for the affected Aperturefinance contracts in those integrations.
Exposure followed the actual grant. A wallet could have approved a fungible token, a position NFT, or both. The affected contract's ability to move assets depended on those permissions. Checking one asset category alone could leave another relevant authorization untouched.
ERC-20 allowances limit a spender by token amount
For an ERC-20 token, the allowance limits how much a specified spender may transfer from an owner's balance under the token's rules.
The token contract records the allowance
Each token contract maintains its own allowance for an owner and spender, so the same liquidity manager can receive separate spending limits for different fungible assets held by the same wallet on the selected network. The approved address receives permission within that particular token contract.
The
allowance(owner, spender)
function returns the remaining permitted amount.
Calling
approve(spender, value)
overwrites the current ERC-20 allowance with the specified value.
The contract expresses this spending limit in the token's own units.
Zero and a smaller positive limit have different effects
Setting the allowance to zero removes ordinary ERC-20 spending permission for that owner-spender pair. Reducing it to a smaller positive value leaves authority over the remaining permitted amount.
A signed or submitted revocation request does not establish a changed allowance. The resulting on-chain record establishes the remaining permission. ERC-20 also requires applications to handle unsuccessful return values, so a request appearing in an interface cannot substitute for the token contract's actual state.
LP NFT approvals select a position or an operator
An ERC-721 LP NFT approval authorizes transfer of a distinct position token, individually or through an operator permission covering the owner's collection. Its scope determines which positions an approved address may transfer.
A controller for one position
For a single NFT,
getApproved(tokenId)
returns its approved controller. A zero address means no individual controller holds that approval. Approving the zero address for that token ID clears its individual controller. Clearing the individual approval leaves any operator authorization unchanged. The identifier selects a position; it does not specify a maximum token amount or a fraction of its liquidity.
An operator across the NFT contract
An ERC-721 operator approval covers every NFT the owner holds in that NFT contract.
The owner enables this permission with
setApprovalForAll(operator, true)
and disables it with
setApprovalForAll(operator, false)
. The
isApprovedForAll(owner, operator)
function reads the operator's authorization. Disabling an operator leaves any individual NFT approval naming the same address unchanged. Other NFT contracts retain their own permission records.
Transfer clears the individual approval
An ERC-721 transfer resets the transferred NFT's individual approved address. Operator permissions belong to an owner within the NFT contract, so a transfer does not carry the previous owner's operator grants into the recipient's account even though the NFT retains its original token identifier. An operator may retain authority over other NFTs the previous owner still holds in that contract.
A shared function name carries different meanings
The ERC-20 and ERC-721 versions of
transferFrom
move different objects despite sharing a function name. In ERC-20, the final argument specifies a token amount. In ERC-721, it identifies the NFT whose ownership changes. A token amount measures fungible units; a position identifier names one distinct asset. Treating an NFT identifier as an allowance amount confuses the transfer's scope and obscures what the approved address can control.
A position NFT carries control over pool liquidity
A Uniswap V3 position NFT represents a liquidity position containing assets allocated within a chosen pool price range. Transferring the ownership token changes who owns that position. The NFT approval therefore matters even when the position's underlying assets are in the pool rather than in the owner's wallet. A fungible-token allowance and a position NFT approval describe access to different assets.
Market prices can change the position's token composition and move liquidity outside its active range. Changing a transfer approval does not alter that range or exchange the position's assets. Rebalancing concerns the allocation and range; approval maintenance concerns who may act on the relevant assets. The position identifier alone reveals neither its liquidity size nor its value.
The vulnerable swap path exposed approved assets
Within the January 2026 affected native-token minting path, insufficiently checked swap inputs let attackers use the contract's existing asset permissions. The intended flow wrapped native tokens, performed a swap through a helper, and minted a Uniswap V3 position. The vulnerability sat in the swap stage, where the helper accepted an inadequately constrained external call target and input data.
The exploited manager could call a token contract with attacker-controlled transfer instructions. The asset contract evaluated authorization using the manager's existing permissions. The January 2026 vulnerable contracts could transfer approved Uniswap V3 position NFTs through attacker-controlled external calls. A swap-related helper flaw therefore exposed assets beyond the fungible tokens involved in the intended swap.
The project disabled affected instant-liquidity functions in its web app during the incident response. That change restricted the interface. It did not itself overwrite ERC-20 allowance records or ERC-721 permissions in deployed asset contracts. Revocation addressed the separate authority those contracts had already received.
An ERC-20 revocation can leave an LP NFT exposed
Revoking a token allowance leaves any separate ERC-721 permission unchanged. In this hypothetical example, a wallet still owns a Uniswap V3 position NFT. An affected management contract has a positive allowance for a fungible token and an enabled operator approval in the position NFT contract. The NFT has no individual approved controller. The intended outcome is to remove that manager's transfer authority over both assets.
Setting the ERC-20 allowance to zero removes the spender's ordinary permission over that token. The enabled operator approval still authorizes transfer of the position NFT under ERC-721 rules. The absence of an individual controller leaves the operator grant relevant. An on-chain allowance of zero confirms only the token-side outcome.
After the operator revocation takes effect on-chain, the management contract has neither the specified token allowance nor NFT transfer permission. The NFT still has no individual approved controller. This conclusion concerns the stated owner, token contract, position contract, and network. A later approval can restore permission.
Approval maintenance spans networks and contract generations
Maintaining these permissions requires the exact network, asset contract, owner, and approved address, because those details determine which record a change affects.
Token contract and spender
The same spender may receive approvals in several token contracts. Each contract has its own allowance record; a change in one does not edit another. Records on different networks also belong to separate deployments. Replacing a management address in an interface alone does not alter an existing on-chain approval to an older contract.
Position contract and token identifier
An LP NFT requires its NFT contract address and token identifier, together with the network. The identifier alone does not distinguish positions across different deployments. The January 2026 label V4-ready described the affected management contract generation. It did not establish a universal authorization format for every listed integration. ERC-721 checks apply where the relevant position contract implements ERC-721.
Instant reinvestment and automated compounding had separate incident scopes
The January 2026 affected feature group included instant reinvesting, while automated compounding belonged to a separate architecture outside the stated impact scope. Auto-Rebalance, Prescheduled Position Close, Auto-Compound, and Limit Order used the separate core automation infrastructure.
Similar liquidity actions can involve different management contracts. An instant reinvestment permission should not inherit the incident classification of an automated compounding strategy merely because both return assets to liquidity. The approved address and affected generation determine which incident scope applies.
Transfer permission granted to a new management address belongs to that address. It does not remove an older spender's records. The active permissions change when the owner grants fresh access, transfers a position NFT, or disables an operator in the relevant asset contract.
Aperturefinance questions worth asking
-
Does granting an Aperturefinance token allowance deposit tokens into its contract?
- Granting an ERC-20 allowance gives the spender permission to transfer tokens; it does not itself transfer the owner's balance. The token contract records the allowance separately from token ownership. A later transfer uses that authority, subject to the permitted amount and the token's rules.
-
Why can an Aperturefinance allowance remain relevant after the wallet's token balance reaches zero?
- A zero token balance does not by itself establish a zero ERC-20 allowance. Balance and remaining spending permission are separate values in the token contract. If a positive allowance remains, the spender may retain authority over tokens the owner later receives, subject to that token's implementation. The current balance describes available assets; the allowance describes the permission a spender still holds.
-
Will revoking an Aperturefinance approval reverse an earlier unauthorized transfer?
- Revoking an approval removes the specified permission for subsequent transfers; it does not reverse an earlier asset transfer. An ERC-20 allowance change updates spending authority, and an ERC-721 approval change updates control of NFTs the owner still holds. Neither operation returns an asset an attacker has already transferred.
-
How do token decimals affect the displayed amount of an Aperturefinance allowance?
- For a token exposing a decimals value d, the allowance in token units equals its raw allowance divided by 10 raised to d. The contract stores the raw amount, while interfaces may display a scaled token quantity. ERC-20 makes the decimals method optional, so applications cannot assume every token exposes it. An LP NFT token identifier has no corresponding decimal-scaled allowance amount.
-
Can safeTransferFrom block an authorized Aperturefinance operator from moving an LP NFT?
- ERC-721 safeTransferFrom permits an authorized operator to initiate a transfer and adds a check for smart contract recipients. A receiving contract must return the expected response, or the transfer fails. That recipient check does not revoke the operator's existing permission. The function's name describes safe receipt of the NFT, not protection against an operator whose transfer authority remains enabled.
-
Should an Aperturefinance token allowance return to zero before a different positive amount replaces it?
- ERC-20 recommends interfaces set an existing allowance to zero before assigning a different positive value for the same spender. The standard treats this as an interface recommendation and does not require token contracts to enforce the sequence. A new positive allowance grants spending permission again, so replacement and revocation express different intentions.