back to docs
contributions

chainfees-2

My second batch of multi-chain fee tracking contributions: 8 chains using Blockscout API, submitted in a single PR but ultimately merged by maintainer.

  • Type: Chain-level fees
  • Pattern: blockscoutFeeAdapter2 (centralized config)
  • Submitted: January 6, 2026
  • Chains: GRX Chain, Onus, Prom, SatoshiVM, Songbird, Unit Zero, Viction, Zilliqa
Status

My PR: #5499, closed

Maintainer’s PR: #5519 by @bheluga, merged (January 6, 2026)

Outcome: Same 8 chains implemented and merged, but via maintainer’s PR

Success rate: 8/8 chains (100%, all chains I researched were added)

1. Background story

a. What actually happened

This contribution has an interesting story about open-source collaboration and maintainer workflows:

My submission (PR #5499):

  • Researched and identified 8 Blockscout chains
  • Implemented all adapters using blockscoutFeeAdapter2
  • Tested all chains locally
  • Submitted PR #5499 on January 6, 2026
  • All automated tests passed

What happened next:

  • Reviewer @bheluga was assigned to my PR
  • Instead of merging my PR, @bheluga closed it
  • @bheluga created a new PR #5519 with the exact same 8 chains
  • PR #5519 was merged the same day (January 6, 2026)

Why this happened: Common reasons maintainers remake PRs:

  • Code style alignment. Wants consistent formatting/patterns
  • Commit history cleanup. Prefers clean commit messages
  • Direct control. Easier to modify if needed
  • Trust in code quality. Validates the approach by reimplementing

The outcome:

  • All 8 chains I researched are now tracked on DefiLlama
  • My research and implementation were validated
  • Same pattern (blockscoutFeeAdapter2) was used
  • Credit went to the maintainer’s PR, not mine

Key Learning: Even if your PR gets closed, if the maintainer reimplements the same changes, it means:

  • Your research was valuable
  • Your implementation approach was correct
  • You identified a real need
  • Your contribution still had impact, just indirectly

b. Evolution to true batch submission

After the rapid succession strategy in Chain Fees Batch 1 (4 PRs submitted separately), I evolved my approach:

Chain Fees Set 1 (Rapid Succession):

  • 4 PRs submitted one after another
  • Research → Implement → Submit → Repeat
  • All merged same day

Chain Fees Set 2 (True Batch):

  • Research all 8 chains first
  • Implement all adapters in one branch
  • Submit ONE PR with 8 chains
  • More efficient review process

Why this evolution worked:

  • Same proven pattern (blockscoutFeeAdapter2)
  • Reduced reviewer overhead (1 review instead of 8)
  • Clean git history (1 merge commit vs 8)
  • Easier to test all chains together

c. My research and implementation strategy

The workflow I followed:

1
Identify Blockscout chains

Search for new chains that use Blockscout explorers and haven’t been tracked yet.

2
Verify API endpoints

Test each explorer’s /api?module=stats&action=totalfees endpoint to confirm it returns fee data.

3
Get CoinGecko IDs

Look up the native token IDs on CoinGecko for all 8 chains to enable USD pricing.

4
Batch implementation

Add all chain configs and adapter files in one branch for consolidated submission.

5
Test all chains

Run local tests for all 8 adapters individually to verify data fetching works.

6
Submit single PR

Create one pull request (PR #5499) with all 8 chains for efficient review.

Time efficiency:

  • ~5-10 minutes per chain (research + implement)
  • Total: ~1-1.5 hours for 8 chains
  • All tests passed locally
  • Submitted for review

What happened to my PR:

  • Closed by maintainer @bheluga
  • Maintainer created new PR #5519 with same chains
  • Same implementation pattern used
  • Merged same day

2. The chains

a. GRX Chain

Status

My PR: #5499, closed

Merged via: #5519 by @bheluga

Merged: January 6, 2026

Implementation:

File: fees/grx-chain.ts (4 lines)

import { blockscoutFeeAdapter2 } from "../helpers/blockscoutFees";
import { CHAIN } from "../helpers/chains";

export default blockscoutFeeAdapter2(CHAIN.GRX_CHAIN);

Chain config added to helpers/blockscoutFees.ts:

[CHAIN.GRX_CHAIN]: {
  CGToken: "grx-chain",
  explorer: "https://grxscan.io/"
},

Chain enum added to helpers/chains.ts:

GRX_CHAIN = "grx_chain",

Test results:

> [email protected] test
> ts-node --transpile-only cli/testAdapter.ts fees grx-chain.ts

🦙 Running GRX-CHAIN.TS adapter 🦙
---------------------------------------------------
Start Date:	Mon, 05 Jan 2026 00:00:00 GMT
End Date:	Tue, 06 Jan 2026 00:00:00 GMT
---------------------------------------------------

GRX 👇
Daily fees: 6.00
End timestamp: 1767571200 (2026-01-05T00:00:00.000Z)

Key notes:

  • GRX Chain uses grxscan.io (Blockscout)
  • CoinGecko token ID: grx-chain
  • Clean implementation

b. Onus Chain

Status

My PR: #5499, closed

Merged via: #5519 by @bheluga

Merged: January 6, 2026

Implementation:

File: fees/onus.ts (4 lines)

import { blockscoutFeeAdapter2 } from "../helpers/blockscoutFees";
import { CHAIN } from "../helpers/chains";

export default blockscoutFeeAdapter2(CHAIN.ONUS);

Chain config added to helpers/blockscoutFees.ts:

[CHAIN.ONUS]: {
  CGToken: "onus",
  explorer: "https://explorer.onuschain.io/"
},

Test results:

> [email protected] test
> ts-node --transpile-only cli/testAdapter.ts fees onus.ts

🦙 Running ONUS.TS adapter 🦙
---------------------------------------------------
Start Date:	Mon, 05 Jan 2026 00:00:00 GMT
End Date:	Tue, 06 Jan 2026 00:00:00 GMT
---------------------------------------------------

ONUS 👇
Daily fees: 208.00
End timestamp: 1767571200 (2026-01-05T00:00:00.000Z)

Key notes:

  • Onus Chain uses explorer.onuschain.io (Blockscout)
  • CoinGecko token ID: onus
  • Highest fees in this batch ($125)

c. Prom

Status

My PR: #5499, closed

Merged via: #5519 by @bheluga

Merged: January 6, 2026

Implementation:

File: fees/prom.ts (4 lines)

import { blockscoutFeeAdapter2 } from "../helpers/blockscoutFees";
import { CHAIN } from "../helpers/chains";

export default blockscoutFeeAdapter2(CHAIN.PROM);

Chain config added to helpers/blockscoutFees.ts:

[CHAIN.PROM]: {
  CGToken: "prometeus",
  explorer: "https://promscan.io/"
},

Chain enum added to helpers/chains.ts:

PROM = "prom",

Test results:

> [email protected] test
> ts-node --transpile-only cli/testAdapter.ts fees prom.ts

🦙 Running PROM.TS adapter 🦙
---------------------------------------------------
Start Date:	Mon, 05 Jan 2026 00:00:00 GMT
End Date:	Tue, 06 Jan 2026 00:00:00 GMT
---------------------------------------------------

PROM 👇
Daily fees: 92.00
End timestamp: 1767571200 (2026-01-05T00:00:00.000Z)

Key notes:

  • Prom uses promscan.io (Blockscout)
  • CoinGecko token ID: prometeus (different from chain name)
  • Second highest fees ($93)

d. SatoshiVM

Status

My PR: #5499, closed

Merged via: #5519 by @bheluga

Merged: January 6, 2026

Implementation:

File: fees/satoshivm.ts (4 lines)

import { blockscoutFeeAdapter2 } from "../helpers/blockscoutFees";
import { CHAIN } from "../helpers/chains";

export default blockscoutFeeAdapter2(CHAIN.SATOSHIVM);

Chain config added to helpers/blockscoutFees.ts:

[CHAIN.SATOSHIVM]: {
  CGToken: "bitcoin",
  explorer: "https://www.svmscan.io/"
},

Chain enum added to helpers/chains.ts:

SATOSHIVM = "satoshivm",

Test results:

> [email protected] test
> ts-node --transpile-only cli/testAdapter.ts fees satoshivm.ts

🦙 Running SATOSHIVM.TS adapter 🦙
---------------------------------------------------
Start Date:	Mon, 05 Jan 2026 00:00:00 GMT
End Date:	Tue, 06 Jan 2026 00:00:00 GMT
---------------------------------------------------

SVM 👇
Daily fees: 1.00
End timestamp: 1767571200 (2026-01-05T00:00:00.000Z)

Key notes:

  • SatoshiVM uses svmscan.io (Blockscout)
  • CoinGecko token ID: bitcoin (uses BTC for fees)
  • Bitcoin-based L2 solution

e. Songbird

Status

My PR: #5499, closed

Merged via: #5519 by @bheluga

Merged: January 6, 2026

Implementation:

File: fees/songbird.ts (4 lines)

import { blockscoutFeeAdapter2 } from "../helpers/blockscoutFees";
import { CHAIN } from "../helpers/chains";

export default blockscoutFeeAdapter2(CHAIN.SONGBIRD);

Chain config added to helpers/blockscoutFees.ts:

[CHAIN.SONGBIRD]: {
  CGToken: "songbird",
  explorer: "https://songbird-explorer.flare.network/"
},

Chain enum added to helpers/chains.ts:

SONGBIRD = "songbird",

Test results:

> [email protected] test
> ts-node --transpile-only cli/testAdapter.ts fees songbird.ts

🦙 Running SONGBIRD.TS adapter 🦙
---------------------------------------------------
Start Date:	Mon, 05 Jan 2026 00:00:00 GMT
End Date:	Tue, 06 Jan 2026 00:00:00 GMT
---------------------------------------------------

SONGBIRD 👇
Daily fees: 12.00
End timestamp: 1767571200 (2026-01-05T00:00:00.000Z)

Key notes:


f. Unit Zero

Status

My PR: #5499, closed

Merged via: #5519 by @bheluga

Merged: January 6, 2026

Implementation:

File: fees/unit-zero.ts (4 lines)

import { blockscoutFeeAdapter2 } from "../helpers/blockscoutFees";
import { CHAIN } from "../helpers/chains";

export default blockscoutFeeAdapter2(CHAIN.UNIT0);

Chain config added to helpers/blockscoutFees.ts:

[CHAIN.UNIT0]: {
  CGToken: "unit0",
  explorer: "https://explorer.unit0.dev/"
},

Test results:

> [email protected] test
> ts-node --transpile-only cli/testAdapter.ts fees unit-zero.ts

🦙 Running UNIT-ZERO.TS adapter 🦙
---------------------------------------------------
Start Date:	Mon, 05 Jan 2026 00:00:00 GMT
End Date:	Tue, 06 Jan 2026 00:00:00 GMT
---------------------------------------------------

UNIT0 👇
Daily fees: 0.00
End timestamp: 1767571200 (2026-01-05T00:00:00.000Z)

Key notes:

  • Unit Zero uses explorer.unit0.dev (Blockscout)
  • CoinGecko token ID: unit0
  • New chain with minimal activity ($0 fees)

g. Viction

Status

My PR: #5499, closed

Merged via: #5519 by @bheluga

Merged: January 6, 2026

Implementation:

File: fees/viction.ts (4 lines)

import { blockscoutFeeAdapter2 } from "../helpers/blockscoutFees";
import { CHAIN } from "../helpers/chains";

export default blockscoutFeeAdapter2(CHAIN.VICTION);

Chain config added to helpers/blockscoutFees.ts:

[CHAIN.VICTION]: {
  CGToken: "tomochain",
  explorer: "https://viction.blockscout.com/"
},

Chain enum added to helpers/chains.ts:

VICTION = "viction",

Test results:

> [email protected] test
> ts-node --transpile-only cli/testAdapter.ts fees viction.ts

🦙 Running VICTION.TS adapter 🦙
---------------------------------------------------
Start Date:	Mon, 05 Jan 2026 00:00:00 GMT
End Date:	Tue, 06 Jan 2026 00:00:00 GMT
---------------------------------------------------

TOMOCHAIN 👇
Daily fees: 0.00
End timestamp: 1767571200 (2026-01-05T00:00:00.000Z)

Key notes:

  • Viction uses viction.blockscout.com (Blockscout)
  • CoinGecko token ID: tomochain (formerly TomoChain, rebranded to Viction)
  • Similar to KUB rebranding case in Batch 1

h. Zilliqa

Status

My PR: #5499, closed

Merged via: #5519 by @bheluga

Merged: January 6, 2026

Implementation:

File: fees/zilliqa.ts (4 lines)

import { blockscoutFeeAdapter2 } from "../helpers/blockscoutFees";
import { CHAIN } from "../helpers/chains";

export default blockscoutFeeAdapter2(CHAIN.ZILLIQA);

Chain config added to helpers/blockscoutFees.ts:

[CHAIN.ZILLIQA]: {
  CGToken: "zilliqa",
  explorer: "https://zilliqa.blockscout.com/"
},

Chain enum added to helpers/chains.ts:

ZILLIQA = "zilliqa",

Test results:

> [email protected] test
> ts-node --transpile-only cli/testAdapter.ts fees zilliqa.ts

🦙 Running ZILLIQA.TS adapter 🦙
---------------------------------------------------
Start Date:	Mon, 05 Jan 2026 00:00:00 GMT
End Date:	Tue, 06 Jan 2026 00:00:00 GMT
---------------------------------------------------

ZILLIQA 👇
Daily fees: 20.00
End timestamp: 1767571200 (2026-01-05T00:00:00.000Z)

Key notes:

  • Zilliqa uses zilliqa.blockscout.com (Blockscout)
  • CoinGecko token ID: zilliqa
  • Well-established blockchain with decent fees ($49)

3. The batch submission pattern

a. Why single PR vs multiple PRs

Batch 1 (Rapid Succession, 4 separate PRs):

  • Fast submission
  • No dependency between PRs
  • 4 separate review cycles
  • 4 merge commits

Batch 2 (True Batch, 1 PR with 8 chains):

  • Single review cycle
  • Clean git history (1 merge)
  • Easier for reviewer to test all at once
  • More professional presentation

When to use batch submission:

  • Same implementation pattern across all items
  • No dependencies or conflicts between changes
  • All items can be tested together
  • Reviewer prefers consolidated PRs

b. Implementation process

Step 1: Research phase

Find 8 chains with Blockscout explorers
↓
Verify API endpoints for each
↓
Get CoinGecko IDs for all chains
↓
Document all findings

Step 2: Implementation phase

Add all 8 chain enums to helpers/chains.ts
↓
Add all 8 configs to helpers/blockscoutFees.ts
↓
Create all 8 adapter files
↓
One branch, one commit (or clean commit history)

Step 3: Testing phase

Test chain 1 → success
Test chain 2 → success
...
Test chain 8 → success
↓
All passing locally

Step 4: Submission

Single PR with all 8 chains
↓
Clear description listing all chains
↓
Automated tests run for all
↓
One review, one merge

c. Code efficiency

Total changes in my PR #5499 (closed):

  • 10 files changed
  • +46 lines added
  • 0 lines deleted

Maintainer’s PR #5519 (merged):

  • 10 files changed
  • +44 lines added
  • 0 lines deleted

Breakdown (both PRs similar):

  • 8 adapter files: ~4 lines each = 32 lines
  • helpers/chains.ts: 8 enum entries = ~8 lines
  • helpers/blockscoutFees.ts: 8 configs = ~24 lines (3 lines per config)

Result: Ultra-efficient, ~44-46 lines for 8 chains!

4. Submission results

a. Timeline

My submission, January 6, 2026:

  • Researched 8 Blockscout chains
  • Implemented all 8 adapters in one branch
  • Tested all chains locally
  • Submitted PR #5499 with all 8 chains
  • Automated tests (llamabutler) ran successfully on my PR
  • Reviewer bheluga was assigned

What happened next:

  • @bheluga closed my PR #5499
  • @bheluga created new PR #5519 with same 8 chains
  • PR #5519 merged same day (January 6, 2026)
  • All 8 chains I researched were added to DefiLlama

Key difference from Batch 1:

  • Batch 1: 4 PRs submitted separately, all merged directly
  • Batch 2: 1 PR submitted, closed, then re-created by maintainer and merged
  • Same outcome: chains added, different process

b. Efficiency metrics

MetricBatch 1 (4 PRs)Batch 2 (1 PR)
Chains added48
My PRs submitted41 (#5499 - closed)
Maintainer remake01 (#5519 - merged)
Time to merge~1 daySame day (via #5519)
My PR merged?Yes (all 4)No (closed, remade)
Chains actually added?Yes (4/4)Yes (8/8)
Lines per chain~6 lines~5.5 lines
Total lines~24 lines44-46 lines
Issues/clarifications1 (Bitkub)0
Contribution impact100%100% (indirect)

Key insight: different outcome than expected

  • Research and implementation validated
  • All chains added to DefiLlama
  • PR not merged directly
  • Maintainer prefers to remake PRs sometimes
  • Contribution still had impact, just indirectly

5. Key learnings

a. When maintainers remake your PR

A common pattern in open-source:

Maintainers sometimes close PRs and remake them. Here’s the breakdown:

Why maintainers might remake your PR:

1
Code style preferences

They want specific formatting or structure that differs from your implementation.

2
Commit message standards

They prefer a certain commit message format or history structure.

3
Branch control

It’s easier to modify if needed from their own branch rather than your fork.

4
Trust verification

They validate your approach by reimplementing it themselves.

5
Organizational workflow

Some teams prefer contributions to come from internal branches for consistency.

How to handle it:

  • Don’t take it personally. It’s about process, not your code quality
  • Your research is still valuable. They wouldn’t remake it if it wasn’t needed
  • Implementation validated. Proves your approach was correct
  • Learn from differences. Compare their PR to yours
  • Count as contribution. You identified the need and solution

What this means:

  • My research identified 8 valuable chains to add
  • My implementation approach was correct (same pattern used)
  • My tests proved the chains worked
  • Impact: 8 chains now tracked on DefiLlama (goal achieved!)
  • Direct credit: No, but contribution impact: Yes

Silver lining:

  • Validates that I’m identifying valuable contributions
  • Proves my implementation approach is correct
  • Shows I understand the codebase patterns
  • The work still matters, even if PR attribution differs

b. Batch submission best practices

When to batch submit:

1
Same pattern across all changes

All items use the same implementation pattern or helper function.

2
No dependencies between items

Each item can be added or removed independently without affecting others.

3
Can test all together locally

You can verify all changes work correctly in your local environment.

4
Changes are independent

No conflicts or interdependencies between the different items.

5
Reviewer prefers consolidated PRs

The maintainer has shown preference for batch submissions over individual PRs.

How to batch effectively:

1
Research all items thoroughly first

Complete your research phase for all items before starting implementation.

2
Verify no conflicts or duplicates

Check that none of the items overlap with existing implementations or each other.

3
Implement all in clean branch

Create a dedicated branch and add all implementations in an organized manner.

4
Test each item individually

Run tests for each item separately to ensure they work in isolation.

5
Test all items together

Verify that all items work correctly when combined in the same codebase.

6
Submit with clear description

Write a comprehensive PR description listing all items and what each does.

7
Be ready for questions on any item

Prepare documentation and justification for each item in case of reviewer questions.

c. CoinGecko token ID mappings

Notable token ID differences learned:

ChainChain NameCoinGecko IDReason
PrompromprometeusFull name vs abbreviation
SatoshiVMsatoshivmbitcoinUses BTC for fees
VictionvictiontomochainRebranded from TomoChain
Others-Same as chainStandard naming

How to verify CoinGecko ID:

  1. Go to https://www.coingecko.com
  2. Search for chain’s native token
  3. Check URL: /en/coins/{this-is-the-id}
  4. Verify token matches chain’s native token
  5. Check for rebranding history

c. Fee activity insights

Daily fees from test results:

ChainDaily FeesActivity Level
Onus$125High
Prom$93High
Zilliqa$49Medium
Songbird$10Low-Medium
GRX Chain$4Low
SatoshiVM$2Very Low
Unit Zero$0Very Low
Viction$0Very Low

Insights:

  • Onus and Prom have significant activity
  • Unit Zero and Viction are very new or less active
  • Zilliqa (established chain) has consistent fees
  • Total daily fees tracked: ~$283

6. Comparison: Batch 1 vs Batch 2

a. Strategy evolution

Batch 1: Rapid Succession

Chain A: Research → Implement → Submit PR
         ↓ (while A in review)
Chain B: Research → Implement → Submit PR
         ↓ (while A,B in review)
Chain C: Research → Implement → Submit PR
         ↓ (while A,B,C in review)
Chain D: Research → Implement → Submit PR
         ↓
All PRs merged independently

Batch 2: True Batch (with twist)

Research all 8 chains first
         ↓
Implement all 8 adapters
         ↓
Test all 8 chains
         ↓
Submit 1 PR with all 8 (#5499)
         ↓
Maintainer closes PR
         ↓
Maintainer creates new PR (#5519)
         ↓
PR #5519 merged (same 8 chains)

b. What I learned between batches

From Batch 1:

  • blockscoutFeeAdapter2 pattern works reliably
  • Quick implementation (~10 min per chain)
  • Rapid submission prevents waiting time
  • Multiple PRs = multiple review cycles
  • Chain identifier conflicts can happen

Applied to Batch 2:

  • Pre-verify all chain identifiers
  • Research all chains before implementing
  • Submit as single PR for cleaner process
  • No issues or clarifications needed
  • More professional presentation

New learning from Batch 2:

  • Maintainers may remake your PR, even if code is correct
  • Impact matters more than attribution. Chains were added
  • Contribution validated indirectly. Same approach used
  • Research is valuable. Identified real needs

c. Combined statistics (Batch 1 + 2)

Total contributions so far:

  • Total chains added to DefiLlama: 12 (4 + 8)
  • My PRs submitted: 5 (4 from Batch 1 + 1 from Batch 2)
  • My PRs merged: 4 (all from Batch 1)
  • My PRs closed & remade: 1 (Batch 2, PR #5499 → #5519)
  • Total lines of code: ~70 lines for 12 chains
  • Chains successfully added: 12/12 (100%)
  • Direct PR success rate: 4/5 (80%)
  • Contribution impact rate: 12/12 (100%)
  • Average time per chain: ~10 minutes
  • Pattern used: blockscoutFeeAdapter2 for all

This shows:

  • Mastery of the blockscoutFeeAdapter2 pattern
  • Evolution from rapid succession to batch submission
  • Efficient contribution workflow
  • All chains added, even if one PR was remade
  • Research and implementation skills validated

7. Resources

a. Pull requests

b. Chain explorers

c. Documentation

8. Key takeaways

a. What worked well (and what didn’t)

What worked:

  1. Research and identification. Found 8 valuable chains to add
  2. Implementation approach. Correct pattern, clean code
  3. Zero issues. Learning from Batch 1 prevented problems
  4. Pattern mastery. 12 chains total using same pattern
  5. Testing. All chains tested and working locally

What didn’t go as expected:

  1. PR not merged directly. Closed and remade by maintainer
  2. No direct attribution. Maintainer’s PR got the credit
  3. Different process. Not the “smooth merge” I expected

What actually matters:

  1. All 8 chains added. Goal achieved!
  2. Approach validated. Same implementation used
  3. Research valuable. Identified real needs
  4. Skills demonstrated. Proved I understand patterns
  5. Impact over attribution. Work still contributed to ecosystem

b. Evolution in contribution strategy

The progression:

Individual protocols (complex, slow)
              ↓
Rapid succession (4 PRs, all merged directly)
              ↓
True batch (8 chains, 1 PR, closed & remade)
              ↓
Understanding: Impact > Attribution

Key evolution points:

  1. Recognized reusable pattern
  2. Optimized for speed (rapid succession)
  3. Optimized for efficiency (batch submission)
  4. Learned from feedback (no issues in Batch 2)
  5. New learning: Maintainers may remake PRs, and that’s okay

c. When to use each strategy

Individual PRs:

  • Different patterns per PR
  • Complex implementations
  • High chance of issues
  • Need feedback between submissions

Rapid Succession (multiple PRs, sequential):

  • Same pattern, proven
  • Want to move fast
  • Independent changes
  • Multiple review cycles

Batch Submission (single PR, multiple items):

  • Same pattern, proven
  • Reviewer prefers consolidated
  • Clean git history matters
  • Professional presentation
  • Most efficient (what I used for Batch 2)
  • May be remade by maintainer (but impact still counts!)

d. Final notes

What happened with this batch:

  • Researched 8 valuable chains
  • Implemented with correct pattern
  • All tests passed
  • Submitted PR #5499
  • PR closed by maintainer
  • Maintainer created PR #5519 with same chains
  • PR #5519 merged same day

The outcome:

  • Impact > Attribution. All 8 chains were added
  • Validation. My approach was correct (they used the same pattern)
  • Research matters. I identified real value
  • Total across batches: 12 chains added, 100% impact rate
Command Palette
Search for a command to run...