@parqxchange/sdk 0.1.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.
- package/LICENSE +21 -0
- package/README.md +122 -0
- package/dist/accounts/marketOracle.d.ts +21 -0
- package/dist/accounts/marketOracle.js +114 -0
- package/dist/accounts/resolve.d.ts +75 -0
- package/dist/accounts/resolve.js +116 -0
- package/dist/actions/cranks.d.ts +8 -0
- package/dist/actions/cranks.js +10 -0
- package/dist/actions/liquidity.d.ts +23 -0
- package/dist/actions/liquidity.js +21 -0
- package/dist/actions/trading.d.ts +39 -0
- package/dist/actions/trading.js +95 -0
- package/dist/auth/tradingKey.d.ts +27 -0
- package/dist/auth/tradingKey.js +71 -0
- package/dist/decode/index.d.ts +39 -0
- package/dist/decode/index.js +445 -0
- package/dist/events/decoder.d.ts +60 -0
- package/dist/events/decoder.js +369 -0
- package/dist/events/emitter.d.ts +49 -0
- package/dist/events/emitter.js +153 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +93 -0
- package/dist/indexer/client.d.ts +13 -0
- package/dist/indexer/client.js +36 -0
- package/dist/indexer/types.d.ts +9 -0
- package/dist/indexer/types.js +2 -0
- package/dist/minimal.d.ts +3 -0
- package/dist/minimal.js +13 -0
- package/dist/node.d.ts +1 -0
- package/dist/node.js +5 -0
- package/dist/programs/feeDistributor.d.ts +42 -0
- package/dist/programs/feeDistributor.js +42 -0
- package/dist/programs/oracle.d.ts +31 -0
- package/dist/programs/oracle.js +49 -0
- package/dist/programs/perp.d.ts +283 -0
- package/dist/programs/perp.js +346 -0
- package/dist/programs/pool.d.ts +113 -0
- package/dist/programs/pool.js +126 -0
- package/dist/programs/priceFeed.d.ts +13 -0
- package/dist/programs/priceFeed.js +21 -0
- package/dist/programs/staking.d.ts +76 -0
- package/dist/programs/staking.js +135 -0
- package/dist/types/index.d.ts +337 -0
- package/dist/types/index.js +9 -0
- package/dist/utils/computeBudget.d.ts +5 -0
- package/dist/utils/computeBudget.js +14 -0
- package/dist/utils/errors.d.ts +56 -0
- package/dist/utils/errors.js +138 -0
- package/dist/utils/pda.d.ts +28 -0
- package/dist/utils/pda.js +131 -0
- package/dist/utils/priceMath.d.ts +5 -0
- package/dist/utils/priceMath.js +46 -0
- package/dist/utils/tokenProgram.d.ts +2 -0
- package/dist/utils/tokenProgram.js +16 -0
- package/dist/utils/transaction.d.ts +2 -0
- package/dist/utils/transaction.js +12 -0
- package/dist/utils/version.d.ts +11 -0
- package/dist/utils/version.js +29 -0
- package/idl/fee_distributor.json +779 -0
- package/idl/oracle_adapter.json +767 -0
- package/idl/perp_engine.json +3908 -0
- package/idl/pool_program.json +2956 -0
- package/idl/price_feed.json +478 -0
- package/idl/staking.json +1336 -0
- package/package.json +98 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Keypair, PublicKey, TransactionInstruction } from "@solana/web3.js";
|
|
2
|
+
import { Program } from "@coral-xyz/anchor";
|
|
3
|
+
export declare function buildRegisterTradingKeyIx(opts: {
|
|
4
|
+
wallet: PublicKey;
|
|
5
|
+
delegate: PublicKey;
|
|
6
|
+
expiresAt: bigint;
|
|
7
|
+
program: Program;
|
|
8
|
+
perpEngineId: PublicKey;
|
|
9
|
+
}): Promise<TransactionInstruction>;
|
|
10
|
+
export declare function buildRevokeTradingKeyIx(opts: {
|
|
11
|
+
wallet: PublicKey;
|
|
12
|
+
program: Program;
|
|
13
|
+
perpEngineId: PublicKey;
|
|
14
|
+
}): Promise<TransactionInstruction>;
|
|
15
|
+
export declare function registerTradingKey(opts: {
|
|
16
|
+
wallet: Keypair;
|
|
17
|
+
delegate: PublicKey;
|
|
18
|
+
expiresAt: bigint;
|
|
19
|
+
program: Program;
|
|
20
|
+
perpEngineId: PublicKey;
|
|
21
|
+
}): Promise<string>;
|
|
22
|
+
export declare function revokeTradingKey(opts: {
|
|
23
|
+
wallet: Keypair;
|
|
24
|
+
program: Program;
|
|
25
|
+
perpEngineId: PublicKey;
|
|
26
|
+
}): Promise<string>;
|
|
27
|
+
export declare function loadTradingKeypair(path: string): Keypair;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildRegisterTradingKeyIx = buildRegisterTradingKeyIx;
|
|
4
|
+
exports.buildRevokeTradingKeyIx = buildRevokeTradingKeyIx;
|
|
5
|
+
exports.registerTradingKey = registerTradingKey;
|
|
6
|
+
exports.revokeTradingKey = revokeTradingKey;
|
|
7
|
+
exports.loadTradingKeypair = loadTradingKeypair;
|
|
8
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
9
|
+
const anchor_1 = require("@coral-xyz/anchor");
|
|
10
|
+
const pda_1 = require("../utils/pda");
|
|
11
|
+
const SYSTEM_PROGRAM = new web3_js_1.PublicKey("11111111111111111111111111111111");
|
|
12
|
+
async function buildRegisterTradingKeyIx(opts) {
|
|
13
|
+
const [tradingKeyPda] = (0, pda_1.tradingKeyPDA)(opts.wallet, opts.perpEngineId);
|
|
14
|
+
return opts.program.methods
|
|
15
|
+
.registerTradingKey(opts.delegate, new anchor_1.BN(opts.expiresAt.toString()))
|
|
16
|
+
.accounts({
|
|
17
|
+
tradingKey: tradingKeyPda,
|
|
18
|
+
wallet: opts.wallet,
|
|
19
|
+
systemProgram: SYSTEM_PROGRAM,
|
|
20
|
+
})
|
|
21
|
+
.instruction();
|
|
22
|
+
}
|
|
23
|
+
async function buildRevokeTradingKeyIx(opts) {
|
|
24
|
+
const [tradingKeyPda] = (0, pda_1.tradingKeyPDA)(opts.wallet, opts.perpEngineId);
|
|
25
|
+
return opts.program.methods
|
|
26
|
+
.revokeTradingKey()
|
|
27
|
+
.accounts({ tradingKey: tradingKeyPda, wallet: opts.wallet })
|
|
28
|
+
.instruction();
|
|
29
|
+
}
|
|
30
|
+
async function registerTradingKey(opts) {
|
|
31
|
+
const [tradingKeyPda] = (0, pda_1.tradingKeyPDA)(opts.wallet.publicKey, opts.perpEngineId);
|
|
32
|
+
return opts.program.methods
|
|
33
|
+
.registerTradingKey(opts.delegate, new anchor_1.BN(opts.expiresAt.toString()))
|
|
34
|
+
.accounts({
|
|
35
|
+
tradingKey: tradingKeyPda,
|
|
36
|
+
wallet: opts.wallet.publicKey,
|
|
37
|
+
systemProgram: SYSTEM_PROGRAM,
|
|
38
|
+
})
|
|
39
|
+
.signers([opts.wallet])
|
|
40
|
+
.rpc();
|
|
41
|
+
}
|
|
42
|
+
async function revokeTradingKey(opts) {
|
|
43
|
+
const [tradingKeyPda] = (0, pda_1.tradingKeyPDA)(opts.wallet.publicKey, opts.perpEngineId);
|
|
44
|
+
return opts.program.methods
|
|
45
|
+
.revokeTradingKey()
|
|
46
|
+
.accounts({
|
|
47
|
+
tradingKey: tradingKeyPda,
|
|
48
|
+
wallet: opts.wallet.publicKey,
|
|
49
|
+
})
|
|
50
|
+
.signers([opts.wallet])
|
|
51
|
+
.rpc();
|
|
52
|
+
}
|
|
53
|
+
function loadTradingKeypair(path) {
|
|
54
|
+
if (typeof globalThis.process === "undefined") {
|
|
55
|
+
throw new Error("loadTradingKeypair is Node.js only — use Keypair.fromSecretKey() in browsers");
|
|
56
|
+
}
|
|
57
|
+
const fs = require("fs");
|
|
58
|
+
let raw;
|
|
59
|
+
try {
|
|
60
|
+
raw = JSON.parse(fs.readFileSync(path, "utf8"));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
throw new Error("loadTradingKeypair: invalid key file (JSON parse failed)");
|
|
64
|
+
}
|
|
65
|
+
if (!Array.isArray(raw) ||
|
|
66
|
+
raw.length !== 64 ||
|
|
67
|
+
!raw.every((n) => Number.isInteger(n) && n >= 0 && n <= 255)) {
|
|
68
|
+
throw new Error("loadTradingKeypair: key file must be a JSON array of 64 byte values");
|
|
69
|
+
}
|
|
70
|
+
return web3_js_1.Keypair.fromSecretKey(Uint8Array.from(raw));
|
|
71
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Position, MarketState, PoolState, Order, OrderNonce, TradingKey, ReferralConfig, ReferralCode, TraderReferral, AffiliateReward, FeePool, StakingPool, StakePosition, PayoutQueueEntry, UserQueueClaims } from "../types";
|
|
2
|
+
export declare function sha256Disc(name: string): Buffer;
|
|
3
|
+
export declare const DISCRIMINATORS: {
|
|
4
|
+
readonly Position: Buffer<ArrayBufferLike>;
|
|
5
|
+
readonly MarketState: Buffer<ArrayBufferLike>;
|
|
6
|
+
readonly PoolState: Buffer<ArrayBufferLike>;
|
|
7
|
+
readonly Order: Buffer<ArrayBufferLike>;
|
|
8
|
+
readonly OrderNonce: Buffer<ArrayBufferLike>;
|
|
9
|
+
readonly TradingKey: Buffer<ArrayBufferLike>;
|
|
10
|
+
readonly ReferralConfig: Buffer<ArrayBufferLike>;
|
|
11
|
+
readonly ReferralCode: Buffer<ArrayBufferLike>;
|
|
12
|
+
readonly TraderReferral: Buffer<ArrayBufferLike>;
|
|
13
|
+
readonly AffiliateReward: Buffer<ArrayBufferLike>;
|
|
14
|
+
readonly FeePool: Buffer<ArrayBufferLike>;
|
|
15
|
+
readonly StakingPool: Buffer<ArrayBufferLike>;
|
|
16
|
+
readonly StakePosition: Buffer<ArrayBufferLike>;
|
|
17
|
+
readonly PayoutQueueEntry: Buffer<ArrayBufferLike>;
|
|
18
|
+
readonly UserQueueClaims: Buffer<ArrayBufferLike>;
|
|
19
|
+
};
|
|
20
|
+
export declare class DecoderError extends Error {
|
|
21
|
+
constructor(message: string);
|
|
22
|
+
}
|
|
23
|
+
export declare function decodePosition(data: Buffer | Uint8Array): Position;
|
|
24
|
+
export declare function decodeMarketState(data: Buffer | Uint8Array): MarketState;
|
|
25
|
+
export declare function decodePoolState(data: Buffer | Uint8Array): PoolState;
|
|
26
|
+
export declare function decodeOrder(data: Buffer | Uint8Array): Order;
|
|
27
|
+
export declare function decodeOrderNonce(data: Buffer | Uint8Array): OrderNonce;
|
|
28
|
+
export declare function decodeTradingKey(data: Buffer | Uint8Array): TradingKey;
|
|
29
|
+
export declare function decodeReferralConfig(data: Buffer | Uint8Array): ReferralConfig;
|
|
30
|
+
export declare function decodeReferralCode(data: Buffer | Uint8Array): ReferralCode;
|
|
31
|
+
export declare function decodeTraderReferral(data: Buffer | Uint8Array): TraderReferral;
|
|
32
|
+
export declare function decodeAffiliateReward(data: Buffer | Uint8Array): AffiliateReward;
|
|
33
|
+
export declare function decodeFeePool(data: Buffer | Uint8Array): FeePool;
|
|
34
|
+
export declare function decodeStakingPool(data: Buffer | Uint8Array): StakingPool;
|
|
35
|
+
export declare function decodeStakePosition(data: Buffer | Uint8Array): StakePosition;
|
|
36
|
+
export declare function decodePayoutQueueEntry(data: Buffer | Uint8Array): PayoutQueueEntry;
|
|
37
|
+
export declare function decodeUserQueueClaims(data: Buffer | Uint8Array): UserQueueClaims;
|
|
38
|
+
export type AccountTypeName = "Position" | "MarketState" | "Order" | "OrderNonce" | "PoolState" | "TradingKey" | "ReferralConfig" | "ReferralCode" | "TraderReferral" | "AffiliateReward" | "FeePool" | "StakingPool" | "StakePosition" | "PayoutQueueEntry" | "UserQueueClaims";
|
|
39
|
+
export declare function identifyAccountType(data: Buffer | Uint8Array): AccountTypeName | null;
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DecoderError = exports.DISCRIMINATORS = void 0;
|
|
4
|
+
exports.sha256Disc = sha256Disc;
|
|
5
|
+
exports.decodePosition = decodePosition;
|
|
6
|
+
exports.decodeMarketState = decodeMarketState;
|
|
7
|
+
exports.decodePoolState = decodePoolState;
|
|
8
|
+
exports.decodeOrder = decodeOrder;
|
|
9
|
+
exports.decodeOrderNonce = decodeOrderNonce;
|
|
10
|
+
exports.decodeTradingKey = decodeTradingKey;
|
|
11
|
+
exports.decodeReferralConfig = decodeReferralConfig;
|
|
12
|
+
exports.decodeReferralCode = decodeReferralCode;
|
|
13
|
+
exports.decodeTraderReferral = decodeTraderReferral;
|
|
14
|
+
exports.decodeAffiliateReward = decodeAffiliateReward;
|
|
15
|
+
exports.decodeFeePool = decodeFeePool;
|
|
16
|
+
exports.decodeStakingPool = decodeStakingPool;
|
|
17
|
+
exports.decodeStakePosition = decodeStakePosition;
|
|
18
|
+
exports.decodePayoutQueueEntry = decodePayoutQueueEntry;
|
|
19
|
+
exports.decodeUserQueueClaims = decodeUserQueueClaims;
|
|
20
|
+
exports.identifyAccountType = identifyAccountType;
|
|
21
|
+
const node_crypto_1 = require("node:crypto");
|
|
22
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
23
|
+
function sha256Disc(name) {
|
|
24
|
+
const hash = (0, node_crypto_1.createHash)("sha256").update(`account:${name}`).digest();
|
|
25
|
+
return hash.subarray(0, 8);
|
|
26
|
+
}
|
|
27
|
+
exports.DISCRIMINATORS = {
|
|
28
|
+
Position: sha256Disc("Position"),
|
|
29
|
+
MarketState: sha256Disc("MarketState"),
|
|
30
|
+
PoolState: sha256Disc("PoolState"),
|
|
31
|
+
Order: sha256Disc("Order"),
|
|
32
|
+
OrderNonce: sha256Disc("OrderNonce"),
|
|
33
|
+
TradingKey: sha256Disc("TradingKey"),
|
|
34
|
+
ReferralConfig: sha256Disc("ReferralConfig"),
|
|
35
|
+
ReferralCode: sha256Disc("ReferralCode"),
|
|
36
|
+
TraderReferral: sha256Disc("TraderReferral"),
|
|
37
|
+
AffiliateReward: sha256Disc("AffiliateReward"),
|
|
38
|
+
FeePool: sha256Disc("FeePool"),
|
|
39
|
+
StakingPool: sha256Disc("StakingPool"),
|
|
40
|
+
StakePosition: sha256Disc("StakePosition"),
|
|
41
|
+
PayoutQueueEntry: sha256Disc("PayoutQueueEntry"),
|
|
42
|
+
UserQueueClaims: sha256Disc("UserQueueClaims"),
|
|
43
|
+
};
|
|
44
|
+
class DecoderError extends Error {
|
|
45
|
+
constructor(message) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.name = "DecoderError";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.DecoderError = DecoderError;
|
|
51
|
+
function checkDisc(data, expected, typeName) {
|
|
52
|
+
if (data.byteLength < 8) {
|
|
53
|
+
throw new DecoderError(`${typeName}: data too short for discriminator (${data.byteLength} < 8)`);
|
|
54
|
+
}
|
|
55
|
+
for (let i = 0; i < 8; i++) {
|
|
56
|
+
if (data[i] !== expected[i]) {
|
|
57
|
+
throw new DecoderError(`${typeName}: discriminator mismatch at byte ${i} ` +
|
|
58
|
+
`(got 0x${data[i].toString(16).padStart(2, "0")}, ` +
|
|
59
|
+
`expected 0x${expected[i].toString(16).padStart(2, "0")})`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function checkLen(data, expected, typeName) {
|
|
64
|
+
if (data.byteLength !== expected) {
|
|
65
|
+
throw new DecoderError(`${typeName}: expected ${expected} bytes, got ${data.byteLength}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function readU8(view, offset) {
|
|
69
|
+
return view.getUint8(offset);
|
|
70
|
+
}
|
|
71
|
+
function readU16LE(view, offset) {
|
|
72
|
+
return view.getUint16(offset, true);
|
|
73
|
+
}
|
|
74
|
+
function readU32LE(view, offset) {
|
|
75
|
+
return view.getUint32(offset, true);
|
|
76
|
+
}
|
|
77
|
+
function readU64LE(view, offset) {
|
|
78
|
+
return view.getBigUint64(offset, true);
|
|
79
|
+
}
|
|
80
|
+
function readI64LE(view, offset) {
|
|
81
|
+
return view.getBigInt64(offset, true);
|
|
82
|
+
}
|
|
83
|
+
function readU128LE(view, offset) {
|
|
84
|
+
const lo = view.getBigUint64(offset, true);
|
|
85
|
+
const hi = view.getBigUint64(offset + 8, true);
|
|
86
|
+
return lo | (hi << 64n);
|
|
87
|
+
}
|
|
88
|
+
function readI128LE(view, offset) {
|
|
89
|
+
const lo = view.getBigUint64(offset, true);
|
|
90
|
+
const hi = view.getBigInt64(offset + 8, true);
|
|
91
|
+
return lo | (hi << 64n);
|
|
92
|
+
}
|
|
93
|
+
function readPubkey(view, offset) {
|
|
94
|
+
const bytes = new Uint8Array(view.buffer, view.byteOffset + offset, 32);
|
|
95
|
+
return new web3_js_1.PublicKey(bytes);
|
|
96
|
+
}
|
|
97
|
+
function readBytes(view, offset, len) {
|
|
98
|
+
return new Uint8Array(view.buffer.slice(view.byteOffset + offset, view.byteOffset + offset + len));
|
|
99
|
+
}
|
|
100
|
+
function readBool(view, offset) {
|
|
101
|
+
return view.getUint8(offset) !== 0;
|
|
102
|
+
}
|
|
103
|
+
function readSide(view, offset) {
|
|
104
|
+
const v = view.getUint8(offset);
|
|
105
|
+
if (v === 0)
|
|
106
|
+
return "long";
|
|
107
|
+
if (v === 1)
|
|
108
|
+
return "short";
|
|
109
|
+
throw new DecoderError(`invalid Side byte: ${v}`);
|
|
110
|
+
}
|
|
111
|
+
function readOrderType(view, offset) {
|
|
112
|
+
const v = view.getUint8(offset);
|
|
113
|
+
const map = [
|
|
114
|
+
"marketIncrease",
|
|
115
|
+
"limitIncrease",
|
|
116
|
+
"stopIncrease",
|
|
117
|
+
"marketDecrease",
|
|
118
|
+
"limitDecrease",
|
|
119
|
+
"stopLossDecrease",
|
|
120
|
+
];
|
|
121
|
+
const result = map[v];
|
|
122
|
+
if (result === undefined) {
|
|
123
|
+
throw new DecoderError(`invalid OrderType byte: ${v}`);
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
function makeView(data) {
|
|
128
|
+
return new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
129
|
+
}
|
|
130
|
+
function decodePosition(data) {
|
|
131
|
+
checkDisc(data, exports.DISCRIMINATORS.Position, "Position");
|
|
132
|
+
checkLen(data, 154, "Position");
|
|
133
|
+
const v = makeView(data);
|
|
134
|
+
return {
|
|
135
|
+
owner: readPubkey(v, 8),
|
|
136
|
+
marketId: readBytes(v, 40, 32),
|
|
137
|
+
side: readSide(v, 72),
|
|
138
|
+
sizeUsdc: readU64LE(v, 73),
|
|
139
|
+
collateralUsdc: readU64LE(v, 81),
|
|
140
|
+
entryPrice: readU64LE(v, 89),
|
|
141
|
+
fundingIndexSnapshot: readI128LE(v, 97),
|
|
142
|
+
borrowingFactorSnapshot: readU128LE(v, 113),
|
|
143
|
+
reservedMaxPayout: readU64LE(v, 129),
|
|
144
|
+
collateralFromQueue: readU64LE(v, 137),
|
|
145
|
+
openedAt: readI64LE(v, 145),
|
|
146
|
+
bump: readU8(v, 153),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function decodeMarketState(data) {
|
|
150
|
+
checkDisc(data, exports.DISCRIMINATORS.MarketState, "MarketState");
|
|
151
|
+
if (data.length !== 460 && data.length !== 476 && data.length !== 511) {
|
|
152
|
+
checkLen(data, 511, "MarketState");
|
|
153
|
+
}
|
|
154
|
+
const v = makeView(data);
|
|
155
|
+
const base = {
|
|
156
|
+
marketId: readBytes(v, 8, 32),
|
|
157
|
+
longOi: readU64LE(v, 40),
|
|
158
|
+
shortOi: readU64LE(v, 48),
|
|
159
|
+
fundingIndex: readI128LE(v, 56),
|
|
160
|
+
lastFundingTs: readI64LE(v, 72),
|
|
161
|
+
maxLeverage: readU8(v, 80),
|
|
162
|
+
baseFeeBps: readU16LE(v, 81),
|
|
163
|
+
mmrBps: readU16LE(v, 83),
|
|
164
|
+
poolState: readPubkey(v, 85),
|
|
165
|
+
poolProgram: readPubkey(v, 117),
|
|
166
|
+
oracleProgram: readPubkey(v, 149),
|
|
167
|
+
treasury: readPubkey(v, 181),
|
|
168
|
+
stakingProgramId: readPubkey(v, 213),
|
|
169
|
+
engineAuthBump: readU8(v, 245),
|
|
170
|
+
isPaused: readBool(v, 246),
|
|
171
|
+
savedFundingFactorPerSecond: readI128LE(v, 247),
|
|
172
|
+
fundingIncreaseFactorPerSecond: readU64LE(v, 263),
|
|
173
|
+
fundingDecreaseFactorPerSecond: readU64LE(v, 271),
|
|
174
|
+
thresholdForStableFunding: readU64LE(v, 279),
|
|
175
|
+
thresholdForDecreaseFunding: readU64LE(v, 287),
|
|
176
|
+
minFundingFactorPerSecond: readU64LE(v, 295),
|
|
177
|
+
maxFundingFactorPerSecond: readU64LE(v, 303),
|
|
178
|
+
longCumulativeBorrowingFactor: readU128LE(v, 311),
|
|
179
|
+
shortCumulativeBorrowingFactor: readU128LE(v, 327),
|
|
180
|
+
lastBorrowingTs: readI64LE(v, 343),
|
|
181
|
+
borrowingFactor: readU64LE(v, 351),
|
|
182
|
+
optimalUsageFactor: readU64LE(v, 359),
|
|
183
|
+
aboveOptimalBorrowingFactor: readU64LE(v, 367),
|
|
184
|
+
longReservedUsdc: readU64LE(v, 375),
|
|
185
|
+
shortReservedUsdc: readU64LE(v, 383),
|
|
186
|
+
priceImpactFactor: readU64LE(v, 391),
|
|
187
|
+
maxPriceImpactBps: readU16LE(v, 399),
|
|
188
|
+
impactPoolUsdc: readU64LE(v, 401),
|
|
189
|
+
keeper: readPubkey(v, 409),
|
|
190
|
+
maxOiLong: readU64LE(v, 441),
|
|
191
|
+
maxOiShort: readU64LE(v, 449),
|
|
192
|
+
feeBpsFavorable: readU16LE(v, 457),
|
|
193
|
+
bump: readU8(v, 459),
|
|
194
|
+
};
|
|
195
|
+
if (data.length >= 476) {
|
|
196
|
+
const v2 = {
|
|
197
|
+
...base,
|
|
198
|
+
offHoursMaxOiLong: readU64LE(v, 460),
|
|
199
|
+
offHoursMaxOiShort: readU64LE(v, 468),
|
|
200
|
+
};
|
|
201
|
+
if (data.length >= 511) {
|
|
202
|
+
return {
|
|
203
|
+
...v2,
|
|
204
|
+
adlFrozen: readU8(v, 476),
|
|
205
|
+
adlTailTriggerUsdcRth: readU64LE(v, 477),
|
|
206
|
+
adlTailTriggerUsdcOff: readU64LE(v, 485),
|
|
207
|
+
adlTailMinAgeSecsRth: readU32LE(v, 493),
|
|
208
|
+
adlTailMinAgeSecsOff: readU32LE(v, 497),
|
|
209
|
+
adlHaircutBpsRth: readU16LE(v, 501),
|
|
210
|
+
adlHaircutBpsOff: readU16LE(v, 503),
|
|
211
|
+
adlMaxHaircutBps: readU16LE(v, 505),
|
|
212
|
+
adlMaxFeedDivergenceBps: readU16LE(v, 507),
|
|
213
|
+
initialMarginBps: readU16LE(v, 509),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return v2;
|
|
217
|
+
}
|
|
218
|
+
return base;
|
|
219
|
+
}
|
|
220
|
+
function decodePoolState(data) {
|
|
221
|
+
checkDisc(data, exports.DISCRIMINATORS.PoolState, "PoolState");
|
|
222
|
+
if (data.byteLength !== 240 && data.byteLength !== 252) {
|
|
223
|
+
throw new DecoderError(`PoolState: expected 240 or 252 bytes, got ${data.byteLength}`);
|
|
224
|
+
}
|
|
225
|
+
const v = makeView(data);
|
|
226
|
+
const hasAdl = data.byteLength >= 252;
|
|
227
|
+
return {
|
|
228
|
+
marketId: readBytes(v, 8, 32),
|
|
229
|
+
usdcVault: readPubkey(v, 40),
|
|
230
|
+
vaultAuthorityBump: readU8(v, 72),
|
|
231
|
+
lpMint: readPubkey(v, 73),
|
|
232
|
+
totalUsdc: readU64LE(v, 105),
|
|
233
|
+
reservedUsdc: readU64LE(v, 113),
|
|
234
|
+
cumulativeFees: readU64LE(v, 121),
|
|
235
|
+
engineAuth: readPubkey(v, 129),
|
|
236
|
+
engineAuthBump: readU8(v, 161),
|
|
237
|
+
admin: readPubkey(v, 162),
|
|
238
|
+
isPaused: readBool(v, 194),
|
|
239
|
+
reserveFactor: readU64LE(v, 195),
|
|
240
|
+
depositFeeBps: readU16LE(v, 203),
|
|
241
|
+
withdrawalFeeBps: readU16LE(v, 205),
|
|
242
|
+
sideBucket: readU64LE(v, 207),
|
|
243
|
+
queueHeadIdx: readU64LE(v, 215),
|
|
244
|
+
queueTailIdx: readU64LE(v, 223),
|
|
245
|
+
queueTotalOwed: readU64LE(v, 231),
|
|
246
|
+
bump: readU8(v, 239),
|
|
247
|
+
currentAdlEpoch: hasAdl ? readU32LE(v, 240) : 0,
|
|
248
|
+
lastAdlCutIdx: hasAdl ? readU64LE(v, 244) : 0n,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function decodeOrder(data) {
|
|
252
|
+
checkDisc(data, exports.DISCRIMINATORS.Order, "Order");
|
|
253
|
+
checkLen(data, 171, "Order");
|
|
254
|
+
const v = makeView(data);
|
|
255
|
+
return {
|
|
256
|
+
owner: readPubkey(v, 8),
|
|
257
|
+
marketId: readBytes(v, 40, 32),
|
|
258
|
+
orderType: readOrderType(v, 72),
|
|
259
|
+
side: readSide(v, 73),
|
|
260
|
+
sizeUsdc: readU64LE(v, 74),
|
|
261
|
+
collateralUsdc: readU64LE(v, 82),
|
|
262
|
+
triggerPrice: readU64LE(v, 90),
|
|
263
|
+
acceptablePrice: readU64LE(v, 98),
|
|
264
|
+
minOutputUsdc: readU64LE(v, 106),
|
|
265
|
+
referralCode: readBytes(v, 114, 32),
|
|
266
|
+
positionNonce: readU64LE(v, 146),
|
|
267
|
+
createdAt: readI64LE(v, 154),
|
|
268
|
+
nonce: readU64LE(v, 162),
|
|
269
|
+
bump: readU8(v, 170),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function decodeOrderNonce(data) {
|
|
273
|
+
checkDisc(data, exports.DISCRIMINATORS.OrderNonce, "OrderNonce");
|
|
274
|
+
checkLen(data, 49, "OrderNonce");
|
|
275
|
+
const v = makeView(data);
|
|
276
|
+
return {
|
|
277
|
+
owner: readPubkey(v, 8),
|
|
278
|
+
nonce: readU64LE(v, 40),
|
|
279
|
+
bump: readU8(v, 48),
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function decodeTradingKey(data) {
|
|
283
|
+
checkDisc(data, exports.DISCRIMINATORS.TradingKey, "TradingKey");
|
|
284
|
+
checkLen(data, 81, "TradingKey");
|
|
285
|
+
const v = makeView(data);
|
|
286
|
+
return {
|
|
287
|
+
wallet: readPubkey(v, 8),
|
|
288
|
+
delegate: readPubkey(v, 40),
|
|
289
|
+
expiresAt: readI64LE(v, 72),
|
|
290
|
+
bump: readU8(v, 80),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
function decodeReferralConfig(data) {
|
|
294
|
+
checkDisc(data, exports.DISCRIMINATORS.ReferralConfig, "ReferralConfig");
|
|
295
|
+
checkLen(data, 53, "ReferralConfig");
|
|
296
|
+
const v = makeView(data);
|
|
297
|
+
function readTier(offset) {
|
|
298
|
+
return {
|
|
299
|
+
totalRebateBps: readU16LE(v, offset),
|
|
300
|
+
discountSharePct: readU8(v, offset + 2),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
admin: readPubkey(v, 8),
|
|
305
|
+
tiers: [
|
|
306
|
+
readTier(40),
|
|
307
|
+
readTier(43),
|
|
308
|
+
readTier(46),
|
|
309
|
+
readTier(49),
|
|
310
|
+
],
|
|
311
|
+
bump: readU8(v, 52),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function decodeReferralCode(data) {
|
|
315
|
+
checkDisc(data, exports.DISCRIMINATORS.ReferralCode, "ReferralCode");
|
|
316
|
+
checkLen(data, 74, "ReferralCode");
|
|
317
|
+
const v = makeView(data);
|
|
318
|
+
return {
|
|
319
|
+
owner: readPubkey(v, 8),
|
|
320
|
+
code: readBytes(v, 40, 32),
|
|
321
|
+
tier: readU8(v, 72),
|
|
322
|
+
bump: readU8(v, 73),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function decodeTraderReferral(data) {
|
|
326
|
+
checkDisc(data, exports.DISCRIMINATORS.TraderReferral, "TraderReferral");
|
|
327
|
+
checkLen(data, 73, "TraderReferral");
|
|
328
|
+
const v = makeView(data);
|
|
329
|
+
return {
|
|
330
|
+
trader: readPubkey(v, 8),
|
|
331
|
+
code: readBytes(v, 40, 32),
|
|
332
|
+
bump: readU8(v, 72),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
function decodeAffiliateReward(data) {
|
|
336
|
+
checkDisc(data, exports.DISCRIMINATORS.AffiliateReward, "AffiliateReward");
|
|
337
|
+
checkLen(data, 81, "AffiliateReward");
|
|
338
|
+
const v = makeView(data);
|
|
339
|
+
return {
|
|
340
|
+
affiliate: readPubkey(v, 8),
|
|
341
|
+
marketId: readBytes(v, 40, 32),
|
|
342
|
+
accruedUsdc: readU64LE(v, 72),
|
|
343
|
+
bump: readU8(v, 80),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function decodeFeePool(data) {
|
|
347
|
+
checkDisc(data, exports.DISCRIMINATORS.FeePool, "FeePool");
|
|
348
|
+
checkLen(data, 215, "FeePool");
|
|
349
|
+
const v = makeView(data);
|
|
350
|
+
return {
|
|
351
|
+
admin: readPubkey(v, 8),
|
|
352
|
+
perpEngine: readPubkey(v, 40),
|
|
353
|
+
usdcAccount: readPubkey(v, 72),
|
|
354
|
+
stakingReward: readPubkey(v, 104),
|
|
355
|
+
treasury: readPubkey(v, 136),
|
|
356
|
+
referralReserve: readPubkey(v, 168),
|
|
357
|
+
stakerSplitBps: readU16LE(v, 200),
|
|
358
|
+
treasurySplitBps: readU16LE(v, 202),
|
|
359
|
+
referralSplitBps: readU16LE(v, 204),
|
|
360
|
+
totalDistributed: readU64LE(v, 206),
|
|
361
|
+
bump: readU8(v, 214),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
function decodeStakingPool(data) {
|
|
365
|
+
checkDisc(data, exports.DISCRIMINATORS.StakingPool, "StakingPool");
|
|
366
|
+
checkLen(data, 282, "StakingPool");
|
|
367
|
+
const v = makeView(data);
|
|
368
|
+
return {
|
|
369
|
+
admin: readPubkey(v, 8),
|
|
370
|
+
tokenMint: readPubkey(v, 40),
|
|
371
|
+
stakedVault: readPubkey(v, 72),
|
|
372
|
+
rewardSource: readU8(v, 104),
|
|
373
|
+
rewardMint: readPubkey(v, 105),
|
|
374
|
+
rewardVault: readPubkey(v, 137),
|
|
375
|
+
rewardUsdc: readPubkey(v, 169),
|
|
376
|
+
totalWeightedStake: readU128LE(v, 201),
|
|
377
|
+
rewardIndex: readU128LE(v, 217),
|
|
378
|
+
totalRewardsDistributed: readU64LE(v, 233),
|
|
379
|
+
totalAllocation: readU64LE(v, 241),
|
|
380
|
+
startTs: readI64LE(v, 249),
|
|
381
|
+
endTs: readI64LE(v, 257),
|
|
382
|
+
emittedSoFar: readU64LE(v, 265),
|
|
383
|
+
lastUpdateTs: readI64LE(v, 273),
|
|
384
|
+
bump: readU8(v, 281),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
function decodeStakePosition(data) {
|
|
388
|
+
checkDisc(data, exports.DISCRIMINATORS.StakePosition, "StakePosition");
|
|
389
|
+
checkLen(data, 122, "StakePosition");
|
|
390
|
+
const v = makeView(data);
|
|
391
|
+
return {
|
|
392
|
+
pool: readPubkey(v, 8),
|
|
393
|
+
owner: readPubkey(v, 40),
|
|
394
|
+
amount: readU64LE(v, 72),
|
|
395
|
+
lockupTier: readU8(v, 80),
|
|
396
|
+
lockupExpiry: readI64LE(v, 81),
|
|
397
|
+
weightedAmount: readU64LE(v, 89),
|
|
398
|
+
rewardIndexSnap: readU128LE(v, 97),
|
|
399
|
+
accruedReward: readU64LE(v, 113),
|
|
400
|
+
bump: readU8(v, 121),
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
function decodePayoutQueueEntry(data) {
|
|
404
|
+
checkDisc(data, exports.DISCRIMINATORS.PayoutQueueEntry, "PayoutQueueEntry");
|
|
405
|
+
checkLen(data, 98, "PayoutQueueEntry");
|
|
406
|
+
const v = makeView(data);
|
|
407
|
+
return {
|
|
408
|
+
owner: readPubkey(v, 8),
|
|
409
|
+
marketId: readBytes(v, 40, 32),
|
|
410
|
+
idx: readU64LE(v, 72),
|
|
411
|
+
amount: readU64LE(v, 80),
|
|
412
|
+
enqueuedAt: readI64LE(v, 88),
|
|
413
|
+
status: readU8(v, 96),
|
|
414
|
+
bump: readU8(v, 97),
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
function decodeUserQueueClaims(data) {
|
|
418
|
+
checkDisc(data, exports.DISCRIMINATORS.UserQueueClaims, "UserQueueClaims");
|
|
419
|
+
checkLen(data, 97, "UserQueueClaims");
|
|
420
|
+
const v = makeView(data);
|
|
421
|
+
return {
|
|
422
|
+
owner: readPubkey(v, 8),
|
|
423
|
+
marketId: readBytes(v, 40, 32),
|
|
424
|
+
unpaidOwed: readU64LE(v, 72),
|
|
425
|
+
collateralDrawn: readU64LE(v, 80),
|
|
426
|
+
phantomUnpaidOwed: readU64LE(v, 88),
|
|
427
|
+
bump: readU8(v, 96),
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
function identifyAccountType(data) {
|
|
431
|
+
if (data.byteLength < 8)
|
|
432
|
+
return null;
|
|
433
|
+
for (const [name, disc] of Object.entries(exports.DISCRIMINATORS)) {
|
|
434
|
+
let match = true;
|
|
435
|
+
for (let i = 0; i < 8; i++) {
|
|
436
|
+
if (data[i] !== disc[i]) {
|
|
437
|
+
match = false;
|
|
438
|
+
break;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (match)
|
|
442
|
+
return name;
|
|
443
|
+
}
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { PositionOpenedEvent, PositionClosedEvent, LiquidatedEvent, BadDebtEvent, FundingUpdatedEvent, EnqueuedEvent, HarvestedEvent, EntryVoidedEvent, SideBucketCreditedEvent, QueueDrainedEvent, PhantomCreditDrainedEvent, FeesSweptEvent, FeesDistributedEvent, TreasuryWithdrawalEvent, StakedEvent, UnstakedEvent, RewardClaimedEvent, RewardIndexUpdatedEvent, CompoundedRewardEvent } from "../types";
|
|
2
|
+
export type DecodedEvent = {
|
|
3
|
+
type: "positionOpened";
|
|
4
|
+
data: PositionOpenedEvent;
|
|
5
|
+
} | {
|
|
6
|
+
type: "positionClosed";
|
|
7
|
+
data: PositionClosedEvent;
|
|
8
|
+
} | {
|
|
9
|
+
type: "liquidated";
|
|
10
|
+
data: LiquidatedEvent;
|
|
11
|
+
} | {
|
|
12
|
+
type: "badDebt";
|
|
13
|
+
data: BadDebtEvent;
|
|
14
|
+
} | {
|
|
15
|
+
type: "fundingUpdated";
|
|
16
|
+
data: FundingUpdatedEvent;
|
|
17
|
+
} | {
|
|
18
|
+
type: "enqueued";
|
|
19
|
+
data: EnqueuedEvent;
|
|
20
|
+
} | {
|
|
21
|
+
type: "harvested";
|
|
22
|
+
data: HarvestedEvent;
|
|
23
|
+
} | {
|
|
24
|
+
type: "entryVoided";
|
|
25
|
+
data: EntryVoidedEvent;
|
|
26
|
+
} | {
|
|
27
|
+
type: "sideBucketCredited";
|
|
28
|
+
data: SideBucketCreditedEvent;
|
|
29
|
+
} | {
|
|
30
|
+
type: "queueDrained";
|
|
31
|
+
data: QueueDrainedEvent;
|
|
32
|
+
} | {
|
|
33
|
+
type: "phantomCreditDrained";
|
|
34
|
+
data: PhantomCreditDrainedEvent;
|
|
35
|
+
} | {
|
|
36
|
+
type: "feesSwept";
|
|
37
|
+
data: FeesSweptEvent;
|
|
38
|
+
} | {
|
|
39
|
+
type: "feesDistributed";
|
|
40
|
+
data: FeesDistributedEvent;
|
|
41
|
+
} | {
|
|
42
|
+
type: "treasuryWithdrawal";
|
|
43
|
+
data: TreasuryWithdrawalEvent;
|
|
44
|
+
} | {
|
|
45
|
+
type: "staked";
|
|
46
|
+
data: StakedEvent;
|
|
47
|
+
} | {
|
|
48
|
+
type: "unstaked";
|
|
49
|
+
data: UnstakedEvent;
|
|
50
|
+
} | {
|
|
51
|
+
type: "rewardClaimed";
|
|
52
|
+
data: RewardClaimedEvent;
|
|
53
|
+
} | {
|
|
54
|
+
type: "rewardIndexUpdated";
|
|
55
|
+
data: RewardIndexUpdatedEvent;
|
|
56
|
+
} | {
|
|
57
|
+
type: "compoundedReward";
|
|
58
|
+
data: CompoundedRewardEvent;
|
|
59
|
+
};
|
|
60
|
+
export declare function decodeAnchorEvent(base64Data: string): DecodedEvent | null;
|