UNPKG

@hyperionxyz/sdk

Version:

This SDK allows you to interact with the Hyperion API. You can use it to request data, create pools/positions and more.

283 lines (256 loc) 7.96 kB
import { AccountAddress } from "@aptos-labs/ts-sdk"; import { TokenPairs } from "aptos-tool"; import BigNumber from "bignumber.js"; import { HyperionSDK } from ".."; import { QueryAllPositionByAddress, QueryPoolInfoByObjectId, } from "../config/queries/pool.query"; import { currencyCheck, POOL_STABLE_TYPE, poolDeadline, slippageCalculator, slippageCheck, } from "../utils"; import { QueryClaimedFee } from "./../config/queries/reward.query"; BigNumber.config({ EXPONENTIAL_AT: 1e9 }); export interface AddLiquidityTransactionPayloadArgs { positionId: string; currencyA: string; currencyB: string; currencyAAmount: number | string; currencyBAmount: number | string; slippage: number | string; feeTierIndex: number | string; } export interface RemoveLiquidityTransactionPayloadArgs { positionId: string; currencyA: string; currencyB: string; currencyAAmount: number | string; currencyBAmount: number | string; deltaLiquidity: number | string; slippage: number | string; // Remove to recipient: string; } export class Position { protected _sdk: HyperionSDK; constructor(sdk: HyperionSDK) { this._sdk = sdk; } async fetchAllPositionsByAddress({ address }: { address: string }) { const ret: any = await this._sdk.requestModule.queryIndexer({ document: QueryAllPositionByAddress, variables: { address, }, }); return ret?.api?.getPositionStatsByAddress || []; } async fetchPositionById(args: { positionId: string; address: string }) { const ret: any = await this._sdk.requestModule.queryIndexer({ document: QueryPoolInfoByObjectId, variables: { objectId: args.positionId, ownerAddress: args.address, }, }); return ret?.objectOwnership || []; } /** * Fetch the history of Fee Reward claim * * @param args * @returns */ async fetchFeeHistory(args: { positionId: string; address: string }) { const ret: any = await this._sdk.requestModule.queryIndexer({ document: QueryClaimedFee, variables: { objectId: args.positionId, ownerAddress: args.address, }, }); return ret.rewardStatement?.filter((item: any) => { return !new BigNumber(item.amount).isEqualTo(0); }); } // async fetchFeePayload({ positionId }: { positionId: string }) { // return { // function: `${this._sdk.sdkOptions.contractAddress}::pool_v3::get_pending_fees`, // typeArguments: [], // functionArguments: [positionId], // }; // } /** * Adds liquidity to a liquidity pool * * This method is used to add liquidity to a liquidity pool. */ async addLiquidityTransactionPayload( args: AddLiquidityTransactionPayloadArgs ) { currencyCheck(args); slippageCheck(args); const currencyAddresses: string[] = [args.currencyA, args.currencyB]; const currencyAmounts = [ BigNumber(args.currencyAAmount).toNumber(), BigNumber(args.currencyBAmount).toNumber(), ]; const currencyAmountsAfterSlippage = currencyAmounts.map( (amount: number | string) => { return slippageCalculator(amount, args.slippage); } ); const params = [ BigNumber(args.feeTierIndex).toNumber(), POOL_STABLE_TYPE, ...currencyAmounts, ...currencyAmountsAfterSlippage, poolDeadline(), ]; const paramsReverse = [...params]; [paramsReverse[2], paramsReverse[3]] = [paramsReverse[3], paramsReverse[2]]; [paramsReverse[4], paramsReverse[5]] = [paramsReverse[5], paramsReverse[4]]; return TokenPairs.TokenPairTypeCheck(currencyAddresses, [ { function: `${this._sdk.sdkOptions.contractAddress}::router_adapter::add_liquidity_entry`, typeArguments: [], functionArguments: [args.positionId, ...currencyAddresses, ...params], }, { function: `${this._sdk.sdkOptions.contractAddress}::router_adapter::add_liquidity_both_coin_entry`, typeArguments: [...currencyAddresses], functionArguments: [args.positionId, ...params], }, { function: `${this._sdk.sdkOptions.contractAddress}::router_adapter::add_liquidity_coin_entry`, typeArguments: [currencyAddresses[0]], functionArguments: [args.positionId, currencyAddresses[1], ...params], }, { function: `${this._sdk.sdkOptions.contractAddress}::router_adapter::add_liquidity_coin_entry`, typeArguments: [currencyAddresses[1]], functionArguments: [ args.positionId, currencyAddresses[0], ...paramsReverse, ], }, ]); } /** * Removes liquidity from a liquidity pool * * This method is used to remove liquidity from a liquidity pool. */ removeLiquidityTransactionPayload( args: RemoveLiquidityTransactionPayloadArgs ) { console.log(args); currencyCheck(args); slippageCheck(args); if ( !AccountAddress.isValid({ input: args.recipient, strict: true }).valid ) { throw new Error("Invalid recipient address"); } const currencyAddresses: string[] = [args.currencyA, args.currencyB]; const currencyAmounts = [ BigNumber(args.currencyAAmount).toNumber(), BigNumber(args.currencyBAmount).toNumber(), ]; const currencyAmountsAfterSlippage = currencyAmounts.map( (amount: number | string) => { return slippageCalculator(amount, args.slippage); } ); const functionArguments = [ args.positionId, BigNumber(args.deltaLiquidity).dp(0).toNumber(), ...currencyAmountsAfterSlippage, args.recipient, poolDeadline(), ]; return TokenPairs.TokenPairTypeCheck(currencyAddresses, [ { function: `${this._sdk.sdkOptions.contractAddress}::router_adapter::remove_liquidity_entry_v2`, typeArguments: [], functionArguments, }, { function: `${this._sdk.sdkOptions.contractAddress}::router_adapter::remove_liquidity_both_coins_entry_v2`, typeArguments: [...currencyAddresses], functionArguments, }, { function: `${this._sdk.sdkOptions.contractAddress}::router_adapter::remove_liquidity_coin_entry_v2`, typeArguments: [currencyAddresses[0]], functionArguments, }, { function: `${this._sdk.sdkOptions.contractAddress}::router_adapter::remove_liquidity_coin_entry_v2`, typeArguments: [currencyAddresses[1]], functionArguments, }, ]); } claimFeeTransactionPayload({ positionId, recipient, }: { positionId: string; recipient: string; }) { return { function: `${this._sdk.sdkOptions.contractAddress}::router_v3::claim_fees`, typeArguments: [], functionArguments: [[positionId], recipient], }; } claimRewardTransactionPayload({ positionId, recipient, }: { positionId: string; recipient: string; }) { return { function: `${this._sdk.sdkOptions.contractAddress}::router_v3::claim_rewards`, typeArguments: [], functionArguments: [positionId, recipient], }; } claimAllRewardsTransactionPayload({ positionId, recipient, }: { positionId: string; recipient: string; }) { return { function: `${this._sdk.sdkOptions.contractAddress}::router_v3::claim_fees_and_rewards`, typeArguments: [], functionArguments: [[positionId], recipient], }; } /** * * @param positionId * * @returns [currencyAAmount, currencyBAmount] */ async fetchTokensAmountByPositionId({ positionId }: { positionId: string }) { const payload: any = { function: `${this._sdk.sdkOptions.contractAddress}::router_v3::get_amount_by_liquidity`, typeArguments: [], functionArguments: [positionId], }; const ret: any = await this._sdk.AptosClient.view({ payload, }); return ret; } }