[1IP-XX] Collect Accrued Fees on the DAO's 1INCH/WETH Uniswap V3 LP Position

Author: DAOplomats

Status: Draft — Phase 2
Category: DAO / Treasury

Simple Summary

Authorize collecting the roughly $112,800 in accrued, unclaimed trading fees sitting on the DAO’s 1INCH/WETH Uniswap V3 LP position (NFT #501891, 1% fee tier).

Abstract

The DAO Safe holds a Uniswap V3 liquidity position in the 1INCH/WETH pool (1% fee tier), represented by NFT #501891. Per the Safe’s asset dashboard, the position is currently valued at $258,320.04, made up of:

Component Amount Value
Deposited principal 1.66M 1INCH ~$145,500
Uncollected fees (WETH) 36.01414 WETH ~$86,281
Uncollected fees (1INCH) 303.58K 1INCH ~$26,534
Total uncollected fees ~$112,815

That’s roughly 43.7% of the position’s total value sitting uncollected ($112,815 ÷ $258,320 ≈ 43.7%) — fees that have accrued but never been swept into the treasury. This is a Safe-dashboard snapshot [timeline: 20260916]. This proposal asks the DAO to authorize collecting those fees now.

Motivation

Uniswap V3 fees accrue to a position. Over the past couple months, the position has been more consistently out of range, and an out-of-range Uniswap V3 position accrues zero new fees; the balance is frozen, not growing. Thus, this position sits inert until someone calls collect(). They don’t compound and don’t otherwise benefit the treasury while unclaimed. Collecting them now improves treasury custody, visibility, and operational flexibility, and separates already-earned assets from however the LP principal is managed going forward. A follow-up proposal on rebalancing the position’s range is planned but has no scheduled timeline yet.

Rather than leave a meaningful, growing balance unclaimed while that discussion plays out, this proposal asks the DAO to collect it now.

  • It’s idle capital. Uncollected fees aren’t earning anything further while they sit as tokensOwed on the position; they’re just a balance waiting to be swept into the treasury.

  • It’s a meaningful, quantifiable sum. At ~$112,800 (43.7% of the position’s total value; see Abstract), this is large enough to be worth a routine treasury operation rather than being left to accumulate indefinitely.

  • The position appears to be out of range. The Safe’s dashboard shows the deposited principal entirely in 1INCH with no WETH, which is consistent with — but does not itself prove — the pool’s current price sitting outside this position’s tick range. The transaction preparer must confirm this directly by comparing the position’s current tick to tickLower/tickUpper before publication (see the Verification Checklist).

  • Collecting separately, rather than waiting for a rebalance, avoids indefinite delay. No rebalance proposal is currently scheduled and its timeline is undetermined. If one is brought forward on short notice before this executes, the DAO can still choose to combine both actions into a single transaction bundle instead.

This proposal is scoped narrowly to fee collection only. It does not propose withdrawing or rebalancing the underlying 1.66M 1INCH principal — that will be the subject of a separate, follow-up proposal to consider adjusting the position’s range so it stays active going forward.

Specification

Execute decreaseLiquidity() and collect() on the Uniswap V3 NonfungiblePositionManager contract for this position, as one atomic SafeSnap execution:

  • Contract: 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 (Uniswap V3: NonfungiblePositionManager, Ethereum mainnet)

  • Position (pool): 1INCH/WETH, 1% fee tier — 0xE931b03260B2854e77e8dA8378A1BC017b13cb97, with

    • token0 = 1INCH, and
    • token1 = WETH
  • Token ID: 501891

  • NFT owner: 0x7951c7ef839e26F63DA87a42C9a87986507f1c07 (1inch DAO Treasury Safe)

  • Recipient: 0x7951c7ef839e26F63DA87a42C9a87986507f1c07 (1inch DAO Treasury Safe)

  • Executing Safe: 1inch DAO Treasury Safe, 0x7951c7ef839e26F63DA87a42C9a87986507f1c07, via SafeSnap (Reality module 0xa62D2a75eb39C12e908e9F6BF50f189641692F2E)

  • Network: Ethereum mainnet

decreaseLiquidity(
  tokenId:     501891,
  liquidity:   15580280333655487507944,
  amount0Min:  0,
  amount1Min:  0,
  deadline:    115792089237316195423570985008687907853269984665640564039457584007913129639935
)

collect(
  tokenId:     501891,
  recipient:   0x7951c7ef839e26F63DA87a42C9a87986507f1c07,
  amount0Max:  340282366920938463463374607431768211455,
  amount1Max:  340282366920938463463374607431768211455
)
  • amount0Max / amount1Max are the literal uint128 maximum (2^128 − 1) and deadline is the literal uint256 maximum (2^256 − 1). Safe Transaction Builder and most wallet interfaces require these exact integers, not Solidity’s type(uint128).max / type(uint256).max shorthand.

  • decreaseLiquidity() removes the position’s full liquidity (15580280333655487507944), which moves the principal into tokensOwed0/tokensOwed1. collect() then transfers all of it, principal plus accrued fees, to the treasury Safe. amount0Min / amount1Min are 0 because the position is below its range and returns only 1INCH.

  • This authorization does not permit burning or transferring the NFT, approving another operator, swapping either received token, or sending proceeds to any address other than the DAO treasury Safe.

  • Execution is through the treasury Safe’s SafeSnap Reality module (0xa62D2a75eb39C12e908e9F6BF50f189641692F2E), which is enabled on the Safe. After the vote passes, the Reality.eth answer must stand for a 3-day timeout and a 3-day cooldown, then the transaction can be executed within the remaining 4 days of the 7-day expiry window.

  • Position state recorded at block 26,127,278: tick range −98,600 to −69,000, current tick −101,573 (below range), liquidity 15580280333655487507944. Simulated through the Reality module → Safe path: 1,968,341.53 1INCH and 36.0141 WETH to the treasury Safe. This will be re-simulated immediately before the Snapshot vote.

Rationale

An alternative considered was bundling this with a full range-rebalance in one proposal, since a rebalance’s decreaseLiquidity() and collect() could be executed together in one transaction, saving gas and governance overhead. We chose to split it because no rebalance proposal is currently scheduled and its timeline is undetermined; leaving a meaningful, growing fee balance unclaimed indefinitely while that separate strategy discussion plays out is a worse trade-off than the modest extra gas and signing overhead of a second transaction. If a rebalance is brought forward on short notice before this executes, the DAO can still combine both into one bundle instead.

A second alternative considered was publishing this proposal on the dashboard figures alone, without on-chain verification. We rejected this: collect() transfers whatever is currently in tokensOwed0/tokensOwed1, which can include previously-decreased-but-uncollected principal, not only fees, and a wrong recipient address has no slippage protection to catch it. The Specification and the accompanying Verification Checklist require independent on-chain confirmation of ownership, balances, and recipient before execution.

Considerations

  • Token amounts and USD values above are as of the time of writing and will drift with price before execution; verify the exact collect() output on-chain at execution time rather than assuming it matches the figures here.

  • This proposal does not address why the position has gone out of range or what to do about it — that will be brought as a separate proposal on rebalancing the range.

  • Recipient address for the collected fees needs to be filled in with the correct treasury Safe address, confirmed byte-for-byte, before this is formalized as an official 1IP.

  • Confirm which Safe will execute the transaction and under what signer policy (direct multisig execution vs. a SafeSnap-connected module) — do not assume SafeSnap applies without confirming the module is active for this specific Safe.

  • Add the exact block number and timestamp behind the position figures in the Abstract before this is published.

Snapshot Proposal Payload

{ "version": "1.0", "chainId": "1", "createdAt": 1791331200000, "meta": { "name": "Withdraw 1INCH/WETH Uniswap V3 LP #501891 (decoded)", "description": "1) decreaseLiquidity: remove all liquidity from NFT #501891. 2) collect: send all 1INCH and WETH owed to the 1inch DAO treasury Safe.", "txBuilderVersion": "1.16.5", "createdFromSafeAddress": "0x7951c7ef839e26F63DA87a42C9a87986507f1c07", "createdFromOwnerAddress": "" }, "transactions": [ { "to": "0xC36442b4a4522E871399CD717aBDD847Ab11FE88", "value": "0", "data": null, "contractMethod": { "name": "decreaseLiquidity", "payable": true, "inputs": [ { "name": "params", "type": "tuple", "internalType": "struct INonfungiblePositionManager.DecreaseLiquidityParams", "components": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" }, { "name": "liquidity", "type": "uint128", "internalType": "uint128" }, { "name": "amount0Min", "type": "uint256", "internalType": "uint256" }, { "name": "amount1Min", "type": "uint256", "internalType": "uint256" }, { "name": "deadline", "type": "uint256", "internalType": "uint256" } ] } ] }, "contractInputsValues": { "params": "[\"501891\", \"15580280333655487507944\", \"0\", \"0\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"]" } }, { "to": "0xC36442b4a4522E871399CD717aBDD847Ab11FE88", "value": "0", "data": null, "contractMethod": { "name": "collect", "payable": true, "inputs": [ { "name": "params", "type": "tuple", "internalType": "struct INonfungiblePositionManager.CollectParams", "components": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" }, { "name": "recipient", "type": "address", "internalType": "address" }, { "name": "amount0Max", "type": "uint128", "internalType": "uint128" }, { "name": "amount1Max", "type": "uint128", "internalType": "uint128" } ] } ] }, "contractInputsValues": { "params": "[\"501891\", \"0x7951c7ef839e26F63DA87a42C9a87986507f1c07\", \"340282366920938463463374607431768211455\", \"340282366920938463463374607431768211455\"]" } } ] }


Should this proposal move to Snapshot
  • Yes
  • No
  • Abstain
0 voters

1 Like