Crypto
Staking Guide
End-to-end staking operations on EVM chains for LONG tokens, executed directly from the user's wallet.
Overview
This guide provides frontend examples for performing staking operations with LONG tokens on EVM-compatible chains directly from the user's wallet. It covers minting, depositing, withdrawing, redeeming, and emergency operations.
Important Note
Throughout the examples below, parseEther("<amount>") is used to convert token amounts into their on-chain uint256 representation.
Although the function name refers to “Ether”, it represents LONG tokens, not ETH. For example, parseEther("0.5") corresponds to 0.5 LONG tokens.
Process Flow
flowchart TD;
A[Start: User Connect] --> B[Staking Mint]
B --> C[Staking Deposit]
C --> D{Withdraw or Redeem?}
D --> E[Staking Withdraw]
D --> F[Staking Redeem]
E --> G[Emergency Functions]
F --> G
G --> H[End: Tokens Managed]
style A fill:#e1f5fe
style H fill:#c8e6c9
style G fill:#fff3e0
Usage Examples
Staking Mint
/*
* mint(uint256 shares, address user)
* The user mints sLONG shares by depositing LONG.
* Note: parseEther("0.5") means 0.5 LONG tokens (not ETH).
*/
async function stakingMint() {
// Approve LONG token before mint
const transaction = prepareContractCall({
contract,
method: "mint",
params: [parseEther("0.5"), "0xUserAddress"],
});
}
Staking Deposit
/*
* deposit(uint256 assets, address user)
* The user deposits LONG tokens and receives sLONG.
* Note: parseEther("0.5") means 0.5 LONG tokens (not ETH).
*/
async function stakingDeposit() {
// Approve LONG token before deposit
const transaction = prepareContractCall({
contract,
method: "deposit",
params: [parseEther("0.5"), "0xUserAddress"],
});
}
Staking Withdraw
/*
* withdraw(uint256 assets, address receiver, address owner)
* The user withdraws LONG by burning sLONG.
* Note: parseEther("0.1") means 0.1 LONG tokens (not ETH).
*/
async function stakingWithdraw() {
const transaction = prepareContractCall({
contract,
method: "withdraw",
params: [parseEther("0.1"), "0xUserAddress", "0xUserAddress"],
});
}
Staking Redeem
/*
* redeem(uint256 shares, address receiver, address owner)
* The user redeems sLONG and receives LONG.
* Note: parseEther("0.1") means 0.1 LONG tokens (not ETH).
*/
async function stakingRedeem() {
const transaction = prepareContractCall({
contract,
method: "redeem",
params: [parseEther("0.1"), "0xUserAddress", "0xUserAddress"],
});
}
Emergency Withdraw
/*
* emergencyWithdraw(uint256 assets, address receiver, address owner)
* Emergency withdrawal in case of issues.
* Note: parseEther("0.1") means 0.1 LONG tokens (not ETH).
*/
async function emergencyWithdraw() {
const transaction = prepareContractCall({
contract,
method: "emergencyWithdraw",
params: [parseEther("0.1"), "0xUserAddress", "0xUserAddress"],
});
}
Emergency Redeem
/*
* emergencyRedeem(uint256 shares, address receiver, address owner)
* Emergency redemption for stuck positions.
* Note: parseEther("0.1") means 0.1 LONG tokens (not ETH).
*/
async function emergencyRedeem() {
const transaction = prepareContractCall({
contract,
method: "emergencyRedeem",
params: [parseEther("0.1"), "0xUserAddress", "0xUserAddress"],
});
}
Errors
MCP tools return errors in the standard JSON format:
{
"error": "STAKING_INSUFFICIENT_BALANCE"
}
Common error codes
| Code | Description |
|---|---|
STAKING_INSUFFICIENT_BALANCE | Not enough LONG tokens to complete the transaction. |
APPROVE_REQUIRED | Token approval is missing or insufficient. |
EMERGENCY_ONLY | Operation allowed only in emergency mode. |
INVALID_AMOUNT | Provided amount is invalid (zero or exceeds limits). |