@bulletxyz/bullet-sdk 0.16.0-rc.0

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.
@@ -0,0 +1,12 @@
1
+ export * from "./exchange";
2
+ export * from "./orderbook";
3
+ export * from "./utils";
4
+ export * from "./types";
5
+ export * from "./client";
6
+ export * from "./zod-types/rest";
7
+ export * from "./zod-types/ws";
8
+ export * from "./zod-types/wasm";
9
+ export * from "./constants";
10
+ export * from "./calc";
11
+ export * from "./error";
12
+ export { Wallet } from "./wallet";
@@ -0,0 +1,23 @@
1
+ import { Asset, AssetId, Side } from "./types";
2
+ import { MarginConfig, OrderbookData, Pricing, UserAccount } from "./zod-types/rest";
3
+ import { EquityType, MarginType } from "./bullet-wasm";
4
+ export declare function calculateOrderbookMidpoint(orderbook: OrderbookData): number | undefined;
5
+ export declare function calculateEntryPrice(asset: Asset, userAccount: UserAccount): number;
6
+ export interface MarginContext {
7
+ pricing: Pricing;
8
+ margin_config: MarginConfig;
9
+ }
10
+ export declare function calculateTotalPerpUnrealizedPnl(userAccount: UserAccount, marginContext: MarginContext): number;
11
+ export declare function calculateAccountEquity(equityType: EquityType, conservative: boolean, userAccount: UserAccount, marginContext: MarginContext): number;
12
+ export declare function calculateAccountLeverage(userAccount: UserAccount, marginContext: MarginContext): number;
13
+ export declare function calculateAvailableMargin(marginType: MarginType, conservative: boolean, userAccount: UserAccount, marginContext: MarginContext): number;
14
+ export declare function calculateUsedMargin(marginType: MarginType, userAccount: UserAccount, marginContext: MarginContext): number;
15
+ export declare function calculateWithdrawableAmountOfAsset(assetId: AssetId, userAccount: UserAccount, marginContext: MarginContext): number;
16
+ export declare function calculateEstimatedLiquidationPrice(assetId: AssetId, userAccount: UserAccount, marginContext: MarginContext): number;
17
+ export declare function calculateLiquidationRiskPercentage(userAccount: UserAccount, marginContext: MarginContext): number;
18
+ export declare function calculateMaxBorrowAmount(assetId: AssetId, userAccount: UserAccount, marginContext: MarginContext): number;
19
+ export declare function calculateMaxOrderSize(assetId: AssetId, side: Side, price: number, reduceOnly: boolean, userAccount: UserAccount, marginContext: MarginContext, makerBook: OrderbookData, n_iterations?: number, error_tolerance?: number): number;
20
+ export declare function simulateUsedMarginOnBorrow(assetId: AssetId, borrowAmount: number, userAccount: UserAccount, marginType: MarginType, marginContext: MarginContext): {
21
+ current: number;
22
+ new: number;
23
+ };
@@ -0,0 +1,113 @@
1
+ import { Transaction, TransactionResult } from "@sovereign-sdk/web3";
2
+ import { ExchangeConnection } from "./exchange";
3
+ import { Side, Asset, Network, Address, TokenId, CallMessage, TpslOrder, OrderType } from "./types";
4
+ import { Wallet } from "./wallet";
5
+ import { Connection } from "./connection";
6
+ export interface TransactionOpts {
7
+ maxPriorityFeeBps: number;
8
+ maxFee: number;
9
+ gasLimit: number[] | null;
10
+ chainId: number;
11
+ }
12
+ export declare class Client {
13
+ connection: Connection;
14
+ exchange: ExchangeConnection;
15
+ address: Address;
16
+ private rollup;
17
+ private wallet;
18
+ private queue;
19
+ private generationOverride;
20
+ private constructor();
21
+ static create(network: Network, wallet: Wallet, txOpts?: TransactionOpts): Promise<Client>;
22
+ setGenerationOverride(generation: (() => number) | undefined): void;
23
+ getNonce(): Promise<import("@sovereign-sdk/web3").Dedup>;
24
+ getTokenBalance(tokenId: string): Promise<bigint>;
25
+ getUserAccount(): Promise<{
26
+ usdc_ledger: {
27
+ ledger: {
28
+ weights: {
29
+ initial_liability_weight: number;
30
+ maintenance_liability_weight: number;
31
+ asset_weight: number;
32
+ };
33
+ asset: number;
34
+ liability: number;
35
+ };
36
+ unrealized_loss_borrow: number;
37
+ unsettled_perp_profit: number;
38
+ };
39
+ spot_ledgers: Map<any, {
40
+ weights: {
41
+ initial_liability_weight: number;
42
+ maintenance_liability_weight: number;
43
+ asset_weight: number;
44
+ };
45
+ asset: number;
46
+ liability: number;
47
+ }>;
48
+ perp_ledgers: Map<any, {
49
+ orders: {
50
+ size: number;
51
+ price: number;
52
+ side: "Bid" | "Ask";
53
+ order_id: number;
54
+ reduce_only: boolean;
55
+ }[];
56
+ position: {
57
+ size: number;
58
+ cost_of_trades: number;
59
+ realized_pnl: number;
60
+ cached_mark_price: number;
61
+ funding_payments_on_side: number;
62
+ funding_payments_on_position: number;
63
+ last_accum_funding_applied_per_lot: [number, number];
64
+ };
65
+ user_selected_max_leverage: number;
66
+ tpsls: {
67
+ side: "Bid" | "Ask";
68
+ tpsl_order_id: number;
69
+ order_price: number;
70
+ trigger_price: number;
71
+ trigger_direction: "GreaterThanOrEqual" | "LessThanOrEqual";
72
+ tpsl_price_condition: "Mark" | "Oracle" | "LastTrade";
73
+ active_size: number;
74
+ full_size: number;
75
+ order_type: "Limit" | "PostOnly" | "FillOrKill" | "ImmediateOrCancel" | "PostOnlySlide" | "PostOnlyFront";
76
+ linked_tpsl_order_ids: number[];
77
+ parent_order_id?: number | undefined;
78
+ }[];
79
+ }>;
80
+ }>;
81
+ submitTransaction(runtimeCall: CallMessage): Promise<void | TransactionResult<Transaction<unknown>>>;
82
+ transfer(to: Address, amount: bigint, tokenId: TokenId): Promise<void | TransactionResult<Transaction<unknown>>>;
83
+ mint(to: Address, amount: bigint, tokenId: TokenId): Promise<void | TransactionResult<Transaction<unknown>>>;
84
+ setValue(value: number): Promise<void | TransactionResult<Transaction<unknown>>>;
85
+ deposit(asset: Asset, amount: number): Promise<void | TransactionResult<Transaction<unknown>>>;
86
+ withdraw(asset: Asset, amount: number): Promise<void | TransactionResult<Transaction<unknown>>>;
87
+ borrowSpot(asset: Asset, amount: number): Promise<void | TransactionResult<Transaction<unknown>>>;
88
+ placeOrder(asset: Asset, price: number, size: number, side: Side, orderType?: OrderType, reduceOnly?: boolean, tpslOrders?: TpslOrder[]): Promise<void | TransactionResult<Transaction<unknown>>>;
89
+ placeTpsls(asset: Asset, tpslOrders: TpslOrder[]): Promise<void | TransactionResult<Transaction<unknown>>>;
90
+ replaceOrder(asset: Asset, existingOrderId: number, existingSide: Side, price: number, size: number, side: Side, orderType?: OrderType, reduceOnly?: boolean, tpslOrders?: TpslOrder[]): Promise<void | TransactionResult<Transaction<unknown>>>;
91
+ cancelTpsl(tpslOrderId: number): Promise<void | TransactionResult<Transaction<unknown>>>;
92
+ cancelOrder(asset: Asset, orderId: number): Promise<void | TransactionResult<Transaction<unknown>>>;
93
+ cancelAllOrders(asset: Asset): Promise<void | TransactionResult<Transaction<unknown>>>;
94
+ updatePricing(pricing_updates: {
95
+ asset: Asset;
96
+ medianCexPrice: number;
97
+ oraclePrice: number;
98
+ diffEma: number;
99
+ }[], publishTimestamp?: number): Promise<void | TransactionResult<Transaction<unknown>>>;
100
+ updateAssetMaxLeverage(asset: Asset, maxLeverage: number): Promise<void | TransactionResult<Transaction<unknown>>>;
101
+ updatePremiumIndexes(assetIds: Asset[]): Promise<void | TransactionResult<Transaction<unknown>>>;
102
+ updateFunding(assetIds: Asset[]): Promise<void | TransactionResult<Transaction<unknown>>>;
103
+ applyFunding(addresses: Address[]): Promise<void | TransactionResult<Transaction<unknown>>>;
104
+ forceCancelOrders(address: Address): Promise<void | TransactionResult<Transaction<unknown>>>;
105
+ forceClosePositions(address: Address): Promise<void | TransactionResult<Transaction<unknown>>>;
106
+ liquidate(address: Address, positions?: {
107
+ asset: Asset;
108
+ size: number;
109
+ }[]): Promise<void | TransactionResult<Transaction<unknown>>>;
110
+ liquidateSpotLiability(address: Address, liabilityAssetId: Asset, collateralAssetId: Asset, liabilityAmount: number): Promise<void | TransactionResult<Transaction<unknown>>>;
111
+ depositToUsdcPnlPool(amount: number): Promise<void | TransactionResult<Transaction<unknown>>>;
112
+ depositToInsuranceFund(amount: number): Promise<void | TransactionResult<Transaction<unknown>>>;
113
+ }
@@ -0,0 +1,12 @@
1
+ import { TokenId, Address } from "./types";
2
+ export declare class BaseConnection {
3
+ endpoint: string;
4
+ constructor(endpoint?: string);
5
+ protected fetchApiResource<T>(path: string, params?: Record<string, string>): Promise<T>;
6
+ }
7
+ export declare class Connection extends BaseConnection {
8
+ constructor(endpoint: string);
9
+ getNonce(address: Address): Promise<number>;
10
+ getTokenBalance(address: Address, token_id: TokenId): Promise<bigint>;
11
+ getTotalSupply(token_id: TokenId): Promise<bigint>;
12
+ }
@@ -0,0 +1,26 @@
1
+ import { Network } from "./types";
2
+ export declare const TOKEN_ADDRESSES: {
3
+ readonly GAS: "token_1nyl0e0yweragfsatygt24zmd8jrr2vqtvdfptzjhxkguz2xxx3vs0y07u7";
4
+ readonly USDC: "token_1zh04r2k3kk0jf3xzr8cfpcm6qntumxwdvglq75g2ynwcu7daca0qm9ccg3";
5
+ readonly SOL: "token_1djhak8xt5326dgq8urtean5xtsv6hawcn9cy9wvsdtptu2eqj40q0qjxr7";
6
+ readonly BTC: "token_1g09xywefypxxx5exvxuqy0v3c5a7jwpnq4kkl85wxu9pkhgnrtqszlm4n8";
7
+ readonly ETH: "token_1gxvm2vkwqw40q9d4djxhrk66mukgrhdtqljeq5qa7jm3ajyksmmqwervaa";
8
+ readonly DOGE: "token_1y0xpw76f4nlscy0g50j0n7vyt6cemza96p4gj7a3hj548a3tmcrspfjmr3";
9
+ readonly WIF: "token_1kwcvtrg0k4xllu8ylxukquckmlh273u8eufvqtx30e07gm8c3lpsuxv8j6";
10
+ readonly XRP: "token_1jezvz43ldt6vqgycch077qqa4m8e97enrqww93vzgqra7v7rhxpqz4j3rm";
11
+ readonly HYPE: "token_1caey4sxtejtmf3q0djxkuztx6up4f66dkudgmw2ev0slhafx09kqj9qxcf";
12
+ readonly ADA: "token_1xgppquwlmyxsp9ecrqtu2feucecjkcfryvm6uhxsegvqn494mywsm75spg";
13
+ readonly TRUMP: "token_1pmd3hja4m4jewfjfcxl3zt6vlmphyyh0nlr4cn3kfs0pkdqx4wwq76053k";
14
+ readonly SUI: "token_1kxyfvmf7mxr5256kx8cjrg6whvau54wpq30n5j805h64z0wyzzpswhmz36";
15
+ readonly JUP: "token_18saxwfuma39ks3gafmqtql5y57qpd6yh2r6s4uawak8c8pe6xrzspw5gtv";
16
+ readonly JTO: "token_1ecdw04ht4xh5hkhx37dshz7gpjgkrww56e53tqx4nkhmau55p5yswazeej";
17
+ readonly ENA: "token_120xgtxhl5uwp9p20k8yjd5plshr9fdvsn5afj7cqazh5csuduj8q9nmy42";
18
+ readonly BERA: "token_133zykxvsvq8u8eq2j67n63gc08dpc4zudrch9vl7028rahcvss3s42ywhs";
19
+ readonly TIA: "token_185jxgchq6kpxskn4eggjfeju3t4sjxxfxj5mx9dn6wgydud7mtys4glllf";
20
+ readonly ZEX: "token_1g3hhmzp0c358t0s2dxht8jqqrfnnrgerk423mgs4cxd96u8ux24stetj0c";
21
+ };
22
+ export declare const NETWORK_CONFIG: Record<Network, {
23
+ restEndpoint: string;
24
+ wsEndpoint: string;
25
+ }>;
26
+ export declare const GLOBAL_DEFAULT_MAX_LEVERAGE = 1000;
@@ -0,0 +1,8 @@
1
+ export declare class ApiError extends Error {
2
+ readonly title: string;
3
+ readonly status: number;
4
+ readonly details: Record<string, unknown>;
5
+ private constructor();
6
+ static fromResponse(response: Response): Promise<ApiError>;
7
+ toString(): string;
8
+ }
@@ -0,0 +1,23 @@
1
+ import { BaseConnection } from "./connection";
2
+ import { Orderbook } from "./orderbook";
3
+ import { AssetId, Network } from "./types";
4
+ import { Order, OrderbookData, EnrichedBorrowLendMarket, Pricing, PerpMarket, MarginConfig, UsdcPnlPool, UsdcInsuranceFund, UserAccount } from "./zod-types/rest";
5
+ export declare class ExchangeConnection extends BaseConnection {
6
+ private wsManager;
7
+ constructor(network: Network);
8
+ getValue(): Promise<number | null>;
9
+ getOrder(order_id: number): Promise<Order | null>;
10
+ getOrderbookData(asset_id: number): Promise<OrderbookData | null>;
11
+ getUserAccountAddresses(start?: number, limit?: number): Promise<string[]>;
12
+ getUserAccounts(addresses: string[]): Promise<UserAccount[]>;
13
+ getPricing(): Promise<Pricing | null>;
14
+ getUsdcPnlPool(): Promise<UsdcPnlPool | null>;
15
+ getUsdcInsuranceFund(): Promise<UsdcInsuranceFund | null>;
16
+ getEnrichedBorrowLendMarket(asset_id: number): Promise<EnrichedBorrowLendMarket | null>;
17
+ getPerpMarket(asset_id: number): Promise<PerpMarket | null>;
18
+ getMarginConfig(): Promise<MarginConfig | null>;
19
+ getPerpAssets(): Promise<Map<AssetId, string>>;
20
+ getBorrowLendAssets(): Promise<Map<AssetId, string>>;
21
+ subscribeOrderbook(assetId: number): AsyncIterable<Orderbook>;
22
+ unsubscribeOrderbook(assetId: number): Promise<void>;
23
+ }
@@ -0,0 +1,13 @@
1
+ export * from "./exchange";
2
+ export * from "./orderbook";
3
+ export * from "./utils";
4
+ export * from "./types";
5
+ export * from "./wallet";
6
+ export * from "./client";
7
+ export * from "./zod-types/rest";
8
+ export * from "./zod-types/ws";
9
+ export * from "./zod-types/wasm";
10
+ export * from "./constants";
11
+ export * from "./wallet/nodeWallet";
12
+ export * from "./calc";
13
+ export * from "./error";
@@ -0,0 +1,22 @@
1
+ import { Asset } from "./types";
2
+ import { OrderbookData } from "./zod-types/rest";
3
+ import { OrderbookUpdate } from "./zod-types/ws";
4
+ type Price = number;
5
+ type TotalSize = number;
6
+ type OrderbookLevel = [Price, TotalSize];
7
+ export declare class Orderbook {
8
+ bids: Map<Price, TotalSize>;
9
+ asks: Map<Price, TotalSize>;
10
+ asset: Asset;
11
+ lastUpdated: number;
12
+ constructor(assetId: number, snapshot?: OrderbookUpdate);
13
+ protected updateBid(price: number, size: number): void;
14
+ protected updateAsk(price: number, size: number): void;
15
+ applyDelta(delta: OrderbookUpdate): void;
16
+ getBids(levels?: number): OrderbookLevel[];
17
+ getAsks(levels?: number): OrderbookLevel[];
18
+ static fromOrderbookData(orderbook: OrderbookData): Orderbook;
19
+ toDisplay(levels?: number): string;
20
+ setLastUpdated(ts: number): void;
21
+ }
22
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,52 @@
1
+ import { MarginType } from "./bullet-wasm";
2
+ export { MarginType };
3
+ export type CallMessage = {
4
+ [module: string]: {
5
+ [instruction: string]: string | number | object;
6
+ };
7
+ };
8
+ export type PrivateKey = string;
9
+ export type PublicKey = string;
10
+ export type Address = string;
11
+ export type TokenId = string;
12
+ export type AssetId = number;
13
+ export declare enum Asset {
14
+ USDC = 0,
15
+ SOL = 1,
16
+ BTC = 2,
17
+ ETH = 3,
18
+ DOGE = 4,
19
+ WIF = 5,
20
+ XRP = 6,
21
+ HYPE = 7,
22
+ ADA = 8,
23
+ TRUMP = 9,
24
+ SUI = 10,
25
+ JUP = 11,
26
+ JTO = 12,
27
+ ENA = 13,
28
+ BERA = 14,
29
+ TIA = 15,
30
+ ZEX = 16
31
+ }
32
+ export type Side = "Bid" | "Ask";
33
+ export type TriggerDirection = "GreaterThanOrEqual" | "LessThanOrEqual";
34
+ export type TpslPriceCondition = "Mark" | "Oracle" | "LastTrade";
35
+ export type OrderType = "Limit" | "PostOnly" | "FillOrKill" | "ImmediateOrCancel" | "PostOnlySlide" | "PostOnlyFront";
36
+ export type Network = "Localnet" | "Staging" | "Testnet" | "Mainnet";
37
+ export type TpslOrder = {
38
+ orderPrice: number;
39
+ triggerPrice: number;
40
+ triggerDirection: TriggerDirection;
41
+ tpslPriceCondition: TpslPriceCondition;
42
+ size: number;
43
+ orderType: OrderType;
44
+ };
45
+ export declare class BulletError extends Error {
46
+ originalError?: Error | undefined;
47
+ code: string;
48
+ shortMessage: string;
49
+ verboseMessage: string;
50
+ constructor(code: string, shortMessage: string, verboseMessage: string, originalError?: Error | undefined);
51
+ static fromModuleError(error: Error): Error;
52
+ }
@@ -0,0 +1,8 @@
1
+ export declare function bytesToHex(bytes: Uint8Array): string;
2
+ export declare function hexToBytes(hex: string): Uint8Array;
3
+ export declare function hexToBase64(hex: string): string;
4
+ export declare function hexToBase58(hex: string): string;
5
+ export declare function base58ToBytes(base58: string): Uint8Array;
6
+ export declare function base58ToHex(base58: string): string;
7
+ export declare function sleep(ms: number): Promise<void>;
8
+ export declare function isNode(): boolean;
@@ -0,0 +1 @@
1
+ export * from "./wallet";
@@ -0,0 +1,12 @@
1
+ import { PrivateKey, PublicKey } from "../types";
2
+ import { Wallet } from "./wallet";
3
+ import { Signer } from "@sovereign-sdk/signers";
4
+ export declare class NodeWallet extends Wallet {
5
+ private privateKey;
6
+ chainId: number;
7
+ constructor(privateKey: PrivateKey, publicKey: PublicKey, chainId?: number);
8
+ static fromPrivateKeyBytes(privateKeyBytes: Uint8Array): Promise<NodeWallet>;
9
+ static fromLocalSolanaWallet(filePath?: string): NodeWallet;
10
+ static fromLocalSovWallet(filePath: string): Promise<NodeWallet>;
11
+ getSigner(chainHash: Uint8Array): Signer;
12
+ }
@@ -0,0 +1,9 @@
1
+ import { PublicKey, Address } from "../types";
2
+ import { Signer } from "@sovereign-sdk/signers";
3
+ export declare abstract class Wallet {
4
+ address: Address;
5
+ publicKey: PublicKey;
6
+ chainId: number;
7
+ constructor(publicKey: PublicKey, chainId?: number);
8
+ abstract getSigner(chainHash: Uint8Array): Signer;
9
+ }
@@ -0,0 +1,23 @@
1
+ import { Orderbook } from "./orderbook";
2
+ export declare class WebSocketManager {
3
+ private socket;
4
+ private orderbooks;
5
+ private isConnected;
6
+ private heartbeatInterval;
7
+ private lastUpdateIds;
8
+ private url;
9
+ private reconnectAttempts;
10
+ private readonly maxReconnectAttempts;
11
+ private readonly reconnectDelay;
12
+ private eventEmitter;
13
+ constructor(url: string);
14
+ private connect;
15
+ private handleReconnect;
16
+ private handleMessage;
17
+ private startHeartbeat;
18
+ private stopHeartbeat;
19
+ private sendSubscription;
20
+ sendMessage(message: string): void;
21
+ subscribeOrderbook(assetId: number): AsyncIterable<Orderbook>;
22
+ unsubscribeOrderbook(assetId: number): Promise<void>;
23
+ }
@@ -0,0 +1,5 @@
1
+ import { z } from "zod";
2
+ export declare const Decimal: z.ZodNumber;
3
+ export declare const AssetId: z.ZodNumber;
4
+ export declare const Amount: z.ZodEffects<z.ZodBigInt, bigint, bigint>;
5
+ export declare const createJsonMap: <K extends z.ZodTypeAny, V extends z.ZodTypeAny>(valueSchema: V) => z.ZodEffects<z.ZodRecord<z.ZodString, V>, Map<z.infer<K>, z.infer<V>>>;