token-fundraiser: large valid targets cause contribution-limit overflow

Đang mở Phù hợp với người mới
#790 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

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

  • #791 của @Bismithblde — đã đóng, không merge

Đánh giá

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

Hướng nghiên cứu

Bắt đầu với programs/fundraiser/src/instructions/contribute.rs:67, nơi giới hạn cho mỗi người đóng góp bị tràn số, và kiểm tra cách giới hạn đó được dùng lại trong các bước kiểm tra giao dịch và tổng đóng góp. Thêm hoặc chạy kiểm thử hồi quy LiteSVM cho các giá trị mục tiêu u64::MAX / 10 + 1 và u64::MAX; hoàn tất khi các khoản đóng góp đúng bằng giới hạn thành công, các khoản vượt giới hạn thất bại, và số dư cùng các khoản đóng góp được ghi nhận đều chính xác.

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

Mô tả

Problem

The Anchor fundraiser accepts u64 fundraising targets, but calculating the per-contributor 10% limit uses u64 multiplication before division. For a target greater than u64::MAX / 10, target * 10 overflows and contributions panic, even when the contribution is small and the final limit fits in u64.

Reproduction

A Rust LiteSVM integration test creates a six-decimal mint, initializes a fundraiser with a target of u64::MAX / 10 + 1, then contributes 1,000,000 base units (one token).

Initialization succeeds. The contribution fails with attempt to multiply with overflow at programs/fundraiser/src/instructions/contribute.rs:67.

The same issue affects a target of u64::MAX. The existing initialization instruction accepts both values.

Proposed fix

Calculate the percentage once in u128 and reuse it for the per-transaction and cumulative contributor limits. Compare the cumulative contribution in u128 as well. This preserves the 10% policy and integer rounding.

The regression fails against the original program and passes after the fix. It covers both targets, acceptance up to the exact cap, rejection above the cap, and resulting balances and recorded contributions. All three fundraiser integration tests pass locally.

Ngôn ngữ chính
Rust
Star
1.4k
Fork
562
Merge trung bình
23 giờ 5 phút
Pull request đã merge (30 ngày)
19

Chuẩn bị môi trường

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.

Issue khác của solana-foundation/program-examples

Tất cả issue của solana-foundation/program-examples

Issue tương tự

Thêm issue về Rust

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.