Skip to main content
Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →
Thông tin phiên bản. Tất cả các ví dụ nhắm tới @raydium-io/raydium-sdk-v2@0.2.64-alpha trên Solana mainnet-beta, được xác minh vào 2026-09-09 — mọi tên builder, tên tham số và kiểu tham số dưới đây đã được kiểm tra so với thư mục src/raydium/farm/ của bản phát hành đó và so với raydium-sdk-V2-demo/src/farm. SDK gửi v3 / v5 / v6 nội bộ dựa trên chủ sở hữu chương trình của farm; các ví dụ dưới đây giả định một farm v6. Xem reference/program-addresses để biết ba ID chương trình.Tên phương thức của mô-đun farm không phải là những gì bạn có thể đoán: không có getFarmByIdkhông có setRewards. Việc lấy dữ liệu diễn ra thông qua raydium.api.fetchFarmInfoById, và các builder chỉnh sửa phần thưởng là addNewRewardToken / addNewRewardsTokenrestartReward / restartRewards.

Thiết lập

Các ví dụ ở đây phản ánh các tệp trong raydium-sdk-V2-demo/src/farm. Bootstrap tuân theo config.ts.template của kho lưu trữ demo:

Lấy farm theo id

Không có raydium.farm.getFarmById. Mọi ví dụ farm đều bắt đầu từ mô-đun API, mô-đun này trả về hình dạng FormatFarmInfoOut được chuẩn hóa mà deposit / withdraw / harvestAllRewards đều sử dụng:
fetchFarmInfoById nhận một chuỗi các id được phân tách bằng dấu phẩy và trả về một mảng, vì vậy một lệnh gọi có thể cấp nước cho toàn bộ danh mục đầu tư. Nếu bạn cần các khóa tài khoản thô hơn là thông tin hiển thị, raydium.api.fetchFarmKeysById({ ids }) trả về các vault và PDA có thẩm quyền; SDK gọi nó nội bộ cho bạn bên trong mọi builder dưới đây.

Stake LP tokens

Nguồn: src/farm/stake.ts
SDK xử lý việc pre-settle bất kỳ phần thưởng nào đang chờ xử lý, vì vậy nếu ví này đã có stake trong farm này, hướng dẫn sẽ trả lãi tích lũy cho người dùng trong cùng một giao dịch.

Chỉ yêu cầu (harvest)

Nguồn: src/farm/harvest.ts farmInfoList là một Record được khóa bằng farm id, không phải một mảng, và builder trả về nhiều giao dịch — vì vậy execute phải được cung cấp sequentially: true:
Builder đóng gói càng nhiều farm trên mỗi giao dịch càng tốt trong giới hạn 1232 byte và chia phần còn lại thành các giao dịch tiếp theo, đó là lý do tại sao nó trả về txIds thay vì một txId duy nhất. Đối với một farm duy nhất, harvest bằng cách sử dụng amount: 0 — đây là những gì src/farm/harvest.ts làm, trên mọi phiên bản bao gồm v6:

Unstake

Nguồn: src/farm/unstake.ts

Tạo một farm v6

Nguồn: src/farm/createAmmFarm.tseditAmmFarm.ts create nhận đối tượng thông tin pool cho pool có mint LP đang được stake (không phải một mint trần), và mỗi mục nhập của rewardInfos là một FarmRewardInfo: { mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }. Thời gian là giây đơn giản, và perSecond là một chuỗi, không phải một BN. programId mặc định là chương trình v6, vì vậy bạn hiếm khi truyền nó.
Các điểm chính:
  • perSecond là tốc độ phát hành trên giây ở các đơn vị thô của mint phần thưởng, được truyền dưới dạng chuỗi thập phân. SDK đóng gói nó vào biểu diễn điểm cố định trên chuỗi trước khi gửi.
  • Toàn bộ ngân sách (perSecond × (endTime − openTime)) phải có trong ATA phần thưởng của bạn — create di chuyển nó vào vault phần thưởng một cách nguyên tử.
  • Các mint phần thưởng Token-2022 không được hỗ trợ bởi các builder farm của SDK ở phiên bản SDK này; sử dụng mint SPL đơn giản cho phần thưởng.
  • Bạn có thể seed tối đa 5 phần thưởng trong một lệnh gọi create. Danh sách tài khoản tăng lên (reward_mint, reward_vault, sender_ata, token_program) cho mỗi luồng bổ sung; hãy nhận thức được giới hạn kích thước giao dịch 1232 byte. Đối với 4+ phần thưởng, tạo với 1–2 và sử dụng addNewRewardsToken trong các giao dịch tiếp theo.

Thêm một luồng phần thưởng mới

Không có raydium.farm.setRewards. Hai builder thay đổi phần thưởng của farm là addNewRewardToken / addNewRewardsToken (chiếm một slot trống với một mint mới) và restartReward / restartRewards (tái vũ trang một slot có luồng đã kết thúc). Cả hai đều nhận các đối tượng FarmRewardInfo ở chính xác hình dạng mà create sử dụng.
Ngân sách delta (perSecond × duration) được rút từ ATA của người trả tiền như một phần của giao dịch. Hướng dẫn cơ bản không thể rút ngắn một luồng, không thể hạ thấp per_second trên một luồng trực tiếp, và không thể thay đổi mint phần thưởng của một slot — để hoán đổi mint, hãy chờ end_time và sử dụng addNewRewardsToken trên một slot được giải phóng, hoặc tạo một farm mới.
restartRewardsaddNewRewardsToken mỗi cái trả về một builder, vì vậy một giao dịch duy nhất có thể làm cả hai. src/farm/editAmmFarm.ts cho thấy mô hình: editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData), sau đó một versionBuild({ txVersion }).

Khởi động lại một luồng đã hoàn thành

Nguồn: src/farm/editAmmFarm.ts restartRewards nhận newRewardInfos (số nhiều, một mảng); restartReward là dạng mục đơn và nhận newRewardInfo. Trường mint là mint, không phải rewardMint, và nó phải khớp với một slot đã tồn tại trên farm — builder tìm kiếm slot theo mint và báo lỗi nếu nó không có.
restartRewardschỉ v6 — builder đọc ID chương trình của farm và ném cho các farm v3 / v5. Chỉ hợp lệ khi reward_state == 2 của slot mục tiêu (đã kết thúc); người gọi phải là reward_sender của slot. Lưu ý openTime >= endTime bị từ chối phía máy khách trước khi bất kỳ RPC nào được thực hiện.

Rust CPI

Không có crate Anchor raydium_farm_v6. Không có crate nào có tên đó tồn tại trên crates.io, chương trình Farm v6 không xuất bản IDL trên chuỗi (không phải tài khoản anchor:idl kế thừa cũng không phải mục nhập trong chương trình Program Metadata), và không có kho lưu trữ nguồn công khai nào cho nó. Một bản sửa đổi trước đó của trang này cho thấy một ví dụ raydium_farm_v6::cpi::deposit; nó không biên dịch được so với bất cứ điều gì và đã bị xóa.
Farm v6 được triển khai lần cuối vào 2024-05-13 và không phải là chương trình Anchor từ quan điểm của người tích hợp. Nếu bạn cần soạn với nó từ chương trình trên chuỗi của riêng bạn, hãy xây dựng Instruction bằng tay — suy ra danh sách tài khoản và bộ phân biệt hướng dẫn độc lập (từ các bố cục TypeScript của SDK dưới raydium-sdk-V2/src/raydium/farm/, hoặc bằng cách giải mã các giao dịch thực), và invoke_signed nó. Xem sdk-api/rust-cpi để biết quy trình đó. Bất kể bạn chọn con đường nào, đuôi remaining_accounts phải khớp với các slot phần thưởng hoạt động của farm 1-for-1 (các cặp reward_vault_i, user_reward_ata_i theo thứ tự chỉ mục). Bỏ qua hoặc sắp xếp sai những cái này sẽ tạo ra một sai lệch âm thầm — chương trình sẽ chuyển số tiền sai.

Những cạm bẫy

  • Quên yêu cầu trước khi rút. Vô hại — Withdraw giải quyết phần thưởng đang chờ xử lý trước. Nhưng nếu UI của bạn hiển thị “yêu cầu” riêng biệt với “rút”, người dùng có thể nghĩ rằng vẫn còn điều gì đó để yêu cầu sau một Withdraw. Không có; mọi thứ tích lũy cho đến thời điểm đó đã được trả.
  • total_staked = 0 trong quá trình phát hành. Phát hành tích lũy trong khi không có gì được stake bị mất (công thức cập nhật reward_per_share chia cho 0 và chương trình bỏ qua cập nhật). Đối với các chương trình có open_time được lên lịch, chạy một “seed stake” tại open_time để tránh điều này.
  • Phí chuyển Token-2022. Trên các farm v6 có mint phần thưởng Token-2022, phí chuyển áp dụng khi phát hành (vault → người dùng). Tính toán điều này vào các báo giá APR.
  • per_second nhỏ trên v5. u64 của v5 có nghĩa là bất kỳ per_second < 1 đơn vị token trên giây (trên mint có ≥9 chữ số thập phân đây thường là tốc độ mong muốn) không thể được biểu thị — tốc độ luồng làm tròn thành 0 và farm không phát hành gì. Sử dụng v6.

Tiếp theo

Nguồn: