LPインタラクション
LPトランザクションの作成
流動性追加 / sFLPミント
const addLiquidityAndStake = async () => {
const usdcInputAmount = new BN(1_000_000); // $1
// this can be any other token available in the pool, for instance SOL, BTC and ETH
const usdcCustody = POOL_CONFIG.custodies.find(c => c.symbol === 'USDC')!;
const slippageBps: number = 800 // 0.8%
let instructions: TransactionInstruction[] = []
let additionalSigners: Signer[] = []
await flashClient.loadAddressLookupTable(POOL_CONFIG)
// flash-sdk version >= 2.31.6
const { amount: minLpAmountOut, fee } = await flashClient.getAddLiquidityAmountAndFeeView(usdcInputAmount, POOL_CONFIG.poolAddress, usdcCustody.custodyAccount, POOL_CONFIG);
const minLpAmountOutAfterSlippage = minLpAmountOut
.mul(new BN(10 ** BPS_DECIMALS - slippageBps))
.div(new BN(10 ** BPS_DECIMALS))
const setCULimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }) // addLiquidity
const addLiquidityAndStakeData = await flashClient.addLiquidityAndStake('USDC', usdcInputAmount, minLpAmountOutAfterSlippage, POOL_CONFIG);
instructions.push(...addLiquidityAndStakeData.instructions)
additionalSigners.push(...addLiquidityAndStakeData.additionalSigners)
const flpStakeAccountPK = PublicKey.findProgramAddressSync(
[Buffer.from('stake'), flashClient.provider.publicKey.toBuffer(), POOL_CONFIG.poolAddress.toBuffer()],
POOL_CONFIG.programId
)[0]
const refreshStakeInstruction = await flashClient.refreshStake('USDC', POOL_CONFIG, [flpStakeAccountPK])
instructions.push(refreshStakeInstruction)
const trxId = await flashClient.sendTransaction([setCULimitIx, ...instructions])
console.log('addLiquidityAndStake trx :>> ', trxId);
}
複利運用流動性追加 / FLPミント
const addCompoundingLiquidity = async () => {
// USDC with its decimals
const usdcInputAmount = new BN(1_000_000); // $1
// this can be any other token available in the pool, for instance SOL, BTC and ETH
const usdcCustody = POOL_CONFIG.custodies.find(c => c.symbol === 'USDC')!;
const slippageBps: number = 800 // 0.8%
let instructions: TransactionInstruction[] = []
let additionalSigners: Signer[] = []
await flashClient.loadAddressLookupTable(POOL_CONFIG)
// flash-sdk version >= 2.31.6
const { amount: minLpAmountOut, fee } = await flashClient.getAddCompoundingLiquidityAmountAndFeeView(usdcInputAmount, POOL_CONFIG.poolAddress, usdcCustody.custodyAccount, POOL_CONFIG);
const minLpAmountOutAfterSlippage = minLpAmountOut
.mul(new BN(10 ** BPS_DECIMALS - slippageBps))
.div(new BN(10 ** BPS_DECIMALS))
const setCULimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }) // addLiquidity
const addCompoundingLiquidityData = await flashClient.addCompoundingLiquidity(
usdcInputAmount,
minLpAmountOutAfterSlippage,
'USDC',
usdcCustody.mintKey,
POOL_CONFIG
)
instructions.push(...addCompoundingLiquidityData.instructions)
additionalSigners.push(...addCompoundingLiquidityData.additionalSigners)
const trxId = await flashClient.sendTransaction([setCULimitIx, ...instructions])
console.log('addCompoundingLiquidity trx :>> ', trxId);
}
流動性削除 / sFLP償却
const removeSflpLiquidity = async () => {
const usdcCustody = POOL_CONFIG.custodies.find(c => c.symbol === 'USDC')!;
const slippageBps: number = 800 // 0.8%
let instructions: TransactionInstruction[] = []
let additionalSigners: Signer[] = []
await flashClient.loadAddressLookupTable(POOL_CONFIG)
const flpStakeAccountPK = PublicKey.findProgramAddressSync(
[Buffer.from('stake'), flashClient.provider.publicKey.toBuffer(), POOL_CONFIG.poolAddress.toBuffer()],
POOL_CONFIG.programId
)[0]
const flpStakeAccount = await flashClient.program.account.flpStake.fetch(flpStakeAccountPK);
const flpWithPendingAndActive =
flpStakeAccount?.stakeStats.activeAmount.add(flpStakeAccount?.stakeStats.pendingActivation) ??
BN_ZERO
// flash-sdk version >= 2.31.6
const { amount: minTokenAmountOut, fee } = await flashClient.getRemoveLiquidityAmountAndFeeView(flpWithPendingAndActive, POOL_CONFIG.poolAddress, usdcCustody.custodyAccount, POOL_CONFIG);
const { instructions: unstakeInstantInstructions, additionalSigners: unstakeInstantAdditionalSigners } =
await flashClient.unstakeInstant('USDC', flpWithPendingAndActive, POOL_CONFIG)
const { instructions: withdrawStakeInstructions, additionalSigners: withdrawStakeAdditionalSigners } =
await flashClient.withdrawStake(POOL_CONFIG, true, true)
instructions.push(...unstakeInstantInstructions)
additionalSigners.push(...unstakeInstantAdditionalSigners)
instructions.push(...withdrawStakeInstructions)
additionalSigners.push(...withdrawStakeAdditionalSigners)
const minTokenAmountOutAfterSlippage = minTokenAmountOut
.mul(new BN(10 ** BPS_DECIMALS - slippageBps))
.div(new BN(10 ** BPS_DECIMALS))
const removeLiquidityData = await flashClient.removeLiquidity(
'USDC',
flpWithPendingAndActive,
minTokenAmountOutAfterSlippage,
POOL_CONFIG
)
instructions.push(...removeLiquidityData.instructions)
additionalSigners.push(...removeLiquidityData.additionalSigners)
const setCULimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }) // addLiquidity
const trxId = await flashClient.sendTransaction([setCULimitIx, ...instructions])
console.log('trx :>> ', trxId);
}
複利運用流動性削除 / FLP償却
const removeFlpLiquidity = async () => {
const usdcCustody = POOL_CONFIG.custodies.find(c => c.symbol === 'USDC')!;
const slippageBps: number = 800 // 0.8%
let instructions: TransactionInstruction[] = []
let additionalSigners: Signer[] = []
const usdcToken = POOL_CONFIG.tokens.find(t => t.symbol === 'USDC')!;
await flashClient.loadAddressLookupTable(POOL_CONFIG)
const account = getAssociatedTokenAddressSync(POOL_CONFIG.compoundingTokenMint, flashClient.provider.publicKey, true)
const walletBalance = await flashClient.provider.connection.getTokenAccountBalance(account, 'processed')
const compoundingTokenBalance = new BN(walletBalance.value.amount)
// flash-sdk version >= 2.31.6
const { amount: minTokenAmountOut, fee } = await flashClient.getRemoveCompoundingLiquidityAmountAndFeeView(compoundingTokenBalance, POOL_CONFIG.poolAddress, usdcCustody.custodyAccount, POOL_CONFIG);
const minTokenAmountOutAfterSlippage = minTokenAmountOut
.mul(new BN(10 ** BPS_DECIMALS - slippageBps))
.div(new BN(10 ** BPS_DECIMALS))
const removeCompoundingLiquidityData = await flashClient.removeCompoundingLiquidity(
compoundingTokenBalance,
minTokenAmountOutAfterSlippage,
'USDC',
usdcToken.mintKey,
POOL_CONFIG,
true
)
instructions.push(...removeCompoundingLiquidityData.instructions)
additionalSigners.push(...removeCompoundingLiquidityData.additionalSigners)
const setCULimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }) // addLiquidity
const trxId = await flashClient.sendTransaction([setCULimitIx, ...instructions])
console.log('trx :>> ', trxId);
}
FLP/sFLPトークン価格取得
1
SDKの使用(高度な統合)
const getLpTokenPrices = async () => {
await flashClient.loadAddressLookupTable(POOL_CONFIG)
const stakedLpPrice = await flashClient.getStakedLpTokenPrice(POOL_CONFIG.poolAddress, POOL_CONFIG); // sFLP price
const compoundingLPTokenPrice = await flashClient.getCompoundingLPTokenPrice(POOL_CONFIG.poolAddress, POOL_CONFIG); // FLP price
console.log('stakedLpPrice :>> ', stakedLpPrice);
console.log('compoundingLPTokenPrice :>> ', compoundingLPTokenPrice);
}
2
APIの使用(迅速で簡単)
すべてのプールの価格データを取得するには、以下のエンドポイントをクエリしてください:
https://api.prod.flash.trade/earn-page/data
✅ レスポンス形式(例)
レスポンスはpools
の配列を含むJSONオブジェクトであり、それぞれがユニークなFLPプールを表しています。各キーの意味は以下の通りです:
フィールド
説明
poolAddress
流動性プールのユニークなオンチェーンアドレス
aum
このプールの運用資産(USD建て)
flpTokenSymbol
複利運用FLPトークンのシンボル(例:FLP.1
、FLP.2
)
sFlpTokenSymbol
ステークドFLPトークンのシンボル(例:sFLP.1
、sFLP.2
)
flpDailyApy
複利運用FLPトークンの日次APY(自動再投資)
flpWeeklyApy
複利運用FLPトークンの週次APY
flpWeeklyApr
複利運用FLPトークンの週次APR(非複利運用)
sFlpDailyApr
ステークドFLPトークンの日次APR(非複利運用)
sFlpPrice
ステークドFLPトークンの現在価格
flpPrice
複利運用FLPトークンの現在価格
sFlpPriceWithYield
利回りが評価に含まれる場合のsFLPトークンの導出価格
🔎 使用方法
トークン価格を取得するには:
flpTokenSymbol
(例:"FLP.1"
)またはpoolAddress
を照合して、希望するプールを特定します。複利運用FLPトークンには
flpPrice
を、ステーク版にはsFlpPrice
を使用します。
これは、SDKのセットアップやブロックチェーンのクエリなしに、リアルタイムの価格設定と利回りデータを必要とするフロントエンドやダッシュボードにとって最も簡単な方法です。
最終更新
役に立ちましたか?