UNPKG

whales-otc-pre-market-aptos-sdk

Version:

TypeScript SDK for Whales OTC Pre-Market trading on Aptos blockchain

471 lines (418 loc) 12.2 kB
import { AccountAddress, Aptos, AptosConfig, MoveOption, Network, U64, type AccountAddressInput, type AptosSettings, type AnyRawTransaction, MoveVector, NetworkToNodeAPI, NetworkToIndexerAPI, NetworkToFaucetAPI, NetworkToPepperAPI, NetworkToProverAPI, InputGenerateTransactionData, } from "@aptos-labs/ts-sdk"; import type { Role, ConfigData, OtcOfferData } from "./type"; import { MAINNET, TESTNET } from "./constants"; import { EventCrawler } from "./eventCrawler"; import { InputTransactionData } from "@aptos-labs/wallet-adapter-react"; import { GraphQLConfig } from "./graphqlClient"; import { checkCoinToFa } from "./utils"; export class OTCPreMarketAptos { aptos: Aptos; packageId: string; eventCrawler: EventCrawler; constructor(aptosConfig?: AptosSettings, graphQlConfig?: GraphQLConfig) { this.aptos = new Aptos( new AptosConfig({ network: aptosConfig?.network ?? Network.MAINNET, fullnode: NetworkToNodeAPI[aptosConfig?.network ?? Network.MAINNET], indexer: NetworkToIndexerAPI[aptosConfig?.network ?? Network.MAINNET], faucet: NetworkToFaucetAPI[aptosConfig?.network ?? Network.MAINNET], pepper: NetworkToPepperAPI[aptosConfig?.network ?? Network.MAINNET], prover: NetworkToProverAPI[aptosConfig?.network ?? Network.MAINNET], ...aptosConfig, }) ); if (this.aptos.config.network === Network.MAINNET) { this.packageId = MAINNET.packageId; } else { this.packageId = TESTNET.packageId; } this.eventCrawler = new EventCrawler( this.aptos, this.packageId, graphQlConfig ); } async getConfig(): Promise<ConfigData> { const res = await this.aptos.view({ payload: { function: `${this.packageId}::otc_pre_market::get_config`, }, }); const configRaw = res as any; return { version: configRaw[0], owner: configRaw[1], feePercent: configRaw[2], feeWallet: configRaw[3], }; } async getOtcOffer(offerId: AccountAddressInput): Promise<OtcOfferData> { const res = await this.aptos.view({ payload: { function: `${this.packageId}::otc_pre_market::get_otc_offer`, functionArguments: [offerId], }, }); const offerRaw = res as any; return { orderId: offerRaw[0], isBuyer: offerRaw[1], owner: offerRaw[2], exToken: offerRaw[3], value: offerRaw[4], deadline: offerRaw[5], status: offerRaw[6], }; } async getRole(user: AccountAddressInput): Promise<Role> { const res = await this.aptos.view({ payload: { function: `${this.packageId}::otc_pre_market::get_role`, functionArguments: [user], }, }); return res[0] as number as Role; } async isOfferExpired(offerId: AccountAddressInput): Promise<boolean> { const res = await this.aptos.view({ payload: { function: `${this.packageId}::otc_pre_market::is_offer_expired`, functionArguments: [offerId], }, }); return res[0] as boolean; } async buildUpdateConfig( owner: AccountAddressInput, params: { feePercent?: number | bigint; feeWallet?: AccountAddressInput; } ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: owner, data: { function: `${this.packageId}::otc_pre_market::update_config`, functionArguments: [ new MoveOption(params.feePercent ? new U64(params.feePercent) : null), new MoveOption( params.feeWallet ? AccountAddress.from(params.feeWallet) : null ), ], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildMigrate(owner: AccountAddressInput): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: owner, data: { function: `${this.packageId}::otc_pre_market::migrate`, functionArguments: [], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildAddRole( admin: AccountAddressInput, user: AccountAddressInput, role: Role ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: admin, data: { function: `${this.packageId}::otc_pre_market::add_role`, functionArguments: [user, role], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildRemoveRole( admin: AccountAddressInput, user: AccountAddressInput ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: admin, data: { function: `${this.packageId}::otc_pre_market::remove_role`, functionArguments: [user], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildForceCancelOffer( operator: AccountAddressInput, offerObj: AccountAddressInput ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: operator, data: { function: `${this.packageId}::otc_pre_market::force_cancel_offer`, functionArguments: [offerObj], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildForceCancelOffers( operator: AccountAddressInput, offerObjs: AccountAddressInput[] ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: operator, data: { function: `${this.packageId}::otc_pre_market::force_cancel_offers`, functionArguments: [offerObjs.map((addr) => AccountAddress.from(addr))], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildCreateOffer( user: AccountAddressInput, params: { orderObj: AccountAddressInput; isBuyer: boolean; exToken: AccountAddressInput; value: number | bigint; deadline: number | bigint; } ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: user, data: { function: `${this.packageId}::otc_pre_market::create_offer`, functionArguments: [ AccountAddress.from(params.orderObj), params.isBuyer, AccountAddress.from(params.exToken), new U64(params.value), new U64(params.deadline), ], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildBatchCreateOffer( user: AccountAddressInput, params: { orderObjs: AccountAddressInput[]; isBuyers: boolean[]; exTokens: AccountAddressInput[]; values: (number | bigint)[]; deadlines: (number | bigint)[]; } ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: user, data: { function: `${this.packageId}::otc_pre_market::batch_create_offer`, functionArguments: [ params.orderObjs.map((addr) => AccountAddress.from(addr)), params.isBuyers, params.exTokens.map((addr) => AccountAddress.from(addr)), params.values.map((v) => new U64(v)), params.deadlines.map((d) => new U64(d)), ], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildUpdateOffer( user: AccountAddressInput, params: { offerObj: AccountAddressInput; newValue: number | bigint; newDeadline: number | bigint; } ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: user, data: { function: `${this.packageId}::otc_pre_market::update_offer`, functionArguments: [ AccountAddress.from(params.offerObj), new U64(params.newValue), new U64(params.newDeadline), ], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildFillOffer( user: AccountAddressInput, offerObj: AccountAddressInput ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const otcOfferData = await this.getOtcOffer(offerObj); const { useCoin, coinType } = await checkCoinToFa( this.aptos, user, otcOfferData.exToken ); let txData: InputGenerateTransactionData; if (!useCoin) { txData = { sender: user, data: { function: `${this.packageId}::otc_pre_market::fill_offer`, functionArguments: [AccountAddress.from(offerObj)], }, }; } else { txData = { sender: user, data: { function: `${this.packageId}::otc_pre_market::fill_offer_with_coin`, functionArguments: [AccountAddress.from(offerObj)], typeArguments: [coinType], }, }; } const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildCancelOffer( user: AccountAddressInput, offerObj: AccountAddressInput ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: user, data: { function: `${this.packageId}::otc_pre_market::cancel_offer`, functionArguments: [AccountAddress.from(offerObj)], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildCancelExpiredOffer( user: AccountAddressInput, offerObj: AccountAddressInput ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: user, data: { function: `${this.packageId}::otc_pre_market::cancel_expired_offer`, functionArguments: [AccountAddress.from(offerObj)], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } async buildCancelExpiredOffers( user: AccountAddressInput, offerObjs: AccountAddressInput[] ): Promise<{ rawTx: AnyRawTransaction; txData: InputTransactionData; }> { const txData: InputGenerateTransactionData = { sender: user, data: { function: `${this.packageId}::otc_pre_market::cancel_expired_offers`, functionArguments: [offerObjs.map((addr) => AccountAddress.from(addr))], }, }; const rawTx = await this.aptos.transaction.build.simple(txData); return { rawTx, txData: txData as unknown as InputTransactionData, }; } }