From ce4e289514af75dbe47c33faf629b0a9cf70a99e Mon Sep 17 00:00:00 2001 From: bonkman22 Date: Wed, 2 Oct 2024 00:31:55 -0400 Subject: [PATCH] added price api --- package.json | 3 ++- src/sdk/api.ts | 6 +++++ src/sdk/routes/price.ts | 49 +++++++++++++++++++++++++++++++++++++++++ src/sdk/types/api.ts | 6 +++++ src/tests/price.test.ts | 19 ++++++++++++++++ src/tests/tx.test.ts | 34 +++++++++++++++++++--------- src/types/index.ts | 1 + 7 files changed, 107 insertions(+), 11 deletions(-) create mode 100644 src/sdk/routes/price.ts create mode 100644 src/tests/price.test.ts diff --git a/package.json b/package.json index 5ed9f70..cea25d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hop.ag/sdk", - "version": "3.2.7", + "version": "3.3.0", "description": "Official Hop SDK to access Hop Aggregator", "type": "module", "main": "dist/cjs/index.js", @@ -17,6 +17,7 @@ "test:tx": "npx tsx src/tests/tx.test.ts", "test:tokens": "npx tsx src/tests/tokens.test.ts", "test:base": "npx tsx src/tests/base.test.ts", + "test:price": "npx tsx src/tests/price.test.ts", "build": "npm run build:esm && npm run build:cjs", "build:esm": "tsc && echo '{\"type\":\"module\"}' > dist/esm/package.json", "build:cjs": "tsc --project tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json", diff --git a/src/sdk/api.ts b/src/sdk/api.ts index 4c0f1bf..4df4712 100644 --- a/src/sdk/api.ts +++ b/src/sdk/api.ts @@ -6,6 +6,7 @@ import { } from "./routes/quote.js"; import { fetchTx, GetTxParams, GetTxResponse } from "./routes/tx.js"; import { fetchTokens, GetTokensResponse } from "./routes/tokens.js"; +import { fetchPrice, GetPriceParams, GetPriceResponse } from "./routes/price.js"; export interface HopApiOptions { api_key: string; @@ -67,4 +68,9 @@ export class HopApi { async fetchTokens(): Promise { return fetchTokens(this); } + + async fetchPrice(price: GetPriceParams): Promise { + return fetchPrice(this, price); + } + } diff --git a/src/sdk/routes/price.ts b/src/sdk/routes/price.ts new file mode 100644 index 0000000..bdea755 --- /dev/null +++ b/src/sdk/routes/price.ts @@ -0,0 +1,49 @@ +import { HopApi } from "../api.js"; +import { makeAPIRequest } from "../util.js"; +import { priceResponseSchema } from "../types/api.js"; + +export interface GetPriceParams { + coin_type: string; +} + +export interface GetPriceResponse { + coin_type: string; + + price_sui: number; // returns sui per token + price_usd: number; // returns usd per token + + sui_price: number; // returns usdc per token + +} + +export async function fetchPrice( + client: HopApi, + params: GetPriceParams +): Promise { + const response = await makeAPIRequest({ + route: `price`, + options: { + api_key: client.options.api_key, + hop_server_url: client.options.hop_server_url, + data: { + coin_type: params.coin_type, + }, + method: "post", + }, + responseSchema: priceResponseSchema, + }); + + if (response?.coin_type) { + let price_usd = response.price_sui * response.sui_price; + + return { + coin_type: response?.coin_type, + price_sui: response?.price_sui, + price_usd, + sui_price: response?.sui_price + }; + } + + throw new Error("Unable to get price"); + +} \ No newline at end of file diff --git a/src/sdk/types/api.ts b/src/sdk/types/api.ts index fe5a5b9..679e01c 100644 --- a/src/sdk/types/api.ts +++ b/src/sdk/types/api.ts @@ -62,3 +62,9 @@ export const tokensResponseSchema = z.object({ token_order: z.nullable(z.number()) })) }) + +export const priceResponseSchema = z.object({ + coin_type: z.string(), + price_sui: z.number(), + sui_price: z.number() +}); diff --git a/src/tests/price.test.ts b/src/tests/price.test.ts new file mode 100644 index 0000000..0a50d98 --- /dev/null +++ b/src/tests/price.test.ts @@ -0,0 +1,19 @@ +import { HopApi } from "../index"; +import { getFullnodeUrl } from "@mysten/sui/client"; + +// @ts-ignore +async function priceTest() { + const api = new HopApi(getFullnodeUrl("mainnet"), { + api_key: "hopapisKX7I30wPvo5YfN8Vx5P9r4cPh3nzVcS", + fee_bps: 0, + // hop_server_url: "http://localhost:3002/api/v2" + }); + + const result = await api.fetchPrice({ + coin_type: "0x06b145d0322e389d6225f336ab57bba4c67e4e701bd6c6bc959d90675900a17e::meow::MEOW" + }); + + console.log("result", result); +} + +priceTest(); diff --git a/src/tests/tx.test.ts b/src/tests/tx.test.ts index 3bbfe82..e686018 100644 --- a/src/tests/tx.test.ts +++ b/src/tests/tx.test.ts @@ -5,34 +5,48 @@ import { getFullnodeUrl, SuiClient } from "@mysten/sui/client"; async function txTest(): Promise { const sui_client = new SuiClient({ url: getFullnodeUrl('mainnet') }); const api = new HopApi(getFullnodeUrl("mainnet"), { - api_key: "hopapisKX7I30wPvo5YfN8Vx5P9r4cPh3nzVcS", - fee_bps: 10, - fee_wallet: "0xa89611f02060bad390103e783a62c88725b47059e6460cf0d2f3ca32e2559641" + api_key: "", + fee_bps: 0, + // fee_wallet: "0xa89611f02060bad390103e783a62c88725b47059e6460cf0d2f3ca32e2559641" }); + const total_balance = await sui_client.getBalance({ + owner: "0x90afb76a8bfca719dadb4e77de50f65bba5327397cc7550d9c7b816907958943", + coinType: "0x71bd8693b1d17688e6671c9208e5e2499a95dce65ec690373002a72e6649f0e6::sure::SURE" + }); + + let amount_in = BigInt(total_balance.totalBalance); + const quote_result = await api.fetchQuote({ // @ts-ignore - amount_in: 1_000_000_000n, - token_in: "0x2::sui::SUI", - token_out: - "0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN", + amount_in, + token_out: "0x2::sui::SUI", + token_in: + "0x71bd8693b1d17688e6671c9208e5e2499a95dce65ec690373002a72e6649f0e6::sure::SURE", }); + console.log("amount_in", amount_in); + console.log("quote_result.trade.amount_in", quote_result.trade.amount_in.amount); + console.log("quote_result", quote_result); const tx_result = await api.fetchTx({ // @ts-ignore trade: quote_result.trade, sui_address: - "0x4466fe25550f648a4acd6823a90e1f96c77e1d37257ee3ed2d6e02a694984f73", - max_slippage_bps: 100, + "0x90afb76a8bfca719dadb4e77de50f65bba5327397cc7550d9c7b816907958943", + return_output_coin_argument: false, + // gas_budget: 1e7 + // max_slippage_bps: 100, // return_output_coin_argument: true, // base_transaction: tx, // input_coin_argument: coin, }); + // console.log("tx_result", tx_result); + const result = await sui_client.dryRunTransactionBlock({ transactionBlock: await tx_result.transaction.build({ client: sui_client }) }); - console.log("result", JSON.stringify(result, null, 2)); + // console.log("result", JSON.stringify(result, null, 2)); } txTest(); diff --git a/src/types/index.ts b/src/types/index.ts index b82591b..64a11e8 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,6 +1,7 @@ export type { GetQuoteParams, GetQuoteResponse } from "../sdk/routes/quote.js"; export type { VerifiedToken, GetTokensResponse } from "../sdk/routes/tokens.js"; export type { GetTxParams, GetTxResponse } from "../sdk/routes/tx.js"; +export type { GetPriceParams, GetPriceResponse } from "../sdk/routes/price.js"; export * from "../sdk/types/trade.js";