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
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:
Search for new chains that use Blockscout explorers and haven’t been tracked yet.
Test each explorer’s /api?module=stats&action=totalfees endpoint to confirm it returns fee data.
Look up the native token IDs on CoinGecko for all 8 chains to enable USD pricing.
Add all chain configs and adapter files in one branch for consolidated submission.
Run local tests for all 8 adapters individually to verify data fetching works.
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
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
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
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
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
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:
- Songbird uses songbird-explorer.flare.network (Blockscout)
- CoinGecko token ID:
songbird - Flare Network’s canary network
f. Unit Zero
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
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
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 lineshelpers/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
bhelugawas 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
| Metric | Batch 1 (4 PRs) | Batch 2 (1 PR) |
|---|---|---|
| Chains added | 4 | 8 |
| My PRs submitted | 4 | 1 (#5499 - closed) |
| Maintainer remake | 0 | 1 (#5519 - merged) |
| Time to merge | ~1 day | Same 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 lines | 44-46 lines |
| Issues/clarifications | 1 (Bitkub) | 0 |
| Contribution impact | 100% | 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:
They want specific formatting or structure that differs from your implementation.
They prefer a certain commit message format or history structure.
It’s easier to modify if needed from their own branch rather than your fork.
They validate your approach by reimplementing it themselves.
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:
All items use the same implementation pattern or helper function.
Each item can be added or removed independently without affecting others.
You can verify all changes work correctly in your local environment.
No conflicts or interdependencies between the different items.
The maintainer has shown preference for batch submissions over individual PRs.
How to batch effectively:
Complete your research phase for all items before starting implementation.
Check that none of the items overlap with existing implementations or each other.
Create a dedicated branch and add all implementations in an organized manner.
Run tests for each item separately to ensure they work in isolation.
Verify that all items work correctly when combined in the same codebase.
Write a comprehensive PR description listing all items and what each does.
Prepare documentation and justification for each item in case of reviewer questions.
c. CoinGecko token ID mappings
Notable token ID differences learned:
| Chain | Chain Name | CoinGecko ID | Reason |
|---|---|---|---|
| Prom | prom | prometeus | Full name vs abbreviation |
| SatoshiVM | satoshivm | bitcoin | Uses BTC for fees |
| Viction | viction | tomochain | Rebranded from TomoChain |
| Others | - | Same as chain | Standard naming |
How to verify CoinGecko ID:
- Go to https://www.coingecko.com
- Search for chain’s native token
- Check URL:
/en/coins/{this-is-the-id} - Verify token matches chain’s native token
- Check for rebranding history
c. Fee activity insights
Daily fees from test results:
| Chain | Daily Fees | Activity Level |
|---|---|---|
| Onus | $125 | High |
| Prom | $93 | High |
| Zilliqa | $49 | Medium |
| Songbird | $10 | Low-Medium |
| GRX Chain | $4 | Low |
| SatoshiVM | $2 | Very Low |
| Unit Zero | $0 | Very Low |
| Viction | $0 | Very 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:
blockscoutFeeAdapter2pattern 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:
blockscoutFeeAdapter2for all
This shows:
- Mastery of the
blockscoutFeeAdapter2pattern - 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
- My PR #5499: Track fees for 8 chains, closed
- Maintainer’s PR #5519: Track fees for 8 chains by @bheluga, merged
b. Chain explorers
- GRX Scan (GRX Chain)
- Onus Explorer (Onus)
- Prom Scan (Prom)
- SVM Scan (SatoshiVM)
- Songbird Explorer (Songbird)
- Unit Zero Explorer (Unit Zero)
- Viction Explorer (Viction)
- Zilliqa Explorer (Zilliqa)
c. Documentation
- blockscoutFeeAdapter2 Helper
- Chain Fees Batch 1 (Previous batch)
8. Key takeaways
a. What worked well (and what didn’t)
What worked:
- Research and identification. Found 8 valuable chains to add
- Implementation approach. Correct pattern, clean code
- Zero issues. Learning from Batch 1 prevented problems
- Pattern mastery. 12 chains total using same pattern
- Testing. All chains tested and working locally
What didn’t go as expected:
- PR not merged directly. Closed and remade by maintainer
- No direct attribution. Maintainer’s PR got the credit
- Different process. Not the “smooth merge” I expected
What actually matters:
- All 8 chains added. Goal achieved!
- Approach validated. Same implementation used
- Research valuable. Identified real needs
- Skills demonstrated. Proved I understand patterns
- 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:
- Recognized reusable pattern
- Optimized for speed (rapid succession)
- Optimized for efficiency (batch submission)
- Learned from feedback (no issues in Batch 2)
- 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