@decibeltrade/sdk 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-lint$colon$check.log +5 -0
- package/.turbo/turbo-lint.log +5 -0
- package/decibel_transactions.md +1049 -0
- package/dist/abi/abi-manager.d.ts +13 -0
- package/dist/abi/abi-manager.d.ts.map +1 -0
- package/dist/abi/abi-manager.js +21 -0
- package/dist/abi/abis.json +1322 -0
- package/dist/abi/bytecode-manager.d.ts +57 -0
- package/dist/abi/bytecode-manager.d.ts.map +1 -0
- package/dist/abi/bytecode-manager.js +62 -0
- package/dist/abi/bytecode.json +24 -0
- package/dist/abi/fetch-abis.d.ts +7 -0
- package/dist/abi/fetch-abis.d.ts.map +1 -0
- package/dist/abi/fetch-abis.js +132 -0
- package/dist/abi/fetch-bytecode.d.ts +24 -0
- package/dist/abi/fetch-bytecode.d.ts.map +1 -0
- package/dist/abi/fetch-bytecode.js +123 -0
- package/dist/abi/generate-abis.d.ts +6 -0
- package/dist/abi/generate-abis.d.ts.map +1 -0
- package/dist/abi/generate-abis.js +170 -0
- package/dist/abi/json/netna.json +1323 -0
- package/dist/abi/json/testnet.json +1315 -0
- package/dist/abi/types.d.ts +22 -0
- package/dist/abi/types.d.ts.map +1 -0
- package/dist/abi/types.js +2 -0
- package/dist/admin.d.ts +29 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +203 -0
- package/dist/base.d.ts +42 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +176 -0
- package/dist/constants.d.ts +41 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +78 -0
- package/dist/fee-pay.d.ts +11 -0
- package/dist/fee-pay.d.ts.map +1 -0
- package/dist/fee-pay.js +30 -0
- package/dist/gas/gas-price-manager.d.ts +35 -0
- package/dist/gas/gas-price-manager.d.ts.map +1 -0
- package/dist/gas/gas-price-manager.js +93 -0
- package/dist/gas-price-manager.d.ts +31 -0
- package/dist/gas-price-manager.d.ts.map +1 -0
- package/dist/gas-price-manager.js +84 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/order-event.types.d.ts +55 -0
- package/dist/order-event.types.d.ts.map +1 -0
- package/dist/order-event.types.js +3 -0
- package/dist/order-status.d.ts +43 -0
- package/dist/order-status.d.ts.map +1 -0
- package/dist/order-status.js +86 -0
- package/dist/read/account-overview/account-overview.reader.d.ts +37 -0
- package/dist/read/account-overview/account-overview.reader.d.ts.map +1 -0
- package/dist/read/account-overview/account-overview.reader.js +35 -0
- package/dist/read/account-overview/account-overview.types.d.ts +52 -0
- package/dist/read/account-overview/account-overview.types.d.ts.map +1 -0
- package/dist/read/account-overview/account-overview.types.js +36 -0
- package/dist/read/api-wallets/api-wallets.reader.d.ts +17 -0
- package/dist/read/api-wallets/api-wallets.reader.d.ts.map +1 -0
- package/dist/read/api-wallets/api-wallets.reader.js +27 -0
- package/dist/read/api-wallets/api-wallets.types.d.ts +17 -0
- package/dist/read/api-wallets/api-wallets.types.d.ts.map +1 -0
- package/dist/read/api-wallets/api-wallets.types.js +13 -0
- package/dist/read/base-reader.d.ts +22 -0
- package/dist/read/base-reader.d.ts.map +1 -0
- package/dist/read/base-reader.js +29 -0
- package/dist/read/candlesticks/candlesticks.reader.d.ts +31 -0
- package/dist/read/candlesticks/candlesticks.reader.d.ts.map +1 -0
- package/dist/read/candlesticks/candlesticks.reader.js +43 -0
- package/dist/read/candlesticks/candlesticks.types.d.ts +45 -0
- package/dist/read/candlesticks/candlesticks.types.d.ts.map +1 -0
- package/dist/read/candlesticks/candlesticks.types.js +36 -0
- package/dist/read/delegations/delegations.reader.d.ts +15 -0
- package/dist/read/delegations/delegations.reader.d.ts.map +1 -0
- package/dist/read/delegations/delegations.reader.js +23 -0
- package/dist/read/delegations/delegations.types.d.ts +17 -0
- package/dist/read/delegations/delegations.types.d.ts.map +1 -0
- package/dist/read/delegations/delegations.types.js +13 -0
- package/dist/read/index.d.ts +105 -0
- package/dist/read/index.d.ts.map +1 -0
- package/dist/read/index.js +244 -0
- package/dist/read/leaderboard/leaderboard.reader.d.ts +21 -0
- package/dist/read/leaderboard/leaderboard.reader.d.ts.map +1 -0
- package/dist/read/leaderboard/leaderboard.reader.js +22 -0
- package/dist/read/leaderboard/leaderboard.types.d.ts +27 -0
- package/dist/read/leaderboard/leaderboard.types.d.ts.map +1 -0
- package/dist/read/leaderboard/leaderboard.types.js +14 -0
- package/dist/read/market-contexts/market-contexts.reader.d.ts +22 -0
- package/dist/read/market-contexts/market-contexts.reader.d.ts.map +1 -0
- package/dist/read/market-contexts/market-contexts.reader.js +27 -0
- package/dist/read/market-contexts/market-contexts.types.d.ts +26 -0
- package/dist/read/market-contexts/market-contexts.types.d.ts.map +1 -0
- package/dist/read/market-contexts/market-contexts.types.js +19 -0
- package/dist/read/market-depth/market-depth.reader.d.ts +30 -0
- package/dist/read/market-depth/market-depth.reader.d.ts.map +1 -0
- package/dist/read/market-depth/market-depth.reader.js +46 -0
- package/dist/read/market-depth/market-depth.types.d.ts +20 -0
- package/dist/read/market-depth/market-depth.types.d.ts.map +1 -0
- package/dist/read/market-depth/market-depth.types.js +16 -0
- package/dist/read/market-prices/market-prices.reader.d.ts +44 -0
- package/dist/read/market-prices/market-prices.reader.d.ts.map +1 -0
- package/dist/read/market-prices/market-prices.reader.js +51 -0
- package/dist/read/market-prices/market-prices.types.d.ts +48 -0
- package/dist/read/market-prices/market-prices.types.d.ts.map +1 -0
- package/dist/read/market-prices/market-prices.types.js +26 -0
- package/dist/read/market-trades/market-trades.reader.d.ts +33 -0
- package/dist/read/market-trades/market-trades.reader.d.ts.map +1 -0
- package/dist/read/market-trades/market-trades.reader.js +39 -0
- package/dist/read/market-trades/market-trades.types.d.ts +52 -0
- package/dist/read/market-trades/market-trades.types.d.ts.map +1 -0
- package/dist/read/market-trades/market-trades.types.js +23 -0
- package/dist/read/markets/markets.reader.d.ts +38 -0
- package/dist/read/markets/markets.reader.d.ts.map +1 -0
- package/dist/read/markets/markets.reader.js +80 -0
- package/dist/read/markets/markets.types.d.ts +82 -0
- package/dist/read/markets/markets.types.d.ts.map +1 -0
- package/dist/read/markets/markets.types.js +46 -0
- package/dist/read/pagination.types.d.ts +14 -0
- package/dist/read/pagination.types.d.ts.map +1 -0
- package/dist/read/pagination.types.js +12 -0
- package/dist/read/portfolio-chart/portfolio-chart.reader.d.ts +14 -0
- package/dist/read/portfolio-chart/portfolio-chart.reader.d.ts.map +1 -0
- package/dist/read/portfolio-chart/portfolio-chart.reader.js +21 -0
- package/dist/read/portfolio-chart/portfolio-chart.types.d.ts +14 -0
- package/dist/read/portfolio-chart/portfolio-chart.types.d.ts.map +1 -0
- package/dist/read/portfolio-chart/portfolio-chart.types.js +12 -0
- package/dist/read/public-vaults/public-vaults.reader.d.ts +38 -0
- package/dist/read/public-vaults/public-vaults.reader.d.ts.map +1 -0
- package/dist/read/public-vaults/public-vaults.reader.js +31 -0
- package/dist/read/public-vaults/public-vaults.types.d.ts +62 -0
- package/dist/read/public-vaults/public-vaults.types.d.ts.map +1 -0
- package/dist/read/public-vaults/public-vaults.types.js +33 -0
- package/dist/read/types.d.ts +178 -0
- package/dist/read/types.d.ts.map +1 -0
- package/dist/read/types.js +87 -0
- package/dist/read/user-active-twaps/user-active-twaps.reader.d.ts +31 -0
- package/dist/read/user-active-twaps/user-active-twaps.reader.d.ts.map +1 -0
- package/dist/read/user-active-twaps/user-active-twaps.reader.js +31 -0
- package/dist/read/user-active-twaps/user-active-twaps.types.d.ts +49 -0
- package/dist/read/user-active-twaps/user-active-twaps.types.d.ts.map +1 -0
- package/dist/read/user-active-twaps/user-active-twaps.types.js +25 -0
- package/dist/read/user-bulk-orders/user-bulk-orders.reader.d.ts +31 -0
- package/dist/read/user-bulk-orders/user-bulk-orders.reader.d.ts.map +1 -0
- package/dist/read/user-bulk-orders/user-bulk-orders.reader.js +32 -0
- package/dist/read/user-bulk-orders/user-bulk-orders.types.d.ts +46 -0
- package/dist/read/user-bulk-orders/user-bulk-orders.types.d.ts.map +1 -0
- package/dist/read/user-bulk-orders/user-bulk-orders.types.js +24 -0
- package/dist/read/user-funding-history/user-funding-history.reader.d.ts +28 -0
- package/dist/read/user-funding-history/user-funding-history.reader.d.ts.map +1 -0
- package/dist/read/user-funding-history/user-funding-history.reader.js +32 -0
- package/dist/read/user-funding-history/user-funding-history.types.d.ts +37 -0
- package/dist/read/user-funding-history/user-funding-history.types.d.ts.map +1 -0
- package/dist/read/user-funding-history/user-funding-history.types.js +21 -0
- package/dist/read/user-notifications/user-notifications.reader.d.ts +13 -0
- package/dist/read/user-notifications/user-notifications.reader.d.ts.map +1 -0
- package/dist/read/user-notifications/user-notifications.reader.js +19 -0
- package/dist/read/user-notifications/user-notifications.types.d.ts +49 -0
- package/dist/read/user-notifications/user-notifications.types.d.ts.map +1 -0
- package/dist/read/user-notifications/user-notifications.types.js +18 -0
- package/dist/read/user-open-orders/user-open-orders.reader.d.ts +40 -0
- package/dist/read/user-open-orders/user-open-orders.reader.d.ts.map +1 -0
- package/dist/read/user-open-orders/user-open-orders.reader.js +31 -0
- package/dist/read/user-open-orders/user-open-orders.types.d.ts +76 -0
- package/dist/read/user-open-orders/user-open-orders.types.d.ts.map +1 -0
- package/dist/read/user-open-orders/user-open-orders.types.js +34 -0
- package/dist/read/user-order-history/user-order-history.reader.d.ts +40 -0
- package/dist/read/user-order-history/user-order-history.reader.d.ts.map +1 -0
- package/dist/read/user-order-history/user-order-history.reader.js +28 -0
- package/dist/read/user-order-history/user-order-history.types.d.ts +85 -0
- package/dist/read/user-order-history/user-order-history.types.d.ts.map +1 -0
- package/dist/read/user-order-history/user-order-history.types.js +37 -0
- package/dist/read/user-positions/user-positions.reader.d.ts +37 -0
- package/dist/read/user-positions/user-positions.reader.d.ts.map +1 -0
- package/dist/read/user-positions/user-positions.reader.js +41 -0
- package/dist/read/user-positions/user-positions.types.d.ts +2590 -0
- package/dist/read/user-positions/user-positions.types.d.ts.map +1 -0
- package/dist/read/user-positions/user-positions.types.js +31 -0
- package/dist/read/user-subaccounts/user-subaccounts.reader.d.ts +18 -0
- package/dist/read/user-subaccounts/user-subaccounts.reader.d.ts.map +1 -0
- package/dist/read/user-subaccounts/user-subaccounts.reader.js +28 -0
- package/dist/read/user-subaccounts/user-subaccounts.types.d.ts +21 -0
- package/dist/read/user-subaccounts/user-subaccounts.types.d.ts.map +1 -0
- package/dist/read/user-subaccounts/user-subaccounts.types.js +15 -0
- package/dist/read/user-trade-history/user-trade-history.reader.d.ts +33 -0
- package/dist/read/user-trade-history/user-trade-history.reader.d.ts.map +1 -0
- package/dist/read/user-trade-history/user-trade-history.reader.js +32 -0
- package/dist/read/user-trade-history/user-trade-history.types.d.ts +52 -0
- package/dist/read/user-trade-history/user-trade-history.types.d.ts.map +1 -0
- package/dist/read/user-trade-history/user-trade-history.types.js +26 -0
- package/dist/read/user-vaults/user-vaults.reader.d.ts +26 -0
- package/dist/read/user-vaults/user-vaults.reader.d.ts.map +1 -0
- package/dist/read/user-vaults/user-vaults.reader.js +32 -0
- package/dist/read/user-vaults/user-vaults.types.d.ts +39 -0
- package/dist/read/user-vaults/user-vaults.types.d.ts.map +1 -0
- package/dist/read/user-vaults/user-vaults.types.js +21 -0
- package/dist/read/vault/vault.reader.d.ts +95 -0
- package/dist/read/vault/vault.reader.d.ts.map +1 -0
- package/dist/read/vault/vault.reader.js +168 -0
- package/dist/read/vault/vault.types.d.ts +49 -0
- package/dist/read/vault/vault.types.d.ts.map +1 -0
- package/dist/read/vault/vault.types.js +45 -0
- package/dist/read/vaults/vaults.reader.d.ts +72 -0
- package/dist/read/vaults/vaults.reader.d.ts.map +1 -0
- package/dist/read/vaults/vaults.reader.js +63 -0
- package/dist/read/vaults/vaults.types.d.ts +140 -0
- package/dist/read/vaults/vaults.types.d.ts.map +1 -0
- package/dist/read/vaults/vaults.types.js +71 -0
- package/dist/read/ws-subscription.d.ts +21 -0
- package/dist/read/ws-subscription.d.ts.map +1 -0
- package/dist/read/ws-subscription.js +170 -0
- package/dist/subaccount-types.d.ts +24 -0
- package/dist/subaccount-types.d.ts.map +1 -0
- package/dist/subaccount-types.js +11 -0
- package/dist/transaction-builder.d.ts +14 -0
- package/dist/transaction-builder.d.ts.map +1 -0
- package/dist/transaction-builder.js +40 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils.d.ts +56 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +164 -0
- package/dist/vault-types.d.ts +43 -0
- package/dist/vault-types.d.ts.map +1 -0
- package/dist/vault-types.js +11 -0
- package/dist/write.d.ts +271 -0
- package/dist/write.d.ts.map +1 -0
- package/dist/write.js +485 -0
- package/eslint.config.mjs +25 -0
- package/package.json +39 -0
- package/readme.md +257 -0
- package/sdk_reference.md +876 -0
- package/src/abi/generate-abis.ts +164 -0
- package/src/abi/json/netna.json +1323 -0
- package/src/abi/json/testnet.json +1315 -0
- package/src/abi/types.ts +23 -0
- package/src/admin.ts +284 -0
- package/src/base.ts +218 -0
- package/src/constants.ts +118 -0
- package/src/fee-pay.ts +39 -0
- package/src/gas/gas-price-manager.ts +115 -0
- package/src/index.ts +10 -0
- package/src/order-event.types.ts +65 -0
- package/src/order-status.ts +89 -0
- package/src/read/account-overview/account-overview.reader.ts +43 -0
- package/src/read/account-overview/account-overview.types.ts +45 -0
- package/src/read/base-reader.ts +41 -0
- package/src/read/candlesticks/candlesticks.reader.ts +61 -0
- package/src/read/candlesticks/candlesticks.types.ts +46 -0
- package/src/read/delegations/delegations.reader.ts +22 -0
- package/src/read/delegations/delegations.types.ts +19 -0
- package/src/read/index.ts +271 -0
- package/src/read/leaderboard/leaderboard.reader.ts +21 -0
- package/src/read/leaderboard/leaderboard.types.ts +26 -0
- package/src/read/market-contexts/market-contexts.reader.ts +26 -0
- package/src/read/market-contexts/market-contexts.types.ts +18 -0
- package/src/read/market-depth/market-depth.reader.ts +60 -0
- package/src/read/market-depth/market-depth.types.ts +24 -0
- package/src/read/market-prices/market-prices.reader.ts +61 -0
- package/src/read/market-prices/market-prices.types.ts +38 -0
- package/src/read/market-trades/market-trades.reader.ts +46 -0
- package/src/read/market-trades/market-trades.types.ts +34 -0
- package/src/read/markets/markets.reader.ts +82 -0
- package/src/read/markets/markets.types.ts +54 -0
- package/src/read/pagination.types.ts +18 -0
- package/src/read/portfolio-chart/portfolio-chart.reader.ts +20 -0
- package/src/read/portfolio-chart/portfolio-chart.types.ts +21 -0
- package/src/read/types.ts +129 -0
- package/src/read/user-active-twaps/user-active-twaps.reader.ts +36 -0
- package/src/read/user-active-twaps/user-active-twaps.types.ts +33 -0
- package/src/read/user-bulk-orders/user-bulk-orders.reader.ts +37 -0
- package/src/read/user-bulk-orders/user-bulk-orders.types.ts +32 -0
- package/src/read/user-funding-history/user-funding-history.reader.ts +38 -0
- package/src/read/user-funding-history/user-funding-history.types.ts +29 -0
- package/src/read/user-notifications/user-notifications.reader.ts +17 -0
- package/src/read/user-notifications/user-notifications.types.ts +61 -0
- package/src/read/user-open-orders/user-open-orders.reader.ts +36 -0
- package/src/read/user-open-orders/user-open-orders.types.ts +42 -0
- package/src/read/user-order-history/user-order-history.reader.ts +34 -0
- package/src/read/user-order-history/user-order-history.types.ts +44 -0
- package/src/read/user-positions/user-positions.reader.ts +55 -0
- package/src/read/user-positions/user-positions.types.ts +43 -0
- package/src/read/user-subaccounts/user-subaccounts.reader.ts +30 -0
- package/src/read/user-subaccounts/user-subaccounts.types.ts +21 -0
- package/src/read/user-trade-history/user-trade-history.reader.ts +38 -0
- package/src/read/user-trade-history/user-trade-history.types.ts +33 -0
- package/src/read/vaults/vaults.reader.ts +79 -0
- package/src/read/vaults/vaults.types.ts +106 -0
- package/src/read/ws-subscription.ts +200 -0
- package/src/subaccount-types.ts +31 -0
- package/src/transaction-builder.ts +75 -0
- package/src/utils.ts +255 -0
- package/src/write.ts +965 -0
- package/tsconfig.json +8 -0
package/src/write.ts
ADDED
|
@@ -0,0 +1,965 @@
|
|
|
1
|
+
import { Account, AccountAddress, CommittedTransactionResponse } from "@aptos-labs/ts-sdk";
|
|
2
|
+
|
|
3
|
+
import { BaseSDK, Options } from "./base";
|
|
4
|
+
import { DecibelConfig } from "./constants";
|
|
5
|
+
import { OrderEvent, PlaceOrderResult, TwapEvent } from "./order-event.types";
|
|
6
|
+
import { OrderStatusClient } from "./order-status";
|
|
7
|
+
import {
|
|
8
|
+
ActivateVaultArgs,
|
|
9
|
+
CreateVaultArgs,
|
|
10
|
+
DepositToVaultArgs,
|
|
11
|
+
WithdrawFromVaultArgs,
|
|
12
|
+
} from "./read";
|
|
13
|
+
import { RenameSubaccountArgs, RenameSubaccountSchema } from "./subaccount-types";
|
|
14
|
+
import { getMarketAddr, getPrimarySubaccountAddr, postRequest } from "./utils";
|
|
15
|
+
|
|
16
|
+
export const TimeInForce = {
|
|
17
|
+
GoodTillCanceled: 0,
|
|
18
|
+
PostOnly: 1,
|
|
19
|
+
ImmediateOrCancel: 2,
|
|
20
|
+
} as const;
|
|
21
|
+
export type TimeInForce = (typeof TimeInForce)[keyof typeof TimeInForce];
|
|
22
|
+
|
|
23
|
+
interface Cache {
|
|
24
|
+
usdcDecimals?: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
type WithSignerAddress<T> = T & {
|
|
28
|
+
signerAddress: AccountAddress;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Rounds price to the nearest tick size multiple
|
|
33
|
+
* @param price The price to round
|
|
34
|
+
* @param tickSize The market's tick size
|
|
35
|
+
* @returns Price rounded to nearest tick size multiple
|
|
36
|
+
*/
|
|
37
|
+
function roundToTickSize(price: number, tickSize: number): number {
|
|
38
|
+
if (price === 0 || tickSize === 0) return 0;
|
|
39
|
+
return Math.round(price / tickSize) * tickSize;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class DecibelWriteDex extends BaseSDK {
|
|
43
|
+
readonly cache: Cache;
|
|
44
|
+
readonly orderStatusClient: OrderStatusClient;
|
|
45
|
+
|
|
46
|
+
constructor(config: DecibelConfig, account: Account, opts?: Options) {
|
|
47
|
+
super(config, account, opts);
|
|
48
|
+
this.cache = {};
|
|
49
|
+
this.orderStatusClient = new OrderStatusClient(config);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Extract order_id from OrderEvent in transaction response
|
|
54
|
+
*/
|
|
55
|
+
private extractOrderIdFromTransaction(
|
|
56
|
+
txResponse: CommittedTransactionResponse,
|
|
57
|
+
subaccountAddr?: string,
|
|
58
|
+
): string | null {
|
|
59
|
+
const orderEvents = ["market_types::OrderEvent", "async_matching_engine::TwapEvent"];
|
|
60
|
+
try {
|
|
61
|
+
// Check if the response is a UserTransactionResponse with events
|
|
62
|
+
if ("events" in txResponse && Array.isArray(txResponse.events)) {
|
|
63
|
+
for (const event of txResponse.events) {
|
|
64
|
+
// Check if this is an OrderEvent from the market module
|
|
65
|
+
for (const orderEvent of orderEvents) {
|
|
66
|
+
if (event.type.includes(orderEvent)) {
|
|
67
|
+
const orderEvent = event.data as OrderEvent | TwapEvent;
|
|
68
|
+
// Verify the event's user field matches the subaccount placing the order
|
|
69
|
+
const userAddress = subaccountAddr ?? this.account.accountAddress;
|
|
70
|
+
const orderUserAddress = (orderEvent as OrderEvent).user;
|
|
71
|
+
const twapUserAddress = (orderEvent as TwapEvent).account;
|
|
72
|
+
if (orderUserAddress === userAddress || twapUserAddress === userAddress) {
|
|
73
|
+
return typeof orderEvent.order_id === "string"
|
|
74
|
+
? orderEvent.order_id
|
|
75
|
+
: orderEvent.order_id.order_id;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
} catch (error) {
|
|
83
|
+
console.error("Error extracting order_id from transaction:", error);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async renameSubaccount({ subaccountAddress, newName }: RenameSubaccountArgs) {
|
|
89
|
+
return await postRequest({
|
|
90
|
+
schema: RenameSubaccountSchema,
|
|
91
|
+
url: `${this.config.tradingHttpUrl}/api/v1/subaccounts/${subaccountAddress}`,
|
|
92
|
+
body: { name: newName },
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async createSubaccount() {
|
|
97
|
+
return await this.sendTx({
|
|
98
|
+
function: `${this.config.deployment.package}::dex_accounts::create_new_subaccount`,
|
|
99
|
+
typeArguments: [],
|
|
100
|
+
functionArguments: [],
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async sendSubaccountTx(
|
|
105
|
+
sendTx: (subaccountAddr: string) => Promise<CommittedTransactionResponse>,
|
|
106
|
+
subaccountAddr?: string,
|
|
107
|
+
) {
|
|
108
|
+
if (!subaccountAddr) {
|
|
109
|
+
subaccountAddr = getPrimarySubaccountAddr(this.account.accountAddress);
|
|
110
|
+
}
|
|
111
|
+
return await sendTx(subaccountAddr);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async withSubaccount<T>(fn: (subaccountAddr: string) => Promise<T>, subaccountAddr?: string) {
|
|
115
|
+
if (!subaccountAddr) {
|
|
116
|
+
subaccountAddr = getPrimarySubaccountAddr(this.account.accountAddress);
|
|
117
|
+
}
|
|
118
|
+
return await fn(subaccountAddr);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* @param amount u64 amount of collateral to deposit
|
|
122
|
+
*/
|
|
123
|
+
async deposit(amount: number, subaccountAddr?: string) {
|
|
124
|
+
if (!subaccountAddr) {
|
|
125
|
+
return await this.sendTx({
|
|
126
|
+
function: `${this.config.deployment.package}::dex_accounts::deposit_to_subaccount`,
|
|
127
|
+
typeArguments: [],
|
|
128
|
+
functionArguments: [this.config.deployment.usdc, amount],
|
|
129
|
+
});
|
|
130
|
+
} else {
|
|
131
|
+
return await this.sendSubaccountTx(
|
|
132
|
+
(subaccountAddr) =>
|
|
133
|
+
this.sendTx({
|
|
134
|
+
function: `${this.config.deployment.package}::dex_accounts::deposit_to_subaccount_at`,
|
|
135
|
+
typeArguments: [],
|
|
136
|
+
functionArguments: [subaccountAddr, this.config.deployment.usdc, amount],
|
|
137
|
+
}),
|
|
138
|
+
subaccountAddr,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @param amount u64 amount of collateral to withdraw
|
|
145
|
+
*/
|
|
146
|
+
async withdraw(amount: number, subaccountAddr?: string) {
|
|
147
|
+
return await this.sendSubaccountTx(
|
|
148
|
+
(subaccountAddr) =>
|
|
149
|
+
this.sendTx({
|
|
150
|
+
function: `${this.config.deployment.package}::dex_accounts::withdraw_from_subaccount`,
|
|
151
|
+
typeArguments: [],
|
|
152
|
+
functionArguments: [subaccountAddr, this.config.deployment.usdc, amount],
|
|
153
|
+
}),
|
|
154
|
+
subaccountAddr,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async configureUserSettingsForMarket({
|
|
159
|
+
marketAddr,
|
|
160
|
+
subaccountAddr,
|
|
161
|
+
isCross,
|
|
162
|
+
userLeverage,
|
|
163
|
+
}: {
|
|
164
|
+
marketAddr: string;
|
|
165
|
+
subaccountAddr: string;
|
|
166
|
+
isCross: boolean;
|
|
167
|
+
userLeverage: number;
|
|
168
|
+
}) {
|
|
169
|
+
return await this.sendSubaccountTx(
|
|
170
|
+
(subaccountAddr) =>
|
|
171
|
+
this.sendTx({
|
|
172
|
+
function: `${this.config.deployment.package}::dex_accounts::configure_user_settings_for_market`,
|
|
173
|
+
typeArguments: [],
|
|
174
|
+
functionArguments: [subaccountAddr, marketAddr, isCross, userLeverage],
|
|
175
|
+
}),
|
|
176
|
+
subaccountAddr,
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async placeOrder({
|
|
181
|
+
marketName,
|
|
182
|
+
price,
|
|
183
|
+
size,
|
|
184
|
+
isBuy,
|
|
185
|
+
timeInForce,
|
|
186
|
+
isReduceOnly,
|
|
187
|
+
clientOrderId,
|
|
188
|
+
stopPrice,
|
|
189
|
+
tpTriggerPrice,
|
|
190
|
+
tpLimitPrice,
|
|
191
|
+
slTriggerPrice,
|
|
192
|
+
slLimitPrice,
|
|
193
|
+
builderAddr,
|
|
194
|
+
builderFee,
|
|
195
|
+
subaccountAddr,
|
|
196
|
+
accountOverride,
|
|
197
|
+
tickSize,
|
|
198
|
+
}: {
|
|
199
|
+
marketName: string;
|
|
200
|
+
price: number;
|
|
201
|
+
size: number;
|
|
202
|
+
isBuy: boolean;
|
|
203
|
+
timeInForce: TimeInForce;
|
|
204
|
+
isReduceOnly: boolean;
|
|
205
|
+
clientOrderId?: string;
|
|
206
|
+
stopPrice?: number;
|
|
207
|
+
tpTriggerPrice?: number;
|
|
208
|
+
tpLimitPrice?: number;
|
|
209
|
+
slTriggerPrice?: number;
|
|
210
|
+
slLimitPrice?: number;
|
|
211
|
+
builderAddr?: string;
|
|
212
|
+
builderFee?: number;
|
|
213
|
+
subaccountAddr?: string;
|
|
214
|
+
/**
|
|
215
|
+
* Optional account to use for the transaction. Primarily set as the session
|
|
216
|
+
* account. If not provided, the default constructor account will be used
|
|
217
|
+
*/
|
|
218
|
+
accountOverride?: Account;
|
|
219
|
+
/**
|
|
220
|
+
* Market tick size for price rounding. If not provided, no rounding is applied.
|
|
221
|
+
*/
|
|
222
|
+
tickSize?: number;
|
|
223
|
+
}): Promise<PlaceOrderResult> {
|
|
224
|
+
try {
|
|
225
|
+
const marketAddr = getMarketAddr(marketName, this.config.deployment.perpEngineGlobal);
|
|
226
|
+
|
|
227
|
+
// Apply tick size rounding if tickSize is provided
|
|
228
|
+
const roundedPrice = tickSize ? roundToTickSize(price, tickSize) : price;
|
|
229
|
+
const roundedStopPrice =
|
|
230
|
+
stopPrice !== undefined && tickSize ? roundToTickSize(stopPrice, tickSize) : stopPrice;
|
|
231
|
+
const roundedTpTriggerPrice =
|
|
232
|
+
tpTriggerPrice !== undefined && tickSize
|
|
233
|
+
? roundToTickSize(tpTriggerPrice, tickSize)
|
|
234
|
+
: tpTriggerPrice;
|
|
235
|
+
const roundedTpLimitPrice =
|
|
236
|
+
tpLimitPrice !== undefined && tickSize
|
|
237
|
+
? roundToTickSize(tpLimitPrice, tickSize)
|
|
238
|
+
: tpLimitPrice;
|
|
239
|
+
const roundedSlTriggerPrice =
|
|
240
|
+
slTriggerPrice !== undefined && tickSize
|
|
241
|
+
? roundToTickSize(slTriggerPrice, tickSize)
|
|
242
|
+
: slTriggerPrice;
|
|
243
|
+
const roundedSlLimitPrice =
|
|
244
|
+
slLimitPrice !== undefined && tickSize
|
|
245
|
+
? roundToTickSize(slLimitPrice, tickSize)
|
|
246
|
+
: slLimitPrice;
|
|
247
|
+
|
|
248
|
+
const txResponse = await this.sendSubaccountTx(
|
|
249
|
+
(subaccountAddr) =>
|
|
250
|
+
this.sendTx(
|
|
251
|
+
{
|
|
252
|
+
function: `${this.config.deployment.package}::dex_accounts::place_order_to_subaccount`,
|
|
253
|
+
typeArguments: [],
|
|
254
|
+
functionArguments: [
|
|
255
|
+
subaccountAddr,
|
|
256
|
+
marketAddr.toString(),
|
|
257
|
+
roundedPrice,
|
|
258
|
+
size,
|
|
259
|
+
isBuy,
|
|
260
|
+
timeInForce,
|
|
261
|
+
isReduceOnly,
|
|
262
|
+
clientOrderId,
|
|
263
|
+
roundedStopPrice,
|
|
264
|
+
roundedTpTriggerPrice,
|
|
265
|
+
roundedTpLimitPrice,
|
|
266
|
+
roundedSlTriggerPrice,
|
|
267
|
+
roundedSlLimitPrice,
|
|
268
|
+
builderAddr,
|
|
269
|
+
builderFee,
|
|
270
|
+
],
|
|
271
|
+
},
|
|
272
|
+
accountOverride,
|
|
273
|
+
),
|
|
274
|
+
subaccountAddr,
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
// Extract order_id from the transaction events
|
|
278
|
+
const orderId = this.extractOrderIdFromTransaction(txResponse, subaccountAddr);
|
|
279
|
+
|
|
280
|
+
return {
|
|
281
|
+
success: true,
|
|
282
|
+
orderId: orderId || undefined,
|
|
283
|
+
transactionHash: txResponse.hash,
|
|
284
|
+
};
|
|
285
|
+
} catch (error) {
|
|
286
|
+
console.error("Error placing order:", error);
|
|
287
|
+
return {
|
|
288
|
+
success: false,
|
|
289
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
async triggerMatching({ marketAddr, maxWorkUnit }: { marketAddr: string; maxWorkUnit: number }) {
|
|
295
|
+
const txResponse = await this.sendTx({
|
|
296
|
+
function: `${this.config.deployment.package}::public_apis::trigger_matching`,
|
|
297
|
+
typeArguments: [],
|
|
298
|
+
functionArguments: [marketAddr, maxWorkUnit],
|
|
299
|
+
});
|
|
300
|
+
return {
|
|
301
|
+
success: true,
|
|
302
|
+
transactionHash: txResponse.hash,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
async placeTwapOrder({
|
|
307
|
+
marketName,
|
|
308
|
+
size,
|
|
309
|
+
isBuy,
|
|
310
|
+
isReduceOnly,
|
|
311
|
+
// clientOrderId,
|
|
312
|
+
twapFrequencySeconds,
|
|
313
|
+
twapDurationSeconds,
|
|
314
|
+
builderAddress,
|
|
315
|
+
builderFees,
|
|
316
|
+
subaccountAddr,
|
|
317
|
+
accountOverride,
|
|
318
|
+
}: {
|
|
319
|
+
marketName: string;
|
|
320
|
+
size: number;
|
|
321
|
+
isBuy: boolean;
|
|
322
|
+
isReduceOnly: boolean;
|
|
323
|
+
// clientOrderId?: string;
|
|
324
|
+
twapFrequencySeconds: number;
|
|
325
|
+
twapDurationSeconds: number;
|
|
326
|
+
builderAddress?: string;
|
|
327
|
+
builderFees?: number;
|
|
328
|
+
subaccountAddr?: string;
|
|
329
|
+
/**
|
|
330
|
+
* Optional account to use for the transaction. Primarily set as the session
|
|
331
|
+
* account. If not provided, the default constructor account will be used
|
|
332
|
+
*/
|
|
333
|
+
accountOverride?: Account;
|
|
334
|
+
}) {
|
|
335
|
+
const marketAddr = getMarketAddr(marketName, this.config.deployment.perpEngineGlobal);
|
|
336
|
+
const txResponse = await this.sendSubaccountTx(
|
|
337
|
+
(subaccountAddr) =>
|
|
338
|
+
this.sendTx(
|
|
339
|
+
{
|
|
340
|
+
// TODO: update to place_twap_order_to_subaccount_v2 once available
|
|
341
|
+
function: `${this.config.deployment.package}::dex_accounts::place_twap_order_to_subaccount`,
|
|
342
|
+
typeArguments: [],
|
|
343
|
+
functionArguments: [
|
|
344
|
+
subaccountAddr,
|
|
345
|
+
marketAddr.toString(),
|
|
346
|
+
size,
|
|
347
|
+
isBuy,
|
|
348
|
+
isReduceOnly,
|
|
349
|
+
// clientOrderId, // TODO: include once v2 is available
|
|
350
|
+
twapFrequencySeconds,
|
|
351
|
+
twapDurationSeconds,
|
|
352
|
+
builderAddress,
|
|
353
|
+
builderFees,
|
|
354
|
+
],
|
|
355
|
+
},
|
|
356
|
+
accountOverride,
|
|
357
|
+
),
|
|
358
|
+
subaccountAddr,
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
const orderId = this.extractOrderIdFromTransaction(txResponse, subaccountAddr);
|
|
362
|
+
|
|
363
|
+
return {
|
|
364
|
+
success: true,
|
|
365
|
+
orderId: orderId || undefined,
|
|
366
|
+
transactionHash: txResponse.hash,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Cancel an order on the exchange
|
|
372
|
+
* @param orderId The id of the order to cancel
|
|
373
|
+
* @param marketId The id of the market the order is in
|
|
374
|
+
* @param subaccountAddr Optional subaccount address, will use primary if not provided
|
|
375
|
+
* @returns Transaction response
|
|
376
|
+
*/
|
|
377
|
+
async cancelOrder({
|
|
378
|
+
orderId,
|
|
379
|
+
subaccountAddr,
|
|
380
|
+
accountOverride,
|
|
381
|
+
...args
|
|
382
|
+
}: {
|
|
383
|
+
orderId: number | string;
|
|
384
|
+
|
|
385
|
+
subaccountAddr?: string;
|
|
386
|
+
/**
|
|
387
|
+
* Optional account to use for the transaction. Primarily set as the session
|
|
388
|
+
* account. If not provided, the default constructor account will be used
|
|
389
|
+
*/
|
|
390
|
+
accountOverride?: Account;
|
|
391
|
+
} & ({ marketName: string } | { marketAddr: string })) {
|
|
392
|
+
// Either marketName or marketAddr must be provided
|
|
393
|
+
const marketAddr =
|
|
394
|
+
"marketName" in args
|
|
395
|
+
? getMarketAddr(args.marketName, this.config.deployment.perpEngineGlobal)
|
|
396
|
+
: args.marketAddr;
|
|
397
|
+
|
|
398
|
+
return await this.sendSubaccountTx(
|
|
399
|
+
(subaccountAddr) =>
|
|
400
|
+
this.sendTx(
|
|
401
|
+
{
|
|
402
|
+
function: `${this.config.deployment.package}::dex_accounts::cancel_order_to_subaccount`,
|
|
403
|
+
typeArguments: [],
|
|
404
|
+
functionArguments: [subaccountAddr, BigInt(orderId.toString()), marketAddr.toString()],
|
|
405
|
+
},
|
|
406
|
+
accountOverride,
|
|
407
|
+
),
|
|
408
|
+
subaccountAddr,
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
async cancelClientOrder({
|
|
413
|
+
clientOrderId,
|
|
414
|
+
marketName,
|
|
415
|
+
subaccountAddr,
|
|
416
|
+
accountOverride,
|
|
417
|
+
}: {
|
|
418
|
+
clientOrderId: string;
|
|
419
|
+
marketName: string;
|
|
420
|
+
subaccountAddr?: string;
|
|
421
|
+
/**
|
|
422
|
+
* Optional account to use for the transaction. Primarily set as the session
|
|
423
|
+
* account. If not provided, the default constructor account will be used
|
|
424
|
+
*/
|
|
425
|
+
accountOverride?: Account;
|
|
426
|
+
}) {
|
|
427
|
+
const marketAddr = getMarketAddr(marketName, this.config.deployment.perpEngineGlobal);
|
|
428
|
+
return await this.sendSubaccountTx(
|
|
429
|
+
(subaccountAddr) =>
|
|
430
|
+
this.sendTx(
|
|
431
|
+
{
|
|
432
|
+
function: `${this.config.deployment.package}::dex_accounts::cancel_client_order_to_subaccount`,
|
|
433
|
+
typeArguments: [],
|
|
434
|
+
functionArguments: [subaccountAddr, clientOrderId, marketAddr.toString()],
|
|
435
|
+
},
|
|
436
|
+
accountOverride,
|
|
437
|
+
),
|
|
438
|
+
subaccountAddr,
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
async delegateTradingTo({
|
|
443
|
+
subaccountAddr,
|
|
444
|
+
accountToDelegateTo,
|
|
445
|
+
}: {
|
|
446
|
+
subaccountAddr?: string;
|
|
447
|
+
accountToDelegateTo: string;
|
|
448
|
+
}) {
|
|
449
|
+
return await this.sendSubaccountTx(
|
|
450
|
+
(subaccountAddr) =>
|
|
451
|
+
this.sendTx({
|
|
452
|
+
function: `${this.config.deployment.package}::dex_accounts::delegate_trading_to`,
|
|
453
|
+
typeArguments: [],
|
|
454
|
+
functionArguments: [subaccountAddr, accountToDelegateTo],
|
|
455
|
+
}),
|
|
456
|
+
subaccountAddr,
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
async revokeDelegation({
|
|
461
|
+
subaccountAddr,
|
|
462
|
+
accountToRevoke,
|
|
463
|
+
}: {
|
|
464
|
+
subaccountAddr?: string;
|
|
465
|
+
accountToRevoke: string;
|
|
466
|
+
}) {
|
|
467
|
+
return await this.sendSubaccountTx(
|
|
468
|
+
(subaccountAddr) =>
|
|
469
|
+
this.sendTx({
|
|
470
|
+
function: `${this.config.deployment.package}::dex_accounts::revoke_delegation`,
|
|
471
|
+
typeArguments: [],
|
|
472
|
+
functionArguments: [subaccountAddr, accountToRevoke],
|
|
473
|
+
}),
|
|
474
|
+
subaccountAddr,
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Place a TP/SL order for a position
|
|
480
|
+
*/
|
|
481
|
+
async placeTpSlOrderForPosition({
|
|
482
|
+
marketAddr,
|
|
483
|
+
tpTriggerPrice,
|
|
484
|
+
tpLimitPrice,
|
|
485
|
+
tpSize,
|
|
486
|
+
slTriggerPrice,
|
|
487
|
+
slLimitPrice,
|
|
488
|
+
slSize,
|
|
489
|
+
subaccountAddr,
|
|
490
|
+
accountOverride,
|
|
491
|
+
tickSize,
|
|
492
|
+
}: {
|
|
493
|
+
marketAddr: string;
|
|
494
|
+
tpTriggerPrice?: number;
|
|
495
|
+
tpLimitPrice?: number;
|
|
496
|
+
tpSize?: number;
|
|
497
|
+
slTriggerPrice?: number;
|
|
498
|
+
slLimitPrice?: number;
|
|
499
|
+
slSize?: number;
|
|
500
|
+
subaccountAddr?: string;
|
|
501
|
+
accountOverride?: Account;
|
|
502
|
+
tickSize?: number;
|
|
503
|
+
}) {
|
|
504
|
+
const roundedTpTriggerPrice =
|
|
505
|
+
tpTriggerPrice !== undefined && tickSize
|
|
506
|
+
? roundToTickSize(tpTriggerPrice, tickSize)
|
|
507
|
+
: tpTriggerPrice;
|
|
508
|
+
const roundedTpLimitPrice =
|
|
509
|
+
tpLimitPrice !== undefined && tickSize
|
|
510
|
+
? roundToTickSize(tpLimitPrice, tickSize)
|
|
511
|
+
: tpLimitPrice;
|
|
512
|
+
const roundedSlTriggerPrice =
|
|
513
|
+
slTriggerPrice !== undefined && tickSize
|
|
514
|
+
? roundToTickSize(slTriggerPrice, tickSize)
|
|
515
|
+
: slTriggerPrice;
|
|
516
|
+
const roundedSlLimitPrice =
|
|
517
|
+
slLimitPrice !== undefined && tickSize
|
|
518
|
+
? roundToTickSize(slLimitPrice, tickSize)
|
|
519
|
+
: slLimitPrice;
|
|
520
|
+
|
|
521
|
+
return await this.sendSubaccountTx(
|
|
522
|
+
(subaccountAddr) =>
|
|
523
|
+
this.sendTx(
|
|
524
|
+
{
|
|
525
|
+
function: `${this.config.deployment.package}::dex_accounts::place_tp_sl_order_for_position`,
|
|
526
|
+
typeArguments: [],
|
|
527
|
+
functionArguments: [
|
|
528
|
+
subaccountAddr,
|
|
529
|
+
marketAddr,
|
|
530
|
+
roundedTpTriggerPrice,
|
|
531
|
+
roundedTpLimitPrice,
|
|
532
|
+
tpSize,
|
|
533
|
+
roundedSlTriggerPrice,
|
|
534
|
+
roundedSlLimitPrice,
|
|
535
|
+
slSize,
|
|
536
|
+
undefined, // builderAddr
|
|
537
|
+
undefined, // builderFees
|
|
538
|
+
],
|
|
539
|
+
},
|
|
540
|
+
accountOverride,
|
|
541
|
+
),
|
|
542
|
+
subaccountAddr,
|
|
543
|
+
);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Update TP for a position
|
|
548
|
+
*/
|
|
549
|
+
async updateTpOrderForPosition({
|
|
550
|
+
marketAddr,
|
|
551
|
+
prevOrderId,
|
|
552
|
+
tpTriggerPrice,
|
|
553
|
+
tpLimitPrice,
|
|
554
|
+
tpSize,
|
|
555
|
+
subaccountAddr,
|
|
556
|
+
accountOverride,
|
|
557
|
+
}: {
|
|
558
|
+
marketAddr: string;
|
|
559
|
+
prevOrderId: number | string;
|
|
560
|
+
tpTriggerPrice?: number;
|
|
561
|
+
tpLimitPrice?: number;
|
|
562
|
+
tpSize?: number;
|
|
563
|
+
subaccountAddr?: string;
|
|
564
|
+
accountOverride?: Account;
|
|
565
|
+
}) {
|
|
566
|
+
return await this.sendSubaccountTx(
|
|
567
|
+
(subaccountAddr) =>
|
|
568
|
+
this.sendTx(
|
|
569
|
+
{
|
|
570
|
+
function: `${this.config.deployment.package}::dex_accounts::update_tp_order_for_position`,
|
|
571
|
+
typeArguments: [],
|
|
572
|
+
functionArguments: [
|
|
573
|
+
subaccountAddr,
|
|
574
|
+
BigInt(prevOrderId.toString()),
|
|
575
|
+
marketAddr,
|
|
576
|
+
tpTriggerPrice,
|
|
577
|
+
tpLimitPrice,
|
|
578
|
+
tpSize,
|
|
579
|
+
],
|
|
580
|
+
},
|
|
581
|
+
accountOverride,
|
|
582
|
+
),
|
|
583
|
+
subaccountAddr,
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* Update SL for a position
|
|
589
|
+
*/
|
|
590
|
+
async updateSlOrderForPosition({
|
|
591
|
+
marketAddr,
|
|
592
|
+
prevOrderId,
|
|
593
|
+
slTriggerPrice,
|
|
594
|
+
slLimitPrice,
|
|
595
|
+
slSize,
|
|
596
|
+
subaccountAddr,
|
|
597
|
+
accountOverride,
|
|
598
|
+
}: {
|
|
599
|
+
marketAddr: string;
|
|
600
|
+
prevOrderId: number | string;
|
|
601
|
+
slTriggerPrice?: number;
|
|
602
|
+
slLimitPrice?: number;
|
|
603
|
+
slSize?: number;
|
|
604
|
+
subaccountAddr?: string;
|
|
605
|
+
accountOverride?: Account;
|
|
606
|
+
}) {
|
|
607
|
+
return await this.sendSubaccountTx(
|
|
608
|
+
(subaccountAddr) =>
|
|
609
|
+
this.sendTx(
|
|
610
|
+
{
|
|
611
|
+
function: `${this.config.deployment.package}::dex_accounts::update_sl_order_for_position`,
|
|
612
|
+
typeArguments: [],
|
|
613
|
+
functionArguments: [
|
|
614
|
+
subaccountAddr,
|
|
615
|
+
BigInt(prevOrderId.toString()),
|
|
616
|
+
marketAddr,
|
|
617
|
+
slTriggerPrice,
|
|
618
|
+
slLimitPrice,
|
|
619
|
+
slSize,
|
|
620
|
+
],
|
|
621
|
+
},
|
|
622
|
+
accountOverride,
|
|
623
|
+
),
|
|
624
|
+
subaccountAddr,
|
|
625
|
+
);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* Cancel a TP/SL order for a position
|
|
630
|
+
*/
|
|
631
|
+
async cancelTpSlOrderForPosition({
|
|
632
|
+
marketAddr,
|
|
633
|
+
orderId,
|
|
634
|
+
subaccountAddr,
|
|
635
|
+
accountOverride,
|
|
636
|
+
}: {
|
|
637
|
+
marketAddr: string;
|
|
638
|
+
orderId: number | string;
|
|
639
|
+
subaccountAddr?: string;
|
|
640
|
+
accountOverride?: Account;
|
|
641
|
+
}) {
|
|
642
|
+
return await this.sendSubaccountTx(
|
|
643
|
+
(subaccountAddr) =>
|
|
644
|
+
this.sendTx(
|
|
645
|
+
{
|
|
646
|
+
function: `${this.config.deployment.package}::dex_accounts::cancel_tp_sl_order_for_position`,
|
|
647
|
+
typeArguments: [],
|
|
648
|
+
functionArguments: [subaccountAddr, marketAddr, BigInt(orderId.toString())],
|
|
649
|
+
},
|
|
650
|
+
accountOverride,
|
|
651
|
+
),
|
|
652
|
+
subaccountAddr,
|
|
653
|
+
);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
async cancelTwapOrder({
|
|
657
|
+
orderId,
|
|
658
|
+
marketAddr,
|
|
659
|
+
subaccountAddr,
|
|
660
|
+
accountOverride,
|
|
661
|
+
}: {
|
|
662
|
+
orderId: string;
|
|
663
|
+
marketAddr: string;
|
|
664
|
+
subaccountAddr?: string;
|
|
665
|
+
/**
|
|
666
|
+
* Optional account to use for the transaction. Primarily set as the session
|
|
667
|
+
* account. If not provided, the default constructor account will be used
|
|
668
|
+
*/
|
|
669
|
+
accountOverride?: Account;
|
|
670
|
+
}) {
|
|
671
|
+
return await this.sendSubaccountTx(
|
|
672
|
+
(subaccountAddr) =>
|
|
673
|
+
this.sendTx(
|
|
674
|
+
{
|
|
675
|
+
function: `${this.config.deployment.package}::dex_accounts::cancel_twap_orders_to_subaccount`,
|
|
676
|
+
typeArguments: [],
|
|
677
|
+
functionArguments: [subaccountAddr, marketAddr, orderId],
|
|
678
|
+
},
|
|
679
|
+
accountOverride,
|
|
680
|
+
),
|
|
681
|
+
subaccountAddr,
|
|
682
|
+
);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
async buildDeactiveSubaccountTx({
|
|
686
|
+
subaccountAddr,
|
|
687
|
+
revokeAllDelegations = true,
|
|
688
|
+
signerAddress,
|
|
689
|
+
}: WithSignerAddress<{
|
|
690
|
+
subaccountAddr: string;
|
|
691
|
+
revokeAllDelegations: boolean;
|
|
692
|
+
}>) {
|
|
693
|
+
const transaction = await this.buildTx(
|
|
694
|
+
{
|
|
695
|
+
function: `${this.config.deployment.package}::dex_accounts::deactivate_subaccount`,
|
|
696
|
+
typeArguments: [],
|
|
697
|
+
functionArguments: [subaccountAddr, revokeAllDelegations],
|
|
698
|
+
},
|
|
699
|
+
signerAddress,
|
|
700
|
+
);
|
|
701
|
+
return transaction;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
// ======= VAULT FUNCTIONS =======
|
|
705
|
+
|
|
706
|
+
// @Todo: We can move this to another Class and this doesnt requires subaccount so dont belong in here
|
|
707
|
+
/**
|
|
708
|
+
* Create a new vault with optional initial funding
|
|
709
|
+
*/
|
|
710
|
+
async buildCreateVaultTx({
|
|
711
|
+
contributionAssetType,
|
|
712
|
+
vaultName,
|
|
713
|
+
vaultShareSymbol,
|
|
714
|
+
vaultShareIconUri = "",
|
|
715
|
+
vaultShareProjectUri = "",
|
|
716
|
+
feeBps,
|
|
717
|
+
feeIntervalS,
|
|
718
|
+
contributionLockupDurationS,
|
|
719
|
+
initialFunding = 0,
|
|
720
|
+
acceptsContributions = false,
|
|
721
|
+
delegateToCreator = false,
|
|
722
|
+
signerAddress,
|
|
723
|
+
vaultDescription,
|
|
724
|
+
vaultSocialLinks,
|
|
725
|
+
}: WithSignerAddress<CreateVaultArgs>) {
|
|
726
|
+
const transaction = await this.buildTx(
|
|
727
|
+
{
|
|
728
|
+
function: `${this.config.deployment.package}::vault::create_and_fund_vault`,
|
|
729
|
+
typeArguments: [],
|
|
730
|
+
functionArguments: [
|
|
731
|
+
contributionAssetType,
|
|
732
|
+
vaultName,
|
|
733
|
+
vaultDescription,
|
|
734
|
+
vaultSocialLinks,
|
|
735
|
+
vaultShareSymbol,
|
|
736
|
+
vaultShareIconUri,
|
|
737
|
+
vaultShareProjectUri,
|
|
738
|
+
feeBps,
|
|
739
|
+
feeIntervalS,
|
|
740
|
+
contributionLockupDurationS,
|
|
741
|
+
initialFunding,
|
|
742
|
+
acceptsContributions,
|
|
743
|
+
delegateToCreator,
|
|
744
|
+
],
|
|
745
|
+
},
|
|
746
|
+
signerAddress,
|
|
747
|
+
);
|
|
748
|
+
|
|
749
|
+
return transaction;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
async createVault(
|
|
753
|
+
args: CreateVaultArgs & {
|
|
754
|
+
/**
|
|
755
|
+
* Optional account to use for the transaction. Primarily set as the session
|
|
756
|
+
* account. If not provided, the default constructor account will be used
|
|
757
|
+
*/
|
|
758
|
+
accountOverride?: Account;
|
|
759
|
+
subaccountAddr?: string;
|
|
760
|
+
},
|
|
761
|
+
) {
|
|
762
|
+
const txResponse = await this.sendSubaccountTx(
|
|
763
|
+
() =>
|
|
764
|
+
this.sendTx(
|
|
765
|
+
{
|
|
766
|
+
function: `${this.config.deployment.package}::vault::create_and_fund_vault`,
|
|
767
|
+
typeArguments: [],
|
|
768
|
+
functionArguments: [
|
|
769
|
+
args.contributionAssetType,
|
|
770
|
+
args.vaultName,
|
|
771
|
+
args.vaultDescription,
|
|
772
|
+
args.vaultSocialLinks,
|
|
773
|
+
args.vaultShareSymbol,
|
|
774
|
+
args.vaultShareIconUri,
|
|
775
|
+
args.vaultShareProjectUri,
|
|
776
|
+
args.feeBps,
|
|
777
|
+
args.feeIntervalS,
|
|
778
|
+
args.contributionLockupDurationS,
|
|
779
|
+
args.initialFunding,
|
|
780
|
+
args.acceptsContributions,
|
|
781
|
+
args.delegateToCreator,
|
|
782
|
+
],
|
|
783
|
+
},
|
|
784
|
+
args.accountOverride,
|
|
785
|
+
),
|
|
786
|
+
args.subaccountAddr,
|
|
787
|
+
);
|
|
788
|
+
|
|
789
|
+
return txResponse;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
/**
|
|
793
|
+
* Activate a vault to accept contributions
|
|
794
|
+
*/
|
|
795
|
+
async buildActivateVaultTx({
|
|
796
|
+
vaultAddress,
|
|
797
|
+
additionalFunding = 0,
|
|
798
|
+
signerAddress,
|
|
799
|
+
}: WithSignerAddress<ActivateVaultArgs>) {
|
|
800
|
+
return await this.buildTx(
|
|
801
|
+
{
|
|
802
|
+
function: `${this.config.deployment.package}::vault::activate_vault`,
|
|
803
|
+
typeArguments: [],
|
|
804
|
+
functionArguments: [vaultAddress, additionalFunding],
|
|
805
|
+
},
|
|
806
|
+
signerAddress,
|
|
807
|
+
);
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* Contribute funds to a vault in exchange for shares
|
|
812
|
+
*/
|
|
813
|
+
async buildDepositToVaultTx({
|
|
814
|
+
vaultAddress,
|
|
815
|
+
amount,
|
|
816
|
+
signerAddress,
|
|
817
|
+
}: WithSignerAddress<DepositToVaultArgs>) {
|
|
818
|
+
return await this.buildTx(
|
|
819
|
+
{
|
|
820
|
+
function: `${this.config.deployment.package}::vault::contribute`,
|
|
821
|
+
typeArguments: [],
|
|
822
|
+
functionArguments: [vaultAddress, amount],
|
|
823
|
+
},
|
|
824
|
+
signerAddress,
|
|
825
|
+
);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
async depositToVault(
|
|
829
|
+
args: DepositToVaultArgs & {
|
|
830
|
+
subaccountAddr: string;
|
|
831
|
+
},
|
|
832
|
+
) {
|
|
833
|
+
const txResponse = await this.sendSubaccountTx(
|
|
834
|
+
(subaccountAddr) =>
|
|
835
|
+
this.sendTx({
|
|
836
|
+
function: `${this.config.deployment.package}::dex_accounts_vault_extension::contribute_to_vault`,
|
|
837
|
+
typeArguments: [],
|
|
838
|
+
functionArguments: [
|
|
839
|
+
subaccountAddr,
|
|
840
|
+
args.vaultAddress,
|
|
841
|
+
this.config.deployment.usdc,
|
|
842
|
+
args.amount,
|
|
843
|
+
],
|
|
844
|
+
}),
|
|
845
|
+
args.subaccountAddr,
|
|
846
|
+
);
|
|
847
|
+
|
|
848
|
+
return txResponse;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/**
|
|
852
|
+
* Redeem shares from a vault for underlying assets
|
|
853
|
+
*/
|
|
854
|
+
async buildWithdrawFromVaultTx({
|
|
855
|
+
vaultAddress,
|
|
856
|
+
shares,
|
|
857
|
+
signerAddress,
|
|
858
|
+
}: WithSignerAddress<WithdrawFromVaultArgs>) {
|
|
859
|
+
return await this.buildTx(
|
|
860
|
+
{
|
|
861
|
+
function: `${this.config.deployment.package}::vault::redeem`,
|
|
862
|
+
typeArguments: [],
|
|
863
|
+
functionArguments: [vaultAddress, shares],
|
|
864
|
+
},
|
|
865
|
+
signerAddress,
|
|
866
|
+
);
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
async withdrawFromVault(
|
|
870
|
+
args: WithdrawFromVaultArgs & {
|
|
871
|
+
/**
|
|
872
|
+
* Optional account to use for the transaction. Primarily set as the session
|
|
873
|
+
* account. If not provided, the default constructor account will be used
|
|
874
|
+
*/
|
|
875
|
+
accountOverride?: Account;
|
|
876
|
+
subaccountAddr?: string;
|
|
877
|
+
},
|
|
878
|
+
) {
|
|
879
|
+
const txResponse = await this.sendSubaccountTx(
|
|
880
|
+
(subaccountAddr) =>
|
|
881
|
+
this.sendTx(
|
|
882
|
+
{
|
|
883
|
+
function: `${this.config.deployment.package}::dex_accounts_vault_extension::redeem_from_vault`,
|
|
884
|
+
typeArguments: [],
|
|
885
|
+
functionArguments: [subaccountAddr, args.vaultAddress, args.shares],
|
|
886
|
+
},
|
|
887
|
+
args.accountOverride,
|
|
888
|
+
),
|
|
889
|
+
args.subaccountAddr,
|
|
890
|
+
);
|
|
891
|
+
|
|
892
|
+
return txResponse;
|
|
893
|
+
}
|
|
894
|
+
/**
|
|
895
|
+
* Delegate trading to another account for a vault
|
|
896
|
+
*/
|
|
897
|
+
async buildDelegateDexActionsToTx({
|
|
898
|
+
vaultAddress,
|
|
899
|
+
accountToDelegateTo,
|
|
900
|
+
signerAddress,
|
|
901
|
+
expirationTimestampSecs,
|
|
902
|
+
}: WithSignerAddress<{
|
|
903
|
+
vaultAddress: string;
|
|
904
|
+
accountToDelegateTo: string;
|
|
905
|
+
expirationTimestampSecs?: number;
|
|
906
|
+
}>) {
|
|
907
|
+
return await this.buildTx(
|
|
908
|
+
{
|
|
909
|
+
function: `${this.config.deployment.package}::vault::delegate_dex_actions_to`,
|
|
910
|
+
typeArguments: [],
|
|
911
|
+
functionArguments: [vaultAddress, accountToDelegateTo, expirationTimestampSecs],
|
|
912
|
+
},
|
|
913
|
+
signerAddress,
|
|
914
|
+
);
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
/**
|
|
918
|
+
* Approve max builder fee for a subaccount
|
|
919
|
+
* @param builderAddr The address of the builder
|
|
920
|
+
* @param maxFee The maximum fee in basis points (e.g., 100 = 0.01%)
|
|
921
|
+
* @param subaccountAddr Optional subaccount address, will use primary if not provided
|
|
922
|
+
*/
|
|
923
|
+
async approveMaxBuilderFee({
|
|
924
|
+
builderAddr,
|
|
925
|
+
maxFee,
|
|
926
|
+
subaccountAddr,
|
|
927
|
+
}: {
|
|
928
|
+
builderAddr: string;
|
|
929
|
+
maxFee: number;
|
|
930
|
+
subaccountAddr?: string;
|
|
931
|
+
}) {
|
|
932
|
+
return await this.sendSubaccountTx(
|
|
933
|
+
(subaccountAddr) =>
|
|
934
|
+
this.sendTx({
|
|
935
|
+
function: `${this.config.deployment.package}::dex_accounts::approve_max_builder_fee_for_subaccount`,
|
|
936
|
+
typeArguments: [],
|
|
937
|
+
functionArguments: [subaccountAddr, builderAddr, maxFee],
|
|
938
|
+
}),
|
|
939
|
+
subaccountAddr,
|
|
940
|
+
);
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
/**
|
|
944
|
+
* Revoke max builder fee for a subaccount
|
|
945
|
+
* @param builderAddr The address of the builder
|
|
946
|
+
* @param subaccountAddr Optional subaccount address, will use primary if not provided
|
|
947
|
+
*/
|
|
948
|
+
async revokeMaxBuilderFee({
|
|
949
|
+
builderAddr,
|
|
950
|
+
subaccountAddr,
|
|
951
|
+
}: {
|
|
952
|
+
builderAddr: string;
|
|
953
|
+
subaccountAddr?: string;
|
|
954
|
+
}) {
|
|
955
|
+
return await this.sendSubaccountTx(
|
|
956
|
+
(subaccountAddr) =>
|
|
957
|
+
this.sendTx({
|
|
958
|
+
function: `${this.config.deployment.package}::dex_accounts::revoke_max_builder_fee_for_subaccount`,
|
|
959
|
+
typeArguments: [],
|
|
960
|
+
functionArguments: [subaccountAddr, builderAddr],
|
|
961
|
+
}),
|
|
962
|
+
subaccountAddr,
|
|
963
|
+
);
|
|
964
|
+
}
|
|
965
|
+
}
|