import { InputGenerateTransactionPayloadData, Serializer, } from "@aptos-labs/ts-sdk"; import { SwapAMMParams, SwapCLMMParams, SwapStableParams, } from "../types/swap.type"; import { TappSDK } from "../core"; import { Nullable, PoolInfo, RequestResult } from "../types"; import { ErrorNotFound } from "../common/ErrorNotFound"; export default class SwapModule { protected _sdk: TappSDK; constructor(sdk: TappSDK) { this._sdk = sdk; } swapAMMTransactionPayload({ poolId, a2b, fixedAmountIn = true, amount0, amount1, }: SwapAMMParams) { const ser = new Serializer(); ser.serializeStr(poolId); ser.serializeBool(a2b); ser.serializeBool(fixedAmountIn); ser.serializeU64(amount0); ser.serializeU64(amount1); const payload: InputGenerateTransactionPayloadData = { function: `${this._sdk.sdkConfig.contractAddress}::router::swap`, functionArguments: [ser.toUint8Array()], }; return payload; } swapCLMMTransactionPayload({ poolId, amountIn, minAmountOut, a2b, fixedAmountIn = true, targetSqrtPrice, }: SwapCLMMParams) { const ser = new Serializer(); ser.serializeStr(poolId); ser.serializeBool(a2b); ser.serializeBool(fixedAmountIn); ser.serializeU64(amountIn); ser.serializeU64(minAmountOut); ser.serializeU128(targetSqrtPrice); const payload: InputGenerateTransactionPayloadData = { function: `${this._sdk.sdkConfig.contractAddress}::router::swap`, functionArguments: [ser.toUint8Array()], }; return payload; } swapStableTransactionPayload({ poolId, tokenIn, tokenOut, amountIn, minAmountOut, }: SwapStableParams) { const ser = new Serializer(); ser.serializeStr(poolId); ser.serializeU64(tokenIn); ser.serializeU64(tokenOut); ser.serializeU256(amountIn); ser.serializeU256(minAmountOut); const payload: InputGenerateTransactionPayloadData = { function: `${this._sdk.sdkConfig.contractAddress}::router::swap`, functionArguments: [ser.toUint8Array()], }; return payload; } async getRoute(tokenAddr0: string, tokenAddr1: string) { const res = await this._sdk.request.post>>( "public/pool_info", { tokenAddrs: [tokenAddr0, tokenAddr1], } ); if (!res.result) { throw new ErrorNotFound(`Route not found. ${tokenAddr0} - ${tokenAddr1}`); } return res.result; } }