DAO:DFR Transfer the LP Position NFT to the DAO (DAO-Owned Liquidity)

Diornov

Mod
Staff member

How to hand your liquidity to the DAO — so nobody, including you, can pull it

To make a DAO's liquidity rug-proof, you transfer the Uniswap position NFT into the DAO's treasury (the timelock contract) with a normal safeTransferFrom. From that moment the liquidity is DAO-owned: collecting fees, adding or removing liquidity, or moving the position can only happen through an on-chain vote. In this guide I do exactly that with our real DFR/USDC position (NFT #188048), then record the whole thing in the DAO's books so anyone can follow the money.

This is the step that turns "trust me, I won't rug you" into something the contracts enforce for me.




Why this step matters more than it looks​


In the previous guide I created the DFR/USDC pool and got a position NFT — the token that represents ownership of that liquidity. But there was a problem hiding in plain sight: that NFT was sitting in my wallet. Which means, technically, I could have withdrawn all the liquidity whenever I wanted. That's the classic "rug pull," and no amount of me promising not to do it should make you comfortable.

So instead of promising, I remove my own ability to do it. I send the position NFT to the DAO's treasury — a timelock smart contract that can only act when a governance proposal passes. After the transfer:

  • I can't pull the liquidity. Nobody can, alone.
  • The only way the LP ever moves — to collect fees, deepen it, migrate it, or close it — is a community vote that passes quorum and clears the timelock delay.
  • "The founder can't rug the DAO" stops being a slogan and becomes a fact you can verify on-chain.

Before you start (prerequisites)​


  • A live pool and its position NFT in your wallet. If you haven't created the pool yet, start there: How to Create a Uniswap V4 Liquidity Pool.
  • Your DAO's treasury address — and a way to verify it (I'll show you). For DAOForum the treasury (DAOTimelock) is 0x27c58eeF1f6442b03864c67B08143a067Fa525E8.
  • The wallet holding the NFT. I used Rabby on my phone.
  • A little ETH on Arbitrum for gas. The transfer is one cheap transaction.

Step-by-step: send the position NFT to the DAO treasury​


  1. Find your treasury address — from a source you trust. I open our DAO on OpenBook (typed in myself, never a random link) and go to the Treasury tab. That's where the DAO's address lives.
  2. Verify it in the block explorer. I open that address on Arbiscan and confirm two things: the balance looks right (about 9,300,000 DFR in the treasury) and the contract name is DAOTimelock. Confirming the contract name matters — it proves you're sending to the real governance treasury and not a look-alike address.
    DAO Timelock contract in explorer
  3. Unhide the LP NFT in your wallet. In Rabby I open the full-screen extension, go to the NFT tab, and turn off the flag that hides LP NFTs (wallets often hide them by default). Now the Uniswap position NFT shows up.
    NFT Tab in Rabby Wallet Extension
  4. Send it to the treasury. Click Send on the NFT, paste the verified treasury address, and confirm. Because the recipient is a smart contract (the timelock), your wallet may ask you to adjust the gas/tick settings before it will let the transfer through — that's expected when sending an ERC-721 to a contract.
    Sending Uniswap V4 LP NFT via Rabby Wallet
  5. Verify it landed. Refresh the treasury on the explorer. You should see the incoming NFT transfer as the most recent transaction, matching the pool you created. Done — the liquidity now belongs to the DAO.
    Uniswap LP NFT in DAO Treasury

For DAOForum the on-chain proof is here: NFT transfer tx on Arbiscan →

Wait — is it safe to send an NFT to a contract? (Yes, here's why)​


A fair worry: send a token to the wrong kind of contract and it can be stuck forever. Two things make this safe:

  • The treasury can receive NFTs. Our timelock is built on OpenZeppelin's TimelockController, which implements onERC721Received — the standard "yes, I can accept ERC-721s" handshake. A safeTransferFrom into it succeeds cleanly. (The "safe" in safeTransferFrom is literally this check: it refuses to send to a contract that can't acknowledge the NFT.)
  • It's not a one-way trip. A timelock can execute any call after a proposal passes — including sending the NFT back out. So the DAO can later vote to move, migrate, or unwind the position. It's locked to governance, not locked forever.

The honest trade-off​


I want to be straight about the cost of doing this, because it's real: once the treasury holds the NFT, every LP action becomes a governance action. Collecting the 0.3% swap fees, topping up liquidity, narrowing the range, migrating to a new pool — all of it now needs a proposal, a vote, and a timelock delay. It's slower and less convenient than clicking buttons in my own wallet.

That's not a bug. That's the entire point. The inconvenience is the guarantee. I trade my personal convenience for a liquidity pool that no single person — me included — can ever quietly drain.

Then we write it down: recording it in the DAO's books​


Moving the NFT on-chain is only half the job. A DAO isn't a family business with balances scribbled in a notepad — it's a community structure, and asset movements should be transparent enough that anyone can follow them. So I record both events in OpenBook's double-entry ledger. (Important distinction: the ledger is off-chain accounting — a transparent bookkeeping layer. The on-chain transactions above are the source of truth; the ledger just makes them legible.)

Transaction 1 — pool creation (tokens become an LP position). The moment I deposited into Uniswap, I stopped owning "100,000 DFR + $500 USDC" and started owning one LP position. I book that position at its cost:

  • DFR side: 100,000 DFR × $0.005 = $500
  • USDC side: $500
  • Total cost basis = $1,000

So the entry debits account 1070 – LP Position (founder-custodied) by $1,000, and credits the two wallet accounts it came from: 1050 – LP Wallet DFR (100,000 DFR) and 1060 – LP Wallet USDC ($500). Here's the neat part: those lines balance even though 100,000 ≠ 500 in raw units, because OpenBook balances on US-dollar value, not token counts. Each line carries an exchange rate, so $500 + $500 = the $1,000 position. Clean.
OpenBook Ledger Record of NFT Transfer

Transaction 2 — custody moves to the DAO. Then I record the transfer itself: move the $1,000 from 1070 (founder-custodied) to a new account, 1075 – LP Position (treasury-held). Same currency, same value — the economics don't change, only who controls it does. After this, 1070 reads $0.00 and 1075 reads $1,000.00, with a note that the position is retrievable only by governance. I attach the Arbiscan link as proof.

You can see the live books here: DAOForum ledger →

Verify everything yourself​



Key takeaways​


  • DAO-owned liquidity means the position NFT lives in the DAO's timelock, not a personal wallet — so no one can pull the LP alone.
  • You move it with a standard safeTransferFrom; always verify the treasury address (right balance + DAOTimelock contract name) before sending.
  • Sending an NFT to the timelock is safe (it implements onERC721Received) and reversible by governance (a passed proposal can send it back out).
  • The trade-off: every LP action now requires a vote. That inconvenience is exactly what makes the liquidity rug-proof.
  • Record it in the DAO's off-chain ledger too: book the LP position at its $1,000 cost basis and move custody from account 1070 → 1075 for full transparency.

What's next​


With the pool live and the liquidity owned by the DAO, the anti-rug story is now airtight and fully on-chain. Next in the series I'll keep documenting the DAO's real operations — proposals, voting, and treasury moves — step by step. If you want to see how a community-owned treasury actually runs (or you're building your own), come follow along and ask questions at daoforum.org.




DAOForum build-in-public series
  1. Launch Your Own DAO for Free
  2. Register a DAO on OpenBook
  3. Create a DAO Proposal
  4. Vote on DAO Proposals
  5. Queue & Execute Proposals
  6. Record DAO Treasury Transfers
  7. Create a Uniswap V4 Liquidity Pool
  8. Transfer the LP Position to the DAO (you're here)

This is a real, on-chain case study of the DAOForum DAO itself. Not financial advice — an honest, verifiable walkthrough of how DeFi and DAO tooling actually work. If you're into blockchain and decentralized governance, come build with us at daoforum.org.
 
Last edited:
Back
Top