graphprotocol / graphprotocol/graph-node

[QmZsgJLiLQKpb8hxTmQ5LWyrFVvfWzVaL4WK8dfFBn7EeK] `handleInitialize` drops the Pool when a currency's `decimals()` reverts

Đang mở
#6,705 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
Rust
Star
3.2k
Fork
1.1k
Merge trung bình
4 ngày 1 giờ
Pull request đã merge (30 ngày)
1

Mô tả

Repo: Uniswap/v4-subgraph
Deployment seen on: QmZsgJLiLQKpb8hxTmQ5LWyrFVvfWzVaL4WK8dfFBn7EeK (V4, Ethereum mainnet)

Problem

If a pool is initialized with a token whose decimals() reverts, handleInitializeHelper returns
early and never saves the Pool entity. The Initialize event is lost permanently, so the pool
and all of its swaps are missing from the subgraph.

src/mappings/poolManager.ts#L78-L84:

const decimals = fetchTokenDecimals(event.params.currency0, tokenOverrides, nativeTokenDetails)

// bail if we couldn't figure out the decimals
if (decimals === null) {
  log.debug('mybug the decimal on token 0 was null', [])
  return
}

Same for currency1 at #L105-L110
(note: that branch logs "token 0" too, which is misleading).

fetchTokenDecimals
returns null whenever try_decimals() reverts. By contrast,
fetchTokenSymbol
and fetchTokenName
already fall back to 'unknown'. Decimals is the only metadata call that aborts indexing instead of
degrading gracefully.

Real occurrence

Block 25709273
Tx 0x812855aba2c3764d3df74f90e9549e543a75ae6735a8f2f0a7a52b1c31f81114
Pool id 0xc8a28c2bcce2f26a172a85ac5162d5240d26970d95494c446b27bf1b8e982e45
currency0 0x0000000000000000000000000000000000000000 (native)
currency1 0xf1d2d880c5dde7cc912636c2b4d080b3fe5f7b50

currency1 reverts on the whole ERC-20 metadata surface (it is a deployed contract, just not a
standard ERC-20):

$ cast call 0xf1d2d880c5dde7cc912636c2b4d080b3fe5f7b50 "decimals()" --block 25709273
Error: execution reverted

Initialize (logIndex 208) and the pool's first Swap (logIndex 211) are in the same
transaction
, so the pool breaks immediately. Result in the store: no Pool row, no Token row,
no swaps - the pool simply does not exist.

Two different symptoms

The current main already guards the load in
src/mappings/swap.ts#L163-L168:

const pool = Pool.load(poolId)

if (!pool) {
  log.warning('Pool not found: {}', [poolId])
  return
}

So depending on the build:

  • Older builds (like the deployment above, which non-null-asserts the pool) abort the handler:

    Mapping aborted at src/mappings/swap.ts, line 39, column 16, with message: unexpected null
    

    With nonFatalErrors enabled the subgraph is then stuck unhealthy forever. The error is
    deterministic, so it hits every indexer and cannot be repaired by rewinding or resyncing.

  • Current main logs a warning and returns - no error, but the pool's swaps, volume and TVL are
    silently missing from all aggregates. Arguably worse, since nothing surfaces the gap.

Either way the underlying cause is the same: the Pool was never created.

Impact

  • Pools with any non-standard-decimals() currency are entirely absent from the subgraph.
  • Their swaps never contribute to PoolDayData / TokenDayData / UniswapDayData.
  • Not fixable operationally - only a mapping change and redeploy helps.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu trong src/mappings/poolManager.ts tại handleInitializeHelper và lần theo fetchTokenDecimals trong src/utils/token.ts, so sánh hành vi của nó với fetchTokenSymbol và fetchTokenName. Xem xét guard Pool.load trong src/mappings/swap.ts và tái hiện path Initialize và Swap bị ảnh hưởng. Hoàn thành khi một lời gọi decimals() gây revert không còn ngăn Pool được lưu hoặc các swap của nó được xử lý.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
typescript
Lĩnh vực
blockchain
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
70/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.