Farms
The Farms system provides functionality for managing staking pools and staked positions on the Sui network, allowing users to stake tokens and earn rewards.
Initialization
const afSdk = new Aftermath("MAINNET");
await afSdk.init(); // initialize provider
const farms = afSdk.Farms();
Constants
Farms.constants = {
minimalRewardsToClaim: BigInt("1000000"), // Minimum rewards that can be claimed
};
Farms Class Methods
Staking Pool Management
// Get single staking pool
const pool = await farms.getStakingPool({
objectId: "0x...",
});
// Get multiple staking pools
const pools = await farms.getStakingPools({
objectIds: ["0x...", "0x..."],
});
// Get all staking pools
const allPools = await farms.getAllStakingPools();
Staked Positions
// Get user's staked positions
const positions = await farms.getOwnedStakedPositions({
walletAddress: "0x...",
});
// Get owner caps
const ownerCaps = await farms.getOwnedStakingPoolOwnerCaps({
walletAddress: "0x...",
});
// Get one-time admin caps
const adminCaps = await farms.getOwnedStakingPoolOneTimeAdminCaps({
walletAddress: "0x...",
});
Create Staking Pool
const tx = await farms.getCreateStakingPoolTransaction({
lockEnforcement: "Strict", // "Strict" | "Relaxed"
minLockDurationMs: 604800000, // 1 week
maxLockDurationMs: 31536000000, // 1 year
maxLockMultiplier: BigInt("2000000000"), // 2x
minStakeAmount: BigInt("1000000"), // Minimum stake amount
stakeCoinType: "0x...",
walletAddress: "0x...",
});
FarmsStakedPosition Class
Represents and manages an individual staked position.
Position Information
const position = new FarmsStakedPosition(stakedPositionObject);
// Check if position is locked
const isLocked = position.isLocked({ stakingPool });
// Get unlock timestamp
const unlockTime = position.unlockTimestamp();
// Get reward coin types
const rewardTypes = position.rewardCoinTypes();
// Check for claimable rewards
const hasRewards = position.hasClaimableRewards({ stakingPool });
// Calculate total APR
const apr = position.calcTotalApr({
rewardsUsd: 1000,
stakeUsd: 10000,
});
Position Transactions
// Deposit additional tokens
const depositTx = await position.getDepositPrincipalTransaction({
depositAmount: BigInt("1000000"),
walletAddress: "0x...",
isSponsoredTx: false,
});
// Unstake position
const unstakeTx = await position.getUnstakeTransaction({
walletAddress: "0x...",
stakingPool: stakingPoolObject,
claimSuiAsAfSui: false,
});
// Lock position
const lockTx = await position.getLockTransaction({
lockDurationMs: 2592000000, // 30 days
walletAddress: "0x...",
});
// Harvest rewards
const harvestTx = await position.getHarvestRewardsTransaction({
walletAddress: "0x...",
stakingPool: stakingPoolObject,
claimSuiAsAfSui: false,
});
FarmsStakingPool Class
Manages a staking pool and its associated functionality.
Pool Information
const pool = new FarmsStakingPool(stakingPoolObject);
// Get reward coin types
const rewardTypes = pool.rewardCoinTypes();
// Calculate APR for specific coin
const apr = pool.calcApr({
coinType: "0x...",
price: 1.5,
decimals: 9,
tvlUsd: 1000000,
});
// Calculate total APR across all rewards
const totalApr = pool.calcTotalApr({
coinsToPrice: { "0x...": 1.5 },
coinsToDecimals: { "0x...": 9 },
tvlUsd: 1000000,
});
// Calculate multiplier for lock duration
const multiplier = pool.calcMultiplier({
lockDurationMs: 2592000000, // 30 days
});
Pool Transactions
// Stake tokens
const stakeTx = await pool.getStakeTransaction({
stakeAmount: BigInt("1000000"),
lockDurationMs: 2592000000, // 30 days
walletAddress: "0x...",
isSponsoredTx: false,
});
// Initialize rewards
const initRewardsTx = await pool.getInitializeRewardTransaction({
rewardAmount: BigInt("1000000"),
emissionScheduleMs: 2592000000, // 30 days
emissionRate: BigInt("100"),
emissionDelayTimestampMs: 0,
rewardCoinType: "0x...",
walletAddress: "0x...",
ownerCapId: "0x...", // or oneTimeAdminCapId
});
// Top up rewards
const topUpTx = await pool.getTopUpRewardsTransaction({
rewards: [
{
rewardAmount: BigInt("1000000"),
rewardCoinType: "0x...",
},
],
walletAddress: "0x...",
ownerCapId: "0x...", // or oneTimeAdminCapId
});
// Increase emissions
const increaseEmissionsTx = await pool.getIncreaseRewardsEmissionsTransaction({
ownerCapId: "0x...",
rewards: [
{
rewardCoinType: "0x...",
emissionScheduleMs: 2592000000,
emissionRate: BigInt("200"),
},
],
walletAddress: "0x...",
});
Types
Farm Types
type FarmsLockEnforcement = "Strict" | "Relaxed";
type FarmsMultiplier = bigint;
interface FarmsStakingPoolRewardCoin {
coinType: string;
rewards: bigint;
rewardsAccumulatedPerShare: bigint;
emissionRate: bigint;
emissionSchedulesMs: number;
emissionStartTimestamp: number;
lastRewardTimestamp: number;
rewardsRemaining: bigint;
actualRewards: bigint;
}
interface FarmsStakedPositionRewardCoin {
coinType: string;
baseRewardsAccumulated: bigint;
baseRewardsDebt: bigint;
multiplierRewardsAccumulated: bigint;
multiplierRewardsDebt: bigint;
}
Example Usage
const afSdk = new Aftermath("MAINNET");
await afSdk.init();
const farms = afSdk.Farms();
// Get all staking pools
const stakingPools = await farms.getAllStakingPools();
// Get user's staked positions
const stakedPositions = await farms.getOwnedStakedPositions({
walletAddress: "0x...",
});
// Create a new staking position
const stakingPool = new FarmsStakingPool(stakingPools[0]);
const stakeTx = await stakingPool.getStakeTransaction({
stakeAmount: BigInt("1000000"),
lockDurationMs: 2592000000, // 30 days
walletAddress: "0x...",
});
// Harvest rewards from a position
const position = new FarmsStakedPosition(stakedPositions[0]);
const harvestTx = await position.getHarvestRewardsTransaction({
walletAddress: "0x...",
stakingPool: stakingPool,
});
Last updated