Skip to main content
Wallet API đang ở giai đoạn Beta. Các endpoint và định dạng phản hồi có thể thay đổi.

Tổng quan

Endpoint Historical Balance trả lời câu hỏi: số dư của một token cụ thể (hoặc SOL gốc) trong ví này tại một thời điểm cụ thể trong quá khứ là bao nhiêu? Trong khi endpoint Balances báo cáo lượng nắm giữ hiện tại, balance-at báo cáo lượng nắm giữ tại bất kỳ dấu thời gian, thời điểm hoặc slot nào. Endpoint này tìm giao dịch gần nhất xảy ra tại hoặc trước thời điểm được yêu cầu có liên quan đến ví và token, sau đó đọc số dư sau giao dịch của ví từ giao dịch đó. Số dư sau giao dịch là số dư được duy trì từ giao dịch đó cho đến giao dịch tiếp theo, vì vậy “số dư tại thời điểm T” là số dư sau giao dịch của giao dịch liên quan cuối cùng có thời gian khối (hoặc slot) tại hoặc trước T. Với ví thông thường, đây là giá trị chính xác, không phải ước tính.
  • Token (SPL / Token-2022): được đọc từ số dư token sau giao dịch, cộng gộp trên các tài khoản token của ví cho mint đó.
  • SOL gốc: được đọc từ số dư lamport sau giao dịch. Xác định SOL gốc bằng pseudo-mint So11111111111111111111111111111111111111111.

Khi nào nên sử dụng

Sử dụng Historical Balance API cho các mục đích sau:
  • Tính PnL: xác định lượng nắm giữ ở đầu và cuối một kỳ.
  • Giá vốn và lô thuế: tái dựng số dư tại các sự kiện mua hoặc bán.
  • Giải quyết tranh chấp: chứng minh lượng tài sản mà ví nắm giữ tại một thời điểm cụ thể.
  • Xác minh ảnh chụp nhanh: kiểm tra số dư ví tại thời điểm chụp nhanh cho airdrop hoặc quản trị.
  • Kế toán và kiểm toán: tái dựng trạng thái ví tại ranh giới các kỳ.

Bắt đầu nhanh

Số dư token tại một dấu thời gian

Lấy số dư USDC của ví tại một dấu thời gian Unix:

Số dư token tại một thời điểm

Truyền một thời điểm ở định dạng dễ đọc thay vì dấu thời gian. Hãy nhớ mã hóa URL cho dấu cách thành %20:

Số dư SOL gốc tại một slot

Đối với SOL gốc, hãy sử dụng pseudo-mint So11111111111111111111111111111111111111111. Truy vấn dựa trên slot cho kết quả chính xác và xác định:

Tham số truy vấn

Phải cung cấp chính xác một trong các tham số time, datetime hoặc slot. Nếu không cung cấp tham số nào hoặc cung cấp nhiều hơn một tham số, API sẽ trả về lỗi 400.

Định dạng thời điểm

Các định dạng được chấp nhận:
  • Chỉ ngày: 2025-01-10 → nửa đêm UTC
  • Ngày + giờ: 2025-01-10 19:20:00 hoặc 2025-01-10T19:20:00 (không bắt buộc có giây) → UTC
  • Có múi giờ cụ thể: 2025-01-10T19:20:00Z, 2025-01-10T19:20:00+02:00, 2025-01-10T19:20:00-05:00 → được áp dụng theo giá trị đã cung cấp
Các định dạng không hợp lệ hoặc không được hỗ trợ (01/10/2025, 2025-13-10, 2025-02-30) sẽ trả về lỗi 400.
Theo mặc định, thời điểm được diễn giải theo UTC. Một thời điểm không có múi giờ như 2025-01-10 19:20:00 được coi là UTC, không phải giờ địa phương của bạn. Hãy thêm độ lệch múi giờ cụ thể nếu muốn sử dụng múi giờ khác. Trường requested.time trong phản hồi hiển thị số giây epoch đã phân giải để bạn có thể xác minh cách diễn giải.

Định dạng phản hồi

Ghi chú về các trường

  • wallet: lặp lại địa chỉ ví đã truy vấn.
  • mint: lặp lại mint đã truy vấn (pseudo-mint SOL khi truy vấn SOL gốc).
  • isNative: true khi kết quả là SOL gốc.
  • balance: số lượng dễ đọc ở dạng chuỗi thập phân — là chuỗi, không phải số, để số dư lớn không bị mất độ chính xác. Các số 0 ở cuối bị loại bỏ ("1.5", không phải "1.500000").
  • balanceRaw: số lượng chính xác theo đơn vị nhỏ nhất (lamport đối với SOL), ở dạng chuỗi.
  • decimals: số chữ số thập phân của token (9 đối với SOL).
  • requested: lặp lại truy vấn. Khi sử dụng datetime, time cũng được điền bằng số giây epoch đã phân giải, giúp hiển thị rõ cách diễn giải UTC.
  • asOf: giao dịch dùng để đọc số dư (slot, blockTime, signature).
asOf: null có nghĩa là số dư bằng 0, không phải lỗi. Khi ví không có giao dịch khớp nào tại hoặc trước thời điểm được yêu cầu, endpoint trả về 200 cùng với balance: "0" và asOf: null — đơn giản là ví chưa từng nắm giữ token đó vào thời điểm ấy.

Trường hợp sử dụng

Thay đổi số dư trong một kỳ

So sánh lượng nắm giữ tại hai thời điểm:

Kiểm tra điều kiện đủ tại thời điểm chụp nhanh

Xác minh một ví nắm giữ token tại slot chụp nhanh:

Phương pháp hay nhất

  • Sử dụng slot để nhận kết quả xác định. time và datetime được phân giải thông qua thời gian khối do trình xác thực báo cáo, có thể chênh lệch vài giây. Khi cần khả năng tái lập chính xác (ảnh chụp nhanh, kiểm toán), hãy truy vấn bằng slot.
  • Phân tích số dư dưới dạng chuỗi. balance và balanceRaw là chuỗi để duy trì độ chính xác. Hãy sử dụng BigInt(balanceRaw) (hoặc số nguyên có độ chính xác tùy ý của ngôn ngữ bạn dùng) để tính toán — không ép kiểu thành số dấu phẩy động.
  • Coi asOf: null là số 0. asOf có giá trị null là một phản hồi thành công, nghĩa là ví không có hoạt động nào với token đó tính đến thời điểm được yêu cầu. Không xử lý trường hợp này như một lỗi.
  • Lưu kết quả trong quá khứ vào bộ nhớ đệm. Số dư tại một thời điểm trong quá khứ không bao giờ thay đổi. Hãy lưu kết quả vĩnh viễn vào bộ nhớ đệm để tránh gọi API nhiều lần.

Lỗi thường gặp

Hạn chế

  • Ví có nhiều tài khoản token có thể bị tính thiếu. Số dư được đọc từ một giao dịch khớp gần nhất duy nhất. Trường hợp phổ biến — một tài khoản token liên kết cho mỗi mint — cho kết quả chính xác. Một ví nắm giữ cùng một mint trên nhiều tài khoản token có thể bị tính thiếu nếu giao dịch mới nhất chỉ tác động đến một số tài khoản trong đó.
  • Độ chính xác của SOL gốc đối với số dư rất lớn. Đối với số dư SOL vượt quá khoảng 9.007.199 SOL (2⁵³ lamport), độ chính xác có thể bị mất ở thượng nguồn. Số lượng token không bị ảnh hưởng.
  • Độ chính xác của time/datetime phụ thuộc vào thời gian khối do trình xác thực báo cáo, có thể chênh lệch vài giây. Hãy sử dụng slot để nhận kết quả chính xác và xác định.
  • Mỗi yêu cầu chỉ hỗ trợ một token. Không có dạng xử lý hàng loạt nhiều mint hoặc “tất cả số dư tại thời điểm T”.

Bước tiếp theo

Wallet Balances

Lấy lượng token và NFT hiện tại mà ví đang nắm giữ cùng giá trị USD.

Wallet API Overview

Tất cả endpoint của Wallet API và các quy ước chung.

API Reference

Lược đồ yêu cầu và phản hồi cho số dư trong quá khứ.