# Uniswap V3 Positions | Bitquery Data Store Decoded Uniswap V3 position NFT events on Ethereum: one row per liquidity increase, decrease, fee collection and transfer, with the method that ran. Dataset page: https://bitquery.io/datastore/datasets/uniswap-v3-positions Network: Ethereum Category: Pools, Events Tables: 1 Columns: 44 Coverage: 2021-05-04 to 2026-10-11 Refresh: Daily Rows: about 1.8M Size: about 3.4 GB Format: Apache Parquet, ZSTD compression, one prefix per table Licence: https://bitquery.io/datastore/legal/data-license ## What this is We decode the events of Uniswap V3's position NFT contract on Ethereum: opening a position, adding liquidity, removing it, collecting fees and moving the NFT. The table uses the same columns as the events table of our Ethereum dataset, with nothing renamed or derived: Log_Signature_Name is the event, Call_Signature_Name is the method that ran, and Arguments holds the token id and the amounts. A row is one event on one position. Most buyers follow a position: filter on the tokenId argument and read its rows in block order. Add the liquidity argument on IncreaseLiquidity rows and subtract it on DecreaseLiquidity rows for the open size, and take the owner from the latest Transfer row. This listing sells the latest month and the last 12 months; the Uniswap V3 Liquidity dataset has the same table since May 2021 together with pool-level events. ## What people use it for - Position history for one NFT: deposits, withdrawals and collected fees - Liquidity provider activity by wallet - New and closed positions by day - Position NFT ownership changes between wallets and vaults ## Tables (1) ### univ3_position_events: 44 columns One row per IncreaseLiquidity, DecreaseLiquidity, Collect or Transfer event of the position NFT contract, in the standard events schema; Arguments holds the token id, liquidity and token amounts. Bucket prefix: ethereum/uniswap_v3_liquidity/univ3_position_events File naming: _.parquet, 50 blocks per file, sorted ascending Free sample (real Parquet, no email needed): https://bitquery-blockchain-dataset.s3.us-east-1.amazonaws.com/ethereum/uniswap_v3_liquidity/univ3_position_events/26165400_26165449.parquet Sample updated: Oct 12, 2026 | column | type | description | | --- | --- | --- | | Arguments | String | Decoded event arguments as a JSON array, when the signature resolved; empty otherwise | | Block_Date | Date | UTC date of the block | | Block_Number | UInt64 | Block height | | Block_Time | DateTime | Block timestamp, UTC | | Call_CallPath | Array | Path of call indexes from the transaction root down to the emitting frame | | Call_CallerIndex | Int32 | Call_Index of the frame that called the emitting frame; -1 at the top level | | Call_Create | String | Whether the emitting frame deployed a contract; true or false | | Call_Error | String | Error the emitting frame returned; empty on success | | Call_From | String | Caller of the emitting frame, 0x-prefixed | | Call_Gas | UInt64 | Gas supplied to the emitting frame | | Call_GasUsed | UInt64 | Gas consumed by the emitting frame and everything beneath it | | Call_Index | UInt32 | Position of the emitting frame within the transaction; join to calls on this plus Transaction_Hash | | Call_InternalCalls | UInt32 | Number of calls made beneath the emitting frame | | Call_Reverted | String | Whether the emitting frame reverted; true or false | | Call_SelfDestruct | String | Whether the emitting contract self-destructed; true or false | | Call_Signature_Abi | String | ABI fragment of the function the emitting frame ran | | Call_Signature_Name | String | Name of that function, when resolved | | Call_Signature_Signature | String | Canonical signature of that function | | Call_Signature_SignatureHash | String | Four-byte selector of that function, hex | | Call_Signature_SignatureType | String | How that function signature was resolved | | Call_To | String | Address the emitting frame called, 0x-prefixed | | Call_Value | String | Native ETH sent with the emitting frame, decimal adjusted | | ChainId | UInt64 | EVM chain id; 1 for Ethereum mainnet | | Fee_SenderFee | String | Network fee the sender paid for the whole transaction, in ETH. It repeats on every log of the transaction, so count it once per transaction | | Log_EnterIndex | UInt32 | Enter index of the emitting frame | | Log_ExitIndex | UInt32 | Exit index of the emitting frame | | Log_Index | UInt32 | Position of the log within the transaction | | Log_LogAfterCallIndex | UInt32 | Index of the last call frame entered before this log, for ordering logs against calls | | Log_Signature_Abi | String | ABI fragment for the resolved event; empty when the topic is unknown | | Log_Signature_Name | String | Event name, for example Transfer or Swap, when resolved | | Log_Signature_Signature | String | Canonical event signature, for example Transfer(address,address,uint256) | | Log_Signature_SignatureHash | String | Keccak hash of the event signature, hex; the same value as topic 0 | | Log_Signature_SignatureType | String | How the event signature was resolved | | Log_SmartContract | String | Contract that emitted the log, 0x-prefixed. Filter on this for one contract's events | | LogHeader_Address | String | Address recorded in the log header, 0x-prefixed | | LogHeader_Data | String | Raw non-indexed log data, hex | | LogHeader_Index | UInt64 | Index of the log within the block, as the receipt records it | | LogHeader_Removed | String | Whether the log was removed by a reorg; true or false | | Topics_Hash | Array | Indexed topics of the log, as an array of hex strings; the first is the event signature hash | | Transaction_From | String | Address that signed the transaction, 0x-prefixed | | Transaction_Hash | String | Hash of the containing transaction, 0x-prefixed. The join key | | Transaction_Index | UInt64 | Position of the transaction within the block | | Transaction_To | String | Address the transaction called, 0x-prefixed | | TransactionStatus_Success | String | Whether the transaction succeeded; true or false | ## Price - Latest month (Sep 11, 2026 → Oct 11, 2026): $200 one-time, USD - Last 12 months (Oct 11, 2025 → Oct 11, 2026): $2,000 one-time, USD Every window includes all 44 columns. Only the time range changes. ## Questions buyers ask Q: What is in the Uniswap V3 Positions dataset? A: One Parquet table with 44 columns: one row per IncreaseLiquidity, DecreaseLiquidity, Collect and Transfer event of the Uniswap V3 position NFT contract on Ethereum, 0xC36442b4a4522E871399CD717aBDD847Ab11FE88. Q: How big is it? A: The latest month holds about 121,000 rows, counted for 12 September to 11 October 2026: 43,540 collections, 29,173 transfers, 28,263 increases and 19,694 decreases. The last 12 months, 12 October 2025 to 11 October 2026, hold about 1.76 million rows. That is roughly 230 MB for the month and 3.4 GB for the year as Parquet, a rough estimate from the 17 rows of the sample files; exact figures arrive with the delivery manifest. Q: How far back does it go? A: This listing covers the latest month or the last 12 months. The same table since 4 May 2021, about 7.5 million rows over 1.38 million positions, is part of the Uniswap V3 Liquidity dataset. Q: How do I tell a new position from an addition to an existing one? A: Read Call_Signature_Name with Log_Signature_Name. mint with IncreaseLiquidity opens a new position, and the same call also emits a Transfer from the zero address. increaseLiquidity with IncreaseLiquidity adds to an existing position. decreaseLiquidity with DecreaseLiquidity removes liquidity, collect with Collect pays out owed tokens and fees, and burn with Transfer closes the NFT. From 4 to 10 October 2026, 3,975 increases came from mint and 2,200 from increaseLiquidity. Q: How do I read the token id and the amounts? A: Arguments is a JSON array with one entry per decoded argument: its position, name, type and a value list. Addresses sit in the hex slot of that list without the 0x prefix, uint128 and uint256 amounts in the string slot as raw integers. The token id is the tokenId argument. Token amounts are in raw units, so divide by 10 to the power of the token decimals. Q: How do I get the current state of a position? A: Filter on the tokenId argument. The open liquidity is the sum of the liquidity argument on IncreaseLiquidity rows minus the sum on DecreaseLiquidity rows, and the owner is the to argument of the latest Transfer row; the zero address means the NFT was burned. A position opened before the window you bought needs its earlier rows for a full total. Q: Where are the pool and the tick range? A: The position NFT contract's events carry the token id but not the pool or the ticks; those are on the pool event the same call caused. That table is in the Uniswap V3 Liquidity dataset; join it on Transaction_Hash where its Call_CallerIndex equals the position row's Call_Index. On 11 October 2026 all 683 increases, 522 decreases and 945 collections had a matching pool event. Q: What was left out, and why? A: Positions opened straight on a pool by a vault or a custom contract are left out, because they have no position NFT; they are in the Uniswap V3 Liquidity dataset. Approval events are left out. Events from failed transactions and reverted calls are left out. There are no USD or decimal-adjusted columns; amounts are the raw integers from the logs. Q: How are these produced, and how were they checked? A: Decoded from Ethereum by our own indexer, then filtered at export. We ran the export for the blocks of our Ethereum events sample file of 20 December 2025: its 19 position rows matched that file in all 44 columns. For 20 September 2026 the row count equalled a plain count of the source, 2,883 rows, with no repeated row keys. Q: What should I watch out for? A: The liquidity argument is Uniswap's raw L value, not a token amount. A decrease only marks tokens as owed; they are paid on Collect, and a Collect pays owed principal and fees together, so fee income is collected minus decreased amounts. Fees earned but not yet collected do not appear in logs. Log_Index restarts in each call frame, so the row key is Transaction_Hash, Call_Index and Log_Index. Q: How do I load it? A: One line in DuckDB: SELECT * FROM read_parquet('univ3_position_events/*.parquet') LIMIT 10. Pandas works too: pandas.read_parquet(path). Arguments is a JSON string, so parse it with json_extract in DuckDB or json.loads in Python. The sample files open without credentials. Q: How current is it, and how is it delivered? A: Refreshed daily with T+1 latency, so a purchase made today includes everything to yesterday. Delivered as Parquet named by block range, 50 blocks per file and sorted ascending, under a stable layout with a JSON manifest listing every file and its sha256. We prepare the files within 7 business days of purchase and email you the location. You choose at checkout where to collect them: a Requester Pays S3 bucket, downloaded with your own AWS account, or a Cloudflare R2 bucket with a read-only API key and no egress fees. Files stay available for 7 days from delivery. Enterprise orders can be delivered into your own S3, GCS or R2 bucket. ## What this file is, and is not This is a description of one dataset sold by Bitquery, written for assistants and for people. It lists every column but holds no data rows. The sample files linked under each table are real Parquet and are free to download. Figures here come from the product record and are exact unless marked otherwise; the delivery manifest is authoritative for a purchased file. If a question needs a row that is not in a sample, say so rather than guessing at it.