The Farm Manager is a monolithic contract that handles all farms-related logic for pools.
How it works
The Farm Manager has two main concepts:
- Farm: a reward to be distributed
- Position: a user’s liquidity in a pool, locked in the contract
Users can optionally lock LP shares when providing liquidity; those shares are managed by the Farm Manager.
Farms
Farms are permissionless and can be perpetual (expanded forever).
Identifiers:
- Auto-generated farms:
f-<number>
- Custom farms:
m-<custom>
Topping up a farm
Farm owner calls ManageFarm with Fill. Farm can only be topped up with the same reward token, and the amount must be a multiple of the original reward amount.
Farms expire after farm_expiration_time has passed since farm end; expired farms can’t be expanded and may be auto-closed.
Closing a farm
Farm owner or contract owner calls ManageFarm with Close.
Reward distribution
Rewards distribute every epoch. The emission rate is tokens per epoch.
textuserrewards=sumlp=aNdenomssumf=bNfarmssume=startcurrentfracu,lpwet,lpwecdotre
If a user has pending rewards when a farm is closed, they may lose the ability to claim those tokens (unclaimed tokens are reimbursed to the farm owner).
Positions
Positions can be created, expanded, closed, and withdrawn via ManagePosition.
Identifiers:
- Auto-generated positions:
p-<number>
- Custom positions:
u-<custom>
Unlocking duration determines position weight (and rewards). One day ≈ 1x; max 365 days ≈ 16x.
Unlocking duration is how long you must wait after calling Close to be able to withdraw. It is not the same as “how long LP is locked for farming”.
Withdrawing and emergency unlock
You can withdraw after the unlocking duration passes. You can also emergency withdraw immediately (penalty applies; part goes to farm owners, part to Fee Collector).
Emergency unlock renounces unclaimed rewards for that position.
Instantiate
{
"owner": "mantra1...",
"epoch_manager_addr": "mantra1...",
"fee_collector_addr": "mantra1...",
"pool_manager_addr": "mantra1...",
"create_farm_fee": { "denom": "uom", "amount": "1000000000" },
"max_concurrent_farms": 7,
"max_farm_epoch_buffer": 14,
"min_unlocking_duration": 86400,
"max_unlocking_duration": 31536000,
"farm_expiration_time": 2629746,
"emergency_unlock_penalty": "0.01"
}
ExecuteMsg
ManageFarm
Actions:
- Fill: create or expand a farm
- Close: close a farm
Fill (example)
{
"manage_farm": {
"action": {
"fill": {
"params": {
"lp_denom": "factory/mantra1.../LP",
"start_epoch": 10,
"preliminary_end_epoch": 24,
"curve": "linear",
"farm_asset": { "denom": "uom", "amount": "1000000000" },
"farm_identifier": "farm_identifier"
}
}
}
}
}
Close (example)
{
"manage_farm": {
"action": {
"close": { "farm_identifier": "farm_identifier" }
}
}
}
ManagePosition
Actions: Create / Expand / Close / Withdraw
Create (example)
{
"manage_position": {
"action": {
"create": {
"identifier": "position_identifier",
"unlocking_duration": 86400,
"receiver": "mantra1..."
}
}
}
}
Expand (example)
{
"manage_position": {
"action": {
"expand": { "identifier": "position_identifier" }
}
}
}
Close (example)
{
"manage_position": {
"action": {
"close": {
"identifier": "position_identifier",
"lp_asset": { "denom": "factory/mantra1.../LP", "amount": "1000000000" }
}
}
}
}
Withdraw (example)
{
"manage_position": {
"action": {
"withdraw": {
"identifier": "position_identifier",
"emergency_unlock": true
}
}
}
}
Claim
UpdateConfig
{
"update_config": {
"fee_collector_addr": "mantra1...",
"epoch_manager_addr": "mantra1...",
"pool_manager_addr": "mantra1...",
"create_farm_fee": { "denom": "uom", "amount": "1000000000" },
"max_concurrent_farms": 7,
"max_farm_epoch_buffer": 14,
"min_unlocking_duration": 86400,
"max_unlocking_duration": 31536000,
"farm_expiration_time": 2629746,
"emergency_unlock_penalty": "0.01"
}
}
UpdateOwnership (::cw_ownable)
This is a cw_ownable message.
QueryMsg
Config
Farms / Positions / Rewards / LpWeight / Ownership
This page preserves the legacy schema and examples. For additional example payloads and response shapes, see:
_tmp_gitbook/mantra-smart-contracts/mantra-swap/farm-manager.md
MigrateMsg