@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
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Aptos, AptosConfig } from "@aptos-labs/ts-sdk";
|
|
2
|
+
|
|
3
|
+
import { DecibelConfig } from "../constants";
|
|
4
|
+
|
|
5
|
+
export interface GasPriceInfo {
|
|
6
|
+
gasEstimate: number;
|
|
7
|
+
timestamp: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface GasPriceManagerOptions {
|
|
11
|
+
nodeApiKey?: string;
|
|
12
|
+
multiplier: number;
|
|
13
|
+
refreshIntervalMs: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class GasPriceManager {
|
|
17
|
+
private gasPrice: GasPriceInfo | null = null;
|
|
18
|
+
private intervalId: NodeJS.Timeout | null = null;
|
|
19
|
+
private readonly aptos: Aptos;
|
|
20
|
+
private readonly refreshIntervalMs: number;
|
|
21
|
+
private isInitialized = false;
|
|
22
|
+
private readonly multiplier: number;
|
|
23
|
+
|
|
24
|
+
constructor(config: DecibelConfig, opts?: GasPriceManagerOptions) {
|
|
25
|
+
this.aptos = new Aptos(
|
|
26
|
+
new AptosConfig({
|
|
27
|
+
network: config.network,
|
|
28
|
+
fullnode: config.fullnodeUrl,
|
|
29
|
+
clientConfig: { API_KEY: opts?.nodeApiKey },
|
|
30
|
+
}),
|
|
31
|
+
);
|
|
32
|
+
this.refreshIntervalMs = opts?.refreshIntervalMs ?? 60_000; // default to 1 minute
|
|
33
|
+
this.multiplier = opts?.multiplier ?? 2; // default to 2x multilier to ensure we have enough gas for the transactipon
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
getGasPrice(): number | undefined {
|
|
37
|
+
const estimatedGasPrice = this.gasPrice?.gasEstimate;
|
|
38
|
+
if (!estimatedGasPrice) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return estimatedGasPrice;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Initialize the gas price manager and start fetching gas prices
|
|
46
|
+
*/
|
|
47
|
+
async initialize(): Promise<void> {
|
|
48
|
+
try {
|
|
49
|
+
if (this.isInitialized) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Fetch initial gas price
|
|
54
|
+
await this.fetchAndSetGasPrice();
|
|
55
|
+
|
|
56
|
+
// Set up interval to refresh gas price
|
|
57
|
+
this.intervalId = setInterval(async () => {
|
|
58
|
+
try {
|
|
59
|
+
await this.fetchAndSetGasPrice();
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.warn("Failed to fetch gas price:", error);
|
|
62
|
+
}
|
|
63
|
+
}, this.refreshIntervalMs);
|
|
64
|
+
|
|
65
|
+
this.isInitialized = true;
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error("Failed to initialize gas price manager:", error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
refresh() {
|
|
72
|
+
void this.fetchAndSetGasPrice();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Stop the gas price manager and clear the interval
|
|
77
|
+
*/
|
|
78
|
+
destroy(): void {
|
|
79
|
+
if (this.intervalId) {
|
|
80
|
+
clearInterval(this.intervalId);
|
|
81
|
+
this.intervalId = null;
|
|
82
|
+
}
|
|
83
|
+
this.isInitialized = false;
|
|
84
|
+
this.gasPrice = null; // Clear cached data
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async fetchGasPriceEstimation(): Promise<number> {
|
|
88
|
+
return this.aptos.getGasPriceEstimation().then((gasEstimation) => {
|
|
89
|
+
return gasEstimation.gas_estimate * this.multiplier; // Multiplier is applied here to ensure we have enough gas for the transaction
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Fetch gas price from the network
|
|
95
|
+
*/
|
|
96
|
+
async fetchAndSetGasPrice(): Promise<number> {
|
|
97
|
+
try {
|
|
98
|
+
const gasEstimate = await this.fetchGasPriceEstimation();
|
|
99
|
+
|
|
100
|
+
if (!gasEstimate) {
|
|
101
|
+
throw new Error("Gas estimation returned no gas estimate");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
this.gasPrice = {
|
|
105
|
+
gasEstimate,
|
|
106
|
+
timestamp: Date.now(),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
return gasEstimate;
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.error("Failed to fetch gas price:", error);
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./admin";
|
|
2
|
+
export * from "./constants";
|
|
3
|
+
export * from "./fee-pay";
|
|
4
|
+
export * from "./gas/gas-price-manager";
|
|
5
|
+
export * from "./order-event.types";
|
|
6
|
+
export * from "./order-status";
|
|
7
|
+
export * from "./read/index";
|
|
8
|
+
export * from "./subaccount-types";
|
|
9
|
+
export * from "./utils";
|
|
10
|
+
export * from "./write";
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Type definitions for OrderEvent returned by placeOrder transactions
|
|
2
|
+
|
|
3
|
+
export interface OrderEventClientOrderId {
|
|
4
|
+
vec: unknown[];
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface OrderEventStatus {
|
|
8
|
+
__variant__: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface OrderEventTimeInForce {
|
|
12
|
+
__variant__: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface OrderEventTriggerCondition {
|
|
16
|
+
vec: unknown[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface OrderEventOrderId {
|
|
20
|
+
order_id: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface OrderEvent {
|
|
24
|
+
client_order_id: OrderEventClientOrderId;
|
|
25
|
+
details: string;
|
|
26
|
+
is_bid: boolean;
|
|
27
|
+
is_taker: boolean;
|
|
28
|
+
market: string;
|
|
29
|
+
metadata_bytes: string;
|
|
30
|
+
order_id: string;
|
|
31
|
+
orig_size: string;
|
|
32
|
+
parent: string;
|
|
33
|
+
price: string;
|
|
34
|
+
remaining_size: string;
|
|
35
|
+
size_delta: string;
|
|
36
|
+
status: OrderEventStatus;
|
|
37
|
+
time_in_force: OrderEventTimeInForce;
|
|
38
|
+
trigger_condition: OrderEventTriggerCondition;
|
|
39
|
+
user: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface TwapEvent {
|
|
43
|
+
account: string;
|
|
44
|
+
duration_s: string;
|
|
45
|
+
frequency_s: string;
|
|
46
|
+
is_buy: boolean;
|
|
47
|
+
is_reduce_only: boolean;
|
|
48
|
+
market: string;
|
|
49
|
+
order_id: OrderEventOrderId;
|
|
50
|
+
orig_size: string;
|
|
51
|
+
remain_size: string;
|
|
52
|
+
start_time_s: string;
|
|
53
|
+
status: OrderEventStatus;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type PlaceOrderResult =
|
|
57
|
+
| {
|
|
58
|
+
success: true;
|
|
59
|
+
orderId: string | undefined;
|
|
60
|
+
transactionHash: string;
|
|
61
|
+
}
|
|
62
|
+
| {
|
|
63
|
+
success: false;
|
|
64
|
+
error: string;
|
|
65
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import z from "zod/v4";
|
|
2
|
+
|
|
3
|
+
import { DecibelConfig } from "./constants";
|
|
4
|
+
|
|
5
|
+
// Order status response schema
|
|
6
|
+
export const OrderStatusSchema = z.object({
|
|
7
|
+
parent: z.string(),
|
|
8
|
+
market: z.string(),
|
|
9
|
+
order_id: z.string(),
|
|
10
|
+
status: z.string(),
|
|
11
|
+
orig_size: z.number(),
|
|
12
|
+
remaining_size: z.number(),
|
|
13
|
+
size_delta: z.number(),
|
|
14
|
+
price: z.number(),
|
|
15
|
+
is_buy: z.boolean(),
|
|
16
|
+
details: z.string(),
|
|
17
|
+
transaction_version: z.number(),
|
|
18
|
+
unix_ms: z.number(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type OrderStatus = z.infer<typeof OrderStatusSchema>;
|
|
22
|
+
|
|
23
|
+
export type OrderStatusType = "Acknowledged" | "Filled" | "Cancelled" | "Rejected" | "Unknown";
|
|
24
|
+
|
|
25
|
+
export class OrderStatusClient {
|
|
26
|
+
constructor(private config: DecibelConfig) {}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get order status by order ID and market address using REST API
|
|
30
|
+
*/
|
|
31
|
+
async getOrderStatus(
|
|
32
|
+
orderId: string,
|
|
33
|
+
marketAddress: string,
|
|
34
|
+
userAddress: string,
|
|
35
|
+
): Promise<OrderStatus | null> {
|
|
36
|
+
try {
|
|
37
|
+
const url = `${this.config.tradingHttpUrl}/api/v1/orders?order_id=${orderId}&market_address=${marketAddress}&user_address=${userAddress}`;
|
|
38
|
+
const response = await fetch(url);
|
|
39
|
+
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
if (response.status === 404) {
|
|
42
|
+
return null; // Order not found yet
|
|
43
|
+
}
|
|
44
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const data = await response.json();
|
|
48
|
+
return OrderStatusSchema.parse(data);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error("Error fetching order status:", error);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Parse order status string to enum-like type
|
|
57
|
+
*/
|
|
58
|
+
parseOrderStatusType(status: string | undefined | null): OrderStatusType {
|
|
59
|
+
if (!status) return "Unknown";
|
|
60
|
+
const upperStatus = status.toLowerCase();
|
|
61
|
+
if (upperStatus.includes("acknowledged")) return "Acknowledged";
|
|
62
|
+
if (upperStatus.includes("filled")) return "Filled";
|
|
63
|
+
if (upperStatus.includes("cancelled")) return "Cancelled";
|
|
64
|
+
if (upperStatus.includes("rejected")) return "Rejected";
|
|
65
|
+
return "Unknown";
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Check if order status represents success
|
|
70
|
+
*/
|
|
71
|
+
isSuccessStatus(status: string | undefined | null): boolean {
|
|
72
|
+
return this.parseOrderStatusType(status) === "Filled";
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Check if order status represents failure
|
|
77
|
+
*/
|
|
78
|
+
isFailureStatus(status: string | undefined | null): boolean {
|
|
79
|
+
const statusType = this.parseOrderStatusType(status);
|
|
80
|
+
return statusType === "Cancelled" || statusType === "Rejected";
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Check if order status is final (success or failure)
|
|
85
|
+
*/
|
|
86
|
+
isFinalStatus(status: string | undefined | null): boolean {
|
|
87
|
+
return this.isSuccessStatus(status) || this.isFailureStatus(status);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BaseReader } from "../base-reader";
|
|
2
|
+
import {
|
|
3
|
+
AccountOverviewRequestArgs,
|
|
4
|
+
AccountOverviewSchema,
|
|
5
|
+
AccountOverviewWsMessage,
|
|
6
|
+
AccountOverviewWsMessageSchema,
|
|
7
|
+
} from "./account-overview.types";
|
|
8
|
+
|
|
9
|
+
export class AccountOverviewReader extends BaseReader {
|
|
10
|
+
/**
|
|
11
|
+
* Get the account overview for a given user
|
|
12
|
+
* @param subAddr The subaccount address to get the account overview for
|
|
13
|
+
* @returns The account overview for the given subaccount address
|
|
14
|
+
*/
|
|
15
|
+
async getByAddr({ subAddr, volumeWindow, fetchOptions }: AccountOverviewRequestArgs) {
|
|
16
|
+
const queryParams = new URLSearchParams({ user: subAddr });
|
|
17
|
+
|
|
18
|
+
if (volumeWindow) {
|
|
19
|
+
queryParams.set("volume_window", volumeWindow);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const response = await this.getRequest({
|
|
23
|
+
schema: AccountOverviewSchema,
|
|
24
|
+
url: `${this.deps.config.tradingHttpUrl}/api/v1/account_overviews`,
|
|
25
|
+
queryParams,
|
|
26
|
+
options: fetchOptions,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return response.data;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Subscribe to account overview
|
|
34
|
+
* @param subAddr The subaccount address of the user to subscribe to
|
|
35
|
+
* @param onData Callback function for received account overview data
|
|
36
|
+
* @returns A function to unsubscribe from the account overview updates
|
|
37
|
+
*/
|
|
38
|
+
subscribeByAddr(subAddr: string, onData: (data: AccountOverviewWsMessage) => void) {
|
|
39
|
+
const topic = `account_overview:${subAddr}`;
|
|
40
|
+
|
|
41
|
+
return this.deps.ws.subscribe(topic, AccountOverviewWsMessageSchema, onData);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import z from "zod/v4";
|
|
2
|
+
|
|
3
|
+
import { BaseRequestArgs } from "../base-reader";
|
|
4
|
+
|
|
5
|
+
export interface AccountOverviewRequestArgs extends BaseRequestArgs {
|
|
6
|
+
subAddr: string;
|
|
7
|
+
volumeWindow?: VolumeWindow;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const VolumeWindow = {
|
|
11
|
+
SevenDays: "7d",
|
|
12
|
+
FourteenDays: "14d",
|
|
13
|
+
ThirtyDays: "30d",
|
|
14
|
+
NinetyDays: "90d",
|
|
15
|
+
} as const;
|
|
16
|
+
|
|
17
|
+
export type VolumeWindow = (typeof VolumeWindow)[keyof typeof VolumeWindow];
|
|
18
|
+
|
|
19
|
+
export const AccountOverviewSchema = z.object({
|
|
20
|
+
perp_equity_balance: z.number(),
|
|
21
|
+
unrealized_pnl: z.number(),
|
|
22
|
+
unrealized_funding_cost: z.number(),
|
|
23
|
+
cross_margin_ratio: z.number(),
|
|
24
|
+
maintenance_margin: z.number(),
|
|
25
|
+
cross_account_leverage_ratio: z.number().nullable(),
|
|
26
|
+
volume: z.number().nullable(),
|
|
27
|
+
all_time_return: z.number().nullable(),
|
|
28
|
+
pnl_90d: z.number().nullable(),
|
|
29
|
+
sharpe_ratio: z.number().nullable(),
|
|
30
|
+
max_drawdown: z.number().nullable(),
|
|
31
|
+
weekly_win_rate_12w: z.number().nullable(),
|
|
32
|
+
average_cash_position: z.number().nullable(),
|
|
33
|
+
average_leverage: z.number().nullable(),
|
|
34
|
+
cross_account_position: z.number(),
|
|
35
|
+
total_margin: z.number(),
|
|
36
|
+
usdc_cross_withdrawable_balance: z.number(),
|
|
37
|
+
usdc_isolated_withdrawable_balance: z.number(),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export const AccountOverviewWsMessageSchema = z.object({
|
|
41
|
+
account_overview: AccountOverviewSchema.omit({ volume: true }),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export type AccountOverview = z.infer<typeof AccountOverviewSchema>;
|
|
45
|
+
export type AccountOverviewWsMessage = z.infer<typeof AccountOverviewWsMessageSchema>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DecibelReaderDeps } from "../constants";
|
|
2
|
+
import {
|
|
3
|
+
FetchOptions,
|
|
4
|
+
getRequest as baseGetRequest,
|
|
5
|
+
GetRequestArgs,
|
|
6
|
+
patchRequest as basePatchRequest,
|
|
7
|
+
PatchRequestArgs,
|
|
8
|
+
postRequest as basePostRequest,
|
|
9
|
+
PostRequestArgs,
|
|
10
|
+
} from "../utils";
|
|
11
|
+
|
|
12
|
+
export interface BaseRequestArgs {
|
|
13
|
+
fetchOptions?: FetchOptions;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class BaseReader {
|
|
17
|
+
constructor(protected readonly deps: DecibelReaderDeps) {}
|
|
18
|
+
|
|
19
|
+
protected async getRequest<TResponseData>(args: Omit<GetRequestArgs<TResponseData>, "apiKey">) {
|
|
20
|
+
return baseGetRequest({
|
|
21
|
+
...args,
|
|
22
|
+
apiKey: this.deps.apiKey,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
protected async postRequest<TResponseData>(args: Omit<PostRequestArgs<TResponseData>, "apiKey">) {
|
|
27
|
+
return basePostRequest({
|
|
28
|
+
...args,
|
|
29
|
+
apiKey: this.deps.apiKey,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected async patchRequest<TResponseData>(
|
|
34
|
+
args: Omit<PatchRequestArgs<TResponseData>, "apiKey">,
|
|
35
|
+
) {
|
|
36
|
+
return basePatchRequest({
|
|
37
|
+
...args,
|
|
38
|
+
apiKey: this.deps.apiKey,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { getMarketAddr } from "../../utils";
|
|
2
|
+
import { BaseReader } from "../base-reader";
|
|
3
|
+
import {
|
|
4
|
+
CandlestickInterval,
|
|
5
|
+
CandlesticksRequestArgs,
|
|
6
|
+
CandlesticksSchema,
|
|
7
|
+
CandlestickWsMessage,
|
|
8
|
+
CandlestickWsMessageSchema,
|
|
9
|
+
} from "./candlesticks.types";
|
|
10
|
+
|
|
11
|
+
export class CandlesticksReader extends BaseReader {
|
|
12
|
+
/**
|
|
13
|
+
* Get the candlestick data points for a given market during a given time period
|
|
14
|
+
* @param marketName The name of the market to get candlestick data for
|
|
15
|
+
* @param interval The time interval of the candlestick data points
|
|
16
|
+
* @param startTime The start time of the candlestick data points
|
|
17
|
+
* @param endTime The end time of the candlestick data points
|
|
18
|
+
* @returns The candlestick data points for the given market during the given time period
|
|
19
|
+
*/
|
|
20
|
+
async getByName({
|
|
21
|
+
marketName,
|
|
22
|
+
interval,
|
|
23
|
+
startTime,
|
|
24
|
+
endTime,
|
|
25
|
+
fetchOptions,
|
|
26
|
+
}: CandlesticksRequestArgs) {
|
|
27
|
+
const marketAddr = getMarketAddr(marketName, this.deps.config.deployment.perpEngineGlobal);
|
|
28
|
+
|
|
29
|
+
const response = await this.getRequest({
|
|
30
|
+
schema: CandlesticksSchema,
|
|
31
|
+
url: `${this.deps.config.tradingHttpUrl}/api/v1/candlesticks`,
|
|
32
|
+
queryParams: {
|
|
33
|
+
market: marketAddr.toString(),
|
|
34
|
+
interval,
|
|
35
|
+
startTime: startTime.toString(),
|
|
36
|
+
endTime: endTime.toString(),
|
|
37
|
+
},
|
|
38
|
+
options: fetchOptions,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
return response.data;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Subscribe to candlestick data points for a given market
|
|
46
|
+
* @param marketName The name of the market to subscribe to
|
|
47
|
+
* @param interval The time interval of the candlestick data points
|
|
48
|
+
* @param onData Callback function for received candlestick data points
|
|
49
|
+
* @returns A function to unsubscribe from the candlestick updates
|
|
50
|
+
*/
|
|
51
|
+
subscribeByName(
|
|
52
|
+
marketName: string,
|
|
53
|
+
interval: CandlestickInterval,
|
|
54
|
+
onData: (data: CandlestickWsMessage) => void,
|
|
55
|
+
) {
|
|
56
|
+
const marketAddr = getMarketAddr(marketName, this.deps.config.deployment.perpEngineGlobal);
|
|
57
|
+
const topic = `market_candlestick:${marketAddr}:${interval}`;
|
|
58
|
+
|
|
59
|
+
return this.deps.ws.subscribe(topic, CandlestickWsMessageSchema, onData);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import z from "zod/v4";
|
|
2
|
+
|
|
3
|
+
import { BaseRequestArgs } from "../base-reader";
|
|
4
|
+
|
|
5
|
+
export interface CandlesticksRequestArgs extends BaseRequestArgs {
|
|
6
|
+
marketName: string;
|
|
7
|
+
interval: CandlestickInterval;
|
|
8
|
+
startTime: number;
|
|
9
|
+
endTime: number;
|
|
10
|
+
}
|
|
11
|
+
export const CandlestickInterval = {
|
|
12
|
+
OneMinute: "1m",
|
|
13
|
+
FifteenMinutes: "15m",
|
|
14
|
+
OneHour: "1h",
|
|
15
|
+
FourHours: "4h",
|
|
16
|
+
OneDay: "1d",
|
|
17
|
+
} as const;
|
|
18
|
+
|
|
19
|
+
export type CandlestickInterval = (typeof CandlestickInterval)[keyof typeof CandlestickInterval];
|
|
20
|
+
|
|
21
|
+
export const CandlestickSchema = z.object({
|
|
22
|
+
/** time end */
|
|
23
|
+
T: z.number(),
|
|
24
|
+
/** close */
|
|
25
|
+
c: z.number(),
|
|
26
|
+
/** high */
|
|
27
|
+
h: z.number(),
|
|
28
|
+
/** internal */
|
|
29
|
+
i: z.string(),
|
|
30
|
+
/** low */
|
|
31
|
+
l: z.number(),
|
|
32
|
+
/** open */
|
|
33
|
+
o: z.number(),
|
|
34
|
+
/** time start */
|
|
35
|
+
t: z.number(),
|
|
36
|
+
/** volume */
|
|
37
|
+
v: z.number(),
|
|
38
|
+
});
|
|
39
|
+
export const CandlesticksSchema = z.array(CandlestickSchema);
|
|
40
|
+
export const CandlestickWsMessageSchema = z.object({
|
|
41
|
+
candle: CandlestickSchema,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export type Candlestick = z.infer<typeof CandlestickSchema>;
|
|
45
|
+
export type Candlesticks = z.infer<typeof CandlesticksSchema>;
|
|
46
|
+
export type CandlestickWsMessage = z.infer<typeof CandlestickWsMessageSchema>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BaseReader } from "../base-reader";
|
|
2
|
+
import { DelegationsRequestArgs, DelegationsSchema } from "./delegations.types";
|
|
3
|
+
|
|
4
|
+
export class DelegationsReader extends BaseReader {
|
|
5
|
+
/**
|
|
6
|
+
* Get all active delegations for a subaccount
|
|
7
|
+
* @param args The arguments containing the subaccount address
|
|
8
|
+
* @returns The list of active delegations for the given subaccount
|
|
9
|
+
*/
|
|
10
|
+
async getAll({ subAddr, fetchOptions }: DelegationsRequestArgs) {
|
|
11
|
+
const response = await this.getRequest({
|
|
12
|
+
schema: DelegationsSchema,
|
|
13
|
+
url: `${this.deps.config.tradingHttpUrl}/api/v1/delegations`,
|
|
14
|
+
queryParams: new URLSearchParams({
|
|
15
|
+
subaccount: subAddr,
|
|
16
|
+
}),
|
|
17
|
+
options: fetchOptions,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
return response.data;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import z from "zod/v4";
|
|
2
|
+
|
|
3
|
+
import { BaseRequestArgs } from "../base-reader";
|
|
4
|
+
|
|
5
|
+
export interface DelegationsRequestArgs extends BaseRequestArgs {
|
|
6
|
+
subAddr: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const DelegationSchema = z.object({
|
|
10
|
+
delegated_account: z.string(),
|
|
11
|
+
permission_type: z.string(),
|
|
12
|
+
expiration_time_s: z.number().nullable(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export const DelegationsSchema = z.array(DelegationSchema);
|
|
16
|
+
|
|
17
|
+
export type Delegations = z.infer<typeof DelegationsSchema>;
|
|
18
|
+
|
|
19
|
+
export type Delegation = z.infer<typeof DelegationSchema>;
|