Interacciones LP
Creando Transacciones LP
Agregar Liquidez / Acuñar 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);
}
Agregar Liquidez de Capitalización / Acuñar 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);
}
Remover Liquidez / Quemar 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);
}
Remover Liquidez de Capitalización / Quemar 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);
}
Obtener precios de tokens FLP/sFLP
1.) Usando SDK (Integración Avanzada)
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.) Usando API (Rápido y Fácil)
Consulta el siguiente endpoint para obtener datos de precio para todos los pools:
https://api.prod.flash.trade/earn-page/data
✅ Formato de Respuesta (Ejemplo)
La respuesta es un objeto JSON que contiene un array de pools
, cada uno representando un pool FLP único. Aquí está lo que significa cada clave:
poolAddress
La dirección única en cadena del pool de liquidez
aum
Activos bajo gestión (en USD) para este pool
flpTokenSymbol
Símbolo para el token FLP de capitalización (ej., FLP.1
, FLP.2
)
sFlpTokenSymbol
Símbolo para el token FLP en stake (ej., sFLP.1
, sFLP.2
)
flpDailyApy
APY diario para token FLP de capitalización (auto-reinvertido)
flpWeeklyApy
APY semanal para token FLP de capitalización
flpWeeklyApr
APR semanal para token FLP de capitalización (sin capitalización)
sFlpDailyApr
APR diario para token FLP en stake (sin capitalización)
sFlpPrice
Precio actual del token FLP en stake
flpPrice
Precio actual del token FLP de capitalización
sFlpPriceWithYield
Precio derivado del token sFLP si el rendimiento se incluye en la valuación
🔎 Cómo Usar
Para obtener precios de tokens:
Coincide el
flpTokenSymbol
(ej.,"FLP.1"
) opoolAddress
para identificar tu pool deseado.Usa
flpPrice
para el token FLP de capitalización ysFlpPrice
para la versión en stake.
Este es el método más fácil para frontends y dashboards que necesitan precios en tiempo real y datos de rendimiento sin configurar el SDK o consultar la blockchain.
Última actualización
¿Te fue útil?