Direct Indexer Payments (DIPS)

dips · Arbitrum

The DIPS contract stack on Arbitrum One: the Issuance Allocator, the Recurring Agreement Manager and the Recurring Collector, with a timeline view. Built to show when the agreement allocation stops being zero.

statusavailable
categoryGraph Protocol
tier0 · beachhead
complexitylow
discoveryfixed addresses

What it indexes

Each event becomes a decoded SQL table.

IssuanceDistributed, TargetAllocationUpdated, AgreementAdded, AgreementReconciled, AgreementRemoved, EscrowFunded, EscrowWithdrawn and the contracts’ admin events, 56 tables in all

The repository also carries an Arbitrum Sepolia manifest. Its sealed data is on the public mirror.

Run it yourself

The nest is a git repository: ABIs, views and a manifest. One command scaffolds a local copy, and nuthatch dev in it backfills and follows the chain against your own RPC.

nuthatch init --from https://github.com/nuthatch-org/dips-nest

Source: nuthatch-org/dips-nest.

Published data

We run this nest and publish its sealed segments to the public mirror, each stored under the hash of its contents. The figures are what the mirror listed on 2026-11-11, when this page was built; Play reads the mirror as it is now.

tables22
segments48
rows sealed140
sealed through block523,250,060
dataset9bd4bdc1c7a51ed7b4364e25c7502d8973ba2233e9189051c44934fa6768b81c
views from nuthatch-org/dips-nest at 0cf0ec2

Query it in your tab →

Authored views

The nest’s own SQL over its event tables, as published. Open one to read it.

dips_timeline, dips_current_allocationviews/10-dips-timeline.sql
views/10-dips-timeline.sql
-- Every governance move that has configured DIPS on Arbitrum One, one row each, in order.
--
-- The whole point of this nest is to see the switch flip. Right now the timeline ends at
-- "DefaultAllocation registered as a target, allocated zero", which is the last step before
-- indexing agreements start being funded. The row that changes that will appear here.
--
-- `rate_dec` is the *decimal companion* of a big-int column - comparing the raw text column
-- would sort "9" after "120730000000000000000".
CREATE VIEW dips_timeline AS
  SELECT block_number, block_timestamp, tx_hash,
         'issuance_rate_set'          AS step,
         'allocator issuance/block'   AS subject,
         newIssuancePerBlock_dec      AS rate_dec
    FROM "issuance_allocator__issuance_per_block_updated"
  UNION ALL
  SELECT block_number, block_timestamp, tx_hash,
         'target_allocation_set', target, newSelfMintingRate_dec
    FROM "issuance_allocator__target_allocation_updated"
  UNION ALL
  SELECT block_number, block_timestamp, tx_hash,
         'default_target_set', newAddress, NULL
    FROM "issuance_allocator__default_target_updated"
  UNION ALL
  SELECT block_number, block_timestamp, tx_hash,
         'agreement_manager_wired', newIssuanceAllocator, NULL
    FROM "recurring_agreement_manager__issuance_allocator_set"
  UNION ALL
  SELECT block_number, block_timestamp, tx_hash,
         'eligibility_oracle_set', newOracle, NULL
    FROM "recurring_agreement_manager__provider_eligibility_oracle_set"
  UNION ALL
  SELECT block_number, block_timestamp, tx_hash,
         'collector_pause_guardian_set', account, NULL
    FROM "recurring_collector__pause_guardian_set";

-- The single number everyone wants: how much issuance currently reaches indexing agreements.
-- Zero today. The day it is not zero, DIPS is live.
CREATE VIEW dips_current_allocation AS
  SELECT t.target,
         t.newSelfMintingRate_dec      AS self_minting_rate_dec,
         t.newAllocatorMintingRate_dec AS allocator_minting_rate_dec,
         t.block_number,
         t.block_timestamp
    FROM "issuance_allocator__target_allocation_updated" t
    JOIN (SELECT target AS tgt, max(block_number) AS bn
            FROM "issuance_allocator__target_allocation_updated"
           GROUP BY target) latest
      ON t.target = latest.tgt AND t.block_number = latest.bn;

Tables on the mirror

tablerowssegmentsfrom blockto block
issuance_allocator__issuance_self_mint_allowance 53 14 500,700,686 523,250,060
issuance_allocator__issuance_distributed 52 13 500,702,363 523,250,060
recurring_agreement_manager__role_admin_changed 6 1 486,895,281 499,214,220
recurring_agreement_manager__role_granted 5 1 486,895,281 499,214,220
issuance_allocator__role_admin_changed 3 1 486,895,281 499,214,220
issuance_allocator__role_granted 3 1 486,895,281 499,214,220
issuance_allocator__target_allocation_updated 3 2 486,895,281 500,702,362
issuance_allocator__admin_changed 1 1 486,895,281 499,214,220
issuance_allocator__default_target_updated 1 1 486,895,281 499,214,220
issuance_allocator__initialized 1 1 486,895,281 499,214,220
issuance_allocator__issuance_per_block_updated 1 1 486,895,281 499,214,220
issuance_allocator__role_revoked 1 1 486,895,281 499,214,220
issuance_allocator__upgraded 1 1 486,895,281 499,214,220
recurring_agreement_manager__admin_changed 1 1 486,895,281 499,214,220
recurring_agreement_manager__initialized 1 1 486,895,281 499,214,220
recurring_agreement_manager__issuance_allocator_set 1 1 486,895,281 499,214,220
recurring_agreement_manager__provider_eligibility_oracle_set 1 1 486,895,281 499,214,220
recurring_agreement_manager__role_revoked 1 1 486,895,281 499,214,220
recurring_agreement_manager__upgraded 1 1 486,895,281 499,214,220
recurring_collector__admin_changed 1 1 486,895,281 499,214,220
recurring_collector__pause_guardian_set 1 1 486,895,281 499,214,220
recurring_collector__upgraded 1 1 486,895,281 499,214,220