@hadron-fi/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/dist/index.d.mts +676 -0
- package/dist/index.d.ts +676 -0
- package/dist/index.js +1653 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1653 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +43 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,1653 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/constants/index.ts
|
|
2
|
+
var _web3js = require('@solana/web3.js');
|
|
3
|
+
var HADRON_PROGRAM_ID = new (0, _web3js.PublicKey)(
|
|
4
|
+
"Q72w4coozA552keKDdeeh2EyQw32qfMFsHPu6cbatom"
|
|
5
|
+
);
|
|
6
|
+
var CONFIG_SEED = Buffer.from("hadron-config");
|
|
7
|
+
var MIDPRICE_ORACLE_SEED = Buffer.from("hadron-midprice");
|
|
8
|
+
var CURVE_META_SEED = Buffer.from("hadron-curve-meta");
|
|
9
|
+
var CURVE_PREFABS_SEED = Buffer.from("hadron-curve-prefabs");
|
|
10
|
+
var CURVE_UPDATES_SEED = Buffer.from("hadron-curve-updates");
|
|
11
|
+
var FEE_CONFIG_SEED = Buffer.from("fee_config");
|
|
12
|
+
var SPREAD_CONFIG_SEED = Buffer.from("spread_config");
|
|
13
|
+
var CONFIG_SIZE = 248;
|
|
14
|
+
var MIDPRICE_ORACLE_SIZE = 64;
|
|
15
|
+
var CURVE_META_SIZE = 48;
|
|
16
|
+
var FEE_CONFIG_SIZE = 72;
|
|
17
|
+
var CURVE_UPDATES_SIZE = 258;
|
|
18
|
+
var CURVE_SIDE_HEADER = 8;
|
|
19
|
+
var CURVE_POINT_LEN = 24;
|
|
20
|
+
var DEFAULT_MAX_PREFAB_SLOTS = 10;
|
|
21
|
+
var DEFAULT_MAX_CURVE_POINTS = 16;
|
|
22
|
+
var ABSOLUTE_MAX_PREFAB_SLOTS = 16;
|
|
23
|
+
var ABSOLUTE_MAX_CURVE_POINTS = 128;
|
|
24
|
+
var MAX_SETCURVE_POINTS = 32;
|
|
25
|
+
var MAX_CURVE_UPDATE_OPS = 8;
|
|
26
|
+
var Q32_ONE = BigInt(1) << BigInt(32);
|
|
27
|
+
var Discriminator = {
|
|
28
|
+
Initialize: 0,
|
|
29
|
+
Deposit: 1,
|
|
30
|
+
Withdraw: 2,
|
|
31
|
+
SwapExactIn: 3,
|
|
32
|
+
SetCurve: 4,
|
|
33
|
+
UpdateMidprice: 5,
|
|
34
|
+
InitializeFeeConfig: 6,
|
|
35
|
+
UpdateFeeConfig: 7,
|
|
36
|
+
SetRiskCurve: 8,
|
|
37
|
+
UpdateBaseSpread: 9,
|
|
38
|
+
UpdateMidpriceAndBaseSpread: 10,
|
|
39
|
+
SwitchPriceCurve: 11,
|
|
40
|
+
SwitchRiskCurve: 12,
|
|
41
|
+
InitializeSpreadConfig: 13,
|
|
42
|
+
UpdateSpreadConfig: 14,
|
|
43
|
+
UpdateDeltaStaleness: 15,
|
|
44
|
+
NominateAuthority: 16,
|
|
45
|
+
AcceptAuthority: 17,
|
|
46
|
+
SubmitCurveUpdates: 18,
|
|
47
|
+
ApplyCurveUpdates: 19,
|
|
48
|
+
ClosePool: 20,
|
|
49
|
+
SetPoolState: 21,
|
|
50
|
+
AllocateCurvePrefabs: 22,
|
|
51
|
+
SetQuotingAuthority: 23,
|
|
52
|
+
RotateFeeAdmin: 24
|
|
53
|
+
};
|
|
54
|
+
var POINT_DATA_SIZE = 21;
|
|
55
|
+
var CURVE_UPDATE_OP_SIZE = 24;
|
|
56
|
+
function curvePrefabsSize(maxSlots, maxPoints) {
|
|
57
|
+
return 32 + 4 * maxSlots * (CURVE_SIDE_HEADER + maxPoints * CURVE_POINT_LEN);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// src/helpers/derive.ts
|
|
61
|
+
|
|
62
|
+
var _spltoken = require('@solana/spl-token');
|
|
63
|
+
function seedToBuffer(seed) {
|
|
64
|
+
const buf = Buffer.alloc(8);
|
|
65
|
+
buf.writeBigUInt64LE(seed);
|
|
66
|
+
return buf;
|
|
67
|
+
}
|
|
68
|
+
function getConfigAddress(seed, mintX, mintY, programId = HADRON_PROGRAM_ID) {
|
|
69
|
+
return _web3js.PublicKey.findProgramAddressSync(
|
|
70
|
+
[CONFIG_SEED, seedToBuffer(seed), mintX.toBuffer(), mintY.toBuffer()],
|
|
71
|
+
programId
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
function getMidpriceOracleAddress(seed, mintX, mintY, programId = HADRON_PROGRAM_ID) {
|
|
75
|
+
return _web3js.PublicKey.findProgramAddressSync(
|
|
76
|
+
[
|
|
77
|
+
MIDPRICE_ORACLE_SEED,
|
|
78
|
+
seedToBuffer(seed),
|
|
79
|
+
mintX.toBuffer(),
|
|
80
|
+
mintY.toBuffer()
|
|
81
|
+
],
|
|
82
|
+
programId
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
function getCurveMetaAddress(seed, mintX, mintY, programId = HADRON_PROGRAM_ID) {
|
|
86
|
+
return _web3js.PublicKey.findProgramAddressSync(
|
|
87
|
+
[CURVE_META_SEED, seedToBuffer(seed), mintX.toBuffer(), mintY.toBuffer()],
|
|
88
|
+
programId
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
function getCurvePrefabsAddress(seed, mintX, mintY, programId = HADRON_PROGRAM_ID) {
|
|
92
|
+
return _web3js.PublicKey.findProgramAddressSync(
|
|
93
|
+
[
|
|
94
|
+
CURVE_PREFABS_SEED,
|
|
95
|
+
seedToBuffer(seed),
|
|
96
|
+
mintX.toBuffer(),
|
|
97
|
+
mintY.toBuffer()
|
|
98
|
+
],
|
|
99
|
+
programId
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
function getCurveUpdatesAddress(seed, mintX, mintY, programId = HADRON_PROGRAM_ID) {
|
|
103
|
+
return _web3js.PublicKey.findProgramAddressSync(
|
|
104
|
+
[
|
|
105
|
+
CURVE_UPDATES_SEED,
|
|
106
|
+
seedToBuffer(seed),
|
|
107
|
+
mintX.toBuffer(),
|
|
108
|
+
mintY.toBuffer()
|
|
109
|
+
],
|
|
110
|
+
programId
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
function getFeeConfigAddress(programId = HADRON_PROGRAM_ID) {
|
|
114
|
+
return _web3js.PublicKey.findProgramAddressSync([FEE_CONFIG_SEED], programId);
|
|
115
|
+
}
|
|
116
|
+
function getSpreadConfigAddress(configPda, programId = HADRON_PROGRAM_ID) {
|
|
117
|
+
return _web3js.PublicKey.findProgramAddressSync(
|
|
118
|
+
[SPREAD_CONFIG_SEED, configPda.toBuffer()],
|
|
119
|
+
programId
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
function derivePoolAddresses(seed, mintX, mintY, tokenProgramX, tokenProgramY, programId = HADRON_PROGRAM_ID) {
|
|
123
|
+
const [config, configBump] = getConfigAddress(seed, mintX, mintY, programId);
|
|
124
|
+
const [midpriceOracle] = getMidpriceOracleAddress(
|
|
125
|
+
seed,
|
|
126
|
+
mintX,
|
|
127
|
+
mintY,
|
|
128
|
+
programId
|
|
129
|
+
);
|
|
130
|
+
const [curveMeta] = getCurveMetaAddress(seed, mintX, mintY, programId);
|
|
131
|
+
const [curvePrefabs] = getCurvePrefabsAddress(seed, mintX, mintY, programId);
|
|
132
|
+
const [curveUpdates] = getCurveUpdatesAddress(seed, mintX, mintY, programId);
|
|
133
|
+
const vaultX = _spltoken.getAssociatedTokenAddressSync.call(void 0,
|
|
134
|
+
mintX,
|
|
135
|
+
config,
|
|
136
|
+
true,
|
|
137
|
+
tokenProgramX
|
|
138
|
+
);
|
|
139
|
+
const vaultY = _spltoken.getAssociatedTokenAddressSync.call(void 0,
|
|
140
|
+
mintY,
|
|
141
|
+
config,
|
|
142
|
+
true,
|
|
143
|
+
tokenProgramY
|
|
144
|
+
);
|
|
145
|
+
return {
|
|
146
|
+
config,
|
|
147
|
+
configBump,
|
|
148
|
+
midpriceOracle,
|
|
149
|
+
curveMeta,
|
|
150
|
+
curvePrefabs,
|
|
151
|
+
curveUpdates,
|
|
152
|
+
vaultX,
|
|
153
|
+
vaultY
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// src/helpers/math.ts
|
|
158
|
+
function toQ32(value) {
|
|
159
|
+
return BigInt(Math.floor(value * Number(Q32_ONE)));
|
|
160
|
+
}
|
|
161
|
+
function fromQ32(q32) {
|
|
162
|
+
const intPart = q32 >> 32n;
|
|
163
|
+
const fracPart = q32 & 0xFFFFFFFFn;
|
|
164
|
+
return Number(intPart) + Number(fracPart) / Number(Q32_ONE);
|
|
165
|
+
}
|
|
166
|
+
function pctToQ32(pct) {
|
|
167
|
+
return toQ32(pct);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// src/accounts/index.ts
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
// src/types/index.ts
|
|
174
|
+
var PoolState = /* @__PURE__ */ ((PoolState3) => {
|
|
175
|
+
PoolState3[PoolState3["Uninitialized"] = 0] = "Uninitialized";
|
|
176
|
+
PoolState3[PoolState3["Initialized"] = 1] = "Initialized";
|
|
177
|
+
PoolState3[PoolState3["Paused"] = 2] = "Paused";
|
|
178
|
+
PoolState3[PoolState3["WithdrawOnly"] = 3] = "WithdrawOnly";
|
|
179
|
+
return PoolState3;
|
|
180
|
+
})(PoolState || {});
|
|
181
|
+
var OracleMode = /* @__PURE__ */ ((OracleMode3) => {
|
|
182
|
+
OracleMode3[OracleMode3["Authority"] = 0] = "Authority";
|
|
183
|
+
OracleMode3[OracleMode3["Relative"] = 1] = "Relative";
|
|
184
|
+
return OracleMode3;
|
|
185
|
+
})(OracleMode || {});
|
|
186
|
+
var Interpolation = /* @__PURE__ */ ((Interpolation4) => {
|
|
187
|
+
Interpolation4[Interpolation4["Step"] = 0] = "Step";
|
|
188
|
+
Interpolation4[Interpolation4["Linear"] = 1] = "Linear";
|
|
189
|
+
Interpolation4[Interpolation4["MarginalStep"] = 2] = "MarginalStep";
|
|
190
|
+
Interpolation4[Interpolation4["Hyperbolic"] = 3] = "Hyperbolic";
|
|
191
|
+
Interpolation4[Interpolation4["Quadratic"] = 4] = "Quadratic";
|
|
192
|
+
Interpolation4[Interpolation4["Cubic"] = 5] = "Cubic";
|
|
193
|
+
return Interpolation4;
|
|
194
|
+
})(Interpolation || {});
|
|
195
|
+
var CurveType = /* @__PURE__ */ ((CurveType2) => {
|
|
196
|
+
CurveType2[CurveType2["PriceBid"] = 0] = "PriceBid";
|
|
197
|
+
CurveType2[CurveType2["PriceAsk"] = 1] = "PriceAsk";
|
|
198
|
+
CurveType2[CurveType2["RiskBid"] = 2] = "RiskBid";
|
|
199
|
+
CurveType2[CurveType2["RiskAsk"] = 3] = "RiskAsk";
|
|
200
|
+
return CurveType2;
|
|
201
|
+
})(CurveType || {});
|
|
202
|
+
var CurveXMode = /* @__PURE__ */ ((CurveXMode3) => {
|
|
203
|
+
CurveXMode3[CurveXMode3["Native"] = 0] = "Native";
|
|
204
|
+
CurveXMode3[CurveXMode3["Alternate"] = 1] = "Alternate";
|
|
205
|
+
return CurveXMode3;
|
|
206
|
+
})(CurveXMode || {});
|
|
207
|
+
var RiskMode = /* @__PURE__ */ ((RiskMode3) => {
|
|
208
|
+
RiskMode3[RiskMode3["Virtual"] = 0] = "Virtual";
|
|
209
|
+
RiskMode3[RiskMode3["Integrated"] = 1] = "Integrated";
|
|
210
|
+
return RiskMode3;
|
|
211
|
+
})(RiskMode || {});
|
|
212
|
+
var CurveUpdateOpKind = /* @__PURE__ */ ((CurveUpdateOpKind3) => {
|
|
213
|
+
CurveUpdateOpKind3[CurveUpdateOpKind3["Edit"] = 0] = "Edit";
|
|
214
|
+
CurveUpdateOpKind3[CurveUpdateOpKind3["Add"] = 1] = "Add";
|
|
215
|
+
CurveUpdateOpKind3[CurveUpdateOpKind3["Remove"] = 2] = "Remove";
|
|
216
|
+
return CurveUpdateOpKind3;
|
|
217
|
+
})(CurveUpdateOpKind || {});
|
|
218
|
+
var Side = /* @__PURE__ */ ((Side2) => {
|
|
219
|
+
Side2[Side2["Bid"] = 0] = "Bid";
|
|
220
|
+
Side2[Side2["Ask"] = 1] = "Ask";
|
|
221
|
+
return Side2;
|
|
222
|
+
})(Side || {});
|
|
223
|
+
|
|
224
|
+
// src/accounts/index.ts
|
|
225
|
+
function decodeConfig(data) {
|
|
226
|
+
const buf = Buffer.from(data);
|
|
227
|
+
let offset = 0;
|
|
228
|
+
const state = buf.readUInt8(offset);
|
|
229
|
+
offset += 1;
|
|
230
|
+
const seed = buf.readBigUInt64LE(offset);
|
|
231
|
+
offset += 8;
|
|
232
|
+
const authority = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
233
|
+
offset += 32;
|
|
234
|
+
const mintX = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
235
|
+
offset += 32;
|
|
236
|
+
const mintY = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
237
|
+
offset += 32;
|
|
238
|
+
const configBump = buf.readUInt8(offset);
|
|
239
|
+
offset += 1;
|
|
240
|
+
const curveMeta = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
241
|
+
offset += 32;
|
|
242
|
+
const spreadConfigInitialized = buf.readUInt8(offset) !== 0;
|
|
243
|
+
offset += 1;
|
|
244
|
+
const deltaStaleness = buf.readUInt8(offset);
|
|
245
|
+
offset += 1;
|
|
246
|
+
const oracleMode = buf.readUInt8(offset);
|
|
247
|
+
offset += 1;
|
|
248
|
+
offset += 3;
|
|
249
|
+
const pendingAuthority = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
250
|
+
offset += 32;
|
|
251
|
+
const nominationExpiry = buf.readBigUInt64LE(offset);
|
|
252
|
+
offset += 8;
|
|
253
|
+
const tokenProgramX = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
254
|
+
offset += 32;
|
|
255
|
+
const tokenProgramY = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
256
|
+
return {
|
|
257
|
+
state,
|
|
258
|
+
seed,
|
|
259
|
+
authority,
|
|
260
|
+
mintX,
|
|
261
|
+
mintY,
|
|
262
|
+
configBump,
|
|
263
|
+
curveMeta,
|
|
264
|
+
spreadConfigInitialized,
|
|
265
|
+
deltaStaleness,
|
|
266
|
+
oracleMode,
|
|
267
|
+
pendingAuthority,
|
|
268
|
+
nominationExpiry,
|
|
269
|
+
tokenProgramX,
|
|
270
|
+
tokenProgramY
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function decodeMidpriceOracle(data) {
|
|
274
|
+
const buf = Buffer.from(data);
|
|
275
|
+
const authority = new (0, _web3js.PublicKey)(buf.subarray(0, 32));
|
|
276
|
+
const sequence = buf.readBigUInt64LE(32);
|
|
277
|
+
const midpriceQ32 = buf.readBigUInt64LE(40);
|
|
278
|
+
const baseSpreadQ32 = buf.readBigUInt64LE(48);
|
|
279
|
+
const lastUpdateSlot = buf.length >= MIDPRICE_ORACLE_SIZE ? buf.readBigUInt64LE(56) : 0n;
|
|
280
|
+
return { authority, sequence, midpriceQ32, baseSpreadQ32, lastUpdateSlot };
|
|
281
|
+
}
|
|
282
|
+
function decodeCurveMeta(data) {
|
|
283
|
+
const buf = Buffer.from(data);
|
|
284
|
+
return {
|
|
285
|
+
authority: new (0, _web3js.PublicKey)(buf.subarray(0, 32)),
|
|
286
|
+
activePriceBidSlot: buf.readUInt8(32),
|
|
287
|
+
activePriceAskSlot: buf.readUInt8(33),
|
|
288
|
+
activeRiskBidSlot: buf.readUInt8(34),
|
|
289
|
+
activeRiskAskSlot: buf.readUInt8(35),
|
|
290
|
+
initializedSlots: new Uint8Array(buf.subarray(36, 44)),
|
|
291
|
+
maxPrefabSlots: buf.readUInt8(44),
|
|
292
|
+
maxCurvePoints: buf.readUInt8(45)
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
function isSlotInitialized(initializedSlots, curveType, slot, maxSlots) {
|
|
296
|
+
const bitIndex = curveType * maxSlots + slot;
|
|
297
|
+
const byteIndex = Math.floor(bitIndex / 8);
|
|
298
|
+
const bitOffset = bitIndex % 8;
|
|
299
|
+
return (initializedSlots[byteIndex] & 1 << bitOffset) !== 0;
|
|
300
|
+
}
|
|
301
|
+
function decodeFeeConfig(data) {
|
|
302
|
+
const buf = Buffer.from(data);
|
|
303
|
+
return {
|
|
304
|
+
initialized: buf.readUInt8(0) !== 0,
|
|
305
|
+
feePpm: buf.readUInt32LE(1),
|
|
306
|
+
bump: buf.readUInt8(5),
|
|
307
|
+
// skip 2 bytes padding
|
|
308
|
+
feeAdmin: new (0, _web3js.PublicKey)(buf.subarray(8, 40)),
|
|
309
|
+
feeRecipient: new (0, _web3js.PublicKey)(buf.subarray(40, 72))
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
function decodeCurveUpdates(data) {
|
|
313
|
+
const buf = Buffer.from(data);
|
|
314
|
+
let offset = 0;
|
|
315
|
+
const authority = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
316
|
+
offset += 32;
|
|
317
|
+
const curveMeta = new (0, _web3js.PublicKey)(buf.subarray(offset, offset + 32));
|
|
318
|
+
offset += 32;
|
|
319
|
+
const numOps = buf.readUInt8(offset);
|
|
320
|
+
offset += 1;
|
|
321
|
+
offset += 1;
|
|
322
|
+
const ops = [];
|
|
323
|
+
for (let i = 0; i < numOps && i < MAX_CURVE_UPDATE_OPS; i++) {
|
|
324
|
+
const opOffset = offset + i * CURVE_UPDATE_OP_SIZE;
|
|
325
|
+
ops.push({
|
|
326
|
+
curveType: buf.readUInt8(opOffset),
|
|
327
|
+
opKind: buf.readUInt8(opOffset + 1),
|
|
328
|
+
pointIndex: buf.readUInt8(opOffset + 2),
|
|
329
|
+
interpolation: buf.readUInt8(opOffset + 3),
|
|
330
|
+
xIn: buf.readBigUInt64LE(opOffset + 4),
|
|
331
|
+
priceFactorQ32: buf.readBigUInt64LE(opOffset + 12),
|
|
332
|
+
params: new Uint8Array(buf.subarray(opOffset + 20, opOffset + 24))
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
return { authority, curveMeta, numOps, ops };
|
|
336
|
+
}
|
|
337
|
+
function decodeCurveSide(data, curveType, slot, maxSlots, maxPoints) {
|
|
338
|
+
const sideSize = CURVE_SIDE_HEADER + maxPoints * CURVE_POINT_LEN;
|
|
339
|
+
const offset = 32 + (curveType * maxSlots + slot) * sideSize;
|
|
340
|
+
const buf = Buffer.from(data);
|
|
341
|
+
const numPoints = buf.readUInt8(offset);
|
|
342
|
+
const defaultInterpolation = buf.readUInt8(offset + 1);
|
|
343
|
+
const xMode = buf.readUInt8(offset + 2);
|
|
344
|
+
const riskMode = buf.readUInt8(offset + 3);
|
|
345
|
+
const points = [];
|
|
346
|
+
const pointsStart = offset + CURVE_SIDE_HEADER;
|
|
347
|
+
const n = Math.min(numPoints, maxPoints);
|
|
348
|
+
for (let i = 0; i < n; i++) {
|
|
349
|
+
const pOff = pointsStart + i * CURVE_POINT_LEN;
|
|
350
|
+
points.push({
|
|
351
|
+
xIn: buf.readBigUInt64LE(pOff),
|
|
352
|
+
priceFactorQ32: buf.readBigUInt64LE(pOff + 8),
|
|
353
|
+
interpolation: buf.readUInt8(pOff + 16),
|
|
354
|
+
params: new Uint8Array(buf.subarray(pOff + 17, pOff + 21))
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
return { numPoints, defaultInterpolation, xMode, riskMode, points };
|
|
358
|
+
}
|
|
359
|
+
function decodeActiveCurves(prefabsData, meta) {
|
|
360
|
+
const { maxPrefabSlots, maxCurvePoints } = meta;
|
|
361
|
+
return {
|
|
362
|
+
priceBid: decodeCurveSide(
|
|
363
|
+
prefabsData,
|
|
364
|
+
0 /* PriceBid */,
|
|
365
|
+
meta.activePriceBidSlot,
|
|
366
|
+
maxPrefabSlots,
|
|
367
|
+
maxCurvePoints
|
|
368
|
+
),
|
|
369
|
+
priceAsk: decodeCurveSide(
|
|
370
|
+
prefabsData,
|
|
371
|
+
1 /* PriceAsk */,
|
|
372
|
+
meta.activePriceAskSlot,
|
|
373
|
+
maxPrefabSlots,
|
|
374
|
+
maxCurvePoints
|
|
375
|
+
),
|
|
376
|
+
riskBid: decodeCurveSide(
|
|
377
|
+
prefabsData,
|
|
378
|
+
2 /* RiskBid */,
|
|
379
|
+
meta.activeRiskBidSlot,
|
|
380
|
+
maxPrefabSlots,
|
|
381
|
+
maxCurvePoints
|
|
382
|
+
),
|
|
383
|
+
riskAsk: decodeCurveSide(
|
|
384
|
+
prefabsData,
|
|
385
|
+
3 /* RiskAsk */,
|
|
386
|
+
meta.activeRiskAskSlot,
|
|
387
|
+
maxPrefabSlots,
|
|
388
|
+
maxCurvePoints
|
|
389
|
+
)
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// src/instructions/initialize.ts
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
function buildInitialize(payer, params, programId = HADRON_PROGRAM_ID) {
|
|
401
|
+
const seed = params.seed;
|
|
402
|
+
if (seed === void 0) throw new Error("seed is required \u2014 use Hadron.initialize() to auto-generate one");
|
|
403
|
+
const tokenProgramX = _nullishCoalesce(params.tokenProgramX, () => ( _spltoken.TOKEN_PROGRAM_ID));
|
|
404
|
+
const tokenProgramY = _nullishCoalesce(params.tokenProgramY, () => ( _spltoken.TOKEN_PROGRAM_ID));
|
|
405
|
+
const maxPrefabSlots = _nullishCoalesce(params.maxPrefabSlots, () => ( DEFAULT_MAX_PREFAB_SLOTS));
|
|
406
|
+
const maxCurvePoints = _nullishCoalesce(params.maxCurvePoints, () => ( DEFAULT_MAX_CURVE_POINTS));
|
|
407
|
+
const oracleMode = _nullishCoalesce(params.oracleMode, () => ( 0));
|
|
408
|
+
const addrs = derivePoolAddresses(
|
|
409
|
+
seed,
|
|
410
|
+
params.mintX,
|
|
411
|
+
params.mintY,
|
|
412
|
+
tokenProgramX,
|
|
413
|
+
tokenProgramY,
|
|
414
|
+
programId
|
|
415
|
+
);
|
|
416
|
+
const hasCustomSlots = params.maxPrefabSlots !== void 0 || params.maxCurvePoints !== void 0;
|
|
417
|
+
const hasOracleMode = oracleMode !== 0 || hasCustomSlots;
|
|
418
|
+
const trailingLen = hasCustomSlots ? 3 : hasOracleMode ? 1 : 0;
|
|
419
|
+
const data = Buffer.alloc(1 + 8 + 32 + 32 + 32 + 8 + trailingLen);
|
|
420
|
+
let offset = 0;
|
|
421
|
+
data.writeUInt8(Discriminator.Initialize, offset);
|
|
422
|
+
offset += 1;
|
|
423
|
+
data.writeBigUInt64LE(seed, offset);
|
|
424
|
+
offset += 8;
|
|
425
|
+
params.mintX.toBuffer().copy(data, offset);
|
|
426
|
+
offset += 32;
|
|
427
|
+
params.mintY.toBuffer().copy(data, offset);
|
|
428
|
+
offset += 32;
|
|
429
|
+
params.authority.toBuffer().copy(data, offset);
|
|
430
|
+
offset += 32;
|
|
431
|
+
data.writeBigUInt64LE(params.initialMidpriceQ32, offset);
|
|
432
|
+
offset += 8;
|
|
433
|
+
if (hasOracleMode) {
|
|
434
|
+
data.writeUInt8(oracleMode, offset);
|
|
435
|
+
offset += 1;
|
|
436
|
+
}
|
|
437
|
+
if (hasCustomSlots) {
|
|
438
|
+
data.writeUInt8(maxPrefabSlots, offset);
|
|
439
|
+
offset += 1;
|
|
440
|
+
data.writeUInt8(maxCurvePoints, offset);
|
|
441
|
+
}
|
|
442
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
443
|
+
programId,
|
|
444
|
+
keys: [
|
|
445
|
+
{ pubkey: payer, isSigner: true, isWritable: true },
|
|
446
|
+
{ pubkey: addrs.config, isSigner: false, isWritable: true },
|
|
447
|
+
{ pubkey: params.mintX, isSigner: false, isWritable: false },
|
|
448
|
+
{ pubkey: params.mintY, isSigner: false, isWritable: false },
|
|
449
|
+
{ pubkey: addrs.vaultX, isSigner: false, isWritable: true },
|
|
450
|
+
{ pubkey: addrs.vaultY, isSigner: false, isWritable: true },
|
|
451
|
+
{ pubkey: tokenProgramX, isSigner: false, isWritable: false },
|
|
452
|
+
{ pubkey: tokenProgramY, isSigner: false, isWritable: false },
|
|
453
|
+
{
|
|
454
|
+
pubkey: _spltoken.ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
455
|
+
isSigner: false,
|
|
456
|
+
isWritable: false
|
|
457
|
+
},
|
|
458
|
+
{ pubkey: _web3js.SystemProgram.programId, isSigner: false, isWritable: false },
|
|
459
|
+
{ pubkey: addrs.midpriceOracle, isSigner: false, isWritable: true },
|
|
460
|
+
{ pubkey: addrs.curveMeta, isSigner: false, isWritable: true },
|
|
461
|
+
{ pubkey: addrs.curvePrefabs, isSigner: false, isWritable: true },
|
|
462
|
+
{ pubkey: addrs.curveUpdates, isSigner: false, isWritable: true }
|
|
463
|
+
],
|
|
464
|
+
data
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
function buildAllocateCurvePrefabs(payer, params, programId = HADRON_PROGRAM_ID) {
|
|
468
|
+
const maxPrefabSlots = _nullishCoalesce(params.maxPrefabSlots, () => ( DEFAULT_MAX_PREFAB_SLOTS));
|
|
469
|
+
const maxCurvePoints = _nullishCoalesce(params.maxCurvePoints, () => ( DEFAULT_MAX_CURVE_POINTS));
|
|
470
|
+
const data = Buffer.alloc(1 + 8 + 32 + 32 + 1 + 1);
|
|
471
|
+
let offset = 0;
|
|
472
|
+
data.writeUInt8(Discriminator.AllocateCurvePrefabs, offset);
|
|
473
|
+
offset += 1;
|
|
474
|
+
data.writeBigUInt64LE(params.seed, offset);
|
|
475
|
+
offset += 8;
|
|
476
|
+
params.mintX.toBuffer().copy(data, offset);
|
|
477
|
+
offset += 32;
|
|
478
|
+
params.mintY.toBuffer().copy(data, offset);
|
|
479
|
+
offset += 32;
|
|
480
|
+
data.writeUInt8(maxPrefabSlots, offset);
|
|
481
|
+
offset += 1;
|
|
482
|
+
data.writeUInt8(maxCurvePoints, offset);
|
|
483
|
+
const [curvePrefabsPda] = _web3js.PublicKey.findProgramAddressSync(
|
|
484
|
+
[
|
|
485
|
+
Buffer.from("hadron-curve-prefabs"),
|
|
486
|
+
(() => {
|
|
487
|
+
const b = Buffer.alloc(8);
|
|
488
|
+
b.writeBigUInt64LE(params.seed);
|
|
489
|
+
return b;
|
|
490
|
+
})(),
|
|
491
|
+
params.mintX.toBuffer(),
|
|
492
|
+
params.mintY.toBuffer()
|
|
493
|
+
],
|
|
494
|
+
programId
|
|
495
|
+
);
|
|
496
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
497
|
+
programId,
|
|
498
|
+
keys: [
|
|
499
|
+
{ pubkey: payer, isSigner: true, isWritable: true },
|
|
500
|
+
{ pubkey: curvePrefabsPda, isSigner: false, isWritable: true },
|
|
501
|
+
{ pubkey: _web3js.SystemProgram.programId, isSigner: false, isWritable: false }
|
|
502
|
+
],
|
|
503
|
+
data
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// src/instructions/deposit.ts
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
function buildDeposit(user, configPda, mintX, mintY, tokenProgramX, tokenProgramY, params, programId = HADRON_PROGRAM_ID) {
|
|
511
|
+
const data = Buffer.alloc(1 + 8 + 8 + 8);
|
|
512
|
+
let offset = 0;
|
|
513
|
+
data.writeUInt8(Discriminator.Deposit, offset);
|
|
514
|
+
offset += 1;
|
|
515
|
+
data.writeBigUInt64LE(params.amountX, offset);
|
|
516
|
+
offset += 8;
|
|
517
|
+
data.writeBigUInt64LE(params.amountY, offset);
|
|
518
|
+
offset += 8;
|
|
519
|
+
const exp = _nullishCoalesce(params.expiration, () => ( Math.floor(Date.now() / 1e3) + 3600));
|
|
520
|
+
data.writeBigInt64LE(BigInt(exp), offset);
|
|
521
|
+
const userX = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintX, user, false, tokenProgramX);
|
|
522
|
+
const userY = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintY, user, false, tokenProgramY);
|
|
523
|
+
const vaultX = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintX, configPda, true, tokenProgramX);
|
|
524
|
+
const vaultY = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintY, configPda, true, tokenProgramY);
|
|
525
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
526
|
+
programId,
|
|
527
|
+
keys: [
|
|
528
|
+
{ pubkey: user, isSigner: true, isWritable: false },
|
|
529
|
+
{ pubkey: vaultX, isSigner: false, isWritable: true },
|
|
530
|
+
{ pubkey: vaultY, isSigner: false, isWritable: true },
|
|
531
|
+
{ pubkey: userX, isSigner: false, isWritable: true },
|
|
532
|
+
{ pubkey: userY, isSigner: false, isWritable: true },
|
|
533
|
+
{ pubkey: configPda, isSigner: false, isWritable: false },
|
|
534
|
+
{ pubkey: tokenProgramX, isSigner: false, isWritable: false },
|
|
535
|
+
{ pubkey: tokenProgramY, isSigner: false, isWritable: false }
|
|
536
|
+
],
|
|
537
|
+
data
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// src/instructions/withdraw.ts
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
function buildWithdraw(user, configPda, mintX, mintY, tokenProgramX, tokenProgramY, params, programId = HADRON_PROGRAM_ID) {
|
|
545
|
+
const data = Buffer.alloc(1 + 8 + 8 + 8);
|
|
546
|
+
let offset = 0;
|
|
547
|
+
data.writeUInt8(Discriminator.Withdraw, offset);
|
|
548
|
+
offset += 1;
|
|
549
|
+
data.writeBigUInt64LE(params.amountX, offset);
|
|
550
|
+
offset += 8;
|
|
551
|
+
data.writeBigUInt64LE(params.amountY, offset);
|
|
552
|
+
offset += 8;
|
|
553
|
+
const exp = _nullishCoalesce(params.expiration, () => ( Math.floor(Date.now() / 1e3) + 3600));
|
|
554
|
+
data.writeBigInt64LE(BigInt(exp), offset);
|
|
555
|
+
const userX = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintX, user, false, tokenProgramX);
|
|
556
|
+
const userY = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintY, user, false, tokenProgramY);
|
|
557
|
+
const vaultX = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintX, configPda, true, tokenProgramX);
|
|
558
|
+
const vaultY = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintY, configPda, true, tokenProgramY);
|
|
559
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
560
|
+
programId,
|
|
561
|
+
keys: [
|
|
562
|
+
{ pubkey: user, isSigner: true, isWritable: false },
|
|
563
|
+
{ pubkey: vaultX, isSigner: false, isWritable: true },
|
|
564
|
+
{ pubkey: vaultY, isSigner: false, isWritable: true },
|
|
565
|
+
{ pubkey: userX, isSigner: false, isWritable: true },
|
|
566
|
+
{ pubkey: userY, isSigner: false, isWritable: true },
|
|
567
|
+
{ pubkey: configPda, isSigner: false, isWritable: true },
|
|
568
|
+
{ pubkey: tokenProgramX, isSigner: false, isWritable: false },
|
|
569
|
+
{ pubkey: tokenProgramY, isSigner: false, isWritable: false }
|
|
570
|
+
],
|
|
571
|
+
data
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// src/instructions/swap.ts
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
function buildSwapExactIn(user, poolAddresses, mintX, mintY, tokenProgramX, tokenProgramY, params, programId = HADRON_PROGRAM_ID) {
|
|
582
|
+
const data = Buffer.alloc(1 + 1 + 8 + 8 + 8);
|
|
583
|
+
let offset = 0;
|
|
584
|
+
data.writeUInt8(Discriminator.SwapExactIn, offset);
|
|
585
|
+
offset += 1;
|
|
586
|
+
data.writeUInt8(params.isX ? 1 : 0, offset);
|
|
587
|
+
offset += 1;
|
|
588
|
+
data.writeBigUInt64LE(params.amountIn, offset);
|
|
589
|
+
offset += 8;
|
|
590
|
+
data.writeBigUInt64LE(params.minOut, offset);
|
|
591
|
+
offset += 8;
|
|
592
|
+
const exp = _nullishCoalesce(params.expiration, () => ( Math.floor(Date.now() / 1e3) + 3600));
|
|
593
|
+
data.writeBigInt64LE(BigInt(exp), offset);
|
|
594
|
+
const userX = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintX, user, false, tokenProgramX);
|
|
595
|
+
const userY = _spltoken.getAssociatedTokenAddressSync.call(void 0, mintY, user, false, tokenProgramY);
|
|
596
|
+
const [userSource, vaultSource, vaultDest, userDest] = params.isX ? [userX, poolAddresses.vaultX, poolAddresses.vaultY, userY] : [userY, poolAddresses.vaultY, poolAddresses.vaultX, userX];
|
|
597
|
+
const [feeConfigPda] = getFeeConfigAddress(programId);
|
|
598
|
+
const inputMint = params.isX ? mintX : mintY;
|
|
599
|
+
const inputMintProgram = params.isX ? tokenProgramX : tokenProgramY;
|
|
600
|
+
const feeRecipientAta = _spltoken.getAssociatedTokenAddressSync.call(void 0,
|
|
601
|
+
inputMint,
|
|
602
|
+
params.feeRecipient,
|
|
603
|
+
false,
|
|
604
|
+
inputMintProgram
|
|
605
|
+
);
|
|
606
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
607
|
+
programId,
|
|
608
|
+
keys: [
|
|
609
|
+
{ pubkey: tokenProgramX, isSigner: false, isWritable: false },
|
|
610
|
+
{ pubkey: tokenProgramY, isSigner: false, isWritable: false },
|
|
611
|
+
{ pubkey: poolAddresses.config, isSigner: false, isWritable: false },
|
|
612
|
+
{
|
|
613
|
+
pubkey: poolAddresses.midpriceOracle,
|
|
614
|
+
isSigner: false,
|
|
615
|
+
isWritable: false
|
|
616
|
+
},
|
|
617
|
+
{ pubkey: poolAddresses.curveMeta, isSigner: false, isWritable: false },
|
|
618
|
+
{
|
|
619
|
+
pubkey: poolAddresses.curvePrefabs,
|
|
620
|
+
isSigner: false,
|
|
621
|
+
isWritable: true
|
|
622
|
+
},
|
|
623
|
+
{ pubkey: poolAddresses.config, isSigner: false, isWritable: false },
|
|
624
|
+
// authority = pool address PDA
|
|
625
|
+
{ pubkey: user, isSigner: true, isWritable: false },
|
|
626
|
+
{ pubkey: userSource, isSigner: false, isWritable: true },
|
|
627
|
+
{ pubkey: vaultSource, isSigner: false, isWritable: true },
|
|
628
|
+
{ pubkey: vaultDest, isSigner: false, isWritable: true },
|
|
629
|
+
{ pubkey: userDest, isSigner: false, isWritable: true },
|
|
630
|
+
{ pubkey: feeConfigPda, isSigner: false, isWritable: false },
|
|
631
|
+
{ pubkey: feeRecipientAta, isSigner: false, isWritable: true },
|
|
632
|
+
{ pubkey: _web3js.SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false },
|
|
633
|
+
{
|
|
634
|
+
pubkey: poolAddresses.curveUpdates,
|
|
635
|
+
isSigner: false,
|
|
636
|
+
isWritable: true
|
|
637
|
+
}
|
|
638
|
+
],
|
|
639
|
+
data
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// src/instructions/setCurve.ts
|
|
644
|
+
|
|
645
|
+
function interpolationToByte(interp) {
|
|
646
|
+
return interp;
|
|
647
|
+
}
|
|
648
|
+
function buildSetCurve(authority, curveMetaPda, curvePrefabsPda, params, programId = HADRON_PROGRAM_ID) {
|
|
649
|
+
const slot = _nullishCoalesce(params.slot, () => ( 0));
|
|
650
|
+
const xMode = _nullishCoalesce(params.xMode, () => ( 0)) /* Native */;
|
|
651
|
+
const numPoints = params.points.length;
|
|
652
|
+
const data = Buffer.alloc(1 + 1 + 1 + 1 + 1 + 1 + numPoints * POINT_DATA_SIZE);
|
|
653
|
+
let offset = 0;
|
|
654
|
+
data.writeUInt8(Discriminator.SetCurve, offset);
|
|
655
|
+
offset += 1;
|
|
656
|
+
data.writeUInt8(slot, offset);
|
|
657
|
+
offset += 1;
|
|
658
|
+
data.writeUInt8(params.side, offset);
|
|
659
|
+
offset += 1;
|
|
660
|
+
data.writeUInt8(interpolationToByte(params.defaultInterpolation), offset);
|
|
661
|
+
offset += 1;
|
|
662
|
+
data.writeUInt8(numPoints, offset);
|
|
663
|
+
offset += 1;
|
|
664
|
+
data.writeUInt8(xMode, offset);
|
|
665
|
+
offset += 1;
|
|
666
|
+
for (const p of params.points) {
|
|
667
|
+
data.writeBigUInt64LE(p.xIn, offset);
|
|
668
|
+
offset += 8;
|
|
669
|
+
data.writeBigUInt64LE(toQ32(p.priceFactor), offset);
|
|
670
|
+
offset += 8;
|
|
671
|
+
data.writeUInt8(
|
|
672
|
+
interpolationToByte(_nullishCoalesce(p.interpolation, () => ( params.defaultInterpolation))),
|
|
673
|
+
offset
|
|
674
|
+
);
|
|
675
|
+
offset += 1;
|
|
676
|
+
const params_ = _nullishCoalesce(p.params, () => ( new Uint8Array(4)));
|
|
677
|
+
Buffer.from(params_).copy(data, offset, 0, 4);
|
|
678
|
+
offset += 4;
|
|
679
|
+
}
|
|
680
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
681
|
+
programId,
|
|
682
|
+
keys: [
|
|
683
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
684
|
+
{ pubkey: curveMetaPda, isSigner: false, isWritable: true },
|
|
685
|
+
{ pubkey: curvePrefabsPda, isSigner: false, isWritable: true }
|
|
686
|
+
],
|
|
687
|
+
data
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
function buildSetRiskCurve(authority, curveMetaPda, curvePrefabsPda, params, programId = HADRON_PROGRAM_ID) {
|
|
691
|
+
const slot = _nullishCoalesce(params.slot, () => ( 0));
|
|
692
|
+
const xMode = _nullishCoalesce(params.xMode, () => ( 0)) /* Native */;
|
|
693
|
+
const riskMode = _nullishCoalesce(params.riskMode, () => ( 0)) /* Virtual */;
|
|
694
|
+
const numPoints = params.points.length;
|
|
695
|
+
const data = Buffer.alloc(
|
|
696
|
+
1 + 1 + 1 + 1 + 1 + 1 + 1 + numPoints * POINT_DATA_SIZE
|
|
697
|
+
);
|
|
698
|
+
let offset = 0;
|
|
699
|
+
data.writeUInt8(Discriminator.SetRiskCurve, offset);
|
|
700
|
+
offset += 1;
|
|
701
|
+
data.writeUInt8(slot, offset);
|
|
702
|
+
offset += 1;
|
|
703
|
+
data.writeUInt8(params.side, offset);
|
|
704
|
+
offset += 1;
|
|
705
|
+
data.writeUInt8(interpolationToByte(params.defaultInterpolation), offset);
|
|
706
|
+
offset += 1;
|
|
707
|
+
data.writeUInt8(numPoints, offset);
|
|
708
|
+
offset += 1;
|
|
709
|
+
data.writeUInt8(xMode, offset);
|
|
710
|
+
offset += 1;
|
|
711
|
+
data.writeUInt8(riskMode, offset);
|
|
712
|
+
offset += 1;
|
|
713
|
+
for (const p of params.points) {
|
|
714
|
+
data.writeBigUInt64LE(toQ32(p.pctBase), offset);
|
|
715
|
+
offset += 8;
|
|
716
|
+
data.writeBigUInt64LE(toQ32(p.priceFactor), offset);
|
|
717
|
+
offset += 8;
|
|
718
|
+
data.writeUInt8(
|
|
719
|
+
interpolationToByte(_nullishCoalesce(p.interpolation, () => ( params.defaultInterpolation))),
|
|
720
|
+
offset
|
|
721
|
+
);
|
|
722
|
+
offset += 1;
|
|
723
|
+
const params_ = _nullishCoalesce(p.params, () => ( new Uint8Array(4)));
|
|
724
|
+
Buffer.from(params_).copy(data, offset, 0, 4);
|
|
725
|
+
offset += 4;
|
|
726
|
+
}
|
|
727
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
728
|
+
programId,
|
|
729
|
+
keys: [
|
|
730
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
731
|
+
{ pubkey: curveMetaPda, isSigner: false, isWritable: true },
|
|
732
|
+
{ pubkey: curvePrefabsPda, isSigner: false, isWritable: true }
|
|
733
|
+
],
|
|
734
|
+
data
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
function buildSetRiskCurveAbsolute(authority, curveMetaPda, curvePrefabsPda, params, programId = HADRON_PROGRAM_ID) {
|
|
738
|
+
const slot = _nullishCoalesce(params.slot, () => ( 0));
|
|
739
|
+
const riskMode = _nullishCoalesce(params.riskMode, () => ( 0)) /* Virtual */;
|
|
740
|
+
const numPoints = params.points.length;
|
|
741
|
+
const data = Buffer.alloc(
|
|
742
|
+
1 + 1 + 1 + 1 + 1 + 1 + 1 + numPoints * POINT_DATA_SIZE
|
|
743
|
+
);
|
|
744
|
+
let offset = 0;
|
|
745
|
+
data.writeUInt8(Discriminator.SetRiskCurve, offset);
|
|
746
|
+
offset += 1;
|
|
747
|
+
data.writeUInt8(slot, offset);
|
|
748
|
+
offset += 1;
|
|
749
|
+
data.writeUInt8(params.side, offset);
|
|
750
|
+
offset += 1;
|
|
751
|
+
data.writeUInt8(interpolationToByte(params.defaultInterpolation), offset);
|
|
752
|
+
offset += 1;
|
|
753
|
+
data.writeUInt8(numPoints, offset);
|
|
754
|
+
offset += 1;
|
|
755
|
+
data.writeUInt8(1 /* Alternate */, offset);
|
|
756
|
+
offset += 1;
|
|
757
|
+
data.writeUInt8(riskMode, offset);
|
|
758
|
+
offset += 1;
|
|
759
|
+
for (const p of params.points) {
|
|
760
|
+
data.writeBigUInt64LE(p.vaultBalance, offset);
|
|
761
|
+
offset += 8;
|
|
762
|
+
data.writeBigUInt64LE(toQ32(p.priceFactor), offset);
|
|
763
|
+
offset += 8;
|
|
764
|
+
data.writeUInt8(
|
|
765
|
+
interpolationToByte(_nullishCoalesce(p.interpolation, () => ( params.defaultInterpolation))),
|
|
766
|
+
offset
|
|
767
|
+
);
|
|
768
|
+
offset += 1;
|
|
769
|
+
const params_ = _nullishCoalesce(p.params, () => ( new Uint8Array(4)));
|
|
770
|
+
Buffer.from(params_).copy(data, offset, 0, 4);
|
|
771
|
+
offset += 4;
|
|
772
|
+
}
|
|
773
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
774
|
+
programId,
|
|
775
|
+
keys: [
|
|
776
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
777
|
+
{ pubkey: curveMetaPda, isSigner: false, isWritable: true },
|
|
778
|
+
{ pubkey: curvePrefabsPda, isSigner: false, isWritable: true }
|
|
779
|
+
],
|
|
780
|
+
data
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
function buildSetCurveBoth(authority, curveMetaPda, curvePrefabsPda, params, programId = HADRON_PROGRAM_ID) {
|
|
784
|
+
const bidIx = buildSetCurve(authority, curveMetaPda, curvePrefabsPda, { ...params.bid, side: 0 /* Bid */ }, programId);
|
|
785
|
+
const askIx = buildSetCurve(authority, curveMetaPda, curvePrefabsPda, { ...params.ask, side: 1 /* Ask */ }, programId);
|
|
786
|
+
return [bidIx, askIx];
|
|
787
|
+
}
|
|
788
|
+
function buildSetRiskCurveBoth(authority, curveMetaPda, curvePrefabsPda, params, programId = HADRON_PROGRAM_ID) {
|
|
789
|
+
const bidIx = buildSetRiskCurve(authority, curveMetaPda, curvePrefabsPda, { ...params.bid, side: 0 /* Bid */ }, programId);
|
|
790
|
+
const askIx = buildSetRiskCurve(authority, curveMetaPda, curvePrefabsPda, { ...params.ask, side: 1 /* Ask */ }, programId);
|
|
791
|
+
return [bidIx, askIx];
|
|
792
|
+
}
|
|
793
|
+
function buildSetRiskCurveAbsoluteBoth(authority, curveMetaPda, curvePrefabsPda, params, programId = HADRON_PROGRAM_ID) {
|
|
794
|
+
const bidIx = buildSetRiskCurveAbsolute(authority, curveMetaPda, curvePrefabsPda, { ...params.bid, side: 0 /* Bid */ }, programId);
|
|
795
|
+
const askIx = buildSetRiskCurveAbsolute(authority, curveMetaPda, curvePrefabsPda, { ...params.ask, side: 1 /* Ask */ }, programId);
|
|
796
|
+
return [bidIx, askIx];
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
// src/instructions/oracle.ts
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
|
|
804
|
+
function buildUpdateMidprice(authority, midpriceOraclePda, params, programId = HADRON_PROGRAM_ID) {
|
|
805
|
+
const data = Buffer.alloc(1 + 8 + 8);
|
|
806
|
+
data.writeUInt8(Discriminator.UpdateMidprice, 0);
|
|
807
|
+
data.writeBigUInt64LE(_nullishCoalesce(params.sequence, () => ( 0n)), 1);
|
|
808
|
+
data.writeBigUInt64LE(params.midpriceQ32, 9);
|
|
809
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
810
|
+
programId,
|
|
811
|
+
keys: [
|
|
812
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
813
|
+
{ pubkey: midpriceOraclePda, isSigner: false, isWritable: true },
|
|
814
|
+
{ pubkey: _web3js.SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false }
|
|
815
|
+
],
|
|
816
|
+
data
|
|
817
|
+
});
|
|
818
|
+
}
|
|
819
|
+
function buildUpdateBaseSpread(authority, midpriceOraclePda, params, programId = HADRON_PROGRAM_ID) {
|
|
820
|
+
const data = Buffer.alloc(1 + 8 + 8);
|
|
821
|
+
data.writeUInt8(Discriminator.UpdateBaseSpread, 0);
|
|
822
|
+
data.writeBigUInt64LE(_nullishCoalesce(params.sequence, () => ( 0n)), 1);
|
|
823
|
+
data.writeBigUInt64LE(params.baseSpreadQ32, 9);
|
|
824
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
825
|
+
programId,
|
|
826
|
+
keys: [
|
|
827
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
828
|
+
{ pubkey: midpriceOraclePda, isSigner: false, isWritable: true },
|
|
829
|
+
{ pubkey: _web3js.SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false }
|
|
830
|
+
],
|
|
831
|
+
data
|
|
832
|
+
});
|
|
833
|
+
}
|
|
834
|
+
function buildUpdateMidpriceAndBaseSpread(authority, midpriceOraclePda, params, programId = HADRON_PROGRAM_ID) {
|
|
835
|
+
const data = Buffer.alloc(1 + 8 + 8 + 8);
|
|
836
|
+
data.writeUInt8(Discriminator.UpdateMidpriceAndBaseSpread, 0);
|
|
837
|
+
data.writeBigUInt64LE(_nullishCoalesce(params.sequence, () => ( 0n)), 1);
|
|
838
|
+
data.writeBigUInt64LE(params.midpriceQ32, 9);
|
|
839
|
+
data.writeBigUInt64LE(params.baseSpreadQ32, 17);
|
|
840
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
841
|
+
programId,
|
|
842
|
+
keys: [
|
|
843
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
844
|
+
{ pubkey: midpriceOraclePda, isSigner: false, isWritable: true },
|
|
845
|
+
{ pubkey: _web3js.SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false }
|
|
846
|
+
],
|
|
847
|
+
data
|
|
848
|
+
});
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
// src/instructions/switchCurve.ts
|
|
852
|
+
|
|
853
|
+
function buildSwitchPriceCurve(authority, curveMetaPda, params, programId = HADRON_PROGRAM_ID) {
|
|
854
|
+
const data = Buffer.alloc(1 + 1 + 1);
|
|
855
|
+
data.writeUInt8(Discriminator.SwitchPriceCurve, 0);
|
|
856
|
+
data.writeUInt8(params.side, 1);
|
|
857
|
+
data.writeUInt8(params.slot, 2);
|
|
858
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
859
|
+
programId,
|
|
860
|
+
keys: [
|
|
861
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
862
|
+
{ pubkey: curveMetaPda, isSigner: false, isWritable: true }
|
|
863
|
+
],
|
|
864
|
+
data
|
|
865
|
+
});
|
|
866
|
+
}
|
|
867
|
+
function buildSwitchRiskCurve(authority, curveMetaPda, params, programId = HADRON_PROGRAM_ID) {
|
|
868
|
+
const data = Buffer.alloc(1 + 1 + 1);
|
|
869
|
+
data.writeUInt8(Discriminator.SwitchRiskCurve, 0);
|
|
870
|
+
data.writeUInt8(params.side, 1);
|
|
871
|
+
data.writeUInt8(params.slot, 2);
|
|
872
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
873
|
+
programId,
|
|
874
|
+
keys: [
|
|
875
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
876
|
+
{ pubkey: curveMetaPda, isSigner: false, isWritable: true }
|
|
877
|
+
],
|
|
878
|
+
data
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
// src/instructions/curveUpdates.ts
|
|
883
|
+
|
|
884
|
+
function buildSubmitCurveUpdates(authority, curveUpdatesPda, ops, programId = HADRON_PROGRAM_ID) {
|
|
885
|
+
const data = Buffer.alloc(1 + 1 + ops.length * CURVE_UPDATE_OP_SIZE);
|
|
886
|
+
let offset = 0;
|
|
887
|
+
data.writeUInt8(Discriminator.SubmitCurveUpdates, offset);
|
|
888
|
+
offset += 1;
|
|
889
|
+
data.writeUInt8(ops.length, offset);
|
|
890
|
+
offset += 1;
|
|
891
|
+
for (const op of ops) {
|
|
892
|
+
data.writeUInt8(op.curveType, offset);
|
|
893
|
+
offset += 1;
|
|
894
|
+
data.writeUInt8(op.opKind, offset);
|
|
895
|
+
offset += 1;
|
|
896
|
+
data.writeUInt8(op.pointIndex, offset);
|
|
897
|
+
offset += 1;
|
|
898
|
+
data.writeUInt8(op.interpolation, offset);
|
|
899
|
+
offset += 1;
|
|
900
|
+
data.writeBigUInt64LE(op.xIn, offset);
|
|
901
|
+
offset += 8;
|
|
902
|
+
data.writeBigUInt64LE(op.priceFactorQ32, offset);
|
|
903
|
+
offset += 8;
|
|
904
|
+
const params = _nullishCoalesce(op.params, () => ( new Uint8Array(4)));
|
|
905
|
+
Buffer.from(params).copy(data, offset, 0, 4);
|
|
906
|
+
offset += 4;
|
|
907
|
+
}
|
|
908
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
909
|
+
programId,
|
|
910
|
+
keys: [
|
|
911
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
912
|
+
{ pubkey: curveUpdatesPda, isSigner: false, isWritable: true }
|
|
913
|
+
],
|
|
914
|
+
data
|
|
915
|
+
});
|
|
916
|
+
}
|
|
917
|
+
function buildApplyCurveUpdates(authority, curveMetaPda, curvePrefabsPda, curveUpdatesPda, programId = HADRON_PROGRAM_ID) {
|
|
918
|
+
const data = Buffer.alloc(1);
|
|
919
|
+
data.writeUInt8(Discriminator.ApplyCurveUpdates, 0);
|
|
920
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
921
|
+
programId,
|
|
922
|
+
keys: [
|
|
923
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
924
|
+
{ pubkey: curveMetaPda, isSigner: false, isWritable: false },
|
|
925
|
+
{ pubkey: curvePrefabsPda, isSigner: false, isWritable: true },
|
|
926
|
+
{ pubkey: curveUpdatesPda, isSigner: false, isWritable: true }
|
|
927
|
+
],
|
|
928
|
+
data
|
|
929
|
+
});
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
// src/instructions/authority.ts
|
|
933
|
+
|
|
934
|
+
|
|
935
|
+
|
|
936
|
+
|
|
937
|
+
function buildNominateAuthority(authority, configPda, params, programId = HADRON_PROGRAM_ID) {
|
|
938
|
+
const data = Buffer.alloc(1 + 32 + 8);
|
|
939
|
+
let offset = 0;
|
|
940
|
+
data.writeUInt8(Discriminator.NominateAuthority, offset);
|
|
941
|
+
offset += 1;
|
|
942
|
+
params.newAuthority.toBuffer().copy(data, offset);
|
|
943
|
+
offset += 32;
|
|
944
|
+
data.writeBigUInt64LE(params.expirySlot, offset);
|
|
945
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
946
|
+
programId,
|
|
947
|
+
keys: [
|
|
948
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
949
|
+
{ pubkey: configPda, isSigner: false, isWritable: true },
|
|
950
|
+
{ pubkey: _web3js.SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false }
|
|
951
|
+
],
|
|
952
|
+
data
|
|
953
|
+
});
|
|
954
|
+
}
|
|
955
|
+
function buildAcceptAuthority(newAuthority, configPda, programId = HADRON_PROGRAM_ID) {
|
|
956
|
+
const data = Buffer.alloc(1);
|
|
957
|
+
data.writeUInt8(Discriminator.AcceptAuthority, 0);
|
|
958
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
959
|
+
programId,
|
|
960
|
+
keys: [
|
|
961
|
+
{ pubkey: newAuthority, isSigner: true, isWritable: false },
|
|
962
|
+
{ pubkey: configPda, isSigner: false, isWritable: true },
|
|
963
|
+
{ pubkey: _web3js.SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false }
|
|
964
|
+
],
|
|
965
|
+
data
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
function buildSetQuotingAuthority(authority, configPda, oraclePda, curveMetaPda, curveUpdatesPda, params, programId = HADRON_PROGRAM_ID) {
|
|
969
|
+
const data = Buffer.alloc(1 + 32);
|
|
970
|
+
data.writeUInt8(Discriminator.SetQuotingAuthority, 0);
|
|
971
|
+
params.newQuotingAuthority.toBuffer().copy(data, 1);
|
|
972
|
+
const keys = [
|
|
973
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
974
|
+
{ pubkey: configPda, isSigner: false, isWritable: false },
|
|
975
|
+
{ pubkey: oraclePda, isSigner: false, isWritable: true },
|
|
976
|
+
{ pubkey: curveMetaPda, isSigner: false, isWritable: true },
|
|
977
|
+
{ pubkey: curveUpdatesPda, isSigner: false, isWritable: true }
|
|
978
|
+
];
|
|
979
|
+
if (params.spreadConfigPda) {
|
|
980
|
+
keys.push({
|
|
981
|
+
pubkey: params.spreadConfigPda,
|
|
982
|
+
isSigner: false,
|
|
983
|
+
isWritable: true
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
987
|
+
programId,
|
|
988
|
+
keys,
|
|
989
|
+
data
|
|
990
|
+
});
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
// src/instructions/feeConfig.ts
|
|
994
|
+
|
|
995
|
+
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
function buildInitializeFeeConfig(payer, authority, params, programId = HADRON_PROGRAM_ID) {
|
|
999
|
+
const [feeConfigPda] = getFeeConfigAddress(programId);
|
|
1000
|
+
const data = Buffer.alloc(1 + 4 + 32 + 32);
|
|
1001
|
+
let offset = 0;
|
|
1002
|
+
data.writeUInt8(Discriminator.InitializeFeeConfig, offset);
|
|
1003
|
+
offset += 1;
|
|
1004
|
+
data.writeUInt32LE(params.feePpm, offset);
|
|
1005
|
+
offset += 4;
|
|
1006
|
+
params.feeAdmin.toBuffer().copy(data, offset);
|
|
1007
|
+
offset += 32;
|
|
1008
|
+
params.feeRecipient.toBuffer().copy(data, offset);
|
|
1009
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
1010
|
+
programId,
|
|
1011
|
+
keys: [
|
|
1012
|
+
{ pubkey: payer, isSigner: true, isWritable: true },
|
|
1013
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
1014
|
+
{ pubkey: feeConfigPda, isSigner: false, isWritable: true },
|
|
1015
|
+
{ pubkey: _web3js.SystemProgram.programId, isSigner: false, isWritable: false }
|
|
1016
|
+
],
|
|
1017
|
+
data
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
function buildUpdateFeeConfig(feeAdmin, params, programId = HADRON_PROGRAM_ID) {
|
|
1021
|
+
const [feeConfigPda] = getFeeConfigAddress(programId);
|
|
1022
|
+
const data = Buffer.alloc(1 + 4 + 32);
|
|
1023
|
+
let offset = 0;
|
|
1024
|
+
data.writeUInt8(Discriminator.UpdateFeeConfig, offset);
|
|
1025
|
+
offset += 1;
|
|
1026
|
+
data.writeUInt32LE(params.feePpm !== null ? params.feePpm : 4294967295, offset);
|
|
1027
|
+
offset += 4;
|
|
1028
|
+
if (params.feeRecipient) {
|
|
1029
|
+
params.feeRecipient.toBuffer().copy(data, offset);
|
|
1030
|
+
}
|
|
1031
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
1032
|
+
programId,
|
|
1033
|
+
keys: [
|
|
1034
|
+
{ pubkey: feeAdmin, isSigner: true, isWritable: false },
|
|
1035
|
+
{ pubkey: feeConfigPda, isSigner: false, isWritable: true }
|
|
1036
|
+
],
|
|
1037
|
+
data
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
function buildRotateFeeAdmin(feeAdmin, params, programId = HADRON_PROGRAM_ID) {
|
|
1041
|
+
const [feeConfigPda] = getFeeConfigAddress(programId);
|
|
1042
|
+
const data = Buffer.alloc(1 + 32);
|
|
1043
|
+
data.writeUInt8(Discriminator.RotateFeeAdmin, 0);
|
|
1044
|
+
params.newFeeAdmin.toBuffer().copy(data, 1);
|
|
1045
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
1046
|
+
programId,
|
|
1047
|
+
keys: [
|
|
1048
|
+
{ pubkey: feeAdmin, isSigner: true, isWritable: false },
|
|
1049
|
+
{ pubkey: feeConfigPda, isSigner: false, isWritable: true }
|
|
1050
|
+
],
|
|
1051
|
+
data
|
|
1052
|
+
});
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
// src/instructions/spreadConfig.ts
|
|
1056
|
+
|
|
1057
|
+
|
|
1058
|
+
|
|
1059
|
+
|
|
1060
|
+
function buildInitializeSpreadConfig(payer, authority, configPda, params, programId = HADRON_PROGRAM_ID) {
|
|
1061
|
+
const [spreadConfigPda] = getSpreadConfigAddress(configPda, programId);
|
|
1062
|
+
const data = Buffer.alloc(1 + 32);
|
|
1063
|
+
data.writeUInt8(Discriminator.InitializeSpreadConfig, 0);
|
|
1064
|
+
params.admin.toBuffer().copy(data, 1);
|
|
1065
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
1066
|
+
programId,
|
|
1067
|
+
keys: [
|
|
1068
|
+
{ pubkey: payer, isSigner: true, isWritable: true },
|
|
1069
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
1070
|
+
{ pubkey: configPda, isSigner: false, isWritable: true },
|
|
1071
|
+
{ pubkey: spreadConfigPda, isSigner: false, isWritable: true },
|
|
1072
|
+
{ pubkey: _web3js.SystemProgram.programId, isSigner: false, isWritable: false }
|
|
1073
|
+
],
|
|
1074
|
+
data
|
|
1075
|
+
});
|
|
1076
|
+
}
|
|
1077
|
+
function buildUpdateSpreadConfig(admin, configPda, params, programId = HADRON_PROGRAM_ID) {
|
|
1078
|
+
const [spreadConfigPda] = getSpreadConfigAddress(configPda, programId);
|
|
1079
|
+
const numTriggers = params.triggers.length;
|
|
1080
|
+
const data = Buffer.alloc(1 + 1 + numTriggers * 34);
|
|
1081
|
+
let offset = 0;
|
|
1082
|
+
data.writeUInt8(Discriminator.UpdateSpreadConfig, offset);
|
|
1083
|
+
offset += 1;
|
|
1084
|
+
data.writeUInt8(numTriggers, offset);
|
|
1085
|
+
offset += 1;
|
|
1086
|
+
for (const t of params.triggers) {
|
|
1087
|
+
t.account.toBuffer().copy(data, offset);
|
|
1088
|
+
offset += 32;
|
|
1089
|
+
data.writeUInt16LE(t.spreadBps, offset);
|
|
1090
|
+
offset += 2;
|
|
1091
|
+
}
|
|
1092
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
1093
|
+
programId,
|
|
1094
|
+
keys: [
|
|
1095
|
+
{ pubkey: admin, isSigner: true, isWritable: false },
|
|
1096
|
+
{ pubkey: configPda, isSigner: false, isWritable: false },
|
|
1097
|
+
{ pubkey: spreadConfigPda, isSigner: false, isWritable: true }
|
|
1098
|
+
],
|
|
1099
|
+
data
|
|
1100
|
+
});
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
// src/instructions/poolState.ts
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
|
|
1107
|
+
function buildSetPoolState(authority, configPda, params, programId = HADRON_PROGRAM_ID) {
|
|
1108
|
+
const data = Buffer.alloc(1 + 1);
|
|
1109
|
+
data.writeUInt8(Discriminator.SetPoolState, 0);
|
|
1110
|
+
data.writeUInt8(params.newState, 1);
|
|
1111
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
1112
|
+
programId,
|
|
1113
|
+
keys: [
|
|
1114
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
1115
|
+
{ pubkey: configPda, isSigner: false, isWritable: true }
|
|
1116
|
+
],
|
|
1117
|
+
data
|
|
1118
|
+
});
|
|
1119
|
+
}
|
|
1120
|
+
function buildUpdateDeltaStaleness(authority, configPda, params, programId = HADRON_PROGRAM_ID) {
|
|
1121
|
+
const data = Buffer.alloc(1 + 1);
|
|
1122
|
+
data.writeUInt8(Discriminator.UpdateDeltaStaleness, 0);
|
|
1123
|
+
data.writeUInt8(params.deltaStaleness, 1);
|
|
1124
|
+
return new (0, _web3js.TransactionInstruction)({
|
|
1125
|
+
programId,
|
|
1126
|
+
keys: [
|
|
1127
|
+
{ pubkey: authority, isSigner: true, isWritable: false },
|
|
1128
|
+
{ pubkey: configPda, isSigner: false, isWritable: true }
|
|
1129
|
+
],
|
|
1130
|
+
data
|
|
1131
|
+
});
|
|
1132
|
+
}
|
|
1133
|
+
function buildClosePool(authority, configPda, midpriceOraclePda, curveMetaPda, curvePrefabsPda, curveUpdatesPda, vaultX, vaultY, tokenProgramX, tokenProgramY, spreadConfigInitialized = false, programId = HADRON_PROGRAM_ID) {
|
|
1134
|
+
const data = Buffer.alloc(1);
|
|
1135
|
+
data.writeUInt8(Discriminator.ClosePool, 0);
|
|
1136
|
+
const keys = [
|
|
1137
|
+
{ pubkey: authority, isSigner: true, isWritable: true },
|
|
1138
|
+
{ pubkey: configPda, isSigner: false, isWritable: true },
|
|
1139
|
+
{ pubkey: midpriceOraclePda, isSigner: false, isWritable: true },
|
|
1140
|
+
{ pubkey: curveMetaPda, isSigner: false, isWritable: true },
|
|
1141
|
+
{ pubkey: curvePrefabsPda, isSigner: false, isWritable: true },
|
|
1142
|
+
{ pubkey: curveUpdatesPda, isSigner: false, isWritable: true },
|
|
1143
|
+
{ pubkey: vaultX, isSigner: false, isWritable: true },
|
|
1144
|
+
{ pubkey: vaultY, isSigner: false, isWritable: true },
|
|
1145
|
+
{ pubkey: tokenProgramX, isSigner: false, isWritable: false },
|
|
1146
|
+
{ pubkey: tokenProgramY, isSigner: false, isWritable: false }
|
|
1147
|
+
];
|
|
1148
|
+
if (spreadConfigInitialized) {
|
|
1149
|
+
const [spreadConfigPda] = getSpreadConfigAddress(configPda, programId);
|
|
1150
|
+
keys.push({
|
|
1151
|
+
pubkey: spreadConfigPda,
|
|
1152
|
+
isSigner: false,
|
|
1153
|
+
isWritable: true
|
|
1154
|
+
});
|
|
1155
|
+
}
|
|
1156
|
+
return new (0, _web3js.TransactionInstruction)({ programId, keys, data });
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
// src/hadron.ts
|
|
1160
|
+
var Hadron = class _Hadron {
|
|
1161
|
+
constructor(connection, poolAddress, addresses, config, oracle, curveMeta, curvePrefabsData, programId = HADRON_PROGRAM_ID) {
|
|
1162
|
+
this.connection = connection;
|
|
1163
|
+
this.poolAddress = poolAddress;
|
|
1164
|
+
this.addresses = addresses;
|
|
1165
|
+
this.config = config;
|
|
1166
|
+
this.oracle = oracle;
|
|
1167
|
+
this.curveMeta = curveMeta;
|
|
1168
|
+
this.curvePrefabsData = curvePrefabsData;
|
|
1169
|
+
this.programId = programId;
|
|
1170
|
+
}
|
|
1171
|
+
// ==========================================================================
|
|
1172
|
+
// Static Factory Methods
|
|
1173
|
+
// ==========================================================================
|
|
1174
|
+
/**
|
|
1175
|
+
* Load a Hadron instance from an existing pool address.
|
|
1176
|
+
* Fetches all required accounts from the chain.
|
|
1177
|
+
*/
|
|
1178
|
+
static async load(connection, poolAddress) {
|
|
1179
|
+
const programId = HADRON_PROGRAM_ID;
|
|
1180
|
+
const configInfo = await connection.getAccountInfo(poolAddress);
|
|
1181
|
+
if (!configInfo) throw new Error("Config account not found");
|
|
1182
|
+
const config = decodeConfig(configInfo.data);
|
|
1183
|
+
const tokenProgramX = config.tokenProgramX;
|
|
1184
|
+
const tokenProgramY = config.tokenProgramY;
|
|
1185
|
+
const addresses = derivePoolAddresses(
|
|
1186
|
+
config.seed,
|
|
1187
|
+
config.mintX,
|
|
1188
|
+
config.mintY,
|
|
1189
|
+
tokenProgramX,
|
|
1190
|
+
tokenProgramY,
|
|
1191
|
+
programId
|
|
1192
|
+
);
|
|
1193
|
+
const [oracleInfo, curveMetaInfo, curvePrefabsInfo] = await Promise.all([
|
|
1194
|
+
connection.getAccountInfo(addresses.midpriceOracle),
|
|
1195
|
+
connection.getAccountInfo(addresses.curveMeta),
|
|
1196
|
+
connection.getAccountInfo(addresses.curvePrefabs)
|
|
1197
|
+
]);
|
|
1198
|
+
if (!oracleInfo) throw new Error("MidpriceOracle account not found");
|
|
1199
|
+
if (!curveMetaInfo) throw new Error("CurveMeta account not found");
|
|
1200
|
+
if (!curvePrefabsInfo) throw new Error("CurvePrefabs account not found");
|
|
1201
|
+
const oracle = decodeMidpriceOracle(oracleInfo.data);
|
|
1202
|
+
const curveMeta = decodeCurveMeta(curveMetaInfo.data);
|
|
1203
|
+
return new _Hadron(
|
|
1204
|
+
connection,
|
|
1205
|
+
poolAddress,
|
|
1206
|
+
addresses,
|
|
1207
|
+
config,
|
|
1208
|
+
oracle,
|
|
1209
|
+
curveMeta,
|
|
1210
|
+
curvePrefabsInfo.data,
|
|
1211
|
+
programId
|
|
1212
|
+
);
|
|
1213
|
+
}
|
|
1214
|
+
/**
|
|
1215
|
+
* Load a Hadron instance from pool identity (seed + mints).
|
|
1216
|
+
*/
|
|
1217
|
+
static async loadFromSeed(connection, seed, mintX, mintY) {
|
|
1218
|
+
const programId = HADRON_PROGRAM_ID;
|
|
1219
|
+
const [poolAddress] = getConfigAddress(seed, mintX, mintY, programId);
|
|
1220
|
+
return _Hadron.load(connection, poolAddress);
|
|
1221
|
+
}
|
|
1222
|
+
/**
|
|
1223
|
+
* Build all instructions needed to initialize a new pool.
|
|
1224
|
+
*
|
|
1225
|
+
* Returns the allocate + initialize instructions and the derived pool address.
|
|
1226
|
+
* The caller is responsible for grouping them into transactions and sending.
|
|
1227
|
+
* The allocate instruction(s) must be confirmed before the initialize instruction.
|
|
1228
|
+
*
|
|
1229
|
+
* After the pool is live on-chain, load it with `Hadron.load(connection, poolAddress)`.
|
|
1230
|
+
*
|
|
1231
|
+
* ```ts
|
|
1232
|
+
* const { instructions, poolAddress, seed } = Hadron.initialize(payer, {
|
|
1233
|
+
* mintX,
|
|
1234
|
+
* mintY,
|
|
1235
|
+
* authority: payer,
|
|
1236
|
+
* initialMidpriceQ32: Q32_ONE,
|
|
1237
|
+
* });
|
|
1238
|
+
* ```
|
|
1239
|
+
*/
|
|
1240
|
+
static initialize(payer, params) {
|
|
1241
|
+
const programId = HADRON_PROGRAM_ID;
|
|
1242
|
+
const seed = _nullishCoalesce(params.seed, () => ( _Hadron.randomSeed()));
|
|
1243
|
+
const maxPrefabSlots = _nullishCoalesce(params.maxPrefabSlots, () => ( DEFAULT_MAX_PREFAB_SLOTS));
|
|
1244
|
+
const maxCurvePoints = _nullishCoalesce(params.maxCurvePoints, () => ( DEFAULT_MAX_CURVE_POINTS));
|
|
1245
|
+
const resolvedParams = { ...params, seed };
|
|
1246
|
+
const [poolAddress] = getConfigAddress(
|
|
1247
|
+
seed,
|
|
1248
|
+
params.mintX,
|
|
1249
|
+
params.mintY,
|
|
1250
|
+
programId
|
|
1251
|
+
);
|
|
1252
|
+
const allocateParams = {
|
|
1253
|
+
seed,
|
|
1254
|
+
mintX: params.mintX,
|
|
1255
|
+
mintY: params.mintY,
|
|
1256
|
+
maxPrefabSlots,
|
|
1257
|
+
maxCurvePoints
|
|
1258
|
+
};
|
|
1259
|
+
const instructions = [];
|
|
1260
|
+
const size = curvePrefabsSize(maxPrefabSlots, maxCurvePoints);
|
|
1261
|
+
const allocateCalls = size > 10240 ? 2 : 1;
|
|
1262
|
+
for (let i = 0; i < allocateCalls; i++) {
|
|
1263
|
+
instructions.push(buildAllocateCurvePrefabs(payer, allocateParams, programId));
|
|
1264
|
+
}
|
|
1265
|
+
instructions.push(buildInitialize(payer, resolvedParams, programId));
|
|
1266
|
+
return { instructions, poolAddress, seed };
|
|
1267
|
+
}
|
|
1268
|
+
/** Generate a random u64 seed. */
|
|
1269
|
+
static randomSeed() {
|
|
1270
|
+
const buf = new Uint8Array(8);
|
|
1271
|
+
crypto.getRandomValues(buf);
|
|
1272
|
+
return new DataView(buf.buffer).getBigUint64(0, true);
|
|
1273
|
+
}
|
|
1274
|
+
// ==========================================================================
|
|
1275
|
+
// State Queries
|
|
1276
|
+
// ==========================================================================
|
|
1277
|
+
/** Re-fetch all account state from the chain. */
|
|
1278
|
+
async refetchStates() {
|
|
1279
|
+
const [configInfo, oracleInfo, curveMetaInfo, curvePrefabsInfo] = await Promise.all([
|
|
1280
|
+
this.connection.getAccountInfo(this.poolAddress),
|
|
1281
|
+
this.connection.getAccountInfo(this.addresses.midpriceOracle),
|
|
1282
|
+
this.connection.getAccountInfo(this.addresses.curveMeta),
|
|
1283
|
+
this.connection.getAccountInfo(this.addresses.curvePrefabs)
|
|
1284
|
+
]);
|
|
1285
|
+
if (configInfo) this.config = decodeConfig(configInfo.data);
|
|
1286
|
+
if (oracleInfo) this.oracle = decodeMidpriceOracle(oracleInfo.data);
|
|
1287
|
+
if (curveMetaInfo) this.curveMeta = decodeCurveMeta(curveMetaInfo.data);
|
|
1288
|
+
if (curvePrefabsInfo) this.curvePrefabsData = curvePrefabsInfo.data;
|
|
1289
|
+
}
|
|
1290
|
+
/** Get midprice as a floating-point number. */
|
|
1291
|
+
getMidprice() {
|
|
1292
|
+
return fromQ32(this.oracle.midpriceQ32);
|
|
1293
|
+
}
|
|
1294
|
+
/** Get base spread as a floating-point number. */
|
|
1295
|
+
getBaseSpread() {
|
|
1296
|
+
return fromQ32(this.oracle.baseSpreadQ32);
|
|
1297
|
+
}
|
|
1298
|
+
/** Get the currently active curve slot indices. */
|
|
1299
|
+
getActiveCurveSlots() {
|
|
1300
|
+
return {
|
|
1301
|
+
priceBid: this.curveMeta.activePriceBidSlot,
|
|
1302
|
+
priceAsk: this.curveMeta.activePriceAskSlot,
|
|
1303
|
+
riskBid: this.curveMeta.activeRiskBidSlot,
|
|
1304
|
+
riskAsk: this.curveMeta.activeRiskAskSlot
|
|
1305
|
+
};
|
|
1306
|
+
}
|
|
1307
|
+
/** Decode the currently active curves from prefabs data. */
|
|
1308
|
+
getActiveCurves() {
|
|
1309
|
+
return decodeActiveCurves(this.curvePrefabsData, this.curveMeta);
|
|
1310
|
+
}
|
|
1311
|
+
/** Decode a specific curve slot. */
|
|
1312
|
+
getCurveSlot(curveType, slot) {
|
|
1313
|
+
return decodeCurveSide(
|
|
1314
|
+
this.curvePrefabsData,
|
|
1315
|
+
curveType,
|
|
1316
|
+
slot,
|
|
1317
|
+
this.curveMeta.maxPrefabSlots,
|
|
1318
|
+
this.curveMeta.maxCurvePoints
|
|
1319
|
+
);
|
|
1320
|
+
}
|
|
1321
|
+
// ==========================================================================
|
|
1322
|
+
// Instruction Builders (convenience wrappers)
|
|
1323
|
+
// ==========================================================================
|
|
1324
|
+
/** Build deposit instruction. */
|
|
1325
|
+
deposit(user, params) {
|
|
1326
|
+
return buildDeposit(
|
|
1327
|
+
user,
|
|
1328
|
+
this.poolAddress,
|
|
1329
|
+
this.config.mintX,
|
|
1330
|
+
this.config.mintY,
|
|
1331
|
+
this.config.tokenProgramX,
|
|
1332
|
+
this.config.tokenProgramY,
|
|
1333
|
+
params,
|
|
1334
|
+
this.programId
|
|
1335
|
+
);
|
|
1336
|
+
}
|
|
1337
|
+
/** Build withdraw instruction. */
|
|
1338
|
+
withdraw(user, params) {
|
|
1339
|
+
return buildWithdraw(
|
|
1340
|
+
user,
|
|
1341
|
+
this.poolAddress,
|
|
1342
|
+
this.config.mintX,
|
|
1343
|
+
this.config.mintY,
|
|
1344
|
+
this.config.tokenProgramX,
|
|
1345
|
+
this.config.tokenProgramY,
|
|
1346
|
+
params,
|
|
1347
|
+
this.programId
|
|
1348
|
+
);
|
|
1349
|
+
}
|
|
1350
|
+
/** Build swap instruction. */
|
|
1351
|
+
swap(user, params) {
|
|
1352
|
+
return buildSwapExactIn(
|
|
1353
|
+
user,
|
|
1354
|
+
this.addresses,
|
|
1355
|
+
this.config.mintX,
|
|
1356
|
+
this.config.mintY,
|
|
1357
|
+
this.config.tokenProgramX,
|
|
1358
|
+
this.config.tokenProgramY,
|
|
1359
|
+
params,
|
|
1360
|
+
this.programId
|
|
1361
|
+
);
|
|
1362
|
+
}
|
|
1363
|
+
/** Build set curve instruction. */
|
|
1364
|
+
setCurve(authority, params) {
|
|
1365
|
+
return buildSetCurve(
|
|
1366
|
+
authority,
|
|
1367
|
+
this.addresses.curveMeta,
|
|
1368
|
+
this.addresses.curvePrefabs,
|
|
1369
|
+
params,
|
|
1370
|
+
this.programId
|
|
1371
|
+
);
|
|
1372
|
+
}
|
|
1373
|
+
/** Build set risk curve instruction (percent-based x-axis). */
|
|
1374
|
+
setRiskCurve(authority, params) {
|
|
1375
|
+
return buildSetRiskCurve(
|
|
1376
|
+
authority,
|
|
1377
|
+
this.addresses.curveMeta,
|
|
1378
|
+
this.addresses.curvePrefabs,
|
|
1379
|
+
params,
|
|
1380
|
+
this.programId
|
|
1381
|
+
);
|
|
1382
|
+
}
|
|
1383
|
+
/** Build set risk curve instruction (absolute x-axis). */
|
|
1384
|
+
setRiskCurveAbsolute(authority, params) {
|
|
1385
|
+
return buildSetRiskCurveAbsolute(
|
|
1386
|
+
authority,
|
|
1387
|
+
this.addresses.curveMeta,
|
|
1388
|
+
this.addresses.curvePrefabs,
|
|
1389
|
+
params,
|
|
1390
|
+
this.programId
|
|
1391
|
+
);
|
|
1392
|
+
}
|
|
1393
|
+
/** Build set curve instructions for both bid and ask. Returns [bidIx, askIx]. */
|
|
1394
|
+
setCurveBoth(authority, params) {
|
|
1395
|
+
return buildSetCurveBoth(
|
|
1396
|
+
authority,
|
|
1397
|
+
this.addresses.curveMeta,
|
|
1398
|
+
this.addresses.curvePrefabs,
|
|
1399
|
+
params,
|
|
1400
|
+
this.programId
|
|
1401
|
+
);
|
|
1402
|
+
}
|
|
1403
|
+
/** Build set risk curve instructions for both bid and ask. Returns [bidIx, askIx]. */
|
|
1404
|
+
setRiskCurveBoth(authority, params) {
|
|
1405
|
+
return buildSetRiskCurveBoth(
|
|
1406
|
+
authority,
|
|
1407
|
+
this.addresses.curveMeta,
|
|
1408
|
+
this.addresses.curvePrefabs,
|
|
1409
|
+
params,
|
|
1410
|
+
this.programId
|
|
1411
|
+
);
|
|
1412
|
+
}
|
|
1413
|
+
/** Build set risk curve (absolute x-axis) instructions for both bid and ask. Returns [bidIx, askIx]. */
|
|
1414
|
+
setRiskCurveAbsoluteBoth(authority, params) {
|
|
1415
|
+
return buildSetRiskCurveAbsoluteBoth(
|
|
1416
|
+
authority,
|
|
1417
|
+
this.addresses.curveMeta,
|
|
1418
|
+
this.addresses.curvePrefabs,
|
|
1419
|
+
params,
|
|
1420
|
+
this.programId
|
|
1421
|
+
);
|
|
1422
|
+
}
|
|
1423
|
+
/** Build update midprice instruction. */
|
|
1424
|
+
updateMidprice(authority, params) {
|
|
1425
|
+
return buildUpdateMidprice(
|
|
1426
|
+
authority,
|
|
1427
|
+
this.addresses.midpriceOracle,
|
|
1428
|
+
params,
|
|
1429
|
+
this.programId
|
|
1430
|
+
);
|
|
1431
|
+
}
|
|
1432
|
+
/** Build update base spread instruction. */
|
|
1433
|
+
updateBaseSpread(authority, params) {
|
|
1434
|
+
return buildUpdateBaseSpread(
|
|
1435
|
+
authority,
|
|
1436
|
+
this.addresses.midpriceOracle,
|
|
1437
|
+
params,
|
|
1438
|
+
this.programId
|
|
1439
|
+
);
|
|
1440
|
+
}
|
|
1441
|
+
/** Build atomic update of midprice + base spread. */
|
|
1442
|
+
updateMidpriceAndBaseSpread(authority, params) {
|
|
1443
|
+
return buildUpdateMidpriceAndBaseSpread(
|
|
1444
|
+
authority,
|
|
1445
|
+
this.addresses.midpriceOracle,
|
|
1446
|
+
params,
|
|
1447
|
+
this.programId
|
|
1448
|
+
);
|
|
1449
|
+
}
|
|
1450
|
+
/** Build switch price curve instruction (hot path). */
|
|
1451
|
+
switchPriceCurve(authority, params) {
|
|
1452
|
+
return buildSwitchPriceCurve(
|
|
1453
|
+
authority,
|
|
1454
|
+
this.addresses.curveMeta,
|
|
1455
|
+
params,
|
|
1456
|
+
this.programId
|
|
1457
|
+
);
|
|
1458
|
+
}
|
|
1459
|
+
/** Build switch risk curve instruction (hot path). */
|
|
1460
|
+
switchRiskCurve(authority, params) {
|
|
1461
|
+
return buildSwitchRiskCurve(
|
|
1462
|
+
authority,
|
|
1463
|
+
this.addresses.curveMeta,
|
|
1464
|
+
params,
|
|
1465
|
+
this.programId
|
|
1466
|
+
);
|
|
1467
|
+
}
|
|
1468
|
+
/** Build submit curve updates instruction (hot path). */
|
|
1469
|
+
submitCurveUpdates(authority, ops) {
|
|
1470
|
+
return buildSubmitCurveUpdates(
|
|
1471
|
+
authority,
|
|
1472
|
+
this.addresses.curveUpdates,
|
|
1473
|
+
ops,
|
|
1474
|
+
this.programId
|
|
1475
|
+
);
|
|
1476
|
+
}
|
|
1477
|
+
/** Build apply curve updates instruction. */
|
|
1478
|
+
applyCurveUpdates(authority) {
|
|
1479
|
+
return buildApplyCurveUpdates(
|
|
1480
|
+
authority,
|
|
1481
|
+
this.addresses.curveMeta,
|
|
1482
|
+
this.addresses.curvePrefabs,
|
|
1483
|
+
this.addresses.curveUpdates,
|
|
1484
|
+
this.programId
|
|
1485
|
+
);
|
|
1486
|
+
}
|
|
1487
|
+
/** Build nominate authority instruction. */
|
|
1488
|
+
nominateAuthority(authority, params) {
|
|
1489
|
+
return buildNominateAuthority(
|
|
1490
|
+
authority,
|
|
1491
|
+
this.poolAddress,
|
|
1492
|
+
params,
|
|
1493
|
+
this.programId
|
|
1494
|
+
);
|
|
1495
|
+
}
|
|
1496
|
+
/** Build accept authority instruction. */
|
|
1497
|
+
acceptAuthority(newAuthority) {
|
|
1498
|
+
return buildAcceptAuthority(
|
|
1499
|
+
newAuthority,
|
|
1500
|
+
this.poolAddress,
|
|
1501
|
+
this.programId
|
|
1502
|
+
);
|
|
1503
|
+
}
|
|
1504
|
+
/** Build set pool state instruction. */
|
|
1505
|
+
setPoolState(authority, params) {
|
|
1506
|
+
return buildSetPoolState(
|
|
1507
|
+
authority,
|
|
1508
|
+
this.poolAddress,
|
|
1509
|
+
params,
|
|
1510
|
+
this.programId
|
|
1511
|
+
);
|
|
1512
|
+
}
|
|
1513
|
+
/** Build update delta staleness instruction. */
|
|
1514
|
+
updateDeltaStaleness(authority, params) {
|
|
1515
|
+
return buildUpdateDeltaStaleness(
|
|
1516
|
+
authority,
|
|
1517
|
+
this.poolAddress,
|
|
1518
|
+
params,
|
|
1519
|
+
this.programId
|
|
1520
|
+
);
|
|
1521
|
+
}
|
|
1522
|
+
/** Build close pool instruction. */
|
|
1523
|
+
closePool(authority) {
|
|
1524
|
+
return buildClosePool(
|
|
1525
|
+
authority,
|
|
1526
|
+
this.poolAddress,
|
|
1527
|
+
this.addresses.midpriceOracle,
|
|
1528
|
+
this.addresses.curveMeta,
|
|
1529
|
+
this.addresses.curvePrefabs,
|
|
1530
|
+
this.addresses.curveUpdates,
|
|
1531
|
+
this.addresses.vaultX,
|
|
1532
|
+
this.addresses.vaultY,
|
|
1533
|
+
this.config.tokenProgramX,
|
|
1534
|
+
this.config.tokenProgramY,
|
|
1535
|
+
this.config.spreadConfigInitialized,
|
|
1536
|
+
this.programId
|
|
1537
|
+
);
|
|
1538
|
+
}
|
|
1539
|
+
};
|
|
1540
|
+
|
|
1541
|
+
// src/helpers/token.ts
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
async function getOrCreateAta(connection, mint, owner, payer, tokenProgram = _spltoken.TOKEN_PROGRAM_ID, allowOwnerOffCurve = false) {
|
|
1548
|
+
const address = _spltoken.getAssociatedTokenAddressSync.call(void 0,
|
|
1549
|
+
mint,
|
|
1550
|
+
owner,
|
|
1551
|
+
allowOwnerOffCurve,
|
|
1552
|
+
tokenProgram
|
|
1553
|
+
);
|
|
1554
|
+
const account = await connection.getAccountInfo(address);
|
|
1555
|
+
if (account) {
|
|
1556
|
+
return { address, instruction: null };
|
|
1557
|
+
}
|
|
1558
|
+
const instruction = _spltoken.createAssociatedTokenAccountInstruction.call(void 0,
|
|
1559
|
+
payer,
|
|
1560
|
+
address,
|
|
1561
|
+
owner,
|
|
1562
|
+
mint,
|
|
1563
|
+
tokenProgram
|
|
1564
|
+
);
|
|
1565
|
+
return { address, instruction };
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
|
|
1569
|
+
|
|
1570
|
+
|
|
1571
|
+
|
|
1572
|
+
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
|
|
1576
|
+
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
|
|
1586
|
+
|
|
1587
|
+
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
|
|
1591
|
+
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
|
|
1600
|
+
|
|
1601
|
+
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
|
|
1605
|
+
|
|
1606
|
+
|
|
1607
|
+
|
|
1608
|
+
|
|
1609
|
+
|
|
1610
|
+
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
|
|
1615
|
+
|
|
1616
|
+
|
|
1617
|
+
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
|
|
1621
|
+
|
|
1622
|
+
|
|
1623
|
+
|
|
1624
|
+
|
|
1625
|
+
|
|
1626
|
+
|
|
1627
|
+
|
|
1628
|
+
|
|
1629
|
+
|
|
1630
|
+
|
|
1631
|
+
|
|
1632
|
+
|
|
1633
|
+
|
|
1634
|
+
|
|
1635
|
+
|
|
1636
|
+
|
|
1637
|
+
|
|
1638
|
+
|
|
1639
|
+
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
|
|
1644
|
+
|
|
1645
|
+
|
|
1646
|
+
|
|
1647
|
+
|
|
1648
|
+
|
|
1649
|
+
|
|
1650
|
+
|
|
1651
|
+
|
|
1652
|
+
exports.ABSOLUTE_MAX_CURVE_POINTS = ABSOLUTE_MAX_CURVE_POINTS; exports.ABSOLUTE_MAX_PREFAB_SLOTS = ABSOLUTE_MAX_PREFAB_SLOTS; exports.CONFIG_SEED = CONFIG_SEED; exports.CONFIG_SIZE = CONFIG_SIZE; exports.CURVE_META_SEED = CURVE_META_SEED; exports.CURVE_META_SIZE = CURVE_META_SIZE; exports.CURVE_POINT_LEN = CURVE_POINT_LEN; exports.CURVE_PREFABS_SEED = CURVE_PREFABS_SEED; exports.CURVE_SIDE_HEADER = CURVE_SIDE_HEADER; exports.CURVE_UPDATES_SEED = CURVE_UPDATES_SEED; exports.CURVE_UPDATES_SIZE = CURVE_UPDATES_SIZE; exports.CURVE_UPDATE_OP_SIZE = CURVE_UPDATE_OP_SIZE; exports.CurveType = CurveType; exports.CurveUpdateOpKind = CurveUpdateOpKind; exports.CurveXMode = CurveXMode; exports.DEFAULT_MAX_CURVE_POINTS = DEFAULT_MAX_CURVE_POINTS; exports.DEFAULT_MAX_PREFAB_SLOTS = DEFAULT_MAX_PREFAB_SLOTS; exports.Discriminator = Discriminator; exports.FEE_CONFIG_SEED = FEE_CONFIG_SEED; exports.FEE_CONFIG_SIZE = FEE_CONFIG_SIZE; exports.HADRON_PROGRAM_ID = HADRON_PROGRAM_ID; exports.Hadron = Hadron; exports.Interpolation = Interpolation; exports.MAX_CURVE_UPDATE_OPS = MAX_CURVE_UPDATE_OPS; exports.MAX_SETCURVE_POINTS = MAX_SETCURVE_POINTS; exports.MIDPRICE_ORACLE_SEED = MIDPRICE_ORACLE_SEED; exports.MIDPRICE_ORACLE_SIZE = MIDPRICE_ORACLE_SIZE; exports.OracleMode = OracleMode; exports.POINT_DATA_SIZE = POINT_DATA_SIZE; exports.PoolState = PoolState; exports.Q32_ONE = Q32_ONE; exports.RiskMode = RiskMode; exports.SPREAD_CONFIG_SEED = SPREAD_CONFIG_SEED; exports.Side = Side; exports.buildAcceptAuthority = buildAcceptAuthority; exports.buildAllocateCurvePrefabs = buildAllocateCurvePrefabs; exports.buildApplyCurveUpdates = buildApplyCurveUpdates; exports.buildClosePool = buildClosePool; exports.buildDeposit = buildDeposit; exports.buildInitialize = buildInitialize; exports.buildInitializeFeeConfig = buildInitializeFeeConfig; exports.buildInitializeSpreadConfig = buildInitializeSpreadConfig; exports.buildNominateAuthority = buildNominateAuthority; exports.buildRotateFeeAdmin = buildRotateFeeAdmin; exports.buildSetCurve = buildSetCurve; exports.buildSetCurveBoth = buildSetCurveBoth; exports.buildSetPoolState = buildSetPoolState; exports.buildSetQuotingAuthority = buildSetQuotingAuthority; exports.buildSetRiskCurve = buildSetRiskCurve; exports.buildSetRiskCurveAbsolute = buildSetRiskCurveAbsolute; exports.buildSetRiskCurveAbsoluteBoth = buildSetRiskCurveAbsoluteBoth; exports.buildSetRiskCurveBoth = buildSetRiskCurveBoth; exports.buildSubmitCurveUpdates = buildSubmitCurveUpdates; exports.buildSwapExactIn = buildSwapExactIn; exports.buildSwitchPriceCurve = buildSwitchPriceCurve; exports.buildSwitchRiskCurve = buildSwitchRiskCurve; exports.buildUpdateBaseSpread = buildUpdateBaseSpread; exports.buildUpdateDeltaStaleness = buildUpdateDeltaStaleness; exports.buildUpdateFeeConfig = buildUpdateFeeConfig; exports.buildUpdateMidprice = buildUpdateMidprice; exports.buildUpdateMidpriceAndBaseSpread = buildUpdateMidpriceAndBaseSpread; exports.buildUpdateSpreadConfig = buildUpdateSpreadConfig; exports.buildWithdraw = buildWithdraw; exports.curvePrefabsSize = curvePrefabsSize; exports.decodeActiveCurves = decodeActiveCurves; exports.decodeConfig = decodeConfig; exports.decodeCurveMeta = decodeCurveMeta; exports.decodeCurveSide = decodeCurveSide; exports.decodeCurveUpdates = decodeCurveUpdates; exports.decodeFeeConfig = decodeFeeConfig; exports.decodeMidpriceOracle = decodeMidpriceOracle; exports.derivePoolAddresses = derivePoolAddresses; exports.fromQ32 = fromQ32; exports.getConfigAddress = getConfigAddress; exports.getCurveMetaAddress = getCurveMetaAddress; exports.getCurvePrefabsAddress = getCurvePrefabsAddress; exports.getCurveUpdatesAddress = getCurveUpdatesAddress; exports.getFeeConfigAddress = getFeeConfigAddress; exports.getMidpriceOracleAddress = getMidpriceOracleAddress; exports.getOrCreateAta = getOrCreateAta; exports.getSpreadConfigAddress = getSpreadConfigAddress; exports.isSlotInitialized = isSlotInitialized; exports.pctToQ32 = pctToQ32; exports.toQ32 = toQ32;
|
|
1653
|
+
//# sourceMappingURL=index.js.map
|