@metaflux-dex/client 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/dist/client.d.ts +32 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +344 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/http.d.ts +17 -0
  8. package/dist/http.d.ts.map +1 -0
  9. package/dist/http.js +106 -0
  10. package/dist/http.js.map +1 -0
  11. package/dist/index.d.ts +9 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +26 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/info-types.d.ts +380 -0
  16. package/dist/info-types.d.ts.map +1 -0
  17. package/dist/info-types.js +16 -0
  18. package/dist/info-types.js.map +1 -0
  19. package/dist/info.d.ts +65 -0
  20. package/dist/info.d.ts.map +1 -0
  21. package/dist/info.js +252 -0
  22. package/dist/info.js.map +1 -0
  23. package/dist/native.d.ts +10 -0
  24. package/dist/native.d.ts.map +1 -0
  25. package/dist/native.js +252 -0
  26. package/dist/native.js.map +1 -0
  27. package/dist/types.d.ts +143 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +13 -0
  30. package/dist/types.js.map +1 -0
  31. package/dist/wasm.d.ts +28 -0
  32. package/dist/wasm.d.ts.map +1 -0
  33. package/dist/wasm.js +279 -0
  34. package/dist/wasm.js.map +1 -0
  35. package/dist/ws.d.ts +43 -0
  36. package/dist/ws.d.ts.map +1 -0
  37. package/dist/ws.js +221 -0
  38. package/dist/ws.js.map +1 -0
  39. package/package.json +65 -0
  40. package/src/client.ts +454 -0
  41. package/src/http.ts +153 -0
  42. package/src/index.ts +144 -0
  43. package/src/info-types.ts +783 -0
  44. package/src/info.ts +355 -0
  45. package/src/native.ts +307 -0
  46. package/src/types.ts +305 -0
  47. package/src/wasm.ts +384 -0
  48. package/src/ws.ts +279 -0
package/dist/info.js ADDED
@@ -0,0 +1,252 @@
1
+ // MTF-native `/info` read API — typed request builders + envelope unwrap.
2
+ //
3
+ // Byte-for-byte mirror of the server dispatcher
4
+ // (`metaflux/crates/api-node/src/rest/info.rs::handle_info`) and the per-handler
5
+ // shapes in `info/{reads,markets,hl_parity}.rs`. Every request is a
6
+ // `POST /info` whose body is `{"type": "<discriminator>", ...params}` —
7
+ // snake_case field names, the exact convention the node decodes. The node's
8
+ // `/info` surface is MTF-native ONLY; the HL `type` aliases (`meta` etc.) live
9
+ // on the gateway's hl_compat layer, not here.
10
+ //
11
+ // ENVELOPE. Every successful response is `{"type": "<query>", "data": {...}}`.
12
+ // `post` validates the echoed `type` and returns the unwrapped `data` typed —
13
+ // the unwrap lives in exactly one place (`post`). The `raw<T>()` escape hatch
14
+ // returns the unwrapped `data` too (use `rawEnvelope` for the full envelope).
15
+ //
16
+ // KEYING. The node `/info` is keyed by `0x` hex address for account / staking /
17
+ // vault / user reads (`account_state`, `staking_state`, `frontend_open_orders`,
18
+ // every hl_parity user read), by `vault` (0x) for `vault_state`, by `asset_id`
19
+ // or `coin` for `market_info`, and by `market_id` (u32) for the book / trade /
20
+ // funding reads. The account-history reads (`open_orders`, `user_fills`,
21
+ // `agents`, `sub_accounts`) accept EITHER `address` (0x) OR `account_id` (u64).
22
+ // There is NO numeric-id-only keying for accounts and NO gateway id translation
23
+ // on this surface.
24
+ //
25
+ // Money magnitudes that can exceed JS `Number.MAX_SAFE_INTEGER` (2^53) are
26
+ // typed `string` in `./info-types.js` to match the node's decimal-string
27
+ // encoding; ids / counts / bps stay `number`.
28
+ import { httpRequest } from './http.js';
29
+ /// `/info` namespace handle. Each method POSTs a typed `{"type": ...}` body to
30
+ /// `POST <baseUrl>/info`, validates the `{type, data}` envelope, and returns
31
+ /// the unwrapped `data`.
32
+ ///
33
+ /// No signing required — these are read-only queries. Construct via
34
+ /// `Client.info` or directly with a base URL.
35
+ export class InfoApi {
36
+ baseUrl;
37
+ constructor(baseUrl) {
38
+ this.baseUrl = baseUrl;
39
+ }
40
+ // ── documented core reads ──────────────────────────────────────────────
41
+ /// `node_info` — static node identity + protocol version.
42
+ async nodeInfo() {
43
+ return this.post({ type: 'node_info' });
44
+ }
45
+ /// `account_state` — rich per-account snapshot keyed by `address` (0x hex).
46
+ async accountState(address) {
47
+ return this.post({ type: 'account_state', address });
48
+ }
49
+ /// `market_info` — rich per-market snapshot by canonical `asset_id` (u32).
50
+ async marketInfo(assetId) {
51
+ return this.post({ type: 'market_info', asset_id: assetId });
52
+ }
53
+ /// `market_info` — rich per-market snapshot by human-readable `coin`.
54
+ async marketInfoByCoin(coin) {
55
+ return this.post({ type: 'market_info', coin });
56
+ }
57
+ /// `markets` — every registered MIP-3 perp market (array of `MarketInfo`).
58
+ async markets() {
59
+ return this.post({ type: 'markets' });
60
+ }
61
+ /// `vault_state` — per-vault snapshot keyed by vault `address` (0x hex).
62
+ async vaultState(vaultAddress) {
63
+ return this.post({ type: 'vault_state', vault: vaultAddress });
64
+ }
65
+ /// `staking_state` — per-account staking snapshot keyed by `address` (0x).
66
+ async stakingState(address) {
67
+ return this.post({ type: 'staking_state', address });
68
+ }
69
+ /// `fee_schedule` — protocol fee schedule.
70
+ async feeSchedule() {
71
+ return this.post({ type: 'fee_schedule' });
72
+ }
73
+ // ── book / trade / account-history reads ────────────────────────────────
74
+ /// `open_orders` — account-scoped resting orders. Keyed by `address` (0x) or
75
+ /// `account_id` (u64).
76
+ async openOrders(ref) {
77
+ return this.post({ type: 'open_orders', ...ref });
78
+ }
79
+ /// `l2_book` — market-scoped aggregated bid/ask levels by `market_id` (u32).
80
+ async l2Book(marketId) {
81
+ return this.post({ type: 'l2_book', market_id: marketId });
82
+ }
83
+ /// `recent_trades` — market-scoped trade tape by `market_id` (u32).
84
+ async recentTrades(marketId) {
85
+ return this.post({ type: 'recent_trades', market_id: marketId });
86
+ }
87
+ /// `user_fills` — account-scoped fill history. Keyed by `address` (0x) or
88
+ /// `account_id` (u64).
89
+ async userFills(ref) {
90
+ return this.post({ type: 'user_fills', ...ref });
91
+ }
92
+ /// `funding_history` — market-scoped funding premium samples by `market_id`.
93
+ async fundingHistory(marketId) {
94
+ return this.post({ type: 'funding_history', market_id: marketId });
95
+ }
96
+ /// `block_info` — latest committed block metadata. No parameters.
97
+ async blockInfo() {
98
+ return this.post({ type: 'block_info' });
99
+ }
100
+ /// `agents` — approved agent / API wallets. Keyed by `address` (0x) or
101
+ /// `account_id` (u64).
102
+ async agents(ref) {
103
+ return this.post({ type: 'agents', ...ref });
104
+ }
105
+ /// `sub_accounts` — sub-accounts of an account. Keyed by `address` (0x) or
106
+ /// `account_id` (u64).
107
+ async subAccounts(ref) {
108
+ return this.post({ type: 'sub_accounts', ...ref });
109
+ }
110
+ /// `mip3_active_bids` — MIP-3 permissionless perp-deploy auction snapshot.
111
+ async mip3ActiveBids() {
112
+ return this.post({ type: 'mip3_active_bids' });
113
+ }
114
+ // ── HL-node parity reads ────────────────────────────────────────────────
115
+ /// `spot_meta` — spot pair universe. No parameters.
116
+ async spotMeta() {
117
+ return this.post({ type: 'spot_meta' });
118
+ }
119
+ /// `spot_clearinghouse_state` — per-account spot token balances by `address`.
120
+ async spotClearinghouseState(address) {
121
+ return this.post({
122
+ type: 'spot_clearinghouse_state',
123
+ address,
124
+ });
125
+ }
126
+ /// `exchange_status` — global trading status. No parameters.
127
+ async exchangeStatus() {
128
+ return this.post({ type: 'exchange_status' });
129
+ }
130
+ /// `frontend_open_orders` — resting orders + tif / cloid / trigger by
131
+ /// `address` (0x).
132
+ async frontendOpenOrders(address) {
133
+ return this.post({ type: 'frontend_open_orders', address });
134
+ }
135
+ /// `liquidatable` — accounts currently flagged for liquidation. No params.
136
+ async liquidatable() {
137
+ return this.post({ type: 'liquidatable' });
138
+ }
139
+ /// `active_asset_data` — a user's per-asset leverage / margin-mode / max
140
+ /// trade by `address` (0x) + `asset_id` (u32).
141
+ async activeAssetData(address, assetId) {
142
+ return this.post({
143
+ type: 'active_asset_data',
144
+ address,
145
+ asset_id: assetId,
146
+ });
147
+ }
148
+ /// `max_market_order_ntls` — per-asset max market-order notional. No params.
149
+ async maxMarketOrderNtls() {
150
+ return this.post({ type: 'max_market_order_ntls' });
151
+ }
152
+ /// `vault_summaries` — all vaults summary. No parameters.
153
+ async vaultSummaries() {
154
+ return this.post({ type: 'vault_summaries' });
155
+ }
156
+ /// `user_vault_equities` — vaults a user has deposited into by `address` (0x).
157
+ async userVaultEquities(address) {
158
+ return this.post({ type: 'user_vault_equities', address });
159
+ }
160
+ /// `leading_vaults` — vaults led by the user by `address` (0x).
161
+ async leadingVaults(address) {
162
+ return this.post({ type: 'leading_vaults', address });
163
+ }
164
+ /// `user_rate_limit` — a user's action stats / rate-limit budget by `address`.
165
+ async userRateLimit(address) {
166
+ return this.post({ type: 'user_rate_limit', address });
167
+ }
168
+ /// `spot_deploy_state` — MIP-1 spot-pair-deploy gas-auction state. No params.
169
+ async spotDeployState() {
170
+ return this.post({ type: 'spot_deploy_state' });
171
+ }
172
+ /// `delegator_summary` — staking summary for an `address` (0x).
173
+ async delegatorSummary(address) {
174
+ return this.post({ type: 'delegator_summary', address });
175
+ }
176
+ /// `max_builder_fee` — approved builder-fee ceiling for `(address, builder)`,
177
+ /// both 0x.
178
+ async maxBuilderFee(address, builder) {
179
+ return this.post({ type: 'max_builder_fee', address, builder });
180
+ }
181
+ /// `user_to_multi_sig_signers` — multisig config for an `address` (0x).
182
+ async userToMultiSigSigners(address) {
183
+ return this.post({
184
+ type: 'user_to_multi_sig_signers',
185
+ address,
186
+ });
187
+ }
188
+ /// `user_role` — derived account role for an `address` (0x).
189
+ async userRole(address) {
190
+ return this.post({ type: 'user_role', address });
191
+ }
192
+ /// `perps_at_open_interest_cap` — assets whose OI is at/over the cap. No params.
193
+ async perpsAtOpenInterestCap() {
194
+ return this.post({ type: 'perps_at_open_interest_cap' });
195
+ }
196
+ /// `validator_l1_votes` — current validator L1 votes. No parameters.
197
+ async validatorL1Votes() {
198
+ return this.post({ type: 'validator_l1_votes' });
199
+ }
200
+ /// `margin_table` — the margin-tier table (one effective tier per market).
201
+ async marginTable() {
202
+ return this.post({ type: 'margin_table' });
203
+ }
204
+ /// `perp_dexs` — list the perp DEX(es). No parameters.
205
+ async perpDexs() {
206
+ return this.post({ type: 'perp_dexs' });
207
+ }
208
+ /// `validator_summaries` — per-validator snapshot. No parameters.
209
+ async validatorSummaries() {
210
+ return this.post({ type: 'validator_summaries' });
211
+ }
212
+ /// `gossip_root_ips` — configured gossip root/seed peer endpoints. No params.
213
+ async gossipRootIps() {
214
+ return this.post({ type: 'gossip_root_ips' });
215
+ }
216
+ /// `web_data2` — composite frontend snapshot by `address` (0x).
217
+ async webData2(address) {
218
+ return this.post({ type: 'web_data2', address });
219
+ }
220
+ // ── escape hatches ──────────────────────────────────────────────────────
221
+ /// Raw escape hatch — POST an arbitrary `{type, ...}` body to `/info`,
222
+ /// validate the envelope, and return the unwrapped `data` typed. For request
223
+ /// shapes the SDK doesn't yet model.
224
+ async raw(body) {
225
+ return this.post(body);
226
+ }
227
+ /// Like `raw`, but returns the full `{type, data}` envelope rather than just
228
+ /// the unwrapped `data` — for callers that want to inspect the echoed `type`.
229
+ async rawEnvelope(body) {
230
+ return httpRequest(this.baseUrl, '/info', {
231
+ method: 'POST',
232
+ json: body,
233
+ });
234
+ }
235
+ /// POST a typed body, validate the `{type, data}` envelope echoes the request
236
+ /// `type`, and return the unwrapped `data`. The single place the envelope is
237
+ /// peeled — every typed method routes through here.
238
+ async post(body) {
239
+ const env = await httpRequest(this.baseUrl, '/info', {
240
+ method: 'POST',
241
+ json: body,
242
+ });
243
+ if (env === null || typeof env !== 'object' || !('data' in env)) {
244
+ throw new TypeError(`/info ${body.type}: response is not a {type, data} envelope`);
245
+ }
246
+ if (env.type !== body.type) {
247
+ throw new TypeError(`/info ${body.type}: response type mismatch — got '${env.type}'`);
248
+ }
249
+ return env.data;
250
+ }
251
+ }
252
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../src/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { NativeCancel, NativeOrder, NativeSignedAction } from './types.js';
2
+ export declare const MTF_CHAIN_ID = 998;
3
+ export declare function nextNonce(): bigint;
4
+ export declare function nativeActionDigest(actionJson: string, nonce: bigint, chainId?: number): Promise<Uint8Array>;
5
+ export declare function buildNativeOrderAction(order: NativeOrder): string;
6
+ export declare function buildNativeCancelAction(cancel: NativeCancel): string;
7
+ export declare function signNativeAction(privateKey: Uint8Array, actionJson: string, nonce: bigint, chainId?: number): Promise<NativeSignedAction>;
8
+ export declare function recoverNativeSigner(signed: NativeSignedAction, chainId?: number): Promise<string>;
9
+ export declare function nativeRequestBody(signed: NativeSignedAction): string;
10
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAEV,YAAY,EACZ,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAQpB,eAAO,MAAM,YAAY,MAAM,CAAC;AAWhC,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AA8CD,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAoBrB;AA0BD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA0BjE;AAoBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoBpE;AAMD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAqB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAO7B;AAID,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,MAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAajB;AAOD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAEpE"}
package/dist/native.js ADDED
@@ -0,0 +1,252 @@
1
+ // MTF-native signed-action digest + envelope construction.
2
+ //
3
+ // This is the byte-exact TS twin of the Rust SDK reference
4
+ // (`metaflux-client-rust/src/rest/exchange.rs::ActionSignedDigest`) and the
5
+ // server verifier (`metaflux/crates/core-state/src/signing.rs`).
6
+ //
7
+ // digest = keccak256(0x1901 || domainSep5 || structHash)
8
+ // domainSep5 = keccak256(
9
+ // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
10
+ // || keccak256("MetaFlux") || keccak256("1")
11
+ // || chainId_be32 || verifyingContract_padded32 ) // verifyingContract = 0x0
12
+ // structHash = keccak256(
13
+ // keccak256("MetaFluxAction(string action,uint64 nonce)")
14
+ // || keccak256(action_json_bytes) || nonce_be32 )
15
+ //
16
+ // CRITICAL: the signature is verified over the EXACT `action` bytes the server
17
+ // receives (it parses `action` as `serde_json::value::RawValue`). So the same
18
+ // JSON string MUST be both signed and sent verbatim — never re-stringified
19
+ // from a parsed object. `buildNativeOrderAction` is the single source of those
20
+ // bytes.
21
+ import { deriveAddressFromPubkey, keccak256, recoverPubkey, signSecp256k1, } from './wasm.js';
22
+ const MTF_DOMAIN_TYPE = 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)';
23
+ const MTF_ACTION_TYPE = 'MetaFluxAction(string action,uint64 nonce)';
24
+ /// Default MTF chain id (matches `MTF_CHAIN_ID` in the Rust SDK + the server
25
+ /// KAT vector). Pinned to 998 provisionally; configurable post-S10.
26
+ export const MTF_CHAIN_ID = 998;
27
+ const enc = new TextEncoder();
28
+ let nonceClock = 0n;
29
+ /// Strictly-increasing replay nonce — at least the current unix-ms, but bumped
30
+ /// past the last issued value so a burst of orders within one millisecond gets
31
+ /// distinct nonces. The server's per-account window tolerates out-of-order
32
+ /// delivery but rejects collisions, so a raw `Date.now()` would drop the
33
+ /// 2nd-and-later order in a same-ms burst.
34
+ export function nextNonce() {
35
+ const now = BigInt(Date.now());
36
+ nonceClock = now > nonceClock ? now : nonceClock + 1n;
37
+ return nonceClock;
38
+ }
39
+ /// Encode a `bigint` as a 32-byte big-endian buffer (uint256 / nonce slot).
40
+ /// The value rides in the low bytes; high bytes are zero. Rejects negatives
41
+ /// and values that overflow 256 bits.
42
+ function be32(value) {
43
+ if (value < 0n)
44
+ throw new RangeError('be32: value must be non-negative');
45
+ if (value >= 1n << 256n)
46
+ throw new RangeError('be32: value overflows uint256');
47
+ const out = new Uint8Array(32);
48
+ let v = value;
49
+ for (let i = 31; i >= 0 && v > 0n; i--) {
50
+ out[i] = Number(v & 0xffn);
51
+ v >>= 8n;
52
+ }
53
+ return out;
54
+ }
55
+ /// Concatenate 32-byte chunks into one buffer.
56
+ function concat32(...chunks) {
57
+ const out = new Uint8Array(chunks.length * 32);
58
+ chunks.forEach((c, i) => {
59
+ if (c.length !== 32) {
60
+ throw new RangeError(`concat32: chunk ${i} is ${c.length} bytes, want 32`);
61
+ }
62
+ out.set(c, i * 32);
63
+ });
64
+ return out;
65
+ }
66
+ /// Compute the 5-field MTF-native EIP-712 domain separator.
67
+ async function domainSeparator(chainId) {
68
+ const typeHash = await keccak256(enc.encode(MTF_DOMAIN_TYPE));
69
+ const nameHash = await keccak256(enc.encode('MetaFlux'));
70
+ const versionHash = await keccak256(enc.encode('1'));
71
+ const chainIdBe = be32(BigInt(chainId));
72
+ // verifyingContract = 0x0 address, left-padded to 32 bytes => all zeros.
73
+ const verifyingPadded = new Uint8Array(32);
74
+ return keccak256(concat32(typeHash, nameHash, versionHash, chainIdBe, verifyingPadded));
75
+ }
76
+ /// Compute the native action EIP-712 digest over the EXACT `actionJson` bytes.
77
+ ///
78
+ /// Returns the 32-byte digest the wallet signs. `actionJson` MUST be the
79
+ /// identical string later POSTed in the `action` field (raw, not re-parsed).
80
+ export async function nativeActionDigest(actionJson, nonce, chainId = MTF_CHAIN_ID) {
81
+ if (nonce < 0n)
82
+ throw new RangeError('nonce must be non-negative');
83
+ if (nonce >= 1n << 64n)
84
+ throw new RangeError('nonce overflows u64');
85
+ const actionTypeHash = await keccak256(enc.encode(MTF_ACTION_TYPE));
86
+ const actionHash = await keccak256(enc.encode(actionJson));
87
+ const nonceBe = be32(nonce);
88
+ const structHash = await keccak256(concat32(actionTypeHash, actionHash, nonceBe));
89
+ const domainSep = await domainSeparator(chainId);
90
+ // EIP-712 envelope: keccak256(0x19 || 0x01 || domainSep || structHash).
91
+ const envelope = new Uint8Array(2 + 32 + 32);
92
+ envelope[0] = 0x19;
93
+ envelope[1] = 0x01;
94
+ envelope.set(domainSep, 2);
95
+ envelope.set(structHash, 34);
96
+ return keccak256(envelope);
97
+ }
98
+ /// Lowercase hex (no `0x`) of a byte buffer.
99
+ function toHex(bytes) {
100
+ let out = '';
101
+ for (const b of bytes)
102
+ out += b.toString(16).padStart(2, '0');
103
+ return out;
104
+ }
105
+ /// JSON-escape a string for inclusion in the hand-built action body. We build
106
+ /// the action JSON manually (rather than `JSON.stringify`-ing an object) so
107
+ /// the byte layout is fully under our control and matches the server's
108
+ /// expectation field-for-field. The only string values are `0x`-hex addresses
109
+ /// / cloids and fixed enum tokens, none of which contain characters needing
110
+ /// escaping — but we escape defensively so a malformed input can never inject
111
+ /// raw control bytes into the signed payload.
112
+ function jsonStr(s) {
113
+ return JSON.stringify(s);
114
+ }
115
+ /// Build the canonical native `submit_order` action JSON string.
116
+ ///
117
+ /// Field order mirrors the server `NativeOrder` exactly. Optional `cloid` /
118
+ /// `builder` are omitted entirely when absent (matching the server's
119
+ /// `#[serde(default)]` + KAT vector, where neither appears). The returned
120
+ /// string is BOTH what gets signed and what gets sent — do not re-serialize.
121
+ export function buildNativeOrderAction(order) {
122
+ validateAddress(order.owner, 'owner');
123
+ validateMarket(order.market);
124
+ validateU64(order.size, 'size');
125
+ validateU64(order.limit_px, 'limit_px');
126
+ const parts = [
127
+ `${jsonStr('owner')}:${jsonStr(order.owner)}`,
128
+ `${jsonStr('market')}:${order.market}`,
129
+ `${jsonStr('side')}:${jsonStr(order.side)}`,
130
+ `${jsonStr('kind')}:${jsonStr(order.kind)}`,
131
+ `${jsonStr('size')}:${order.size}`,
132
+ `${jsonStr('limit_px')}:${order.limit_px}`,
133
+ `${jsonStr('tif')}:${jsonStr(order.tif)}`,
134
+ `${jsonStr('stp_mode')}:${jsonStr(order.stp_mode)}`,
135
+ `${jsonStr('reduce_only')}:${order.reduce_only ? 'true' : 'false'}`,
136
+ ];
137
+ if (order.cloid !== undefined) {
138
+ validateCloid(order.cloid);
139
+ parts.push(`${jsonStr('cloid')}:${jsonStr(order.cloid)}`);
140
+ }
141
+ if (order.builder !== undefined) {
142
+ parts.push(`${jsonStr('builder')}:${buildBuilder(order.builder)}`);
143
+ }
144
+ const orderJson = `{${parts.join(',')}}`;
145
+ return `{${jsonStr('type')}:${jsonStr('submit_order')},${jsonStr('order')}:${orderJson}}`;
146
+ }
147
+ /// Serialize a builder carve in the server-expected `{fee, user}` order.
148
+ function buildBuilder(b) {
149
+ if (!Number.isInteger(b.fee) || b.fee < 0 || b.fee > 0xffff) {
150
+ throw new RangeError('builder.fee must be a u16 (0..=65535)');
151
+ }
152
+ validateAddress(b.user, 'builder.user');
153
+ return `{${jsonStr('fee')}:${b.fee},${jsonStr('user')}:${jsonStr(b.user)}}`;
154
+ }
155
+ /// Build the canonical native `cancel_order` action JSON string.
156
+ ///
157
+ /// Field order mirrors the server `NativeCancel` exactly
158
+ /// (`metaflux/crates/api-node/src/rest/native_action.rs`): `owner`, `market`,
159
+ /// then `oid` / `cloid` when present. The server's `CancelParams` bridge
160
+ /// cancels by `oid`, so an `oid` is REQUIRED for the cancel to lower
161
+ /// successfully (a `cloid`-only cancel is accepted on the wire but rejected at
162
+ /// lowering with `CancelMissingOid`); we still emit either form so the bytes
163
+ /// stay caller-controlled. The returned string is BOTH signed and sent.
164
+ export function buildNativeCancelAction(cancel) {
165
+ validateAddress(cancel.owner, 'owner');
166
+ validateMarket(cancel.market);
167
+ if (cancel.oid === undefined && cancel.cloid === undefined) {
168
+ throw new RangeError('cancel requires an oid (server cancels by oid)');
169
+ }
170
+ const parts = [
171
+ `${jsonStr('owner')}:${jsonStr(cancel.owner)}`,
172
+ `${jsonStr('market')}:${cancel.market}`,
173
+ ];
174
+ if (cancel.oid !== undefined) {
175
+ validateU64(cancel.oid, 'oid');
176
+ parts.push(`${jsonStr('oid')}:${cancel.oid}`);
177
+ }
178
+ if (cancel.cloid !== undefined) {
179
+ validateCloid(cancel.cloid);
180
+ parts.push(`${jsonStr('cloid')}:${jsonStr(cancel.cloid)}`);
181
+ }
182
+ const cancelJson = `{${parts.join(',')}}`;
183
+ return `{${jsonStr('type')}:${jsonStr('cancel_order')},${jsonStr('cancel')}:${cancelJson}}`;
184
+ }
185
+ /// Sign a pre-built action JSON string with the given private key.
186
+ ///
187
+ /// The returned envelope's `actionJson` is the SAME string passed in — the
188
+ /// caller must POST it verbatim so the server verifies over identical bytes.
189
+ export async function signNativeAction(privateKey, actionJson, nonce, chainId = MTF_CHAIN_ID) {
190
+ if (privateKey.length !== 32) {
191
+ throw new RangeError('privateKey must be exactly 32 bytes');
192
+ }
193
+ const digest = await nativeActionDigest(actionJson, nonce, chainId);
194
+ const sig = await signSecp256k1(privateKey, digest);
195
+ return { actionJson, nonce, signature: `0x${toHex(sig)}` };
196
+ }
197
+ /// Recover the 20-byte signer address from a native signed action — handy for
198
+ /// asserting the owner field locally before POSTing.
199
+ export async function recoverNativeSigner(signed, chainId = MTF_CHAIN_ID) {
200
+ const digest = await nativeActionDigest(signed.actionJson, signed.nonce, chainId);
201
+ const sigHex = signed.signature.startsWith('0x')
202
+ ? signed.signature.slice(2)
203
+ : signed.signature;
204
+ const sig = hexToBytes(sigHex);
205
+ const pubkey = await recoverPubkey(sig, digest);
206
+ const addr = await deriveAddressFromPubkey(pubkey);
207
+ return `0x${toHex(addr)}`;
208
+ }
209
+ /// Assemble the full `POST /exchange` request body STRING.
210
+ ///
211
+ /// Hand-built so the `action` field carries the exact signed bytes (no
212
+ /// re-stringify of a parsed object). The body shape is
213
+ /// `{"action":<actionJson>,"nonce":<u64>,"signature":"0x.."}`.
214
+ export function nativeRequestBody(signed) {
215
+ return `{${jsonStr('action')}:${signed.actionJson},${jsonStr('nonce')}:${signed.nonce},${jsonStr('signature')}:${jsonStr(signed.signature)}}`;
216
+ }
217
+ // ---- validation helpers (fail loud before anything reaches the signed body) ----
218
+ function validateAddress(addr, field) {
219
+ const hex = addr.startsWith('0x') ? addr.slice(2) : addr;
220
+ if (hex.length !== 40 || !/^[0-9a-fA-F]{40}$/.test(hex)) {
221
+ throw new RangeError(`${field} must be a 0x-prefixed 20-byte hex address`);
222
+ }
223
+ }
224
+ function validateCloid(cloid) {
225
+ const hex = cloid.startsWith('0x') ? cloid.slice(2) : cloid;
226
+ if (hex.length !== 32 || !/^[0-9a-fA-F]{32}$/.test(hex)) {
227
+ throw new RangeError('cloid must be a 0x-prefixed 16-byte hex string');
228
+ }
229
+ }
230
+ function validateMarket(market) {
231
+ if (!Number.isInteger(market) || market < 0 || market > 0xffffffff) {
232
+ throw new RangeError('market must be a u32');
233
+ }
234
+ }
235
+ function validateU64(value, field) {
236
+ if (!Number.isInteger(value) || value < 0) {
237
+ throw new RangeError(`${field} must be a non-negative integer`);
238
+ }
239
+ if (value > Number.MAX_SAFE_INTEGER) {
240
+ throw new RangeError(`${field} exceeds Number.MAX_SAFE_INTEGER; use a value below 2^53`);
241
+ }
242
+ }
243
+ function hexToBytes(hex) {
244
+ if (hex.length % 2 !== 0)
245
+ throw new RangeError('hex length must be even');
246
+ const out = new Uint8Array(hex.length / 2);
247
+ for (let i = 0; i < out.length; i++) {
248
+ out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
249
+ }
250
+ return out;
251
+ }
252
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}