Nests · Graph Protocol
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.
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.
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
-- 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
| table | rows | segments | from block | to 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 |