@symmio/trading-core 3.5.0 → 4.0.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/gasless/delegation-preflight.d.ts +22 -0
- package/dist/gasless/delegation-preflight.d.ts.map +1 -1
- package/dist/gasless/delegation-preflight.js +34 -19
- package/dist/gasless/delegation-preflight.js.map +1 -1
- package/dist/index.d.ts +14 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +248 -243
- package/dist/pools/index.d.ts +1 -0
- package/dist/pools/index.d.ts.map +1 -1
- package/dist/pools/markets/get-listing-markets.d.ts +2 -0
- package/dist/pools/markets/get-listing-markets.d.ts.map +1 -1
- package/dist/pools/markets/get-listing-markets.js +1 -0
- package/dist/pools/markets/get-listing-markets.js.map +1 -1
- package/dist/pools/markets/query.d.ts.map +1 -1
- package/dist/pools/markets/query.js +1 -0
- package/dist/pools/markets/query.js.map +1 -1
- package/dist/pools/markets/to-search-params.d.ts +1 -0
- package/dist/pools/markets/to-search-params.d.ts.map +1 -1
- package/dist/pools/markets/to-search-params.js +1 -1
- package/dist/pools/markets/to-search-params.js.map +1 -1
- package/dist/pools/token-price/get-token-price.d.ts +71 -0
- package/dist/pools/token-price/get-token-price.d.ts.map +1 -0
- package/dist/pools/token-price/get-token-price.js +30 -0
- package/dist/pools/token-price/get-token-price.js.map +1 -0
- package/dist/pools/token-price/index.d.ts +4 -0
- package/dist/pools/token-price/index.d.ts.map +1 -0
- package/dist/pools/token-price/query.d.ts +52 -0
- package/dist/pools/token-price/query.d.ts.map +1 -0
- package/dist/pools/token-price/query.js +29 -0
- package/dist/pools/token-price/query.js.map +1 -0
- package/dist/pools/token-price/to-token-price.d.ts +14 -0
- package/dist/pools/token-price/to-token-price.d.ts.map +1 -0
- package/dist/pools/token-price/to-token-price.js +8 -0
- package/dist/pools/token-price/to-token-price.js.map +1 -0
- package/dist/pools/transactions/get-pool-transactions.d.ts +59 -17
- package/dist/pools/transactions/get-pool-transactions.d.ts.map +1 -1
- package/dist/pools/transactions/get-pool-transactions.js +7 -4
- package/dist/pools/transactions/get-pool-transactions.js.map +1 -1
- package/dist/pools/transactions/query.d.ts +6 -2
- package/dist/pools/transactions/query.d.ts.map +1 -1
- package/dist/pools/transactions/query.js +12 -13
- package/dist/pools/transactions/query.js.map +1 -1
- package/dist/pools/transactions/to-pool-transaction.d.ts +7 -0
- package/dist/pools/transactions/to-pool-transaction.d.ts.map +1 -1
- package/dist/pools/transactions/to-pool-transaction.js +3 -1
- package/dist/pools/transactions/to-pool-transaction.js.map +1 -1
- package/dist/pools/types/generated/listing-backend.js +8 -8
- package/dist/pools/types/generated/listing-backend.js.map +1 -1
- package/dist/pools/types.d.ts +53 -10
- package/dist/pools/types.d.ts.map +1 -1
- package/dist/pools/types.js +6 -4
- package/dist/pools/types.js.map +1 -1
- package/dist/solvers/estimated-price/get-estimated-price.d.ts +2 -0
- package/dist/solvers/estimated-price/get-estimated-price.d.ts.map +1 -1
- package/dist/solvers/estimated-price/get-estimated-price.js +4 -1
- package/dist/solvers/estimated-price/get-estimated-price.js.map +1 -1
- package/dist/solvers/estimated-price/query.d.ts +6 -2
- package/dist/solvers/estimated-price/query.d.ts.map +1 -1
- package/dist/solvers/estimated-price/query.js +3 -2
- package/dist/solvers/estimated-price/query.js.map +1 -1
- package/dist/solvers/funding-info/adapters/enigma-funding-info.d.ts +4 -0
- package/dist/solvers/funding-info/adapters/enigma-funding-info.d.ts.map +1 -0
- package/dist/solvers/funding-info/adapters/enigma-funding-info.js +17 -0
- package/dist/solvers/funding-info/adapters/enigma-funding-info.js.map +1 -0
- package/dist/solvers/funding-info/adapters/rasa-funding-info.d.ts +4 -0
- package/dist/solvers/funding-info/adapters/rasa-funding-info.d.ts.map +1 -0
- package/dist/solvers/funding-info/adapters/rasa-funding-info.js +21 -0
- package/dist/solvers/funding-info/adapters/rasa-funding-info.js.map +1 -0
- package/dist/solvers/funding-info/get-funding-info.d.ts +22 -13
- package/dist/solvers/funding-info/get-funding-info.d.ts.map +1 -1
- package/dist/solvers/funding-info/get-funding-info.js +24 -12
- package/dist/solvers/funding-info/get-funding-info.js.map +1 -1
- package/dist/solvers/funding-info/query.d.ts +14 -6
- package/dist/solvers/funding-info/query.d.ts.map +1 -1
- package/dist/solvers/funding-info/query.js +1 -0
- package/dist/solvers/funding-info/query.js.map +1 -1
- package/dist/solvers/funding-info/to-funding-info.d.ts +8 -4
- package/dist/solvers/funding-info/to-funding-info.d.ts.map +1 -1
- package/dist/solvers/funding-info/to-funding-info.js +2 -1
- package/dist/solvers/funding-info/to-funding-info.js.map +1 -1
- package/dist/solvers/funding-info/types.d.ts +26 -4
- package/dist/solvers/funding-info/types.d.ts.map +1 -1
- package/dist/solvers/instant-close/instant-close/instant-close.d.ts +8 -1
- package/dist/solvers/instant-close/instant-close/instant-close.d.ts.map +1 -1
- package/dist/solvers/instant-close/instant-close/instant-close.js +40 -32
- package/dist/solvers/instant-close/instant-close/instant-close.js.map +1 -1
- package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.d.ts +7 -1
- package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.d.ts.map +1 -1
- package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.js +48 -40
- package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.js.map +1 -1
- package/dist/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.d.ts +4 -2
- package/dist/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.d.ts.map +1 -1
- package/dist/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.js +1 -0
- package/dist/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.js.map +1 -1
- package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.d.ts +4 -2
- package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.d.ts.map +1 -1
- package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.js +2 -1
- package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.js.map +1 -1
- package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.d.ts +2 -0
- package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.d.ts.map +1 -1
- package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.js +64 -56
- package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.js.map +1 -1
- package/dist/solvers/instant-open/instant-open/adapters/rasa-instant-open.d.ts +2 -0
- package/dist/solvers/instant-open/instant-open/adapters/rasa-instant-open.d.ts.map +1 -1
- package/dist/solvers/instant-open/instant-open/adapters/rasa-instant-open.js +51 -43
- package/dist/solvers/instant-open/instant-open/adapters/rasa-instant-open.js.map +1 -1
- package/dist/solvers/instant-open/instant-open/instant-open.d.ts +6 -0
- package/dist/solvers/instant-open/instant-open/instant-open.d.ts.map +1 -1
- package/dist/solvers/instant-open/instant-open/instant-open.js.map +1 -1
- package/dist/solvers/instant-open/instant-open/types.d.ts +2 -1
- package/dist/solvers/instant-open/instant-open/types.d.ts.map +1 -1
- package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.d.ts +3 -1
- package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.d.ts.map +1 -1
- package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js +2 -1
- package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js.map +1 -1
- package/dist/solvers/market-info/adapters/enigma-market-info.d.ts +3 -3
- package/dist/solvers/market-info/adapters/enigma-market-info.d.ts.map +1 -1
- package/dist/solvers/market-info/adapters/enigma-market-info.js +7 -5
- package/dist/solvers/market-info/adapters/enigma-market-info.js.map +1 -1
- package/dist/solvers/market-info/get-market-info.d.ts +3 -2
- package/dist/solvers/market-info/get-market-info.d.ts.map +1 -1
- package/dist/solvers/market-info/get-market-info.js.map +1 -1
- package/dist/solvers/market-info/types.d.ts +4 -3
- package/dist/solvers/market-info/types.d.ts.map +1 -1
- package/dist/solvers/notional-cap/get-notional-cap-all.d.ts +10 -10
- package/dist/solvers/notional-cap/get-notional-cap-all.d.ts.map +1 -1
- package/dist/solvers/notional-cap/get-notional-cap-all.js +26 -23
- package/dist/solvers/notional-cap/get-notional-cap-all.js.map +1 -1
- package/dist/solvers/notional-cap/get-notional-cap-page.d.ts +49 -0
- package/dist/solvers/notional-cap/get-notional-cap-page.d.ts.map +1 -0
- package/dist/solvers/notional-cap/get-notional-cap-page.js +37 -0
- package/dist/solvers/notional-cap/get-notional-cap-page.js.map +1 -0
- package/dist/solvers/notional-cap/index.d.ts +2 -0
- package/dist/solvers/notional-cap/index.d.ts.map +1 -1
- package/dist/solvers/notional-cap/query-page.d.ts +45 -0
- package/dist/solvers/notional-cap/query-page.d.ts.map +1 -0
- package/dist/solvers/notional-cap/query-page.js +26 -0
- package/dist/solvers/notional-cap/query-page.js.map +1 -0
- package/dist/solvers/shared/index.d.ts +1 -0
- package/dist/solvers/shared/index.d.ts.map +1 -1
- package/dist/solvers/shared/instant-delegation-preflight.d.ts +65 -0
- package/dist/solvers/shared/instant-delegation-preflight.d.ts.map +1 -0
- package/dist/solvers/shared/instant-delegation-preflight.js +34 -0
- package/dist/solvers/shared/instant-delegation-preflight.js.map +1 -0
- package/dist/solvers/symbols/get-symbols.d.ts +3 -2
- package/dist/solvers/symbols/get-symbols.d.ts.map +1 -1
- package/dist/solvers/symbols/get-symbols.js +17 -3
- package/dist/solvers/symbols/get-symbols.js.map +1 -1
- package/dist/solvers/trade-volume/get-trade-volume.d.ts +2 -1
- package/dist/solvers/trade-volume/get-trade-volume.d.ts.map +1 -1
- package/dist/solvers/trade-volume/get-trade-volume.js +6 -1
- package/dist/solvers/trade-volume/get-trade-volume.js.map +1 -1
- package/dist/solvers/trade-volume/to-daily-volume.d.ts +6 -6
- package/dist/solvers/trade-volume/to-daily-volume.js.map +1 -1
- package/dist/solvers/trade-volume/types.d.ts +4 -3
- package/dist/solvers/trade-volume/types.d.ts.map +1 -1
- package/dist/solvers/types/generated/enigma-solver.js +3 -3
- package/dist/solvers/types/generated/enigma-solver.js.map +1 -1
- package/dist/solvers/types/generated/rasa-solver.js +8 -2
- package/dist/solvers/types/generated/rasa-solver.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,53 +1,61 @@
|
|
|
1
1
|
import { SymmError as e } from "../../../shared/errors/symm-error.js";
|
|
2
2
|
import { buildSignedOperation as t, signAndFormatInstantOperation as n } from "../../instant-open/shared/operations.js";
|
|
3
|
+
import { assertInstantSignerDelegated as r } from "../../shared/instant-delegation-preflight.js";
|
|
3
4
|
import "../../instant-open/shared/types.js";
|
|
4
|
-
import { getMarketOrderDeadline as
|
|
5
|
-
import { encodeRequestToClosePosition as
|
|
6
|
-
import { sendInstantClose as
|
|
7
|
-
import { resolveCloseOrderType as
|
|
5
|
+
import { getMarketOrderDeadline as i } from "../../instant-open/shared/trade-math.js";
|
|
6
|
+
import { encodeRequestToClosePosition as a } from "../shared/calldata.js";
|
|
7
|
+
import { sendInstantClose as o } from "../shared/hedger-api.js";
|
|
8
|
+
import { resolveCloseOrderType as s } from "../shared/resolve-close-order-type.js";
|
|
8
9
|
//#region src/solvers/instant-close/instant-close-bulk/instant-close-bulk.ts
|
|
9
|
-
var
|
|
10
|
-
async function c
|
|
11
|
-
if (
|
|
12
|
-
if (
|
|
13
|
-
let { symmioAddress:
|
|
14
|
-
chainId:
|
|
15
|
-
solverId:
|
|
16
|
-
}),
|
|
17
|
-
chainId:
|
|
18
|
-
from:
|
|
19
|
-
}),
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
deadline: a
|
|
31
|
-
}),
|
|
32
|
-
signerAccount: e.partyA,
|
|
33
|
-
deadline: a,
|
|
34
|
-
salt: e.salt
|
|
10
|
+
var c = 100;
|
|
11
|
+
async function l(c, l) {
|
|
12
|
+
if (l.orders.length === 0) throw new e("validation", "INSTANT_CLOSE_BULK_INVALID_ORDERS", "instantCloseBulk: at least one order is required.");
|
|
13
|
+
if (l.orders.length > 100) throw new e("validation", "INSTANT_CLOSE_BULK_INVALID_ORDERS", `instantCloseBulk: at most 100 orders per call; received ${l.orders.length}.`);
|
|
14
|
+
let { symmioAddress: u } = c.getChainConfig(l.chainId).addresses, d = c.getSolver({
|
|
15
|
+
chainId: l.chainId,
|
|
16
|
+
solverId: l.solverId
|
|
17
|
+
}), f = s(d.id, 1), p = await c.getWalletClient({
|
|
18
|
+
chainId: l.chainId,
|
|
19
|
+
from: l.from
|
|
20
|
+
}), m = p.account.address, h = l.orders.map((e) => {
|
|
21
|
+
let n = e.deadline ?? i();
|
|
22
|
+
return t({
|
|
23
|
+
signer: m,
|
|
24
|
+
target: u,
|
|
25
|
+
callData: a({
|
|
26
|
+
quoteId: e.order.quoteId,
|
|
27
|
+
closePrice: e.order.closePrice,
|
|
28
|
+
quantityToClose: e.order.quantityToClose,
|
|
29
|
+
orderType: f,
|
|
30
|
+
deadline: n
|
|
35
31
|
}),
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
signerAccount: e.partyA,
|
|
33
|
+
deadline: n,
|
|
34
|
+
salt: e.salt
|
|
38
35
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
36
|
+
});
|
|
37
|
+
await r(c, {
|
|
38
|
+
chainId: l.chainId,
|
|
39
|
+
action: "instantCloseBulk",
|
|
40
|
+
operations: h,
|
|
41
|
+
enabled: l.preflightDelegation
|
|
42
|
+
});
|
|
43
|
+
let g = [];
|
|
44
|
+
for (let e of h) g.push(await n(c, {
|
|
45
|
+
operation: e,
|
|
46
|
+
chainId: l.chainId,
|
|
47
|
+
walletClient: p
|
|
48
|
+
}));
|
|
49
|
+
return await o(c, {
|
|
50
|
+
chainId: l.chainId,
|
|
51
|
+
solverId: d.id,
|
|
52
|
+
operations: g
|
|
45
53
|
}), {
|
|
46
|
-
count:
|
|
54
|
+
count: g.length,
|
|
47
55
|
success: !0
|
|
48
56
|
};
|
|
49
57
|
}
|
|
50
58
|
//#endregion
|
|
51
|
-
export {
|
|
59
|
+
export { c as MAX_INSTANT_CLOSE_BULK_ORDERS, l as instantCloseBulk };
|
|
52
60
|
|
|
53
61
|
//# sourceMappingURL=instant-close-bulk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instant-close-bulk.js","names":[],"sources":["../../../../src/solvers/instant-close/instant-close-bulk/instant-close-bulk.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { buildSignedOperation, signAndFormatInstantOperation } from \"../../instant-open/shared/operations\";\nimport { getMarketOrderDeadline } from \"../../instant-open/shared/trade-math\";\nimport { encodeRequestToClosePosition } from \"../shared/calldata\";\nimport { sendInstantClose } from \"../shared/hedger-api\";\nimport { resolveCloseOrderType } from \"../shared/resolve-close-order-type\";\nimport { ORDER_TYPE_MARKET, type InstantCloseOrder } from \"../shared/types\";\n\n/** Maximum orders per {@link instantCloseBulk} call (matches the hedger's `1–100` window). */\nexport const MAX_INSTANT_CLOSE_BULK_ORDERS = 100;\n\n/**\n * One position contributing to a {@link instantCloseBulk} batch. Each entry is\n * already fully-resolved: a VA address, the wei-shape order, and optional\n * per-order salt / deadline overrides.\n */\nexport interface InstantCloseBulkOrder {\n /** PartyA — the VA that owns the position (EIP-712 `signerAccount`). */\n partyA: Address;\n /** Already-final wei order (`quoteId`, `closePrice`, `quantityToClose`). */\n order: InstantCloseOrder;\n /** Override the EIP-712 salt for this order. Defaults to a random 32-byte salt. */\n salt?: Hex;\n /** Override the unix-seconds deadline for this order. Defaults to `now + 300s`. */\n deadline?: bigint;\n}\n\n/**\n * Parameters for {@link instantCloseBulk}.\n *\n * The wallet client identified by `from` is reused to sign every order, so all\n * orders in a batch share the same signer (the subaccount-level session key).\n * Each order may still target a different VA via its own `partyA` — the\n * delegation lives on the subaccount and is inherited by every owned VA.\n */\nexport type InstantCloseBulkParameters = Compute<\n WriteSolverParameter & {\n
|
|
1
|
+
{"version":3,"file":"instant-close-bulk.js","names":[],"sources":["../../../../src/solvers/instant-close/instant-close-bulk/instant-close-bulk.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { buildSignedOperation, signAndFormatInstantOperation } from \"../../instant-open/shared/operations\";\nimport { getMarketOrderDeadline } from \"../../instant-open/shared/trade-math\";\nimport {\n assertInstantSignerDelegated,\n type InstantDelegationPreflightParameter,\n} from \"../../shared/instant-delegation-preflight\";\nimport { encodeRequestToClosePosition } from \"../shared/calldata\";\nimport { sendInstantClose } from \"../shared/hedger-api\";\nimport { resolveCloseOrderType } from \"../shared/resolve-close-order-type\";\nimport { ORDER_TYPE_MARKET, type InstantCloseOrder } from \"../shared/types\";\n\n/** Maximum orders per {@link instantCloseBulk} call (matches the hedger's `1–100` window). */\nexport const MAX_INSTANT_CLOSE_BULK_ORDERS = 100;\n\n/**\n * One position contributing to a {@link instantCloseBulk} batch. Each entry is\n * already fully-resolved: a VA address, the wei-shape order, and optional\n * per-order salt / deadline overrides.\n */\nexport interface InstantCloseBulkOrder {\n /** PartyA — the VA that owns the position (EIP-712 `signerAccount`). */\n partyA: Address;\n /** Already-final wei order (`quoteId`, `closePrice`, `quantityToClose`). */\n order: InstantCloseOrder;\n /** Override the EIP-712 salt for this order. Defaults to a random 32-byte salt. */\n salt?: Hex;\n /** Override the unix-seconds deadline for this order. Defaults to `now + 300s`. */\n deadline?: bigint;\n}\n\n/**\n * Parameters for {@link instantCloseBulk}.\n *\n * The wallet client identified by `from` is reused to sign every order, so all\n * orders in a batch share the same signer (the subaccount-level session key).\n * Each order may still target a different VA via its own `partyA` — the\n * delegation lives on the subaccount and is inherited by every owned VA.\n */\nexport type InstantCloseBulkParameters = Compute<\n WriteSolverParameter &\n InstantDelegationPreflightParameter & {\n /** Orders to submit. Length must be in `[1, MAX_INSTANT_CLOSE_BULK_ORDERS]`. */\n orders: readonly InstantCloseBulkOrder[];\n }\n>;\n\n/** Return type of {@link instantCloseBulk}. */\nexport interface InstantCloseBulkReturnType {\n /** Number of orders submitted. */\n count: number;\n /** Always `true` on success — the hedger returns no per-order body. */\n success: true;\n}\n\n/**\n * Close multiple lowcap positions in one solver round-trip via the InstantLayer\n * v2 `/instant_trade/instant_close` endpoint, which natively accepts 1–100\n * signed operations per request.\n *\n * Each order is signed with the same wallet client (the session key bound to\n * `from`), so the caller must hold a `requestToClosePosition` delegation on\n * the owning subaccount. The delegation is inherited by every owned VA, so\n * orders across different VAs in the same subaccount sign with one key.\n * Every order is built first and that delegation is checked once per\n * sub-account before any order is signed (skip it with\n * `preflightDelegation: false`); the sub-account's owner needs none.\n *\n * Pure primitive — every domain value is already final wei. Use\n * `instantCloseBulkAuto` to derive these inputs from UI-shape parameters.\n * Enigma market closes encode `OrderType.MARKET_BEST_EFFORT` (2) before\n * signing; Rasa market closes encode MARKET (1).\n *\n * @throws {SymmError} `INSTANT_CLOSE_BULK_INVALID_ORDERS` when the batch is\n * empty or exceeds {@link MAX_INSTANT_CLOSE_BULK_ORDERS}.\n * @throws {SymmError} `INSTANT_SIGNER_NOT_DELEGATED` when the signer lacks the\n * delegation for any order, before anything is signed.\n * @throws {SymmApiError} when the hedger request fails — the whole batch is\n * rejected; the caller should retry with fewer orders.\n *\n * @example\n * ```ts\n * await instantCloseBulk(config, {\n * from: sessionKey,\n * orders: [\n * { partyA: vaA, order: { quoteId: 1n, closePrice: …, quantityToClose: … } },\n * { partyA: vaB, order: { quoteId: 2n, closePrice: …, quantityToClose: … } },\n * ],\n * });\n * ```\n */\nexport async function instantCloseBulk(\n config: Config,\n parameters: InstantCloseBulkParameters,\n): Promise<InstantCloseBulkReturnType> {\n if (parameters.orders.length === 0) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_CLOSE_BULK_INVALID_ORDERS\",\n \"instantCloseBulk: at least one order is required.\",\n );\n }\n if (parameters.orders.length > MAX_INSTANT_CLOSE_BULK_ORDERS) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_CLOSE_BULK_INVALID_ORDERS\",\n `instantCloseBulk: at most ${MAX_INSTANT_CLOSE_BULK_ORDERS} orders per call; received ${parameters.orders.length}.`,\n );\n }\n\n const chainConfig = config.getChainConfig(parameters.chainId);\n const { symmioAddress } = chainConfig.addresses;\n const solver = config.getSolver({ chainId: parameters.chainId, solverId: parameters.solverId });\n const orderType = resolveCloseOrderType(solver.id, ORDER_TYPE_MARKET);\n\n const walletClient = await config.getWalletClient({ chainId: parameters.chainId, from: parameters.from });\n const signerAddress = walletClient.account.address;\n\n const operations = parameters.orders.map((entry) => {\n const deadline = entry.deadline ?? getMarketOrderDeadline();\n\n const callData = encodeRequestToClosePosition({\n quoteId: entry.order.quoteId,\n closePrice: entry.order.closePrice,\n quantityToClose: entry.order.quantityToClose,\n orderType,\n deadline,\n });\n\n return buildSignedOperation({\n signer: signerAddress,\n target: symmioAddress,\n callData,\n signerAccount: entry.partyA,\n deadline,\n salt: entry.salt,\n });\n });\n\n await assertInstantSignerDelegated(config, {\n chainId: parameters.chainId,\n action: \"instantCloseBulk\",\n operations,\n enabled: parameters.preflightDelegation,\n });\n\n /** One at a time, so a wallet signer sees its prompts in order. */\n const signedOperations = [] as Awaited<ReturnType<typeof signAndFormatInstantOperation>>[];\n for (const operation of operations) {\n signedOperations.push(\n await signAndFormatInstantOperation(config, {\n operation,\n chainId: parameters.chainId,\n walletClient,\n }),\n );\n }\n\n await sendInstantClose(config, {\n chainId: parameters.chainId,\n solverId: solver.id,\n operations: signedOperations,\n });\n\n return { count: signedOperations.length, success: true };\n}\n"],"mappings":";;;;;;;;;AAgBA,IAAa,IAAgC;AA8E7C,eAAsB,EACpB,GACA,GACqC;CACrC,IAAI,EAAW,OAAO,WAAW,GAC/B,MAAM,IAAI,EACR,cACA,qCACA,mDACF;CAEF,IAAI,EAAW,OAAO,SAAA,KACpB,MAAM,IAAI,EACR,cACA,qCACA,2DAAwF,EAAW,OAAO,OAAO,EACnH;CAIF,IAAM,EAAE,qBADY,EAAO,eAAe,EAAW,OAC3B,EAAY,WAChC,IAAS,EAAO,UAAU;EAAE,SAAS,EAAW;EAAS,UAAU,EAAW;CAAS,CAAC,GACxF,IAAY,EAAsB,EAAO,IAAA,CAAqB,GAE9D,IAAe,MAAM,EAAO,gBAAgB;EAAE,SAAS,EAAW;EAAS,MAAM,EAAW;CAAK,CAAC,GAClG,IAAgB,EAAa,QAAQ,SAErC,IAAa,EAAW,OAAO,KAAK,MAAU;EAClD,IAAM,IAAW,EAAM,YAAY,EAAuB;EAU1D,OAAO,EAAqB;GAC1B,QAAQ;GACR,QAAQ;GACR,UAXe,EAA6B;IAC5C,SAAS,EAAM,MAAM;IACrB,YAAY,EAAM,MAAM;IACxB,iBAAiB,EAAM,MAAM;IAC7B;IACA;GACF,CAKE;GACA,eAAe,EAAM;GACrB;GACA,MAAM,EAAM;EACd,CAAC;CACH,CAAC;CAED,MAAM,EAA6B,GAAQ;EACzC,SAAS,EAAW;EACpB,QAAQ;EACR;EACA,SAAS,EAAW;CACtB,CAAC;CAGD,IAAM,IAAmB,CAAC;CAC1B,KAAK,IAAM,KAAa,GACtB,EAAiB,KACf,MAAM,EAA8B,GAAQ;EAC1C;EACA,SAAS,EAAW;EACpB;CACF,CAAC,CACH;CASF,OANA,MAAM,EAAiB,GAAQ;EAC7B,SAAS,EAAW;EACpB,UAAU,EAAO;EACjB,YAAY;CACd,CAAC,GAEM;EAAE,OAAO,EAAiB;EAAQ,SAAS;CAAK;AACzD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Address, Hex } from 'viem';
|
|
2
2
|
import { Config } from '../../../core/config/index.js';
|
|
3
3
|
import { Compute, WriteSolverParameter } from '../../../shared/types/properties.js';
|
|
4
|
+
import { InstantDelegationPreflightParameter } from '../../shared/instant-delegation-preflight.js';
|
|
4
5
|
import { InstantCloseBulkReturnType } from '../instant-close-bulk/instant-close-bulk.js';
|
|
5
6
|
import { InstantCloseMarketData, PositionType } from '../shared/types.js';
|
|
6
7
|
/**
|
|
@@ -30,9 +31,10 @@ export interface InstantCloseBulkAutoOrder {
|
|
|
30
31
|
deadline?: bigint;
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
|
-
* Parameters for {@link instantCloseBulkAuto}.
|
|
34
|
+
* Parameters for {@link instantCloseBulkAuto}. `preflightDelegation` is
|
|
35
|
+
* forwarded to `instantCloseBulk`.
|
|
34
36
|
*/
|
|
35
|
-
export type InstantCloseBulkAutoParameters = Compute<WriteSolverParameter & {
|
|
37
|
+
export type InstantCloseBulkAutoParameters = Compute<WriteSolverParameter & InstantDelegationPreflightParameter & {
|
|
36
38
|
orders: readonly InstantCloseBulkAutoOrder[];
|
|
37
39
|
}>;
|
|
38
40
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instant-close-bulk-auto.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,sBAAsB,CAAC;IAC/B,yCAAyC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED
|
|
1
|
+
{"version":3,"file":"instant-close-bulk-auto.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAC;AACrG,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,sBAAsB,CAAC;IAC/B,yCAAyC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,8BAA8B,GAAG,OAAO,CAClD,oBAAoB,GAClB,mCAAmC,GAAG;IACpC,MAAM,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAC9C,CACJ,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,8BAA8B,GACzC,OAAO,CAAC,0BAA0B,CAAC,CAkCrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instant-close-bulk-auto.js","names":[],"sources":["../../../../src/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport {\n instantCloseBulk,\n type InstantCloseBulkOrder,\n type InstantCloseBulkReturnType,\n} from \"../instant-close-bulk/instant-close-bulk\";\nimport { prepareInstantCloseParams } from \"../prepare-instant-close-params/prepare-instant-close-params\";\nimport { type InstantCloseMarketData, type PositionType } from \"../shared/types\";\n\n/**\n * One UI-shape close intent inside an {@link instantCloseBulkAuto} batch. Each\n * entry mirrors `prepareInstantCloseParams` minus the per-call `from`/`chainId`\n * — those are hoisted to the batch parameters because the whole batch shares\n * one signer and chain.\n */\nexport interface InstantCloseBulkAutoOrder {\n /** PartyA — the VA that owns the position. */\n partyA: Address;\n /** Market identification + optional pre-fetched precision metadata. */\n market: InstantCloseMarketData;\n /** Side of the position being closed. */\n positionType: PositionType;\n /** Quote id of the position. */\n quoteId: bigint;\n /** Quantity to close as decimal string (base-token units). */\n quantityToClose: string;\n /** Slippage tolerance percent (e.g. `5` for 5%). */\n slippage: number;\n /** Pre-fetched mark price as decimal string. */\n markPrice?: string;\n /** Override the EIP-712 salt for this order. */\n salt?: Hex;\n /** Override the unix-seconds deadline for this order. */\n deadline?: bigint;\n}\n\n/**\n * Parameters for {@link instantCloseBulkAuto}
|
|
1
|
+
{"version":3,"file":"instant-close-bulk-auto.js","names":[],"sources":["../../../../src/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport type { InstantDelegationPreflightParameter } from \"../../shared/instant-delegation-preflight\";\nimport {\n instantCloseBulk,\n type InstantCloseBulkOrder,\n type InstantCloseBulkReturnType,\n} from \"../instant-close-bulk/instant-close-bulk\";\nimport { prepareInstantCloseParams } from \"../prepare-instant-close-params/prepare-instant-close-params\";\nimport { type InstantCloseMarketData, type PositionType } from \"../shared/types\";\n\n/**\n * One UI-shape close intent inside an {@link instantCloseBulkAuto} batch. Each\n * entry mirrors `prepareInstantCloseParams` minus the per-call `from`/`chainId`\n * — those are hoisted to the batch parameters because the whole batch shares\n * one signer and chain.\n */\nexport interface InstantCloseBulkAutoOrder {\n /** PartyA — the VA that owns the position. */\n partyA: Address;\n /** Market identification + optional pre-fetched precision metadata. */\n market: InstantCloseMarketData;\n /** Side of the position being closed. */\n positionType: PositionType;\n /** Quote id of the position. */\n quoteId: bigint;\n /** Quantity to close as decimal string (base-token units). */\n quantityToClose: string;\n /** Slippage tolerance percent (e.g. `5` for 5%). */\n slippage: number;\n /** Pre-fetched mark price as decimal string. */\n markPrice?: string;\n /** Override the EIP-712 salt for this order. */\n salt?: Hex;\n /** Override the unix-seconds deadline for this order. */\n deadline?: bigint;\n}\n\n/**\n * Parameters for {@link instantCloseBulkAuto}. `preflightDelegation` is\n * forwarded to `instantCloseBulk`.\n */\nexport type InstantCloseBulkAutoParameters = Compute<\n WriteSolverParameter &\n InstantDelegationPreflightParameter & {\n orders: readonly InstantCloseBulkAutoOrder[];\n }\n>;\n\n/**\n * Resolve every order's missing wei fields via\n * `prepareInstantCloseParams` (parallel) and submit them in one\n * `instantCloseBulk` round-trip.\n *\n * Friendly default for callers that have a list of close intents and trust the\n * SDK to fetch market/price metadata. For full control, call\n * `prepareInstantCloseParams` per order + `instantCloseBulk` directly.\n *\n * @example\n * ```ts\n * await instantCloseBulkAuto(config, {\n * from: sessionKey,\n * orders: [\n * { partyA: vaA, market: { id: 1 }, positionType: PositionType.LONG, quoteId: 1n, quantityToClose: \"0.5\", slippage: 5 },\n * { partyA: vaB, market: { id: 2 }, positionType: PositionType.SHORT, quoteId: 2n, quantityToClose: \"1.0\", slippage: 5 },\n * ],\n * });\n * ```\n */\nexport async function instantCloseBulkAuto(\n config: Config,\n parameters: InstantCloseBulkAutoParameters,\n): Promise<InstantCloseBulkReturnType> {\n const resolved = await Promise.all(\n parameters.orders.map(async (intent): Promise<InstantCloseBulkOrder> => {\n const prepared = await prepareInstantCloseParams(config, {\n chainId: parameters.chainId,\n from: parameters.from,\n partyA: intent.partyA,\n market: intent.market,\n positionType: intent.positionType,\n quoteId: intent.quoteId,\n quantityToClose: intent.quantityToClose,\n slippage: intent.slippage,\n markPrice: intent.markPrice,\n salt: intent.salt,\n deadline: intent.deadline,\n });\n return {\n partyA: prepared.partyA,\n order: prepared.order,\n salt: prepared.salt,\n deadline: prepared.deadline,\n };\n }),\n );\n\n return instantCloseBulk(config, {\n chainId: parameters.chainId,\n from: parameters.from,\n // Forward the resolved solver so a bulk close on a rasa chain hits its own\n // endpoint instead of falling back to the chain default.\n solverId: parameters.solverId,\n preflightDelegation: parameters.preflightDelegation,\n orders: resolved,\n });\n}\n"],"mappings":";;;AAsEA,eAAsB,EACpB,GACA,GACqC;CACrC,IAAM,IAAW,MAAM,QAAQ,IAC7B,EAAW,OAAO,IAAI,OAAO,MAA2C;EACtE,IAAM,IAAW,MAAM,EAA0B,GAAQ;GACvD,SAAS,EAAW;GACpB,MAAM,EAAW;GACjB,QAAQ,EAAO;GACf,QAAQ,EAAO;GACf,cAAc,EAAO;GACrB,SAAS,EAAO;GAChB,iBAAiB,EAAO;GACxB,UAAU,EAAO;GACjB,WAAW,EAAO;GAClB,MAAM,EAAO;GACb,UAAU,EAAO;EACnB,CAAC;EACD,OAAO;GACL,QAAQ,EAAS;GACjB,OAAO,EAAS;GAChB,MAAM,EAAS;GACf,UAAU,EAAS;EACrB;CACF,CAAC,CACH;CAEA,OAAO,EAAiB,GAAQ;EAC9B,SAAS,EAAW;EACpB,MAAM,EAAW;EAGjB,UAAU,EAAW;EACrB,qBAAqB,EAAW;EAChC,QAAQ;CACV,CAAC;AACH"}
|
package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Address, Hex } from 'viem';
|
|
2
2
|
import { Config } from '../../../core/config/index.js';
|
|
3
3
|
import { Compute, WriteSolverParameter } from '../../../shared/types/properties.js';
|
|
4
|
+
import { InstantDelegationPreflightParameter } from '../../shared/instant-delegation-preflight.js';
|
|
4
5
|
import { InstantCloseParameters } from '../instant-close/instant-close.js';
|
|
5
6
|
import { InstantCloseMarketData, PositionType } from '../shared/types.js';
|
|
6
7
|
/**
|
|
@@ -8,9 +9,10 @@ import { InstantCloseMarketData, PositionType } from '../shared/types.js';
|
|
|
8
9
|
*
|
|
9
10
|
* Required = inputs only the caller can know (PartyA, quote id, trade
|
|
10
11
|
* intent). Optional = anything derivable from solver / price-service reads.
|
|
11
|
-
* Pre-fill an optional field to skip its fetch.
|
|
12
|
+
* Pre-fill an optional field to skip its fetch. `preflightDelegation` is
|
|
13
|
+
* forwarded to {@link InstantCloseParameters}.
|
|
12
14
|
*/
|
|
13
|
-
export type PrepareInstantCloseParameters = Compute<WriteSolverParameter & {
|
|
15
|
+
export type PrepareInstantCloseParameters = Compute<WriteSolverParameter & InstantDelegationPreflightParameter & {
|
|
14
16
|
/** PartyA — the VA address that owns the position. */
|
|
15
17
|
partyA: Address;
|
|
16
18
|
/** Market identification + optional pre-fetched precision metadata. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-instant-close-params.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"prepare-instant-close-params.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAEtF,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAC;AAErG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEjF;;;;;;;GAOG;AACH,MAAM,MAAM,6BAA6B,GAAG,OAAO,CACjD,oBAAoB,GAClB,mCAAmC,GAAG;IACpC,sDAAsD;IACtD,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,sBAAsB,CAAC;IAC/B,oEAAoE;IACpE,YAAY,EAAE,YAAY,CAAC;IAC3B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CACJ,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,6BAA6B,GACxC,OAAO,CAAC,sBAAsB,CAAC,CAqDjC"}
|
package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-instant-close-params.js","names":[],"sources":["../../../../src/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { toWeiBigInt } from \"../../instant-open/shared/trade-math\";\nimport { resolveMarket, resolveMarkPrice } from \"../../shared/resolvers\";\nimport type { InstantCloseParameters } from \"../instant-close/instant-close\";\nimport { calculateClosePrice, clampClosePrecision } from \"../shared/close-math\";\nimport { type InstantCloseMarketData, type PositionType } from \"../shared/types\";\n\n/**\n * Parameters for {@link prepareInstantCloseParams} and `instantCloseAuto`.\n *\n * Required = inputs only the caller can know (PartyA, quote id, trade\n * intent). Optional = anything derivable from solver / price-service reads.\n * Pre-fill an optional field to skip its fetch.\n */\nexport type PrepareInstantCloseParameters = Compute<\n WriteSolverParameter & {\n
|
|
1
|
+
{"version":3,"file":"prepare-instant-close-params.js","names":[],"sources":["../../../../src/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { toWeiBigInt } from \"../../instant-open/shared/trade-math\";\nimport type { InstantDelegationPreflightParameter } from \"../../shared/instant-delegation-preflight\";\nimport { resolveMarket, resolveMarkPrice } from \"../../shared/resolvers\";\nimport type { InstantCloseParameters } from \"../instant-close/instant-close\";\nimport { calculateClosePrice, clampClosePrecision } from \"../shared/close-math\";\nimport { type InstantCloseMarketData, type PositionType } from \"../shared/types\";\n\n/**\n * Parameters for {@link prepareInstantCloseParams} and `instantCloseAuto`.\n *\n * Required = inputs only the caller can know (PartyA, quote id, trade\n * intent). Optional = anything derivable from solver / price-service reads.\n * Pre-fill an optional field to skip its fetch. `preflightDelegation` is\n * forwarded to {@link InstantCloseParameters}.\n */\nexport type PrepareInstantCloseParameters = Compute<\n WriteSolverParameter &\n InstantDelegationPreflightParameter & {\n /** PartyA — the VA address that owns the position. */\n partyA: Address;\n /** Market identification + optional pre-fetched precision metadata. */\n market: InstantCloseMarketData;\n /** Side of the position being closed (LONG = sell, SHORT = buy). */\n positionType: PositionType;\n /** Quote id of the position. */\n quoteId: bigint;\n /** Quantity to close as decimal string (base-token units). */\n quantityToClose: string;\n /** Slippage tolerance percent (e.g. `5` for 5%). */\n slippage: number;\n /** Pre-fetched mark price as decimal string. When omitted, fetched via Enigma price service. */\n markPrice?: string;\n /** Forwarded to {@link InstantCloseParameters}. */\n salt?: Hex;\n /** Forwarded to {@link InstantCloseParameters}. */\n deadline?: bigint;\n }\n>;\n\n/**\n * Resolve every input the {@link InstantCloseParameters} primitive needs from\n * a minimal parameter set.\n *\n * Steps:\n * 1. Resolve market metadata + mark price (caller-supplied values\n * short-circuit the fetches).\n * 2. Compute the slippage-adjusted close price via {@link calculateClosePrice}.\n * 3. Clamp `quantityToClose` to the market's `quantityPrecision`.\n * 4. Convert decimal strings to 18-decimal-wei `bigint`.\n *\n * @throws {SymmError} `INSTANT_CLOSE_INVALID_PARAMETERS` when the mark price\n * is zero/NaN or `quantityToClose` is non-positive.\n */\nexport async function prepareInstantCloseParams(\n config: Config,\n parameters: PrepareInstantCloseParameters,\n): Promise<InstantCloseParameters> {\n const market = await resolveMarket(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketId: parameters.market.id,\n marketName: parameters.market.name,\n pricePrecision: parameters.market.pricePrecision,\n quantityPrecision: parameters.market.quantityPrecision,\n });\n const markPrice = await resolveMarkPrice(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketName: market.name,\n markPrice: parameters.markPrice,\n });\n\n const closePrice = calculateClosePrice({\n markPrice,\n slippage: parameters.slippage,\n positionType: parameters.positionType,\n pricePrecision: market.pricePrecision,\n });\n const clampedQuantity = clampClosePrecision({\n quantityToClose: parameters.quantityToClose,\n quantityPrecision: market.quantityPrecision,\n });\n if (closePrice === null || clampedQuantity === null) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_CLOSE_INVALID_PARAMETERS\",\n \"Invalid instant-close parameters: markPrice or quantityToClose is zero/NaN.\",\n );\n }\n\n return {\n chainId: parameters.chainId,\n /**\n * Carried through deliberately: `instantClose` resolves the solver from it to\n * pick the submit URL, so dropping it would send a quote priced for one\n * solver to another.\n */\n solverId: parameters.solverId,\n from: parameters.from,\n partyA: parameters.partyA,\n order: {\n quoteId: parameters.quoteId,\n closePrice: toWeiBigInt(closePrice),\n quantityToClose: toWeiBigInt(clampedQuantity),\n },\n salt: parameters.salt,\n deadline: parameters.deadline,\n preflightDelegation: parameters.preflightDelegation,\n };\n}\n"],"mappings":";;;;;;AAyDA,eAAsB,EACpB,GACA,GACiC;CACjC,IAAM,IAAS,MAAM,EAAc,GAAQ;EACzC,SAAS,EAAW;EACpB,UAAU,EAAW;EACrB,UAAU,EAAW,OAAO;EAC5B,YAAY,EAAW,OAAO;EAC9B,gBAAgB,EAAW,OAAO;EAClC,mBAAmB,EAAW,OAAO;CACvC,CAAC,GAQK,IAAa,EAAoB;EACrC,WAAA,MARsB,EAAiB,GAAQ;GAC/C,SAAS,EAAW;GACpB,UAAU,EAAW;GACrB,YAAY,EAAO;GACnB,WAAW,EAAW;EACxB,CAAC;EAIC,UAAU,EAAW;EACrB,cAAc,EAAW;EACzB,gBAAgB,EAAO;CACzB,CAAC,GACK,IAAkB,EAAoB;EAC1C,iBAAiB,EAAW;EAC5B,mBAAmB,EAAO;CAC5B,CAAC;CACD,IAAI,MAAe,QAAQ,MAAoB,MAC7C,MAAM,IAAI,EACR,cACA,oCACA,6EACF;CAGF,OAAO;EACL,SAAS,EAAW;EAMpB,UAAU,EAAW;EACrB,MAAM,EAAW;EACjB,QAAQ,EAAW;EACnB,OAAO;GACL,SAAS,EAAW;GACpB,YAAY,EAAY,CAAU;GAClC,iBAAiB,EAAY,CAAe;EAC9C;EACA,MAAM,EAAW;EACjB,UAAU,EAAW;EACrB,qBAAqB,EAAW;CAClC;AACF"}
|
|
@@ -15,6 +15,8 @@ import { InstantOpenAdapterContext } from './context.js';
|
|
|
15
15
|
* @throws {SymmError} `INSTANT_OPEN_MARGIN_REQUIRED` when `margin` is absent —
|
|
16
16
|
* reachable when the caller omitted `solverId` and the chain's default solver
|
|
17
17
|
* turned out to be Enigma.
|
|
18
|
+
* @throws {SymmError} `INSTANT_SIGNER_NOT_DELEGATED` when the signer lacks the
|
|
19
|
+
* delegation for either operation, before anything is signed.
|
|
18
20
|
* @throws {SymmApiError} when the hedger request fails.
|
|
19
21
|
* @internal
|
|
20
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enigma-instant-open.d.ts","sourceRoot":"","sources":["../../../../../src/solvers/instant-open/instant-open/adapters/enigma-instant-open.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"enigma-instant-open.d.ts","sourceRoot":"","sources":["../../../../../src/solvers/instant-open/instant-open/adapters/enigma-instant-open.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,yBAAyB,EAClC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CA8FlC"}
|
|
@@ -1,76 +1,84 @@
|
|
|
1
1
|
import { SymmError as e } from "../../../../shared/errors/symm-error.js";
|
|
2
2
|
import { buildSignedOperation as t, signAndFormatInstantOperation as n } from "../../shared/operations.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { assertInstantSignerDelegated as r } from "../../../shared/instant-delegation-preflight.js";
|
|
4
|
+
import { encodeAddMarginToNextVA as i, encodeSendQuote as a, encodeSendQuoteWithAffiliateAndData as o, getFakeSendQuoteMuonSignature as s, sendQuoteUpnlSigFlexRange as c } from "../../shared/calldata.js";
|
|
5
|
+
import { sendInstantOpen as l } from "../../shared/hedger-api.js";
|
|
6
|
+
import { isolationTypeForSide as u } from "../../shared/types.js";
|
|
6
7
|
//#region src/solvers/instant-open/instant-open/adapters/enigma-instant-open.ts
|
|
7
|
-
async function
|
|
8
|
-
if (!
|
|
9
|
-
let { config:
|
|
10
|
-
subAccount:
|
|
11
|
-
isolationType:
|
|
12
|
-
symbolId:
|
|
13
|
-
amount:
|
|
14
|
-
}),
|
|
15
|
-
partyBsWhiteList: [
|
|
16
|
-
symbolId:
|
|
17
|
-
positionType:
|
|
8
|
+
async function d(d, f) {
|
|
9
|
+
if (!f.margin) throw new e("validation", "INSTANT_OPEN_MARGIN_REQUIRED", "instantOpen: the Enigma (lowcap) flow funds a new virtual account, so `margin.amount` is required.");
|
|
10
|
+
let { config: p, solver: m, chainConfig: h, walletClient: g, signerAddress: _, deadline: v, symbolId: y, metadata: b } = d, { accountLayerAddress: x, symmioAddress: S, affiliatesAddress: C } = h.addresses, w = i({
|
|
11
|
+
subAccount: f.subAccountAddress,
|
|
12
|
+
isolationType: u(f.positionType),
|
|
13
|
+
symbolId: y,
|
|
14
|
+
amount: f.margin.amount
|
|
15
|
+
}), T = {
|
|
16
|
+
partyBsWhiteList: [m.address],
|
|
17
|
+
symbolId: y,
|
|
18
|
+
positionType: f.positionType,
|
|
18
19
|
orderType: 1,
|
|
19
|
-
price:
|
|
20
|
-
quantity:
|
|
21
|
-
cva:
|
|
22
|
-
lf:
|
|
23
|
-
partyAmm:
|
|
24
|
-
partyBmm:
|
|
25
|
-
deadline:
|
|
26
|
-
affiliate:
|
|
27
|
-
data:
|
|
28
|
-
upnlSig:
|
|
29
|
-
},
|
|
30
|
-
...
|
|
31
|
-
solverFeeCaps:
|
|
32
|
-
}), E = t({
|
|
33
|
-
signer: g,
|
|
34
|
-
target: b,
|
|
35
|
-
callData: C,
|
|
36
|
-
signerAccount: d.subAccountAddress,
|
|
37
|
-
deadline: d.operationDeadline ?? _,
|
|
38
|
-
salt: d.addMarginSalt
|
|
20
|
+
price: f.order.price,
|
|
21
|
+
quantity: f.order.quantity,
|
|
22
|
+
cva: f.lockedParam.cva,
|
|
23
|
+
lf: f.lockedParam.lf,
|
|
24
|
+
partyAmm: f.lockedParam.partyAmm,
|
|
25
|
+
partyBmm: f.lockedParam.partyBmm,
|
|
26
|
+
deadline: v,
|
|
27
|
+
affiliate: C,
|
|
28
|
+
data: b,
|
|
29
|
+
upnlSig: s(f.markPrice ?? f.order.price)
|
|
30
|
+
}, E = h.contractsVersion === "0.8.5" ? o(T) : a({
|
|
31
|
+
...T,
|
|
32
|
+
solverFeeCaps: f.solverFeeCaps
|
|
39
33
|
}), D = t({
|
|
40
|
-
signer:
|
|
34
|
+
signer: _,
|
|
41
35
|
target: x,
|
|
42
|
-
callData:
|
|
43
|
-
signerAccount:
|
|
44
|
-
deadline:
|
|
45
|
-
salt:
|
|
36
|
+
callData: w,
|
|
37
|
+
signerAccount: f.subAccountAddress,
|
|
38
|
+
deadline: f.operationDeadline ?? v,
|
|
39
|
+
salt: f.addMarginSalt
|
|
40
|
+
}), O = t({
|
|
41
|
+
signer: _,
|
|
42
|
+
target: S,
|
|
43
|
+
callData: E,
|
|
44
|
+
signerAccount: f.subAccountAddress,
|
|
45
|
+
deadline: f.operationDeadline ?? v,
|
|
46
|
+
salt: f.sendQuoteSalt,
|
|
46
47
|
flexFields: [{
|
|
47
|
-
...
|
|
48
|
-
authorizedFlexFiller:
|
|
48
|
+
...c(E),
|
|
49
|
+
authorizedFlexFiller: m.address
|
|
49
50
|
}]
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
chainId:
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
});
|
|
52
|
+
await r(p, {
|
|
53
|
+
chainId: d.chainId,
|
|
54
|
+
action: "instantOpen",
|
|
55
|
+
operations: [D, O],
|
|
56
|
+
enabled: f.preflightDelegation
|
|
57
|
+
});
|
|
58
|
+
let [k, A] = await Promise.all([n(p, {
|
|
55
59
|
operation: D,
|
|
56
|
-
chainId:
|
|
57
|
-
walletClient:
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
chainId: d.chainId,
|
|
61
|
+
walletClient: g
|
|
62
|
+
}), n(p, {
|
|
63
|
+
operation: O,
|
|
64
|
+
chainId: d.chainId,
|
|
65
|
+
walletClient: g
|
|
66
|
+
})]), j = await l(p, {
|
|
67
|
+
chainId: d.chainId,
|
|
68
|
+
solverId: m.id,
|
|
61
69
|
request: {
|
|
62
|
-
addMargin:
|
|
63
|
-
sendQuote:
|
|
70
|
+
addMargin: k,
|
|
71
|
+
sendQuote: A
|
|
64
72
|
}
|
|
65
73
|
});
|
|
66
74
|
return {
|
|
67
75
|
kind: "enigma",
|
|
68
76
|
success: !0,
|
|
69
|
-
tempQuoteId:
|
|
70
|
-
partyBmm:
|
|
77
|
+
tempQuoteId: j.temp_quote_id !== void 0 && j.temp_quote_id !== null ? String(j.temp_quote_id) : void 0,
|
|
78
|
+
partyBmm: j.partyBmm
|
|
71
79
|
};
|
|
72
80
|
}
|
|
73
81
|
//#endregion
|
|
74
|
-
export {
|
|
82
|
+
export { d as submitEnigmaInstantOpen };
|
|
75
83
|
|
|
76
84
|
//# sourceMappingURL=enigma-instant-open.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enigma-instant-open.js","names":[],"sources":["../../../../../src/solvers/instant-open/instant-open/adapters/enigma-instant-open.ts"],"sourcesContent":["import { SymmError } from \"../../../../shared/errors/symm-error\";\nimport {\n encodeAddMarginToNextVA,\n encodeSendQuote,\n encodeSendQuoteWithAffiliateAndData,\n getFakeSendQuoteMuonSignature,\n sendQuoteUpnlSigFlexRange,\n} from \"../../shared/calldata\";\nimport { sendInstantOpen } from \"../../shared/hedger-api\";\nimport { buildSignedOperation, signAndFormatInstantOperation } from \"../../shared/operations\";\nimport { ORDER_TYPE_MARKET, isolationTypeForSide } from \"../../shared/types\";\nimport type { EnigmaInstantOpenResult, InstantOpenParameters } from \"../types\";\nimport type { InstantOpenAdapterContext } from \"./context\";\n\n/**\n * Submit an instant open to an **Enigma** (lowcap) hedger.\n *\n * Signs two operations — `addMarginToNextVA` on the AccountLayer and\n * `sendQuote` on the diamond — and posts both to `/instant_trade/instant_open`.\n *\n * The quote carries a **placeholder** Muon signature: lowcap bypasses Muon\n * verification, but the contract still reads `upnlSig.price`, and the encoded\n * signature region is delegated to the solver via a `FlexField` so it can write a\n * live attestation at execution time. Only the `sendQuote` operation carries the\n * delegation; `addMargin` stays fully fixed.\n *\n * @throws {SymmError} `INSTANT_OPEN_MARGIN_REQUIRED` when `margin` is absent —\n * reachable when the caller omitted `solverId` and the chain's default solver\n * turned out to be Enigma.\n * @throws {SymmApiError} when the hedger request fails.\n * @internal\n */\nexport async function submitEnigmaInstantOpen(\n context: InstantOpenAdapterContext,\n parameters: InstantOpenParameters,\n): Promise<EnigmaInstantOpenResult> {\n if (!parameters.margin) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_OPEN_MARGIN_REQUIRED\",\n \"instantOpen: the Enigma (lowcap) flow funds a new virtual account, so `margin.amount` is required.\",\n );\n }\n\n const { config, solver, chainConfig, walletClient, signerAddress, deadline, symbolId, metadata } = context;\n const { accountLayerAddress, symmioAddress, affiliatesAddress } = chainConfig.addresses;\n\n const addMarginCallData = encodeAddMarginToNextVA({\n subAccount: parameters.subAccountAddress,\n isolationType: isolationTypeForSide(parameters.positionType),\n symbolId,\n amount: parameters.margin.amount,\n });\n\n const quoteArgs = {\n partyBsWhiteList: [solver.address],\n symbolId,\n positionType: parameters.positionType,\n orderType: ORDER_TYPE_MARKET,\n price: parameters.order.price,\n quantity: parameters.order.quantity,\n cva: parameters.lockedParam.cva,\n lf: parameters.lockedParam.lf,\n partyAmm: parameters.lockedParam.partyAmm,\n partyBmm: parameters.lockedParam.partyBmm,\n deadline,\n affiliate: affiliatesAddress,\n data: metadata,\n upnlSig: getFakeSendQuoteMuonSignature(parameters.markPrice ?? parameters.order.price),\n };\n\n /**\n * Which quote-send call to sign is a chain-generation fact: a v0.8.5 diamond\n * has no capped `sendQuote` selector (the calldata would revert), and a\n * v0.8.6 solver rejects the legacy call's zero fee caps.\n */\n const sendQuoteCallData =\n chainConfig.contractsVersion === \"0.8.5\"\n ? encodeSendQuoteWithAffiliateAndData(quoteArgs)\n : encodeSendQuote({ ...quoteArgs, solverFeeCaps: parameters.solverFeeCaps });\n\n const addMarginOp = buildSignedOperation({\n signer: signerAddress,\n target: accountLayerAddress,\n callData: addMarginCallData,\n signerAccount: parameters.subAccountAddress,\n deadline: parameters.operationDeadline ?? deadline,\n salt: parameters.addMarginSalt,\n });\n\n const sendQuoteOp = buildSignedOperation({\n signer: signerAddress,\n target: symmioAddress,\n callData: sendQuoteCallData,\n signerAccount: parameters.subAccountAddress,\n deadline: parameters.operationDeadline ?? deadline,\n salt: parameters.sendQuoteSalt,\n flexFields: [{ ...sendQuoteUpnlSigFlexRange(sendQuoteCallData), authorizedFlexFiller: solver.address }],\n });\n\n const [addMargin, sendQuote] = await Promise.all([\n signAndFormatInstantOperation(config, { operation: addMarginOp, chainId: context.chainId, walletClient }),\n signAndFormatInstantOperation(config, { operation: sendQuoteOp, chainId: context.chainId, walletClient }),\n ]);\n\n const response = await sendInstantOpen(config, {\n chainId: context.chainId,\n // The resolved solver's own id — never a hardcoded kind, so a differently-id'd\n // solver of the same kind can never be re-resolved onto the wrong endpoint.\n solverId: solver.id,\n request: { addMargin, sendQuote },\n });\n\n return {\n kind: \"enigma\",\n success: true,\n tempQuoteId:\n response.temp_quote_id !== undefined && response.temp_quote_id !== null\n ? String(response.temp_quote_id)\n : undefined,\n partyBmm: response.partyBmm,\n };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"enigma-instant-open.js","names":[],"sources":["../../../../../src/solvers/instant-open/instant-open/adapters/enigma-instant-open.ts"],"sourcesContent":["import { SymmError } from \"../../../../shared/errors/symm-error\";\nimport { assertInstantSignerDelegated } from \"../../../shared/instant-delegation-preflight\";\nimport {\n encodeAddMarginToNextVA,\n encodeSendQuote,\n encodeSendQuoteWithAffiliateAndData,\n getFakeSendQuoteMuonSignature,\n sendQuoteUpnlSigFlexRange,\n} from \"../../shared/calldata\";\nimport { sendInstantOpen } from \"../../shared/hedger-api\";\nimport { buildSignedOperation, signAndFormatInstantOperation } from \"../../shared/operations\";\nimport { ORDER_TYPE_MARKET, isolationTypeForSide } from \"../../shared/types\";\nimport type { EnigmaInstantOpenResult, InstantOpenParameters } from \"../types\";\nimport type { InstantOpenAdapterContext } from \"./context\";\n\n/**\n * Submit an instant open to an **Enigma** (lowcap) hedger.\n *\n * Signs two operations — `addMarginToNextVA` on the AccountLayer and\n * `sendQuote` on the diamond — and posts both to `/instant_trade/instant_open`.\n *\n * The quote carries a **placeholder** Muon signature: lowcap bypasses Muon\n * verification, but the contract still reads `upnlSig.price`, and the encoded\n * signature region is delegated to the solver via a `FlexField` so it can write a\n * live attestation at execution time. Only the `sendQuote` operation carries the\n * delegation; `addMargin` stays fully fixed.\n *\n * @throws {SymmError} `INSTANT_OPEN_MARGIN_REQUIRED` when `margin` is absent —\n * reachable when the caller omitted `solverId` and the chain's default solver\n * turned out to be Enigma.\n * @throws {SymmError} `INSTANT_SIGNER_NOT_DELEGATED` when the signer lacks the\n * delegation for either operation, before anything is signed.\n * @throws {SymmApiError} when the hedger request fails.\n * @internal\n */\nexport async function submitEnigmaInstantOpen(\n context: InstantOpenAdapterContext,\n parameters: InstantOpenParameters,\n): Promise<EnigmaInstantOpenResult> {\n if (!parameters.margin) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_OPEN_MARGIN_REQUIRED\",\n \"instantOpen: the Enigma (lowcap) flow funds a new virtual account, so `margin.amount` is required.\",\n );\n }\n\n const { config, solver, chainConfig, walletClient, signerAddress, deadline, symbolId, metadata } = context;\n const { accountLayerAddress, symmioAddress, affiliatesAddress } = chainConfig.addresses;\n\n const addMarginCallData = encodeAddMarginToNextVA({\n subAccount: parameters.subAccountAddress,\n isolationType: isolationTypeForSide(parameters.positionType),\n symbolId,\n amount: parameters.margin.amount,\n });\n\n const quoteArgs = {\n partyBsWhiteList: [solver.address],\n symbolId,\n positionType: parameters.positionType,\n orderType: ORDER_TYPE_MARKET,\n price: parameters.order.price,\n quantity: parameters.order.quantity,\n cva: parameters.lockedParam.cva,\n lf: parameters.lockedParam.lf,\n partyAmm: parameters.lockedParam.partyAmm,\n partyBmm: parameters.lockedParam.partyBmm,\n deadline,\n affiliate: affiliatesAddress,\n data: metadata,\n upnlSig: getFakeSendQuoteMuonSignature(parameters.markPrice ?? parameters.order.price),\n };\n\n /**\n * Which quote-send call to sign is a chain-generation fact: a v0.8.5 diamond\n * has no capped `sendQuote` selector (the calldata would revert), and a\n * v0.8.6 solver rejects the legacy call's zero fee caps.\n */\n const sendQuoteCallData =\n chainConfig.contractsVersion === \"0.8.5\"\n ? encodeSendQuoteWithAffiliateAndData(quoteArgs)\n : encodeSendQuote({ ...quoteArgs, solverFeeCaps: parameters.solverFeeCaps });\n\n const addMarginOp = buildSignedOperation({\n signer: signerAddress,\n target: accountLayerAddress,\n callData: addMarginCallData,\n signerAccount: parameters.subAccountAddress,\n deadline: parameters.operationDeadline ?? deadline,\n salt: parameters.addMarginSalt,\n });\n\n const sendQuoteOp = buildSignedOperation({\n signer: signerAddress,\n target: symmioAddress,\n callData: sendQuoteCallData,\n signerAccount: parameters.subAccountAddress,\n deadline: parameters.operationDeadline ?? deadline,\n salt: parameters.sendQuoteSalt,\n flexFields: [{ ...sendQuoteUpnlSigFlexRange(sendQuoteCallData), authorizedFlexFiller: solver.address }],\n });\n\n await assertInstantSignerDelegated(config, {\n chainId: context.chainId,\n action: \"instantOpen\",\n operations: [addMarginOp, sendQuoteOp],\n enabled: parameters.preflightDelegation,\n });\n\n const [addMargin, sendQuote] = await Promise.all([\n signAndFormatInstantOperation(config, { operation: addMarginOp, chainId: context.chainId, walletClient }),\n signAndFormatInstantOperation(config, { operation: sendQuoteOp, chainId: context.chainId, walletClient }),\n ]);\n\n const response = await sendInstantOpen(config, {\n chainId: context.chainId,\n // The resolved solver's own id — never a hardcoded kind, so a differently-id'd\n // solver of the same kind can never be re-resolved onto the wrong endpoint.\n solverId: solver.id,\n request: { addMargin, sendQuote },\n });\n\n return {\n kind: \"enigma\",\n success: true,\n tempQuoteId:\n response.temp_quote_id !== undefined && response.temp_quote_id !== null\n ? String(response.temp_quote_id)\n : undefined,\n partyBmm: response.partyBmm,\n };\n}\n"],"mappings":";;;;;;;AAmCA,eAAsB,EACpB,GACA,GACkC;CAClC,IAAI,CAAC,EAAW,QACd,MAAM,IAAI,EACR,cACA,gCACA,oGACF;CAGF,IAAM,EAAE,WAAQ,WAAQ,gBAAa,iBAAc,kBAAe,aAAU,aAAU,gBAAa,GAC7F,EAAE,wBAAqB,kBAAe,yBAAsB,EAAY,WAExE,IAAoB,EAAwB;EAChD,YAAY,EAAW;EACvB,eAAe,EAAqB,EAAW,YAAY;EAC3D;EACA,QAAQ,EAAW,OAAO;CAC5B,CAAC,GAEK,IAAY;EAChB,kBAAkB,CAAC,EAAO,OAAO;EACjC;EACA,cAAc,EAAW;EACzB,WAAA;EACA,OAAO,EAAW,MAAM;EACxB,UAAU,EAAW,MAAM;EAC3B,KAAK,EAAW,YAAY;EAC5B,IAAI,EAAW,YAAY;EAC3B,UAAU,EAAW,YAAY;EACjC,UAAU,EAAW,YAAY;EACjC;EACA,WAAW;EACX,MAAM;EACN,SAAS,EAA8B,EAAW,aAAa,EAAW,MAAM,KAAK;CACvF,GAOM,IACJ,EAAY,qBAAqB,UAC7B,EAAoC,CAAS,IAC7C,EAAgB;EAAE,GAAG;EAAW,eAAe,EAAW;CAAc,CAAC,GAEzE,IAAc,EAAqB;EACvC,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,eAAe,EAAW;EAC1B,UAAU,EAAW,qBAAqB;EAC1C,MAAM,EAAW;CACnB,CAAC,GAEK,IAAc,EAAqB;EACvC,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,eAAe,EAAW;EAC1B,UAAU,EAAW,qBAAqB;EAC1C,MAAM,EAAW;EACjB,YAAY,CAAC;GAAE,GAAG,EAA0B,CAAiB;GAAG,sBAAsB,EAAO;EAAQ,CAAC;CACxG,CAAC;CAED,MAAM,EAA6B,GAAQ;EACzC,SAAS,EAAQ;EACjB,QAAQ;EACR,YAAY,CAAC,GAAa,CAAW;EACrC,SAAS,EAAW;CACtB,CAAC;CAED,IAAM,CAAC,GAAW,KAAa,MAAM,QAAQ,IAAI,CAC/C,EAA8B,GAAQ;EAAE,WAAW;EAAa,SAAS,EAAQ;EAAS;CAAa,CAAC,GACxG,EAA8B,GAAQ;EAAE,WAAW;EAAa,SAAS,EAAQ;EAAS;CAAa,CAAC,CAC1G,CAAC,GAEK,IAAW,MAAM,EAAgB,GAAQ;EAC7C,SAAS,EAAQ;EAGjB,UAAU,EAAO;EACjB,SAAS;GAAE;GAAW;EAAU;CAClC,CAAC;CAED,OAAO;EACL,MAAM;EACN,SAAS;EACT,aACE,EAAS,kBAAkB,KAAA,KAAa,EAAS,kBAAkB,OAC/D,OAAO,EAAS,aAAa,IAC7B,KAAA;EACN,UAAU,EAAS;CACrB;AACF"}
|
|
@@ -15,6 +15,8 @@ import { InstantOpenAdapterContext } from './context.js';
|
|
|
15
15
|
* nothing to delegate.
|
|
16
16
|
*
|
|
17
17
|
* @throws {SymmError} when the Muon attestation cannot be fetched.
|
|
18
|
+
* @throws {SymmError} `INSTANT_SIGNER_NOT_DELEGATED` when the signer lacks the
|
|
19
|
+
* delegation for the operation, before it is signed.
|
|
18
20
|
* @throws {SymmApiError} when the hedger request fails.
|
|
19
21
|
* @internal
|
|
20
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rasa-instant-open.d.ts","sourceRoot":"","sources":["../../../../../src/solvers/instant-open/instant-open/adapters/rasa-instant-open.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rasa-instant-open.d.ts","sourceRoot":"","sources":["../../../../../src/solvers/instant-open/instant-open/adapters/rasa-instant-open.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,yBAAyB,EAClC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAmEhC"}
|
|
@@ -1,55 +1,63 @@
|
|
|
1
1
|
import { buildSignedOperation as e, signAndFormatInstantOperation as t } from "../../shared/operations.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { assertInstantSignerDelegated as n } from "../../../shared/instant-delegation-preflight.js";
|
|
3
|
+
import { encodeSendQuoteWithAffiliateAndData as r } from "../../shared/calldata.js";
|
|
4
|
+
import { sendRasaInstantOpen as i } from "../../shared/hedger-api.js";
|
|
4
5
|
import "../../shared/types.js";
|
|
5
|
-
import { getSendQuoteUpnlSig as
|
|
6
|
-
import { toRasaInstantOpen as
|
|
6
|
+
import { getSendQuoteUpnlSig as a } from "../../../../muon/send-quote-upnl-sig/get-send-quote-upnl-sig.js";
|
|
7
|
+
import { toRasaInstantOpen as o } from "../../get-instant-opens/adapters/rasa-instant-opens.js";
|
|
7
8
|
//#region src/solvers/instant-open/instant-open/adapters/rasa-instant-open.ts
|
|
8
|
-
async function
|
|
9
|
-
let { config:
|
|
10
|
-
chainId:
|
|
11
|
-
partyA:
|
|
12
|
-
symbolId:
|
|
13
|
-
}),
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
upnlSig: v
|
|
32
|
-
}),
|
|
33
|
-
signerAccount: s.subAccountAddress,
|
|
34
|
-
deadline: p,
|
|
35
|
-
salt: s.sendQuoteSalt
|
|
9
|
+
async function s(s, c) {
|
|
10
|
+
let { config: l, solver: u, chainConfig: d, walletClient: f, signerAddress: p, deadline: m, symbolId: h, metadata: g } = s, { symmioAddress: _, affiliatesAddress: v } = d.addresses, y = await a(l, {
|
|
11
|
+
chainId: s.chainId,
|
|
12
|
+
partyA: c.subAccountAddress,
|
|
13
|
+
symbolId: h
|
|
14
|
+
}), b = e({
|
|
15
|
+
signer: p,
|
|
16
|
+
target: _,
|
|
17
|
+
callData: r({
|
|
18
|
+
partyBsWhiteList: [u.address],
|
|
19
|
+
symbolId: h,
|
|
20
|
+
positionType: c.positionType,
|
|
21
|
+
orderType: c.orderType ?? 1,
|
|
22
|
+
price: c.order.price,
|
|
23
|
+
quantity: c.order.quantity,
|
|
24
|
+
cva: c.lockedParam.cva,
|
|
25
|
+
lf: c.lockedParam.lf,
|
|
26
|
+
partyAmm: c.lockedParam.partyAmm,
|
|
27
|
+
partyBmm: c.lockedParam.partyBmm,
|
|
28
|
+
deadline: m,
|
|
29
|
+
affiliate: v,
|
|
30
|
+
data: g,
|
|
31
|
+
upnlSig: y
|
|
36
32
|
}),
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
33
|
+
signerAccount: c.subAccountAddress,
|
|
34
|
+
deadline: m,
|
|
35
|
+
salt: c.sendQuoteSalt
|
|
36
|
+
});
|
|
37
|
+
await n(l, {
|
|
38
|
+
chainId: s.chainId,
|
|
39
|
+
action: "instantOpen",
|
|
40
|
+
operations: [b],
|
|
41
|
+
enabled: c.preflightDelegation
|
|
42
|
+
});
|
|
43
|
+
let x = await t(l, {
|
|
44
|
+
operation: b,
|
|
45
|
+
chainId: s.chainId,
|
|
46
|
+
walletClient: f
|
|
47
|
+
}), S = await i(l, {
|
|
48
|
+
chainId: s.chainId,
|
|
49
|
+
solverId: u.id,
|
|
50
|
+
sendQuote: x
|
|
51
|
+
}), C = o(S);
|
|
44
52
|
return {
|
|
45
53
|
kind: "rasa",
|
|
46
54
|
success: !0,
|
|
47
|
-
tempQuoteId: String(
|
|
48
|
-
partyBmm:
|
|
49
|
-
rfq:
|
|
55
|
+
tempQuoteId: String(S.temp_quote_id),
|
|
56
|
+
partyBmm: S.partyBmm,
|
|
57
|
+
rfq: C
|
|
50
58
|
};
|
|
51
59
|
}
|
|
52
60
|
//#endregion
|
|
53
|
-
export {
|
|
61
|
+
export { s as submitRasaInstantOpen };
|
|
54
62
|
|
|
55
63
|
//# sourceMappingURL=rasa-instant-open.js.map
|