{"id":"ERC-2309","name":"ERC-721 Consecutive Transfer Extension","status":"Final","chain":"both","category":{"id":"nft","name":"NFT Capabilities","description":"What NFTs can do beyond basic ownership"},"journeyStages":[{"id":"executing","name":"Executing Transactions","description":"Performing on-chain actions"}],"uxImpact":"Batch minting/transfer events — efficiently create or move thousands of consecutive tokens in one transaction. Design implications: show batch mint/transfer notifications (e.g., 'Received tokens #1-1000'), handle large collection imports without individual events, efficient indexing of mass distributions. Design decisions: how to display large batch receipts without overwhelming, progress indicators for indexing large transfers, summarizing vs listing individual tokens.","hasDetailedContent":true,"content":{"id":"ERC-2309","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-2309","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Batch minting/transfer events — efficiently create or move thousands of consecutive tokens in one transaction.","designerTakeaways":["You can collapse consecutive mints into one Received #1–1000 activity row with expand option.","Your import progress can show Indexing 847 of 1000 tokens during large batch processing.","You can offer summary-first gallery with expand to id list for power users."],"applicability":{"whenToUse":["Mass airdrops or batch mints use consecutive ids.","Activity feed would choke on individual events.","Indexer supports range expansion."],"whenToAvoid":["Single NFT mints with no batch events.","Non-consecutive token ids in batch.","Users need immediate per-id detail without indexing wait."]},"prototypeFirst":[{"screen":"Batch receipt notification","why":"First touch after airdrop sets expectations.","covers":["Range summary","Expand ids"],"include":["You received #1–1000","Collection name","View collection CTA"]},{"screen":"Indexing progress","why":"Large batches take time to appear in gallery.","covers":["Indexing","Complete","Partial failure"],"include":["Progress bar","Count label","Retry indexing"]},{"screen":"Activity feed aggregation","why":"Feed readability for whale airdrops.","covers":["Collapsed batch","Expanded id list"],"include":["Summary row","Expand chevron","Max expand limit"]},{"screen":"Collection grid after batch","why":"Gallery must load performantly.","covers":["Virtualized grid","Representative thumbnails"],"include":["Lazy load","Sample preview strip","View all"]}],"mentalModel":[{"label":"Consecutive range","description":"Tokens #start–#end moved in one on-chain event."},{"label":"Batch event","description":"One log line represents many tokens — UI summarizes."},{"label":"Indexer expansion","description":"Backend expands range into individual holdings asynchronously."},{"label":"Summary vs detail","description":"Default summary; expand for id list when needed."},{"label":"Airdrop receipt","description":"User cares they got the drop, not 1000 duplicate lines."}],"statesToDesign":[{"state":"Batch received — indexing","trigger":"Event seen, gallery loading.","userNeed":"Know tokens are coming.","designResponse":"Indexing N tokens progress indicator."},{"state":"Batch complete in gallery","trigger":"Indexer finished.","userNeed":"Browse collection.","designResponse":"Full grid with count badge on collection."},{"state":"Activity feed collapsed","trigger":"Default view.","userNeed":"Scan history quickly.","designResponse":"Single batch row with range."},{"state":"Expanded id list","trigger":"User expands batch row.","userNeed":"Find specific id.","designResponse":"Paginated id list or search within range."},{"state":"Partial index failure","trigger":"Indexer timeout.","userNeed":"Recover without panic.","designResponse":"Retry indexing with support link."}],"designDecisions":[{"question":"Summary or list by default?","recommendation":"Summary in feed; full grid in collection view.","rationale":"Feed chokes on thousands of rows."},{"question":"How many ids in expand?","recommendation":"Paginate at 50; offer search by id.","rationale":"Rendering 1000 rows crashes mobile."},{"question":"Notification for batch?","recommendation":"One push: You received 1000 [Collection] tokens.","rationale":"1000 pushes would spam."}],"problemsSolved":[{"problem":"Activity feed unusable after airdrop","oldWay":"1000 identical transfer lines","newWay":"Single batch summary row","impact":"high"},{"problem":"Slow gallery after mass mint","oldWay":"UI freezes loading all items","newWay":"Progressive indexing with progress UI","impact":"high"},{"problem":"Users miss airdrop happened","oldWay":"Buried in noise or invisible","newWay":"Clear batch receipt notification","impact":"medium"}],"uxPatterns":[{"name":"Batch Activity Summary","description":"Collapsed range row in transaction history.","mockup":"concept/nft-gallery","components":["BatchRow","RangeLabel","ExpandToggle"],"userFlow":["Airdrop lands","Feed shows one row","User expands optional","Ids paginate"]},{"name":"Collection Index Progress","description":"Progress while indexer expands token range.","mockup":"concept/tx-status","components":["ProgressBar","CountLabel","RetryButton"],"userFlow":["Batch detected","Progress shown","Grid populates","Complete state"]}],"seenInTheWild":[{"app":"OpenSea","url":"https://opensea.io/","note":"Large collection import and activity aggregation patterns."},{"app":"Blur","url":"https://blur.io/","note":"Batch bid and airdrop UX for high-volume collections."},{"app":"Etherscan","url":"https://etherscan.io/","note":"Batch transfer event display on explorer."}],"antiPatterns":[{"pattern":"1000 separate activity notifications","why":"UI freeze and notification spam","instead":"Single batch summary with optional expand","severity":"critical"},{"pattern":"Empty gallery during indexing with no progress","why":"Users think airdrop failed","instead":"Indexing N tokens progress bar","severity":"high"},{"pattern":"Rendering full id list on mobile expand","why":"Browser crash","instead":"Paginated expand with search","severity":"high"}],"vocabulary":[{"use":"Received 500 tokens","avoid":"ConsecutiveTransfer event id 1-500","why":"Outcome not event name."},{"use":"Loading your collection","avoid":"Indexer expanding range","why":"User-facing wait copy."},{"use":"Show token IDs","avoid":"Expand batch mint log","why":"Power user optional action."}],"onMonad":[{"aspect":"Batch mint throughput","ethereum":"Large drops congest indexers","monad":"High TPS enables faster batch indexing","designImplication":"Shorter indexing progress on Monad airdrops."},{"aspect":"Activity volume","ethereum":"Feed lag on big batches","monad":"Fast blocks still need UI aggregation","designImplication":"Always summarize batches regardless of chain speed."}],"technicalNotes":"ERC-2309 consecutive events require indexer range expansion; never render unbounded id lists.","relatedStandards":[{"id":"ERC-721","relationship":"Consecutive transfer extension for ERC-721"},{"id":"ERC-1155","relationship":"Batch transfers in multi-token standard"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-2309","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-2309","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-2309","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-2309","markdown":"https://www.eipsfordesigners.com/standards/ERC-2309/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-2309/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-2309","official":"https://eips.ethereum.org/EIPS/erc-2309","discussion":"https://ethereum-magicians.org/search?q=ERC-2309"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}